Files
marketdata/MarketDataLib/DataAccess/CompositeDA.cs
2025-05-01 14:08:33 -04:00

357 lines
20 KiB
C#

using System;
using System.Text;
using MySql.Data.MySqlClient;
using MarketData.MarketDataModel;
using MarketData.Utils;
namespace MarketData.DataAccess
{
public class CompositeDA
{
private CompositeDA()
{
}
public static FeedStatistics GetFeedStatistics(FeedStatistic.FeedStatisticType feedStatisticType)
{
MySqlConnection sqlConnection = null;
MySqlDataReader sqlDataReader = null;
MySqlCommand sqlCommand = null;
FeedStatistics feedStatistics = new FeedStatistics();
String strQuery;
try
{
StringBuilder sb = new StringBuilder();
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
switch (feedStatisticType)
{
case FeedStatistic.FeedStatisticType.ZACKS_RANK:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Zacks Rank' description,count(*) records,date from zacksrank group by 3 order by date desc");
break;
case FeedStatistic.FeedStatisticType.VALUATIONS:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Valuations' description, count(*), valuation_date from valuations group by 3 order by valuation_date desc");
break;
case FeedStatistic.FeedStatisticType.YIELD_CURVE:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Yield Curve' description,count(*), date from yieldcurve group by 3 order by date desc");
break;
case FeedStatistic.FeedStatisticType.SPLITS:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Splits' description,count(*), modified from splits group by 3 order by modified desc");
break;
case FeedStatistic.FeedStatisticType.SECURITY_MASTER:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Security Master' description,count(*), date(create_date) from securitymaster group by 3 order by 3 desc");
break;
case FeedStatistic.FeedStatisticType.SEC_FILINGS:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'SEC Filings' description,count(*), filing_date from secfilings group by 3 order by filing_date desc");
break;
case FeedStatistic.FeedStatisticType.PRICES:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Prices' description,count(*), date from prices group by 3 order by date desc");
break;
case FeedStatistic.FeedStatisticType.OPTIONS:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Options' description,count(*), modified from options where modified is not null group by 3 order by modified desc");
break;
case FeedStatistic.FeedStatisticType.INSIDER_TRANSACTIONS:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Insider Transactions' description,count(*), filing_date from insidertransaction group by 3 order by filing_date desc");
break;
case FeedStatistic.FeedStatisticType.FUNDAMENTALS:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Fundamentals' description,count(*), asof from fundamentals group by 3 order by asof desc");
break;
case FeedStatistic.FeedStatisticType.INCOME_STATEMENT:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Income Statement' description,count(*), modified from incomestatement group by 3 order by modified desc");
break;
case FeedStatistic.FeedStatisticType.CASHFLOW_STATEMENT:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Cashflow Statement' description,count(*), modified from cashflowstatement group by 3 order by modified desc");
break;
case FeedStatistic.FeedStatisticType.BALANCE_SHEET:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Balance Sheet' description,count(*), modified from balancesheet group by 3 order by modified desc");
break;
case FeedStatistic.FeedStatisticType.HISTORICAL:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Historical' description,count(*), asof from historical group by 3 order by asof desc");
break;
case FeedStatistic.FeedStatisticType.HEADLINES:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Headlines' description,count(*), asof from headlines group by 3 having count(*) > 10 order by asof desc");
break;
case FeedStatistic.FeedStatisticType.ETF_HOLDINGS:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'ETF Holdings' description,count(*), modified from etfholdings group by 3 order by modified desc");
break;
case FeedStatistic.FeedStatisticType.ECONOMIC_INDICATORS:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Economic Indicators' description,count(*), Date(modified) from economicindicators group by 3 order by Date(modified) desc");
break;
case FeedStatistic.FeedStatisticType.EARNINGS_ANNOUNCEMENTS:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Earnings Announcements' description,count(*), period_ending from earningsannouncements group by 3 order by period_ending desc");
break;
case FeedStatistic.FeedStatisticType.DIVIDEND_HISTORY:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Dividend History' description,count(*), CAST(modified AS DATE) modified from dividendhistory group by 3 order by CAST(modified AS DATE) desc");
break;
case FeedStatistic.FeedStatisticType.CURRENCY_CONVERSION:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Currency Conversion' description,count(*), asof from currencyconversion group by 3 order by asof desc");
break;
case FeedStatistic.FeedStatisticType.ANALYST_RATINGS:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Analyst Ratings' description,count(*), date from analystratings group by 3 order by date desc");
break;
case FeedStatistic.FeedStatisticType.ANALYST_PRICE_TARGET:
sb.Append("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select 'Analyst Price Target' description,count(*), date from analystpricetarget group by 3 order by date desc");
break;
default:
return null;
}
strQuery = sb.ToString();
sqlCommand = new MySqlCommand(strQuery, sqlConnection);
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
sqlDataReader = sqlCommand.ExecuteReader();
while (sqlDataReader.Read())
{
FeedStatistic feedStatistic = new FeedStatistic();
feedStatistic.Feed = sqlDataReader.GetString(0);
feedStatistic.Records = sqlDataReader.GetInt32(1);
feedStatistic.Date = sqlDataReader.GetDateTime(2);
feedStatistics.Add(feedStatistic);
}
return feedStatistics;
}
catch (Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG, exception.ToString());
return null;
}
finally
{
if (null != sqlCommand) { sqlCommand.Dispose(); }
if (null != sqlDataReader) { sqlDataReader.Close(); sqlDataReader.Dispose(); }
if (null != sqlConnection) { sqlConnection.Close(); sqlConnection.Dispose(); }
}
}
public static TimeSeriesCollection GetDebtToEquity(String symbol)
{
TimeSeriesCollection timeSeriesCollection=new TimeSeriesCollection();
MySqlConnection sqlConnection = null;
MySqlDataReader sqlDataReader = null;
MySqlCommand sqlCommand=null;
String strQuery = null;
double prevStockHoldersEquity=double.NaN;
double prevTotalDebt=double.NaN;
int recordCount=0;
try
{
StringBuilder sb = new StringBuilder();
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
sb.Append("set @symbol='").Append(symbol).Append("';");
sb.Append("select A.symbol,A.year,A.total_debt,B.total_stockholder_equity,A.total_debt/B.total_stockholder_equity debt_to_equity from ");
sb.Append("( ");
sb.Append("select MIN(f.symbol) symbol,MIN(YEAR(f.asof))year,AVG(f.total_debt)total_debt from fundamentals f where symbol=").Append(SqlUtils.ToSqlString(symbol));
sb.Append(" group by YEAR(f.asof) order by 2 asc ");
sb.Append(")A ");
sb.Append("left join ");
sb.Append("( ");
sb.Append("select MIN(bs.symbol)symbol,MIN(YEAR(bs.asof)) year,AVG(bs.total_stockholder_equity) total_stockholder_equity from balancesheet bs where symbol=").Append(SqlUtils.ToSqlString(symbol)).Append(" and period=0 ");
sb.Append("group by YEAR(bs.asof) order by 2 asc ");
sb.Append(")B ");
sb.Append("on A.symbol=B.symbol and A.year=B.year order by 2 asc");
strQuery = sb.ToString();
sqlCommand = new MySqlCommand(strQuery, sqlConnection);
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
sqlDataReader = sqlCommand.ExecuteReader();
while(sqlDataReader.Read())
{
double totalDebt=double.NaN;
double totalStockholderEquity=double.NaN;
double debtToEquity=double.NaN;
symbol=sqlDataReader.GetString(0);
int year=sqlDataReader.GetInt32(1);
if(!sqlDataReader.IsDBNull(2))totalDebt=sqlDataReader.GetDouble(2);
if(!sqlDataReader.IsDBNull(3))totalStockholderEquity=sqlDataReader.GetDouble(3);
if(!sqlDataReader.IsDBNull(4))debtToEquity=sqlDataReader.GetDouble(4);
if(0==recordCount&&(double.IsNaN(totalDebt)||double.IsNaN(totalStockholderEquity)))continue;
if(double.IsNaN(totalStockholderEquity))totalStockholderEquity=prevStockHoldersEquity;
if(double.IsNaN(totalDebt))totalDebt=prevTotalDebt;
TimeSeriesElement timeSeriesElement=new TimeSeriesElement();
timeSeriesElement.Symbol=symbol;
timeSeriesElement.AsOf=new DateTime(year,1,1);
timeSeriesElement.Type=TimeSeriesElement.ElementType.OTHER;
timeSeriesElement.OtherType="DebtToEquity";
timeSeriesElement.Value=totalDebt/totalStockholderEquity;
timeSeriesCollection.Add(timeSeriesElement);
recordCount++;
prevStockHoldersEquity=totalStockholderEquity;
prevTotalDebt=totalDebt;
}
return timeSeriesCollection;
}
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 DividendLoadCollection GetDividendLoad(String symbol)
{
DividendLoadCollection dividendLoadCollection=new DividendLoadCollection();
MySqlConnection sqlConnection = null;
MySqlDataReader sqlDataReader = null;
MySqlCommand sqlCommand=null;
String strQuery = null;
try
{
StringBuilder sb = new StringBuilder();
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
sb.Append("SET @symbol='").Append(symbol).Append("';");
sb.Append("select A.symbol,A.year,A.eps,B.cash_amount,B.records,(B.cash_amount/A.eps)*100.00 as dividend_load_pct from ");
sb.Append(" (select MIN(h.symbol) symbol,MIN(YEAR(h.asof)) year,min(h.value) eps from historical h ");
sb.Append(" where h.symbol=@symbol and h.type='eps' ");
sb.Append(" group by YEAR(h.asof))A ");
sb.Append(" inner join ( ");
sb.Append(" select MIN(symbol) symbol,sum(dh.cash_amount) cash_amount,count(*) records,YEAR(dh.payment_date) year from dividendhistory dh ");
sb.Append(" where dh.symbol=@symbol group by 4 ");
sb.Append(" )B ");
sb.Append(" on A.symbol=B.symbol and A.year=B.year ");
sb.Append(" order by 2 desc");
strQuery = sb.ToString();
sqlCommand = new MySqlCommand(strQuery, sqlConnection);
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
sqlDataReader = sqlCommand.ExecuteReader();
while(sqlDataReader.Read())
{
DividendLoadElement dividendLoadElement = new DividendLoadElement();
if(!sqlDataReader.IsDBNull(0))dividendLoadElement.Symbol=sqlDataReader.GetString(0);
if(!sqlDataReader.IsDBNull(1))dividendLoadElement.Year=sqlDataReader.GetInt32(1);
if(!sqlDataReader.IsDBNull(2))dividendLoadElement.EPS=sqlDataReader.GetDouble(2);
if(!sqlDataReader.IsDBNull(3))dividendLoadElement.CashAmount=sqlDataReader.GetDouble(3);
if(!sqlDataReader.IsDBNull(4))dividendLoadElement.Payments=sqlDataReader.GetInt32(4);
if(!sqlDataReader.IsDBNull(5))dividendLoadElement.DividendLoadPcnt=sqlDataReader.GetDouble(5);
dividendLoadCollection.Add(dividendLoadElement);
}
return dividendLoadCollection;
}
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 CompanyProfiles GetCompanyProfiles(String watchListName)
{
CompanyProfiles companyProfiles=new CompanyProfiles();
MySqlConnection sqlConnection = null;
MySqlDataReader sqlDataReader = null;
MySqlCommand sqlCommand=null;
String strQuery = null;
try
{
StringBuilder sb = new StringBuilder();
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
sb.Append("select wl.symbol,sm.sector,sm.industry,sm.security_type,sm.company,cp.description ");
sb.Append("from portfolio_data.watchlist wl ");
sb.Append("join portfolio_data.watchlists wls on wls.watch_list_id=wl.watch_list_id ");
sb.Append("join market_data.securitymaster sm on sm.symbol=wl.symbol ");
sb.Append("left outer join market_data.companyprofile cp on cp.symbol=wl.symbol ");
sb.Append("where wls.watch_list_name='").Append(watchListName).Append("'");
strQuery = sb.ToString();
sqlCommand = new MySqlCommand(strQuery, sqlConnection);
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
sqlDataReader = sqlCommand.ExecuteReader();
while(sqlDataReader.Read())
{
CompanyProfile companyProfile = new CompanyProfile();
companyProfile.Symbol=sqlDataReader.GetString(0);
if (!sqlDataReader.IsDBNull(1)) companyProfile.Sector = sqlDataReader.GetString(1);
if (!sqlDataReader.IsDBNull(2)) companyProfile.Industry = sqlDataReader.GetString(2);
if (!sqlDataReader.IsDBNull(3)) companyProfile.SecurityType = sqlDataReader.GetString(3);
if (!sqlDataReader.IsDBNull(4)) companyProfile.CompanyName = sqlDataReader.GetString(4).ToUpper();
if (!sqlDataReader.IsDBNull(5)) companyProfile.Description = sqlDataReader.GetString(5);
companyProfiles.Add(companyProfile);
}
return companyProfiles;
}
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 EarningsAnnouncementModel GetEarningsAnnouncement(String symbol)
{
MySqlConnection sqlConnection = null;
MySqlDataReader sqlDataReader = null;
MySqlCommand sqlCommand=null;
EarningsAnnouncementModel earningsAnnouncementModel=null;
String strQuery = null;
try
{
StringBuilder sb = new StringBuilder();
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
sb.Append("select f.symbol,f.asof as last_updated,p.date as pricing_date,p.close,p.open,f.pe,f.peg,(f.pe/f.peg)/100.00 as anticipated_earnings_growth,");
sb.Append("case when f.peg<1 then 'UNDERVALUED' when f.peg>1 then 'OVERVALUED' else 'EQUILIBRIUM' end as peg_valuation,f.next_earnings_date,");
sb.Append("datediff(f.next_earnings_date,curdate())as daysfromtoday,s.company,a.high_target as upside,(a.high_target-p.close)/p.close as upside_pcnt,");
sb.Append("a.low_target as downside,(a.low_target-p.close)/p.close as downside_pcnt,a.date as price_target_asof ");
sb.Append(" from fundamentals f ");
sb.Append(" left outer join securitymaster s on s.symbol=f.symbol ");
sb.Append(" left outer join analystpricetarget a on a.symbol=s.symbol");
sb.Append(" left outer join prices p on a.symbol=p.symbol ");
sb.Append(" where f.symbol='").Append(symbol).Append("' and f.asof=(select max(asof) from fundamentals where symbol='").Append(symbol).Append("')");
sb.Append(" and a.symbol='").Append(symbol).Append("' and a.date=(select max(date) from analystpricetarget where symbol='").Append(symbol).Append("')");
sb.Append(" and p.symbol='").Append(symbol).Append("' and p.date=(select max(date) from prices where symbol='").Append(symbol).Append("')");
strQuery = sb.ToString(); ;
sqlCommand = new MySqlCommand(strQuery, sqlConnection);
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
sqlDataReader = sqlCommand.ExecuteReader();
if (!sqlDataReader.Read()) return null;
earningsAnnouncementModel=new EarningsAnnouncementModel();
if(!sqlDataReader.IsDBNull(0))earningsAnnouncementModel.Symbol = sqlDataReader.GetString(0).ToUpper();
if(!sqlDataReader.IsDBNull(1))earningsAnnouncementModel.FundamentalDate = sqlDataReader.GetDateTime(1);
if(!sqlDataReader.IsDBNull(2))earningsAnnouncementModel.PricingDate = sqlDataReader.GetDateTime(2);
if(!sqlDataReader.IsDBNull(3))earningsAnnouncementModel.LastPrice = sqlDataReader.GetDouble(3);
if(!sqlDataReader.IsDBNull(5))earningsAnnouncementModel.PE = sqlDataReader.GetDouble(5);
if(!sqlDataReader.IsDBNull(6))earningsAnnouncementModel.PEG = sqlDataReader.GetDouble(6);
if(!sqlDataReader.IsDBNull(7))earningsAnnouncementModel.AnticipatedEarningsGrowth = sqlDataReader.GetDouble(7);
if(!sqlDataReader.IsDBNull(8))earningsAnnouncementModel.PEGValuation = sqlDataReader.GetString(8);
if(!sqlDataReader.IsDBNull(9))earningsAnnouncementModel.NextEarningsDate = sqlDataReader.GetDateTime(9);
if(!sqlDataReader.IsDBNull(10))earningsAnnouncementModel.DaysFromToday = sqlDataReader.GetInt32(10);
if(!sqlDataReader.IsDBNull(11))earningsAnnouncementModel.CompanyName = sqlDataReader.GetString(11).ToUpper();
if(!sqlDataReader.IsDBNull(12))earningsAnnouncementModel.Upside = sqlDataReader.GetDouble(12);
if(!sqlDataReader.IsDBNull(13))earningsAnnouncementModel.UpsidePcnt = sqlDataReader.GetDouble(13);
if(!sqlDataReader.IsDBNull(14))earningsAnnouncementModel.Downside = sqlDataReader.GetDouble(14);
if(!sqlDataReader.IsDBNull(15))earningsAnnouncementModel.DownsidePcnt = sqlDataReader.GetDouble(15);
if(!sqlDataReader.IsDBNull(16))earningsAnnouncementModel.PriceTargetDate = sqlDataReader.GetDateTime(16);
if(Utility.IsEpoch(earningsAnnouncementModel.NextEarningsDate))return null;
return earningsAnnouncementModel;
}
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();
}
}
}
}