Files
marketdata/MarketDataLib/Generator/Indicators/BandBreakIndicator.cs
2024-02-22 14:52:53 -05:00

65 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MarketData.Numerical;
using MarketData.MarketDataModel;
using MarketData.DataAccess;
using MarketData.Cache;
using MarketData.Utils;
namespace MarketData.Generator.Indicators
{
// ***********************************************************************************
public class BandBreakIndicator
{
private BandBreakIndicator()
{
}
// This Indicator determines if a high price exceeds the K band (+2SSD) of the bollinger band over the past "dayCount" days.
// If high price breaks the K band then we consider that to be a true indication.
public static bool IsUpperBandBreakHigh(String symbol,DateTime pricingDate,int dayCount=20)
{
bool isBandBreak=false;
int pricingDays=dayCount*4;
if(pricingDays<60)pricingDays=60;
Prices prices=GBPriceCache.GetInstance().GetPrices(symbol,pricingDate,pricingDays);
if(null==prices || 0==prices.Count)
{
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("*** IsUpperBandBreakHigh: Failed to retrieve prices for {0} on {1} for {2} days. ***",symbol,pricingDate.ToShortDateString(),pricingDays));
return isBandBreak;
}
BollingerBands bollingerBands=BollingerBandGenerator.GenerateBollingerBands(prices);
if(null==bollingerBands)return false;
bollingerBands=new BollingerBands(bollingerBands.Take(dayCount).ToList());
BollingerBandElement item=bollingerBands.Where(x => x.High > x.K).FirstOrDefault();
if(null!=item)isBandBreak=true;
return isBandBreak;
}
// This Indicator determines if a close price is equal to or less than the L band (-2SSD) of the bollinger band over the past "dayCount" days.
// If close price breaks or is equal to the L band then we consider that to be a true indication.
// If there is a violation then the date of the violation is return otherwise we return Epoch
public static DateTime IsLowerBandBreakClose(String symbol,DateTime pricingDate,int dayCount=20)
{
DateTime bandBreakDate=Utility.Epoch;
int pricingDays=dayCount*4;
if(pricingDays<60)pricingDays=60;
Prices prices=GBPriceCache.GetInstance().GetPrices(symbol,pricingDate,pricingDays);
if(null==prices || 0==prices.Count)
{
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("*** IsLowerBandBreakClose: Failed to retrieve prices for {0} on {1} for {2} days. ***",symbol,pricingDate.ToShortDateString(),pricingDays));
return bandBreakDate;
}
BollingerBands bollingerBands=BollingerBandGenerator.GenerateBollingerBands(prices);
if(null==bollingerBands || bollingerBands.Count<dayCount)return bandBreakDate;
bollingerBands=new BollingerBands(bollingerBands.Take(dayCount).ToList());
BollingerBandElement item=bollingerBands.Where(x => x.Close <= x.L).FirstOrDefault();
if(null!=item)
{
bandBreakDate=item.Date;
}
return bandBreakDate;
}
}
}