Files
managing-apps/src/Managing.Application.Tests/IndicatorTests.cs
Oda 422fecea7b 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
2025-07-27 20:42:17 +07:00

221 lines
8.9 KiB
C#

using Managing.Application.Abstractions.Services;
using Managing.Domain.Accounts;
using Managing.Domain.Strategies.Signals;
using Managing.Domain.Strategies.Trends;
using Xunit;
using static Managing.Common.Enums;
namespace Managing.Application.Tests
{
public class IndicatorTests
{
private readonly IExchangeService _exchangeService;
public IndicatorTests()
{
_exchangeService = TradingBaseTests.GetExchangeService();
}
[Theory]
[InlineData(TradingExchanges.Binance, Ticker.ADA, Timeframe.OneDay)]
public void Should_Return_Signal_On_Rsi_BullishDivergence2(TradingExchanges exchange, Ticker ticker,
Timeframe timeframe)
{
var account = GetAccount(exchange);
// Arrange
var rsiStrategy = new RsiDivergenceIndicator("unittest", 5);
var candles = _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(-50), timeframe).Result;
var resultSignal = new List<LightSignal>();
// Act
foreach (var candle in candles)
{
rsiStrategy.Candles.Enqueue(candle);
var signals = rsiStrategy.Run();
}
if (rsiStrategy.Signals != null && rsiStrategy.Signals.Count > 0)
resultSignal.AddRange(rsiStrategy.Signals);
// Assert
Assert.IsType<List<LightSignal>>(resultSignal);
Assert.Contains(resultSignal, s => s.Direction == TradeDirection.Long);
}
private static Account GetAccount(TradingExchanges exchange)
{
return new Account()
{
Exchange = exchange
};
}
[Theory]
[InlineData(TradingExchanges.Binance, Ticker.ADA, Timeframe.OneDay)]
public void Shoud_Return_Signal_On_Rsi_BearishDivergence(TradingExchanges exchange, Ticker ticker,
Timeframe timeframe)
{
// Arrange
var account = GetAccount(exchange);
var rsiStrategy = new RsiDivergenceIndicator("unittest", 5);
var candles = _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(-50), timeframe).Result;
var resultSignal = new List<LightSignal>();
// Act
foreach (var candle in candles)
{
rsiStrategy.Candles.Enqueue(candle);
var signals = rsiStrategy.Run();
}
if (rsiStrategy.Signals != null && rsiStrategy.Signals.Count > 0)
resultSignal.AddRange(rsiStrategy.Signals);
// Assert
Assert.IsType<List<LightSignal>>(resultSignal);
Assert.Contains(resultSignal, s => s.Direction == TradeDirection.Short);
}
[Theory]
[InlineData(TradingExchanges.Ftx, Ticker.ADA, Timeframe.OneDay, -500)]
public async Task Shoud_Return_Signal_On_Macd_Cross(TradingExchanges exchange, Ticker ticker,
Timeframe timeframe, int days)
{
// Arrange
var account = GetAccount(exchange);
var rsiStrategy = new MacdCrossIndicator("unittest", 12, 26, 9);
var candles = await _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(days), timeframe);
var resultSignal = new List<LightSignal>();
// Act
foreach (var candle in candles)
{
rsiStrategy.Candles.Enqueue(candle);
var signals = rsiStrategy.Run();
}
if (rsiStrategy.Signals != null && rsiStrategy.Signals.Count > 0)
resultSignal.AddRange(rsiStrategy.Signals);
// Assert
Assert.IsType<List<LightSignal>>(resultSignal);
Assert.Contains(resultSignal, s => s.Direction == TradeDirection.Short);
Assert.Contains(resultSignal, s => s.Direction == TradeDirection.Long);
}
[Theory]
[InlineData(TradingExchanges.Ftx, Ticker.ADA, Timeframe.OneDay, -500)]
public void Shoud_Return_Signal_On_SuperTrend(TradingExchanges exchange, Ticker ticker, Timeframe timeframe,
int days)
{
// Arrange
var account = GetAccount(exchange);
var superTrendStrategy = new SuperTrendIndicator("unittest", 10, 3);
var candles = _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(days), timeframe).Result;
var resultSignal = new List<LightSignal>();
// Act
foreach (var candle in candles)
{
superTrendStrategy.Candles.Enqueue(candle);
var signals = superTrendStrategy.Run();
}
if (superTrendStrategy.Signals != null && superTrendStrategy.Signals.Count > 0)
resultSignal.AddRange(superTrendStrategy.Signals);
// Assert
Assert.IsType<List<LightSignal>>(resultSignal);
Assert.Contains(resultSignal, s => s.Direction == TradeDirection.Short);
Assert.Contains(resultSignal, s => s.Direction == TradeDirection.Long);
}
[Theory]
[InlineData(TradingExchanges.Ftx, Ticker.ADA, Timeframe.OneDay, -500)]
public void Shoud_Return_Signal_On_ChandelierExist(TradingExchanges exchange, Ticker ticker,
Timeframe timeframe, int days)
{
// Arrange
var account = GetAccount(exchange);
var chandelierExitStrategy = new ChandelierExitIndicator("unittest", 22, 3);
var candles = _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(days), timeframe, false)
.Result;
var resultSignal = new List<LightSignal>();
// Act
foreach (var candle in candles)
{
chandelierExitStrategy.Candles.Enqueue(candle);
var signals = chandelierExitStrategy.Run();
}
if (chandelierExitStrategy.Signals is { Count: > 0 })
resultSignal.AddRange(chandelierExitStrategy.Signals);
// Assert
Assert.IsType<List<LightSignal>>(resultSignal);
Assert.Contains(resultSignal, s => s.Direction == TradeDirection.Short);
Assert.Contains(resultSignal, s => s.Direction == TradeDirection.Long);
}
[Theory]
[InlineData(TradingExchanges.Ftx, Ticker.ADA, Timeframe.OneDay, -500)]
public void Shoud_Return_Signal_On_EmaTrend(TradingExchanges exchange, Ticker ticker, Timeframe timeframe,
int days)
{
// Arrange
var account = GetAccount(exchange);
var emaTrendSrategy = new EmaTrendIndicator("unittest", 200);
var candles = _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(days), timeframe).Result;
var resultSignal = new List<LightSignal>();
// Act
foreach (var candle in candles)
{
emaTrendSrategy.Candles.Enqueue(candle);
var signals = emaTrendSrategy.Run();
}
if (emaTrendSrategy.Signals != null && emaTrendSrategy.Signals.Count > 0)
resultSignal.AddRange(emaTrendSrategy.Signals);
// Assert
Assert.IsType<List<LightSignal>>(resultSignal);
Assert.Contains(resultSignal, s => s.Direction == TradeDirection.Short);
Assert.Contains(resultSignal, s => s.Direction == TradeDirection.Long);
}
[Theory]
[InlineData(TradingExchanges.Evm, Ticker.BTC, Timeframe.FifteenMinutes, -50)]
public void Shoud_Return_Signal_On_StochRsi(TradingExchanges exchange, Ticker ticker, Timeframe timeframe,
int days)
{
// Arrange
var account = GetAccount(exchange);
var stochRsiStrategy = new StochRsiTrendIndicator("unittest", 14, 14, 3, 1);
var candles = _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(days), timeframe).Result;
var resultSignal = new List<LightSignal>();
// var json = JsonConvert.SerializeObject(candles);
// File.WriteAllText($"{ticker.ToString()}-{timeframe.ToString()}-candles.json", json);
// var json2 = FileHelpers.ReadJson<List<Candle>>($"{ticker.ToString()}-{timeframe.ToString()}-candles.json");
// Act
foreach (var candle in candles)
{
stochRsiStrategy.Candles.Enqueue(candle);
var signals = stochRsiStrategy.Run();
}
if (stochRsiStrategy.Signals != null && stochRsiStrategy.Signals.Count > 0)
resultSignal.AddRange(stochRsiStrategy.Signals);
// Assert
Assert.IsType<List<LightSignal>>(resultSignal);
Assert.Contains(resultSignal, s => s.Direction == TradeDirection.Short);
Assert.Contains(resultSignal, s => s.Direction == TradeDirection.Long);
}
}
}