171 lines
5.9 KiB
C#
171 lines
5.9 KiB
C#
using BinanceExchange.API.Models.Response;
|
|
using Newtonsoft.Json;
|
|
using SignalsTest;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace SignalsTest
|
|
{
|
|
public class TAReport
|
|
{
|
|
public string pair;
|
|
public int interval;
|
|
[JsonIgnore]
|
|
public KlineCandleStickResponse candle;
|
|
public decimal Close;
|
|
public decimal Open;
|
|
public decimal High;
|
|
public decimal Low;
|
|
public DateTime CloseTime;
|
|
public decimal SMA20;
|
|
public decimal SMA50;
|
|
public decimal SMA200;
|
|
|
|
public decimal EMA7, EMA25, EMA99;
|
|
|
|
public decimal MACD = 0;
|
|
public decimal EMACD = 0;
|
|
|
|
public decimal ATR14;
|
|
public decimal ATR10;
|
|
public decimal AVGDiff = 0;
|
|
|
|
public decimal STHigh;
|
|
public decimal STLow;
|
|
public decimal ST;
|
|
|
|
public decimal RSI = 0;
|
|
|
|
public int TWS =0;
|
|
public int TBC = 0;
|
|
|
|
public bool isHammer,isInverseHammer = false;
|
|
|
|
public decimal Stochastic = 0;
|
|
public decimal StochasticK3 = 0;
|
|
|
|
public bool STUp = false;
|
|
public bool TGOR=false;
|
|
public static TAReport Generate(string _pair, int _interval, List<KlineCandleStickResponse> response, int index, List<TAReport> history)
|
|
{
|
|
TAReport report = new TAReport();
|
|
report.pair = _pair;
|
|
report.interval = _interval;
|
|
report.candle = response[index];
|
|
report.Open = response[index].Open;
|
|
report.Close = response[index].Close;
|
|
report.High = response[index].High;
|
|
report.Low = response[index].Low;
|
|
report.CloseTime = response[index].CloseTime;
|
|
// foreach(int sma in m_SMA)
|
|
// {
|
|
// report.SMAs.Add(sma, Indicators.getSMA(response, index, sma));
|
|
// }
|
|
|
|
// foreach (int ema in m_EMA)
|
|
// {
|
|
// report.SMAs.Add(ema, Indicators.getEMA(response, index, 0, ema));
|
|
// }
|
|
report.SMA20 = Indicators.getSMA(response, index, 20);
|
|
report.SMA50 = Indicators.getSMA(response, index, 50);
|
|
report.SMA200 = Indicators.getSMA(response, index, 200);
|
|
|
|
report.EMA7 = Indicators.getEMA(response, index, 0, 7);
|
|
report.EMA25 = Indicators.getEMA(response, index, 0, 25);
|
|
report.EMA99 = Indicators.getEMA(response, index, 0, 99);
|
|
report.MACD = Indicators.getMACD(response, 12, 26, index);
|
|
|
|
report.RSI = Indicators.getRSI(response, index);
|
|
|
|
if (history == null)
|
|
{
|
|
return report;
|
|
}
|
|
//MACD Signal
|
|
List<decimal> MACDHistory = new List<decimal>();
|
|
List<decimal> ATR10History = new List<decimal>();
|
|
List<decimal> ATR14History = new List<decimal>();
|
|
|
|
foreach (TAReport item in history)
|
|
{
|
|
MACDHistory.Add(item.MACD);
|
|
ATR10History.Add(item.ATR10);
|
|
ATR14History.Add(item.ATR14);
|
|
}
|
|
report.EMACD = Indicators.getEMA(MACDHistory, index, 0, 9);
|
|
|
|
report.ATR10 = Indicators.getATR(response, 10, index, ATR10History);
|
|
report.ATR14 = Indicators.getATR(response, 14, index, ATR14History);
|
|
|
|
// SuperTrend Multiplier
|
|
decimal multiplier = 3;
|
|
|
|
// Basic Upper and Lower Bands
|
|
decimal basicUpperBand = (response[index].High + response[index].Low) / 2 + multiplier * report.ATR14;
|
|
decimal basicLowerBand = (response[index].High + response[index].Low) / 2 - multiplier * report.ATR10;
|
|
|
|
// Initialize Final Upper and Lower Bands
|
|
decimal finalUpperBand = basicUpperBand;
|
|
decimal finalLowerBand = basicLowerBand;
|
|
|
|
// Adjust Final Upper and Lower Bands based on previous history
|
|
if (index > 0)
|
|
{
|
|
finalUpperBand = (history[index - 1].Close <= history[index - 1].STHigh)
|
|
? Math.Min(basicUpperBand, history[index - 1].STHigh)
|
|
: basicUpperBand;
|
|
|
|
finalLowerBand = (history[index - 1].Close >= history[index - 1].STLow)
|
|
? Math.Max(basicLowerBand, history[index - 1].STLow)
|
|
: basicLowerBand;
|
|
}
|
|
|
|
bool currentTrendUp = true;
|
|
|
|
if (index > 0)
|
|
{
|
|
if (history[index - 1].STUp) // If the previous trend was up
|
|
{
|
|
currentTrendUp = (response[index].Close > finalLowerBand); // Price > Final Lower Band => Stay up
|
|
}
|
|
else // If the previous trend was down
|
|
{
|
|
currentTrendUp = (response[index].Close >= finalUpperBand); // Price >= Final Upper Band => Flip to up
|
|
}
|
|
}
|
|
|
|
|
|
// Assign SuperTrend values to the report
|
|
report.STHigh = finalUpperBand;
|
|
report.STLow = finalLowerBand;
|
|
report.STUp = currentTrendUp;
|
|
report.ST = currentTrendUp ? finalLowerBand : finalUpperBand;
|
|
|
|
report.Stochastic = Indicators.getStochastic(response, index);
|
|
report.StochasticK3 = Indicators.getStochasticMA(response, index);
|
|
|
|
report.TGOR= Patterns.GetTGOR(response, index);
|
|
report.TWS = Patterns.GetThreeWhiteSoldiers(response,index);
|
|
report.TBC = Patterns.GetThreeBlackCrows(response, index);
|
|
|
|
report.isHammer = Patterns.isHammer(response[index]);
|
|
report.isInverseHammer = Patterns.isInverseHammer(response[index]);
|
|
return report;
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
public static class CustomExtensions
|
|
{
|
|
|
|
public static string toJson(this TAReport report)
|
|
{
|
|
return JsonConvert.SerializeObject(report, Formatting.Indented);
|
|
}
|
|
} |