* 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
221 lines
8.9 KiB
C#
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);
|
|
}
|
|
}
|
|
} |