Add indicators to backtest and bot (#14)

* Add indicators to backtest and bot

* Remove
This commit is contained in:
Oda
2025-02-28 00:53:25 +07:00
committed by GitHub
parent e0a8347953
commit c715da8a17
30 changed files with 787 additions and 109 deletions

View File

@@ -0,0 +1,18 @@
using Skender.Stock.Indicators;
namespace Managing.Domain.Strategies.Base;
public class StrategiesResultBase
{
public List<EmaResult> Ema { get; set; }
public List<MacdResult> Macd { get; set; }
public List<RsiResult> Rsi { get; set; }
public List<StochResult> Stoch { get; set; }
public List<StochRsiResult> StochRsi { get; set; }
public List<BollingerBandsResult> BollingerBands { get; set; }
public List<ChandelierResult> ChandelierShort { get; set; }
public List<StcResult> Stc { get; set; }
public List<StdDevResult> StdDev { get; set; }
public List<SuperTrendResult> SuperTrend { get; set; }
public List<ChandelierResult> ChandelierLong { get; set; }
}

View File

@@ -1,6 +1,7 @@
using Managing.Core;
using Managing.Domain.Candles;
using Managing.Domain.Shared.Rules;
using Managing.Domain.Strategies.Base;
using Skender.Stock.Indicators;
using static Managing.Common.Enums;
@@ -38,6 +39,15 @@ public class ChandelierExitStrategy : Strategy
}
}
public override StrategiesResultBase GetStrategyValues()
{
return new StrategiesResultBase()
{
ChandelierLong = Candles.GetChandelier(Period.Value, Multiplier.Value, ChandelierType.Long).ToList(),
ChandelierShort = Candles.GetChandelier(Period.Value, Multiplier.Value, ChandelierType.Short).ToList()
};
}
private void GetSignals(ChandelierType chandelierType)
{
var chandelier = Candles.GetChandelier(Period.Value, Multiplier.Value, chandelierType)

View File

@@ -16,6 +16,14 @@ public class EmaCrossStrategy : EmaBaseStrategy
Period = period;
}
public override StrategiesResultBase GetStrategyValues()
{
return new StrategiesResultBase()
{
Ema = Candles.GetEma(Period.Value).ToList()
};
}
public override List<Signal> Run()
{
if (Candles.Count <= Period)

View File

@@ -54,6 +54,14 @@ public class EmaTrendStrategy : EmaBaseStrategy
}
}
public override StrategiesResultBase GetStrategyValues()
{
return new StrategiesResultBase()
{
Ema = Candles.GetEma(Period.Value).ToList()
};
}
public void AddSignal(CandleEma candleSignal, TradeDirection direction, Confidence confidence)
{
var signal = new Signal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,

View File

@@ -1,5 +1,6 @@
using Managing.Core.FixedSizedQueue;
using Managing.Domain.Candles;
using Managing.Domain.Strategies.Base;
using static Managing.Common.Enums;
namespace Managing.Domain.Strategies
@@ -16,6 +17,7 @@ namespace Managing.Domain.Strategies
FixedSizeQueue<Candle> Candles { get; set; }
List<Signal> Run();
StrategiesResultBase GetStrategyValues();
void UpdateCandles(HashSet<Candle> newCandles);
string GetName();
}

View File

