Postgres (#30)

* Add postgres

* Migrate users

* Migrate geneticRequest

* Try to fix Concurrent call

* Fix asyncawait

* Fix async and concurrent

* Migrate backtests

* Add cache for user by address

* Fix backtest migration

* Fix not open connection

* Fix backtest command error

* Fix concurrent

* Fix all concurrency

* Migrate TradingRepo

* Fix scenarios

* Migrate statistic repo

* Save botbackup

* Add settings et moneymanagement

* Add bot postgres

* fix a bit more backups

* Fix bot model

* Fix loading backup

* Remove cache market for read positions

* Add workers to postgre

* Fix workers api

* Reduce get Accounts for workers

* Migrate synth to postgre

* Fix backtest saved

* Remove mongodb

* botservice decorrelation

* Fix tradingbot scope call

* fix tradingbot

* fix concurrent

* Fix scope for genetics

* Fix account over requesting

* Fix bundle backtest worker

* fix a lot of things

* fix tab backtest

* Remove optimized moneymanagement

* Add light signal to not use User and too much property

* Make money management lighter

* insert indicators to awaitable

* Migrate add strategies to await

* Refactor scenario and indicator retrieval to use asynchronous methods throughout the application

* add more async await

* Add services

* Fix and clean

* Fix bot a bit

* Fix bot and add message for cooldown

* Remove fees

* Add script to deploy db

* Update dfeeploy script

* fix script

* Add idempotent script and backup

* finish script migration

* Fix did user and agent name on start bot
This commit is contained in:
Oda
2025-07-27 15:42:17 +02:00
committed by GitHub
parent 361bfbf6e8
commit 422fecea7b
294 changed files with 23953 additions and 7272 deletions

View File

@@ -9,15 +9,15 @@ namespace Managing.Domain.Strategies.Context;
public class StDevContext : Indicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public StDevContext(string name, int period) : base(name, IndicatorType.StDev)
{
Signals = new List<Signal>();
Signals = new List<LightSignal>();
Period = period;
}
public override List<Signal> Run()
public override List<LightSignal> Run()
{
if (Candles.Count <= Period)
{
@@ -112,7 +112,7 @@ public class StDevContext : Indicator
private void AddSignal(CandleStDev candleSignal, TradeDirection direction,
Confidence confidence)
{
var signal = new Signal(
var signal = new LightSignal(
MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker),
direction,
confidence,

View File

@@ -16,7 +16,7 @@ namespace Managing.Domain.Strategies
int? SignalPeriods { get; set; }
FixedSizeQueue<Candle> Candles { get; set; }
List<Signal> Run();
List<LightSignal> Run();
IndicatorsResultBase GetIndicatorValues();
void UpdateCandles(HashSet<Candle> newCandles);
string GetName();

View File

@@ -34,9 +34,9 @@ namespace Managing.Domain.Strategies
public int? CyclePeriods { get; set; }
public User User { get; set; }
public virtual List<Signal> Run()
public virtual List<LightSignal> Run()
{
return new List<Signal>();
return new List<LightSignal>();
}
public virtual IndicatorsResultBase GetIndicatorValues()

View File

@@ -0,0 +1,51 @@
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Managing.Core;
using Managing.Domain.Candles;
using static Managing.Common.Enums;
public class LightSignal : ValueObject
{
public LightSignal(Ticker ticker, TradeDirection direction, Confidence confidence, Candle candle, DateTime date,
TradingExchanges exchange, IndicatorType indicatorType, SignalType signalType, string indicatorName)
{
Direction = direction;
Confidence = confidence;
Candle = candle;
Date = date;
Ticker = ticker;
Exchange = exchange;
Status = SignalStatus.WaitingForPosition;
IndicatorType = indicatorType;
IndicatorName = indicatorName;
SignalType = signalType;
Identifier =
$"{indicatorName}-{indicatorType}-{direction}-{ticker}-{candle?.Close.ToString(CultureInfo.InvariantCulture)}-{date:yyyyMMdd-HHmmss}";
}
[Required] public SignalStatus Status { get; set; }
[Required] public TradeDirection Direction { get; }
[Required] public Confidence Confidence { get; set; }
[Required] public Timeframe Timeframe { get; }
[Required] public DateTime Date { get; private set; }
[Required] public Candle Candle { get; }
[Required] public string Identifier { get; }
[Required] public Ticker Ticker { get; }
[Required] public TradingExchanges Exchange { get; set; }
[Required] public IndicatorType IndicatorType { get; set; }
[Required] public SignalType SignalType { get; set; }
[Required] public string IndicatorName { get; set; }
protected override IEnumerable<object> GetEqualityComponents()
{
yield return Direction;
yield return Confidence;
yield return Date;
}
public void SetConfidence(Confidence confidence)
{
Confidence = confidence;
}
}

View File

@@ -1,14 +1,20 @@
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Managing.Core;
using Managing.Domain.Candles;
using Managing.Domain.Users;
using static Managing.Common.Enums;
namespace Managing.Domain.Strategies
{
public class Signal : ValueObject
public class Signal : LightSignal
{
public Signal(Ticker ticker, TradeDirection direction, Confidence confidence, Candle candle, DateTime date,
TradingExchanges exchange, IndicatorType indicatorType, SignalType signalType, string indicatorName,
User user)
: base(ticker, direction, confidence, candle, date, exchange, indicatorType, signalType, indicatorName)
{
User = user;
}
[Required] public SignalStatus Status { get; set; }
[Required] public TradeDirection Direction { get; }
[Required] public Confidence Confidence { get; private set; }
@@ -22,37 +28,5 @@ namespace Managing.Domain.Strategies
[Required] public SignalType SignalType { get; set; }
public User User { get; set; }
[Required] public string IndicatorName { get; set; }
public Signal(Ticker ticker, TradeDirection direction, Confidence confidence, Candle candle, DateTime date,
TradingExchanges exchange, IndicatorType indicatorType, SignalType signalType, string indicatorName,
User user = null)
{
Direction = direction;
Confidence = confidence;
Candle = candle;
Date = date;
Ticker = ticker;
Exchange = exchange;
Status = SignalStatus.WaitingForPosition;
IndicatorType = indicatorType;
User = user;
IndicatorName = indicatorName;
SignalType = signalType;
Identifier =
$"{indicatorName}-{indicatorType}-{direction}-{ticker}-{candle?.Close.ToString(CultureInfo.InvariantCulture)}-{date:yyyyMMdd-HHmmss}";
}
public void SetConfidence(Confidence confidence)
{
Confidence = confidence;
}
protected override IEnumerable<object> GetEqualityComponents()
{
yield return Direction;
yield return Confidence;
yield return Date;
}
}
}

View File

@@ -9,18 +9,18 @@ namespace Managing.Domain.Strategies.Signals;
public class ChandelierExitIndicator : Indicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public ChandelierExitIndicator(string name, int period, double multiplier) : base(name,
IndicatorType.ChandelierExit)
{
Signals = new List<Signal>();
Signals = new List<LightSignal>();
Period = period;
Multiplier = multiplier;
MinimumHistory = 1 + Period.Value;
}
public override List<Signal> Run()
public override List<LightSignal> Run()
{
if (Candles.Count <= MinimumHistory)
{
@@ -106,7 +106,7 @@ public class ChandelierExitIndicator : Indicator
private void AddSignal(CandleChandelier candleSignal, TradeDirection direction,
Confidence confidence)
{
var signal = new Signal(
var signal = new LightSignal(
MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker),
direction,
confidence,

View File

@@ -9,11 +9,11 @@ namespace Managing.Domain.Strategies.Signals;
public class DualEmaCrossIndicator : EmaBaseIndicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public DualEmaCrossIndicator(string name, int fastPeriod, int slowPeriod) : base(name, IndicatorType.DualEmaCross)
{
Signals = new List<Signal>();
Signals = new List<LightSignal>();
FastPeriods = fastPeriod;
SlowPeriods = slowPeriod;
MinimumHistory = Math.Max(fastPeriod, slowPeriod) * 2;
@@ -28,7 +28,7 @@ public class DualEmaCrossIndicator : EmaBaseIndicator
};
}
public override List<Signal> Run()
public override List<LightSignal> Run()
{
if (Candles.Count <= MinimumHistory)
{
@@ -103,7 +103,7 @@ public class DualEmaCrossIndicator : EmaBaseIndicator
private void AddSignal(CandleDualEma candleSignal, TradeDirection direction, Confidence confidence)
{
var signal = new Signal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
var signal = new LightSignal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
candleSignal, candleSignal.Date, candleSignal.Exchange, Type, SignalType, Name);
if (!Signals.Any(s => s.Identifier == signal.Identifier))
{

View File

@@ -8,11 +8,11 @@ namespace Managing.Domain.Strategies.Signals;
public class EmaCrossIndicator : EmaBaseIndicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public EmaCrossIndicator(string name, int period) : base(name, IndicatorType.EmaCross)
{
Signals = new List<Signal>();
Signals = new List<LightSignal>();
Period = period;
}
@@ -24,7 +24,7 @@ public class EmaCrossIndicator : EmaBaseIndicator
};
}
public override List<Signal> Run()
public override List<LightSignal> Run()
{
if (Candles.Count <= Period)
{
@@ -67,7 +67,7 @@ public class EmaCrossIndicator : EmaBaseIndicator
private void AddSignal(CandleEma candleSignal, TradeDirection direction, Confidence confidence)
{
var signal = new Signal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
var signal = new LightSignal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
candleSignal, candleSignal.Date, candleSignal.Exchange, Type, SignalType, Name);
if (!Signals.Any(s => s.Identifier == signal.Identifier))
{

View File

@@ -16,18 +16,18 @@ namespace Managing.Domain.Strategies.Signals;
/// </summary>
public class LaggingSTC : Indicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public LaggingSTC(string name, int cyclePeriods, int fastPeriods, int slowPeriods) : base(name,
IndicatorType.LaggingStc)
{
Signals = new List<Signal>();
Signals = new List<LightSignal>();
FastPeriods = fastPeriods;
SlowPeriods = slowPeriods;
CyclePeriods = cyclePeriods;
}
public override List<Signal> Run()
public override List<LightSignal> Run()
{
if (Candles.Count <= 2 * (SlowPeriods + CyclePeriods))
{
@@ -123,7 +123,7 @@ public class LaggingSTC : Indicator
private void AddSignal(CandleSct candleSignal, TradeDirection direction, Confidence confidence)
{
var signal = new Signal(
var signal = new LightSignal(
MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker),
direction,
confidence,

View File

@@ -9,18 +9,18 @@ namespace Managing.Domain.Strategies.Signals;
public class MacdCrossIndicator : Indicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public MacdCrossIndicator(string name, int fastPeriods, int slowPeriods, int signalPeriods) :
base(name, IndicatorType.MacdCross)
{
Signals = new List<Signal>();
Signals = new List<LightSignal>();
FastPeriods = fastPeriods;
SlowPeriods = slowPeriods;
SignalPeriods = signalPeriods;
}
public override List<Signal> Run()
public override List<LightSignal> Run()
{
if (Candles.Count <= 2 * (SlowPeriods + SignalPeriods))
{
@@ -104,7 +104,7 @@ public class MacdCrossIndicator : Indicator
private void AddSignal(CandleMacd candleSignal, TradeDirection direction,
Confidence confidence)
{
var signal = new Signal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
var signal = new LightSignal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
candleSignal, candleSignal.Date, candleSignal.Exchange, Type, SignalType, Name);
if (!Signals.Any(s => s.Identifier == signal.Identifier))
{

View File

@@ -9,19 +9,19 @@ namespace Managing.Domain.Strategies.Signals;
public class RsiDivergenceConfirmIndicator : Indicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public RsiDivergenceConfirmIndicator(string name, int period) : base(name, IndicatorType.RsiDivergenceConfirm)
{
Period = period;
Signals = new List<Signal>();
Signals = new List<LightSignal>();
}
/// <summary>
/// Get RSI signals
/// </summary>
/// <returns></returns>
public override List<Signal> Run()
public override List<LightSignal> Run()
{
if (Candles.Count <= Period)
{
@@ -232,7 +232,7 @@ public class RsiDivergenceConfirmIndicator : Indicator
private void AddSignal(CandleRsi candleSignal, TradeDirection direction, Confidence confidence)
{
var signal = new Signal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
var signal = new LightSignal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
candleSignal, candleSignal.Date, candleSignal.Exchange, Type, SignalType, Name);
if (!Signals.Any(s => s.Identifier == signal.Identifier))
{

View File

@@ -9,7 +9,7 @@ namespace Managing.Domain.Strategies.Signals;
public class RsiDivergenceIndicator : Indicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public TradeDirection Direction { get; set; }
private const int UpperBand = 70;
private const int LowerBand = 30;
@@ -17,14 +17,14 @@ public class RsiDivergenceIndicator : Indicator
public RsiDivergenceIndicator(string name, int period) : base(name, IndicatorType.RsiDivergence)
{
Period = period;
Signals = new List<Signal>();
Signals = new List<LightSignal>();
}
/// <summary>
/// Get RSI signals
/// </summary>
/// <returns></returns>
public override List<Signal> Run()
public override List<LightSignal> Run()
{
if (!Period.HasValue || Candles.Count <= Period)
{
@@ -205,7 +205,7 @@ public class RsiDivergenceIndicator : Indicator
private void AddSignal(CandleRsi candleSignal, TradeDirection direction)
{
var signal = new Signal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, Confidence.Low,
var signal = new LightSignal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, Confidence.Low,
candleSignal, candleSignal.Date, candleSignal.Exchange, Type, SignalType, Name);
if (Signals.Count(s => s.Identifier == signal.Identifier) < 1)

View File

@@ -9,17 +9,17 @@ namespace Managing.Domain.Strategies.Signals;
public class StcIndicator : Indicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public StcIndicator(string name, int cyclePeriods, int fastPeriods, int slowPeriods) : base(name, IndicatorType.Stc)
{
Signals = new List<Signal>();
Signals = new List<LightSignal>();
FastPeriods = fastPeriods;
SlowPeriods = slowPeriods;
CyclePeriods = cyclePeriods;
}
public override List<Signal> Run()
public override List<LightSignal> Run()
{
if (Candles.Count <= 2 * (SlowPeriods + CyclePeriods))
{
@@ -103,7 +103,7 @@ public class StcIndicator : Indicator
private void AddSignal(CandleSct candleSignal, TradeDirection direction, Confidence confidence)
{
var signal = new Signal(
var signal = new LightSignal(
MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker),
direction,
confidence,

View File

@@ -9,17 +9,17 @@ namespace Managing.Domain.Strategies.Signals;
public class SuperTrendCrossEma : Indicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public SuperTrendCrossEma(string name, int period, double multiplier) : base(name, IndicatorType.SuperTrendCrossEma)
{
Signals = new List<Signal>();
Signals = new List<LightSignal>();
Period = period;
Multiplier = multiplier;
MinimumHistory = 100 + Period.Value;
}
public override List<Signal> Run()
public override List<LightSignal> Run()
{
// Validate sufficient historical data for all indicators
const int emaPeriod = 50;
@@ -169,7 +169,7 @@ public class SuperTrendCrossEma : Indicator
private void AddSignal(CandleSuperTrend candleSignal, TradeDirection direction, Confidence confidence)
{
var signal = new Signal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
var signal = new LightSignal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
candleSignal, candleSignal.Date,
candleSignal.Exchange, Type, SignalType, Name);
if (!Signals.Any(s => s.Identifier == signal.Identifier))

View File

@@ -9,17 +9,17 @@ namespace Managing.Domain.Strategies.Signals;
public class SuperTrendIndicator : Indicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public SuperTrendIndicator(string name, int period, double multiplier) : base(name, IndicatorType.SuperTrend)
{
Signals = new List<Signal>();
Signals = new List<LightSignal>();
Period = period;
Multiplier = multiplier;
MinimumHistory = 100 + Period.Value;
}
public override List<Signal> Run()
public override List<LightSignal> Run()
{
if (Candles.Count <= MinimumHistory)
{
@@ -106,7 +106,7 @@ public class SuperTrendIndicator : Indicator
private void AddSignal(CandleSuperTrend candleSignal, TradeDirection direction, Confidence confidence)
{
var signal = new Signal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
var signal = new LightSignal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
candleSignal, candleSignal.Date,
candleSignal.Exchange, Type, SignalType, Name);
if (!Signals.Any(s => s.Identifier == signal.Identifier))

View File

@@ -16,9 +16,9 @@ namespace Managing.Domain.Strategies.Signals
public TradeDirection Direction { get; }
public override List<Signal> Run()
public override List<LightSignal> Run()
{
var signals = new List<Signal>();
var signals = new List<LightSignal>();
if (Candles.Count <= 3)
{

View File

@@ -8,15 +8,15 @@ namespace Managing.Domain.Strategies.Trends;
public class EmaTrendIndicator : EmaBaseIndicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public EmaTrendIndicator(string name, int period) : base(name, IndicatorType.EmaTrend)
{
Signals = new List<Signal>();
Signals = new List<LightSignal>();
Period = period;
}
public override List<Signal> Run()
public override List<LightSignal> Run()
{
if (Candles.Count <= 2 * Period)
{
@@ -64,7 +64,7 @@ public class EmaTrendIndicator : EmaBaseIndicator
public void AddSignal(CandleEma candleSignal, TradeDirection direction, Confidence confidence)
{
var signal = new Signal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
var signal = new LightSignal(MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker), direction, confidence,
candleSignal, candleSignal.Date, candleSignal.Exchange, Type, SignalType, Name);
if (!Signals.Any(s => s.Identifier == signal.Identifier))
{

View File

@@ -9,7 +9,7 @@ namespace Managing.Domain.Strategies.Trends;
public class StochRsiTrendIndicator : Indicator
{
public List<Signal> Signals { get; set; }
public List<LightSignal> Signals { get; set; }
public StochRsiTrendIndicator(
string name,
@@ -18,14 +18,14 @@ public class StochRsiTrendIndicator : Indicator
int signalPeriod,
int smoothPeriods) : base(name, IndicatorType.StochRsiTrend)
{
Signals = new List<Signal>();
Signals = new List<LightSignal>();
StochPeriods = stochPeriod;
SignalPeriods = signalPeriod;
SmoothPeriods = smoothPeriods;
Period = period;
}
public override List<Signal> Run()
public override List<LightSignal> Run()
{
if (Candles.Count <= 10 * Period + 50)
{
@@ -100,7 +100,7 @@ public class StochRsiTrendIndicator : Indicator
private void AddSignal(CandleStochRsi candleSignal, TradeDirection direction, Confidence confidence)
{
var signal = new Signal(
var signal = new LightSignal(
MiscExtensions.ParseEnum<Ticker>(candleSignal.Ticker),
direction,
confidence,