Files
marketdata/MarketDataLib/DataAccess/PremarketDA.cs
2024-02-22 14:52:53 -05:00

282 lines
11 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using MySql.Data.MySqlClient;
using MarketData.MarketDataModel;
using MarketData.Utils;
namespace MarketData.DataAccess
{
public class PremarketDA
{
private PremarketDA()
{
}
//SELECT market, change_value,change_percent,timestamp, STR_TO_DATE(SUBSTRING(TIMESTAMP,12,11),'%h:%i:%s %p') time_of_day,CONVERT(TIMESTAMP,DATE) AS the_day
//FROM premarket WHERE market='S&P' ORDER BY the_day DESC, time_of_day DESC
public static bool AddElements(PremarketElements premarketElements)
{
MySqlConnection sqlConnection=null;
MySqlTransaction sqlTransaction=null;
String strQuery=null;
try
{
if(null==premarketElements||0==premarketElements.Count) return false;
sqlConnection=SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
sqlTransaction=sqlConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
for(int index=0;index<premarketElements.Count;index++)
{
PremarketElement premarketElement=premarketElements[index];
if(String.IsNullOrEmpty(premarketElement.Market))continue;
if(Utility.IsEpoch(premarketElement.Timestamp))continue;
StringBuilder sb=new StringBuilder();
sb.Append("insert into premarket (market,change_value,change_percent,timestamp)");
sb.Append("values(");
sb.Append("'").Append(premarketElement.Market).Append("'").Append(",");
if(double.NaN.Equals(premarketElement.ChangeValue)) sb.Append("null").Append(",");
else sb.Append(premarketElement.ChangeValue).Append(","); ;
if(double.NaN.Equals(premarketElement.ChangePercent)) sb.Append("null").Append(",");
else sb.Append(premarketElement.ChangePercent).Append(",");
sb.Append("'").Append(SqlUtils.ToSqlDateTimeTT(premarketElement.Timestamp)).Append("'");
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)
{
if(null!=sqlTransaction) sqlTransaction.Rollback();
MDTrace.WriteLine(LogLevel.DEBUG,exception);
if(null!=strQuery) MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Query was {0}",strQuery));
return false;
}
finally
{
if(null!=sqlTransaction) sqlTransaction.Dispose();
if(null!=sqlConnection) sqlConnection.Close();
}
}
public static PremarketElements GetLatestPremarketData()
{
PremarketElements premarketElements=new PremarketElements();
List<String> markets=GetDistinctMarkets();
if(null==markets)return null;
foreach(String market in markets)
{
PremarketElement premarketElement=GetLatestPremarketData(market);
if(null==premarketElement)continue;
premarketElements.Add(premarketElement);
}
return premarketElements;
}
public static PremarketElement GetLatestPremarketData(String market)
{
MySqlConnection sqlConnection=null;
MySqlDataReader sqlDataReader=null;
MySqlCommand sqlCommand=null;
String strQuery=null;
PremarketElement premarketElement=new PremarketElement();
try
{
List<DateTime> availableMarketDates=GetAvailableMarketDates(market);
if(null==availableMarketDates || 0==availableMarketDates.Count)return null;
DateTime marketDate=availableMarketDates.Take(1).FirstOrDefault();
StringBuilder sb=new StringBuilder();
sqlConnection=SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
sb.Append("select market,change_value,change_percent,timestamp,STR_TO_DATE(SUBSTRING(TIMESTAMP,12,11),'%h:%i:%s %p') MILITARY_TIME,CONVERT(TIMESTAMP,DATE) DATE from premarket ");
sb.Append("WHERE MARKET='").Append(market).Append("' and CONVERT(TIMESTAMP,DATE)=").Append(SqlUtils.AddQuotes(SqlUtils.SqlString(SqlUtils.FormatDate(marketDate))));
sb.Append("ORDER BY MILITARY_TIME DESC LIMIT 10");
strQuery=sb.ToString();
sqlCommand=new MySqlCommand(strQuery,sqlConnection);
sqlCommand.CommandTimeout=SqlUtils.COMMAND_TIMEOUT;
sqlDataReader=sqlCommand.ExecuteReader();
if(!sqlDataReader.Read())return null;
if(!sqlDataReader.IsDBNull(0)) premarketElement.Market=sqlDataReader.GetString(0);
if(!sqlDataReader.IsDBNull(1)) premarketElement.ChangeValue=sqlDataReader.GetDouble(1);
if(!sqlDataReader.IsDBNull(2)) premarketElement.ChangePercent=sqlDataReader.GetDouble(2);
if(!sqlDataReader.IsDBNull(3)) premarketElement.Timestamp=Utility.ParseDate(sqlDataReader.GetString(3));
if(String.IsNullOrEmpty(premarketElement.Market)) return null;
return premarketElement;
}
catch(Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,exception);
return null;
}
finally
{
if(null!=sqlCommand) sqlCommand.Dispose();
if(null!=sqlDataReader) sqlDataReader.Close();
if(null!=sqlConnection) sqlConnection.Close();
}
}
public static DateTime GetLatestMarketDate()
{
MySqlConnection sqlConnection=null;
MySqlDataReader sqlDataReader=null;
MySqlCommand sqlCommand=null;
String strQuery=null;
DateTime latestMarketDate=Utility.Epoch;
try
{
StringBuilder sb=new StringBuilder();
sqlConnection=SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
sb.Append("SELECT MAX(CONVERT(TIMESTAMP,DATE)) FROM premarket ");
strQuery=sb.ToString();
sqlCommand=new MySqlCommand(strQuery,sqlConnection);
sqlCommand.CommandTimeout=SqlUtils.COMMAND_TIMEOUT;
sqlDataReader=sqlCommand.ExecuteReader();
if(sqlDataReader.Read())
{
latestMarketDate=sqlDataReader.GetDateTime(0);
}
return latestMarketDate;
}
catch(Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,exception);
return latestMarketDate;
}
finally
{
if(null!=sqlCommand) sqlCommand.Dispose();
if(null!=sqlDataReader) sqlDataReader.Close();
if(null!=sqlConnection) sqlConnection.Close();
}
}
public static List<DateTime> GetAvailableMarketDates(String market)
{
MySqlConnection sqlConnection=null;
MySqlDataReader sqlDataReader=null;
MySqlCommand sqlCommand=null;
String strQuery=null;
List<DateTime> availableMarketDates=new List<DateTime>();
DateGenerator dateGenerator=new DateGenerator();
try
{
StringBuilder sb=new StringBuilder();
sqlConnection=SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
sb.Append("SELECT DISTINCT(CONVERT(TIMESTAMP,DATE)) FROM premarket where market=").Append(SqlUtils.AddQuotes(market)).Append(" ORDER BY 1 DESC");
strQuery=sb.ToString();
sqlCommand=new MySqlCommand(strQuery,sqlConnection);
sqlCommand.CommandTimeout=SqlUtils.COMMAND_TIMEOUT;
sqlDataReader=sqlCommand.ExecuteReader();
while(sqlDataReader.Read())
{
DateTime marketDate=sqlDataReader.GetDateTime(0);
if(!dateGenerator.IsMarketOpen(marketDate)) continue;
availableMarketDates.Add(marketDate);
}
return availableMarketDates;
}
catch(Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,exception);
return null;
}
finally
{
if(null!=sqlCommand) sqlCommand.Dispose();
if(null!=sqlDataReader) sqlDataReader.Close();
if(null!=sqlConnection) sqlConnection.Close();
}
}
public static PremarketElements GetLatestPremarketData(String market,DateTime date,bool constrainToMarketHours=true)
{
MySqlConnection sqlConnection=null;
MySqlDataReader sqlDataReader=null;
MySqlCommand sqlCommand=null;
String strQuery=null;
PremarketElements premarketElements=new PremarketElements();
DateGenerator dateGenerator=new DateGenerator();
try
{
StringBuilder sb=new StringBuilder();
sqlConnection=SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
sb.Append("select market,change_value,change_percent,timestamp,STR_TO_DATE(SUBSTRING(TIMESTAMP,12,11),'%h:%i:%s %p') MILITARY_TIME,CONVERT(TIMESTAMP,DATE) DATE from premarket ");
sb.Append("WHERE MARKET='").Append(market).Append("' and CONVERT(TIMESTAMP,DATE)=").Append(SqlUtils.AddQuotes(SqlUtils.FormatDate(date)));
if(constrainToMarketHours)sb.Append(" AND STR_TO_DATE(SUBSTRING(TIMESTAMP,12,11),'%h:%i:%s %p')<'16:30:00' ");
sb.Append(" ORDER BY MILITARY_TIME ASC");
strQuery=sb.ToString();
sqlCommand=new MySqlCommand(strQuery,sqlConnection);
sqlCommand.CommandTimeout=SqlUtils.COMMAND_TIMEOUT;
sqlDataReader=sqlCommand.ExecuteReader();
while(sqlDataReader.Read())
{
PremarketElement premarketElement=new PremarketElement();
if(!sqlDataReader.IsDBNull(0)) premarketElement.Market=sqlDataReader.GetString(0);
if(!sqlDataReader.IsDBNull(1)) premarketElement.ChangeValue=sqlDataReader.GetDouble(1);
if(!sqlDataReader.IsDBNull(2)) premarketElement.ChangePercent=sqlDataReader.GetDouble(2);
if(!sqlDataReader.IsDBNull(3)) premarketElement.Timestamp=Utility.ParseDate(sqlDataReader.GetString(3));
if(String.IsNullOrEmpty(premarketElement.Market)) continue;
if(!dateGenerator.IsMarketOpen(premarketElement.Timestamp))continue;
premarketElements.Add(premarketElement);
}
return premarketElements;
}
catch(Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,exception);
return null;
}
finally
{
if(null!=sqlCommand) sqlCommand.Dispose();
if(null!=sqlDataReader) sqlDataReader.Close();
if(null!=sqlConnection) sqlConnection.Close();
}
}
public static List<String> GetDistinctMarkets()
{
MySqlConnection sqlConnection=null;
MySqlDataReader sqlDataReader=null;
MySqlCommand sqlCommand=null;
String strQuery=null;
List<String> markets=new List<String>();
try
{
StringBuilder sb=new StringBuilder();
sqlConnection=SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
sb.Append("select distinct market from premarket order by 1 asc");
strQuery=sb.ToString();
sqlCommand=new MySqlCommand(strQuery,sqlConnection);
sqlCommand.CommandTimeout=SqlUtils.COMMAND_TIMEOUT;
sqlDataReader=sqlCommand.ExecuteReader();
while(sqlDataReader.Read())
{
markets.Add(sqlDataReader.GetString(0));
}
return markets;
}
catch(Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,exception);
return null;
}
finally
{
if(null!=sqlCommand) sqlCommand.Dispose();
if(null!=sqlDataReader) sqlDataReader.Close();
if(null!=sqlConnection) sqlConnection.Close();
}
}
}
}