@@ -1,11 +1,11 @@
using Managing.Application.Abstractions ;
using Managing.Application.Abstractions.Repositories ;
using Managing.Application.Abstractions.Services ;
using Managing.Application.Bots ;
using Managing.Core ;
using Managing.Core.FixedSizedQueue ;
using Managing.Domain.Accounts ;
using Managing.Domain.Backtests ;
using Managing.Domain.Bots ;
using Managing.Domain.Candles ;
using Managing.Domain.MoneyManagements ;
using Managing.Domain.Scenarios ;
@@ -86,10 +86,10 @@ namespace Managing.Application.Backtesting
var scalpingBot = _botFactory . CreateBacktestScalpingBot ( config ) ;
scalpingBot . LoadScenario ( scenario . Name ) ;
scalpingBot . User = user ;
await scalpingBot . LoadAccount ( ) ;
var candles = initialCandles ? ? GetCandles ( account , ticker , timeframe , startDate , endDate ) ;
var result = GetBacktestingResult ( ticker , scenario , timeframe , scalpingBot , candles , balance , account ,
moneyManagement ) ;
var result = GetBacktestingResult ( config , scalpingBot , candles ) ;
if ( user ! = null )
{
@@ -141,11 +141,11 @@ namespace Managing.Application.Backtesting
var flippingBot = _botFactory . CreateBacktestFlippingBot ( config ) ;
flippingBot . LoadScenario ( scenario . Name ) ;
flippingBot . User = user ;
await flippingBot . LoadAccount ( ) ;
var candles = initialCandles ? ? GetCandles ( account , ticker , timeframe , startDate , endDate ) ;
var result = GetBacktestingResult ( ticker , scenario , timeframe , flippingBot , candles , balance , account ,
moneyManagement ) ;
var result = GetBacktestingResult ( config , flippingBot , candles ) ;
if ( user ! = null )
{
@@ -193,10 +193,10 @@ namespace Managing.Application.Backtesting
var bot = _botFactory . CreateBacktestScalpingBot ( config ) ;
bot . LoadScenario ( scenario . Name ) ;
bot . User = user ;
await bot . LoadAccount ( ) ;
var result = GetBacktestingResult ( ticker , scenario , timeframe , bot , candles , balance , account ,
moneyManagement ) ;
var result = GetBacktestingResult ( config , bot , candles ) ;
if ( user ! = null )
{
@@ -235,10 +235,10 @@ namespace Managing.Application.Backtesting
var bot = _botFactory . CreateBacktestFlippingBot ( config ) ;
bot . LoadScenario ( scenario . Name ) ;
bot . User = user ;
await bot . LoadAccount ( ) ;
var result = GetBacktestingResult ( ticker , scenario , timeframe , bot , candles , balance , account ,
moneyManagement ) ;
var result = GetBacktestingResult ( config , bot , candles ) ;
if ( user ! = null )
{
@@ -264,21 +264,16 @@ namespace Managing.Application.Backtesting
}
private Backtest GetBacktestingResult (
Ticker ticker ,
Scenario scenario ,
Timeframe timeframe ,
TradingBotConfig config ,
ITradingBot bot ,
List < Candle > candles ,
decimal balance ,
Account account ,
MoneyManagement moneyManagement )
List < Candle > candles )
{
if ( candles = = null | | candles . Count = = 0 )
{
throw new Exception ( "No candle to backtest" ) ;
}
bot . WalletBalances . Add ( candles . FirstOrDefault ( ) . Date , b alance) ;
bot . WalletBalances . Add ( candles . FirstOrDefault ( ) . Date , config . BotTradingB alance) ;
foreach ( var candle in candles )
{
bot . OptimizedCandles . Enqueue ( candle ) ;
@@ -294,9 +289,10 @@ namespace Managing.Application.Backtesting
var finalPnl = bot . GetProfitAndLoss ( ) ;
var winRate = bot . GetWinRate ( ) ;
var optimizedMoneyManagement = TradingBox . GetBestMoneyManagement ( candles , bot . Positions , moneyManagement ) ;
var optimizedMoneyManagement =
TradingBox . GetBestMoneyManagement ( candles , bot . Positions , config . MoneyManagement ) ;
var stats = TradingHelpers . GetStatistics ( bot . WalletBalances ) ;
var growthPercentage = TradingHelpers . GetGrowthFromInitalBalance ( b alance, finalPnl ) ;
var growthPercentage = TradingHelpers . GetGrowthFromInitalBalance ( config . BotTradingB alance, finalPnl ) ;
var hodlPercentage = TradingHelpers . GetHodlPercentage ( candles [ 0 ] , candles . Last ( ) ) ;
var scoringParams = new BacktestScoringParams (
@@ -313,8 +309,7 @@ namespace Managing.Application.Backtesting
var score = BacktestScorer . CalculateTotalScore ( scoringParams ) ;
var result = new Backtest ( ticker , scenario . Name , bot . Positions , bot . Signals . ToList ( ) , timeframe , candles ,
bot . Config . BotType , account . Name )
var result = new Backtest ( config , bot . Positions , bot . Signals . ToList ( ) , candles )
{
FinalPnl = finalPnl ,
WinRate = winRate ,
@@ -324,7 +319,6 @@ namespace Managing.Application.Backtesting
WalletBalances = bot . WalletBalances . ToList ( ) ,
Statistics = stats ,
OptimizedMoneyManagement = optimizedMoneyManagement ,
MoneyManagement = moneyManagement ,
StrategiesValues = AggregateValues ( strategiesValues , bot . StrategiesValues ) ,
Score = score
} ;
@@ -430,9 +424,9 @@ namespace Managing.Application.Backtesting
{
var candles = await _exchangeService . GetCandlesInflux (
user . Accounts . First ( ) . Exchange ,
backtest . Ticker ,
backtest . Config . Ticker,
backtest . StartDate ,
backtest . Timeframe ,
backtest . Config . Timeframe,
backtest . EndDate ) ;
if ( candles ! = null & & candles . Count > 0 )
@@ -465,14 +459,15 @@ namespace Managing.Application.Backtesting
try
{
// Get the account
var account = new Account { Name = backtest . AccountName , Exchange = TradingExchanges . Binance } ;
var account = new Account
{ Name = backtest . Config . AccountName , Exchange = TradingExchanges . Evm } ;
// Use the stored start and end dates to retrieve candles
var candles = _exchangeService . GetCandlesInflux (
account . Exchange ,
backtest . Ticker ,
backtest . Config . Ticker,
backtest . StartDate ,
backtest . Timeframe ,
backtest . Config . Timeframe,
backtest . EndDate ) . Result ;
if ( candles ! = null & & candles . Count > 0 )