using System; using System.Collections.Generic; using System.Text; using MySql.Data.MySqlClient; using MarketData.MarketDataModel; using MarketData.Utils; namespace MarketData.DataAccess { public class YieldCurveDA { private YieldCurveDA() { } private static bool DeleteYieldCurve(YieldCurve yieldCurve, MySqlConnection sqlConnection, MySqlTransaction sqlTransaction) { String strQuery = null; try { StringBuilder sb = new StringBuilder(); sb.Append("delete from yieldcurve "); sb.Append("where date in ").Append(SqlUtils.CreateInClauseYear(yieldCurve.GetDistinctDates())); strQuery = sb.ToString(); MySqlCommand sqlCommand = new MySqlCommand(strQuery, sqlConnection, sqlTransaction); sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT; sqlCommand.ExecuteNonQuery(); sqlCommand.Dispose(); return true; } catch (Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,exception); return false; } finally { } } public static bool InsertOrUpdate(YieldCurve yieldCurve) { MySqlConnection sqlConnection = null; MySqlTransaction sqlTransaction = null; String strQuery = null; try { if (null == yieldCurve || 0 == yieldCurve.Count) return false; sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data")); sqlTransaction = sqlConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); DeleteYieldCurve(yieldCurve,sqlConnection,sqlTransaction); DateTime modified = DateTime.Now; for (int index = 0; index < yieldCurve.Count; index++) { YieldCurveData yieldCurveData = yieldCurve[index]; StringBuilder sb = new StringBuilder(); sb.Append("insert into yieldcurve(date,1mo,3mo,6mo,1yr,2yr,3yr,5yr,7yr,10yr,20yr,30yr,modified)values("); sb.Append(SqlUtils.AddQuotes(Utility.DateTimeToStringYYYYHMMHDD(yieldCurveData.Date))).Append(","); if(!double.IsNaN(yieldCurveData.Mo1))sb.Append(yieldCurveData.Mo1).Append(","); else sb.Append("null").Append(","); if(!double.IsNaN(yieldCurveData.Mo3))sb.Append(yieldCurveData.Mo3).Append(","); else sb.Append("null").Append(","); if(!double.IsNaN(yieldCurveData.Mo3))sb.Append(yieldCurveData.Mo6).Append(","); else sb.Append("null").Append(","); if(!double.IsNaN(yieldCurveData.Yr1))sb.Append(yieldCurveData.Yr1).Append(","); else sb.Append("null").Append(","); if(!double.IsNaN(yieldCurveData.Yr2))sb.Append(yieldCurveData.Yr2).Append(","); else sb.Append("null").Append(","); if(!double.IsNaN(yieldCurveData.Yr3))sb.Append(yieldCurveData.Yr3).Append(","); else sb.Append("null").Append(","); if(!double.IsNaN(yieldCurveData.Yr5))sb.Append(yieldCurveData.Yr5).Append(","); else sb.Append("null").Append(","); if(!double.IsNaN(yieldCurveData.Yr7))sb.Append(yieldCurveData.Yr7).Append(","); else sb.Append("null").Append(","); if(!double.IsNaN(yieldCurveData.Yr10))sb.Append(yieldCurveData.Yr10).Append(","); else sb.Append("null").Append(","); if(!double.IsNaN(yieldCurveData.Yr20))sb.Append(yieldCurveData.Yr20).Append(","); else sb.Append("null").Append(","); if(!double.IsNaN(yieldCurveData.Yr30))sb.Append(yieldCurveData.Yr30).Append(","); else sb.Append("null").Append(","); sb.Append(SqlUtils.AddQuotes(Utility.DateTimeToStringYYYYHMMHDD(modified))); sb.Append(")"); strQuery = sb.ToString(); MySqlCommand sqlCommand = new MySqlCommand(strQuery, sqlConnection, sqlTransaction); sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT; sqlCommand.ExecuteNonQuery(); sqlCommand.Dispose(); } sqlTransaction.Commit(); return true; } catch (Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,exception); return false; } finally { if (null != sqlTransaction) sqlTransaction.Dispose(); if (null != sqlConnection) sqlConnection.Close(); } } public static YieldCurve GetYieldCurve(DateTime startDate, int days) { MySqlConnection sqlConnection = null; MySqlDataReader sqlDataReader = null; MySqlCommand sqlCommand=null; YieldCurve yieldCurve = new YieldCurve(); String strQuery = null; try { StringBuilder sb = new StringBuilder(); DateGenerator dateGenerator = new DateGenerator(); DateTime maxHistoricalDate = dateGenerator.GenerateHistoricalDate(startDate, days * 2); sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data")); sb.Append("select date,1mo,3mo,6mo,1yr,2yr,3yr,5yr,7yr,10yr,20yr,30yr from yieldcurve "); sb.Append("where date<='").Append(Utility.DateTimeToStringYYYYHMMHDD(startDate)).Append("' "); sb.Append("and date>='").Append(Utility.DateTimeToStringYYYYHMMHDD(maxHistoricalDate)).Append("' "); sb.Append(" order by date desc"); sb.Append(" limit ").Append(days); strQuery = sb.ToString(); sqlCommand = new MySqlCommand(strQuery, sqlConnection); sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT; sqlDataReader = sqlCommand.ExecuteReader(); while(sqlDataReader.Read()) { YieldCurveData yieldCurveData = new YieldCurveData(); yieldCurveData.Date = sqlDataReader.GetDateTime(0); yieldCurveData.Mo1 = sqlDataReader.GetDouble(1); yieldCurveData.Mo3 = sqlDataReader.GetDouble(2); yieldCurveData.Mo6 = sqlDataReader.GetDouble(3); yieldCurveData.Yr1 = sqlDataReader.GetDouble(4); yieldCurveData.Yr2 = sqlDataReader.GetDouble(5); yieldCurveData.Yr3 = sqlDataReader.GetDouble(6); yieldCurveData.Yr5 = sqlDataReader.GetDouble(7); yieldCurveData.Yr7 = sqlDataReader.GetDouble(8); yieldCurveData.Yr10 = sqlDataReader.GetDouble(9); yieldCurveData.Yr20 = sqlDataReader.GetDouble(10); yieldCurveData.Yr30 = sqlDataReader.GetDouble(11); yieldCurve.Add(yieldCurveData); } return yieldCurve; } catch (Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,exception); return null; } finally { if(null!=sqlCommand)sqlCommand.Dispose(); if (null != sqlDataReader) {sqlDataReader.Close();sqlDataReader.Dispose();} if (null != sqlConnection) sqlConnection.Close(); } } public static YieldCurveData GetYieldCurve(DateTime effectiveDate) { MySqlConnection sqlConnection = null; MySqlDataReader sqlDataReader = null; MySqlCommand sqlCommand=null; YieldCurveData yieldCurveData = null; String strQuery = null; try { StringBuilder sb = new StringBuilder(); sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data")); sb.Append("select date,1mo,3mo,6mo,1yr,2yr,3yr,5yr,7yr,10yr,20yr,30yr from yieldcurve "); sb.Append("where date='").Append(Utility.DateTimeToStringYYYYHMMHDD(effectiveDate)).Append("' "); strQuery = sb.ToString(); sqlCommand = new MySqlCommand(strQuery, sqlConnection); sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT; sqlDataReader = sqlCommand.ExecuteReader(); if (!sqlDataReader.Read())return null; yieldCurveData = new YieldCurveData(); yieldCurveData.Date = sqlDataReader.GetDateTime(0); yieldCurveData.Mo1 = sqlDataReader.GetDouble(1); yieldCurveData.Mo3 = sqlDataReader.GetDouble(2); yieldCurveData.Mo6 = sqlDataReader.GetDouble(3); yieldCurveData.Yr1 = sqlDataReader.GetDouble(4); yieldCurveData.Yr2 = sqlDataReader.GetDouble(5); yieldCurveData.Yr3 = sqlDataReader.GetDouble(6); yieldCurveData.Yr5 = sqlDataReader.GetDouble(7); yieldCurveData.Yr7 = sqlDataReader.GetDouble(8); yieldCurveData.Yr10 = sqlDataReader.GetDouble(9); yieldCurveData.Yr20 = sqlDataReader.GetDouble(10); yieldCurveData.Yr30 = sqlDataReader.GetDouble(11); return yieldCurveData; } catch (Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,exception); return null; } finally { if(null!=sqlCommand)sqlCommand.Dispose(); if (null != sqlDataReader) {sqlDataReader.Close();sqlDataReader.Dispose();} if (null != sqlConnection) sqlConnection.Close(); } } public static YieldCurve GetYieldCurve(int dayCount) { MySqlConnection sqlConnection = null; MySqlDataReader sqlDataReader = null; MySqlCommand sqlCommand=null; YieldCurve yieldCurve = new YieldCurve(); String strQuery = null; try { StringBuilder sb = new StringBuilder(); sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data")); sb.Append("select date,1mo,3mo,6mo,1yr,2yr,3yr,5yr,7yr,10yr,20yr,30yr from yieldcurve "); sb.Append(" order by date desc"); sb.Append(" limit ").Append(dayCount); strQuery = sb.ToString(); sqlCommand = new MySqlCommand(strQuery, sqlConnection); sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT; sqlDataReader = sqlCommand.ExecuteReader(); while (sqlDataReader.Read()) { YieldCurveData yieldCurveData = new YieldCurveData(); yieldCurveData.Date = sqlDataReader.GetDateTime(0); yieldCurveData.Mo1 = sqlDataReader.GetDouble(1); yieldCurveData.Mo3 = sqlDataReader.GetDouble(2); yieldCurveData.Mo6 = sqlDataReader.GetDouble(3); yieldCurveData.Yr1 = sqlDataReader.GetDouble(4); yieldCurveData.Yr2 = sqlDataReader.GetDouble(5); yieldCurveData.Yr3 = sqlDataReader.GetDouble(6); yieldCurveData.Yr5 = sqlDataReader.GetDouble(7); yieldCurveData.Yr7 = sqlDataReader.GetDouble(8); yieldCurveData.Yr10 = sqlDataReader.GetDouble(9); yieldCurveData.Yr20 = sqlDataReader.GetDouble(10); yieldCurveData.Yr30 = sqlDataReader.GetDouble(11); yieldCurve.Add(yieldCurveData); } return yieldCurve; } catch (Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,exception); return null; } finally { if(null!=sqlCommand)sqlCommand.Dispose(); if (null != sqlDataReader) {sqlDataReader.Close();sqlDataReader.Dispose();} if (null != sqlConnection) sqlConnection.Close(); } } public static YieldCurve GetYieldCurve() { MySqlConnection sqlConnection = null; MySqlDataReader sqlDataReader = null; MySqlCommand sqlCommand=null; YieldCurve yieldCurve = new YieldCurve(); String strQuery = null; try { StringBuilder sb = new StringBuilder(); sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data")); sb.Append("select date,1mo,3mo,6mo,1yr,2yr,3yr,5yr,7yr,10yr,20yr,30yr from yieldcurve "); sb.Append(" order by date desc"); strQuery = sb.ToString(); sqlCommand = new MySqlCommand(strQuery, sqlConnection); sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT; sqlDataReader = sqlCommand.ExecuteReader(); while (sqlDataReader.Read()) { YieldCurveData yieldCurveData = new YieldCurveData(); yieldCurveData.Date=sqlDataReader.GetDateTime(0); yieldCurveData.Mo1=sqlDataReader.GetDouble(1); yieldCurveData.Mo3=sqlDataReader.GetDouble(2); yieldCurveData.Mo6=sqlDataReader.GetDouble(3); yieldCurveData.Yr1=sqlDataReader.GetDouble(4); yieldCurveData.Yr2=sqlDataReader.GetDouble(5); yieldCurveData.Yr3=sqlDataReader.GetDouble(6); yieldCurveData.Yr5=sqlDataReader.GetDouble(7); yieldCurveData.Yr7=sqlDataReader.GetDouble(8); yieldCurveData.Yr10=sqlDataReader.GetDouble(9); yieldCurveData.Yr20=sqlDataReader.GetDouble(10); yieldCurveData.Yr30 = sqlDataReader.GetDouble(11); yieldCurve.Add(yieldCurveData); } return yieldCurve; } catch (Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,exception); return null; } finally { if(null != sqlCommand)sqlCommand.Dispose(); if (null != sqlDataReader) {sqlDataReader.Close();sqlDataReader.Dispose();} if (null != sqlConnection) sqlConnection.Close(); } } public static double GetRiskFreeRate1Yr(DateTime effectiveDate,int lookAhead) { DateGenerator dateGenerator=new DateGenerator(); YieldCurveData yieldCurveData=null; for(int index=0;index GetYieldCurveDates() { MySqlConnection sqlConnection = null; MySqlDataReader sqlDataReader = null; MySqlCommand sqlCommand=null; String strQuery = null; List yieldCurveDates=new List(); try { StringBuilder sb = new StringBuilder(); sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data")); sb.Append("select date from yieldcurve order by date desc"); strQuery = sb.ToString(); sqlCommand = new MySqlCommand(strQuery, sqlConnection); sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT; sqlDataReader = sqlCommand.ExecuteReader(); while(sqlDataReader.Read()) { yieldCurveDates.Add(sqlDataReader.GetDateTime(0)); } return yieldCurveDates; } catch (Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,exception); return new List(); } finally { if(null!=sqlCommand)sqlCommand.Dispose(); if (null != sqlDataReader) {sqlDataReader.Close();sqlDataReader.Dispose();} if (null != sqlConnection) sqlConnection.Close(); } } } }