@@ -1,6 +1,7 @@
using Managing.Core;
using Managing.Domain.Candles;
using Managing.Domain.Shared.Rules;
using Managing.Domain.Strategies.Base;
using Skender.Stock.Indicators;
using static Managing.Common.Enums;
@@ -58,6 +59,15 @@ public class MacdCrossStrategy : Strategy
}
}
public override StrategiesResultBase GetStrategyValues()
{
return new StrategiesResultBase()
{
Macd = Candles.GetMacd(FastPeriods.Value, SlowPeriods.Value, SignalPeriods.Value).ToList()
};
}
private List<CandleMacd> MapMacdToCandle(List<MacdResult> macd, IEnumerable<Candle> candles)
{
var macdList = new List<CandleMacd>();

View File

@@ -1,5 +1,6 @@
using Managing.Core;
using Managing.Domain.Shared.Rules;
using Managing.Domain.Strategies.Base;
using Skender.Stock.Indicators;
using static Managing.Common.Enums;
using Candle = Managing.Domain.Candles.Candle;
@@ -48,6 +49,14 @@ public class RSIDivergenceConfirmStrategy : Strategy
}
}
public override StrategiesResultBase GetStrategyValues()
{
return new StrategiesResultBase()
{
Rsi = Candles.GetRsi(Period.Value).ToList()
};
}
private void GetLongSignals(List<CandleRsi> candlesRsi)
{
// Set the low and high for first candle

View File

@@ -1,5 +1,6 @@
using Managing.Core;
using Managing.Domain.Shared.Rules;
using Managing.Domain.Strategies.Base;
using Skender.Stock.Indicators;
using static Managing.Common.Enums;
using Candle = Managing.Domain.Candles.Candle;
@@ -51,6 +52,14 @@ public class RSIDivergenceStrategy : Strategy
}
}
public override StrategiesResultBase GetStrategyValues()
{
return new StrategiesResultBase()
{
Rsi = Candles.GetRsi(Period.Value).ToList()
};
}
private void GetLongSignals(List<CandleRsi> candlesRsi)
{
// Set the low and high for first candle

View File

@@ -1,6 +1,7 @@
using Managing.Core;
using Managing.Domain.Candles;
using Managing.Domain.Shared.Rules;
using Managing.Domain.Strategies.Base;
using Skender.Stock.Indicators;
using static Managing.Common.Enums;
@@ -57,6 +58,15 @@ public class STCStrategy : Strategy
}
}
public override StrategiesResultBase GetStrategyValues()
{
var stc = Candles.GetStc(FastPeriods.Value, FastPeriods.Value, SlowPeriods.Value).ToList();
return new StrategiesResultBase
{
Stc = stc
};
}
private List<CandleSct> MapStcToCandle(List<StcResult> stc, IEnumerable<Candle> candles)
{
var sctList = new List<CandleSct>();

View File

@@ -1,6 +1,7 @@
using Managing.Core;
using Managing.Domain.Candles;
using Managing.Domain.Shared.Rules;
using Managing.Domain.Strategies.Base;
using Skender.Stock.Indicators;
using static Managing.Common.Enums;
@@ -50,6 +51,16 @@ public class StDevContext : Strategy
}
}
public override StrategiesResultBase GetStrategyValues()
{
var test = new StrategiesResultBase()
{
StdDev = Candles.GetStdDev(Period.Value).ToList()
};
return test;
}
private List<CandleStDev> MapStDev(List<StdDevResult> stDev, IEnumerable<Candle> candles)
{
var sctList = new List<CandleStDev>();

View File

@@ -1,6 +1,7 @@
using Managing.Core;
using Managing.Domain.Candles;
using Managing.Domain.Shared.Rules;
using Managing.Domain.Strategies.Base;
using Skender.Stock.Indicators;
using static Managing.Common.Enums;
@@ -64,6 +65,15 @@ public class StochRsiTrendStrategy : Strategy
}
}
public override StrategiesResultBase GetStrategyValues()
{
return new StrategiesResultBase()
{
StochRsi = Candles.GetStochRsi(Period.Value, StochPeriods.Value, SignalPeriods.Value, SmoothPeriods.Value)
.ToList()
};
}
private List<CandleStochRsi> MapStochRsiToCandle(List<StochRsiResult> ema, IEnumerable<Candle> candles)
{
var emaList = new List<CandleStochRsi>();

View File

@@ -2,6 +2,7 @@
using Managing.Core.FixedSizedQueue;
using Managing.Domain.Candles;
using Managing.Domain.Scenarios;
using Managing.Domain.Strategies.Base;
using static Managing.Common.Enums;
namespace Managing.Domain.Strategies
@@ -34,6 +35,11 @@ namespace Managing.Domain.Strategies
return new List<Signal>();
}
public virtual StrategiesResultBase GetStrategyValues()
{
return new StrategiesResultBase();
}
public void UpdateCandles(HashSet<Candle> newCandles)
{
if (newCandles == null || newCandles.Count == 0)

View File

@@ -1,6 +1,7 @@
using Managing.Core;
using Managing.Domain.Candles;
using Managing.Domain.Shared.Rules;
using Managing.Domain.Strategies.Base;
using Skender.Stock.Indicators;
using static Managing.Common.Enums;
@@ -60,6 +61,15 @@ public class SuperTrendStrategy : Strategy
}
}
public override StrategiesResultBase GetStrategyValues()
{
return new StrategiesResultBase()
{
SuperTrend = Candles.GetSuperTrend(Period.Value, Multiplier.Value).Where(s => s.SuperTrend.HasValue)
.ToList()
};
}
private List<CandleSuperTrend> MapSuperTrendToCandle(List<SuperTrendResult> superTrend, IEnumerable<Candle> candles)
{
var superTrends = new List<CandleSuperTrend>();

View File

@@ -1,5 +1,6 @@
using Managing.Domain.Candles;
using Managing.Domain.Shared.Rules;
using Managing.Domain.Strategies.Base;
using Managing.Domain.Strategies.Rules;
using static Managing.Common.Enums;
@@ -50,5 +51,10 @@ namespace Managing.Domain.Strategies
return null;
}
}
public override StrategiesResultBase GetStrategyValues()
{
throw new NotImplementedException();
}
}
}