Add more tests + Log pnl for each backtest

This commit is contained in:
2025-11-14 13:12:04 +07:00
parent 2548e9b757
commit d341ee05c9
11 changed files with 4163 additions and 97 deletions

View File

@@ -16,7 +16,6 @@
<PackageReference Include="Moq" Version="4.20.70"/>
<PackageReference Include="MSTest.TestAdapter" Version="3.3.1"/>
<PackageReference Include="MSTest.TestFramework" Version="3.3.1"/>
<PackageReference Include="xunit" Version="2.8.0"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

View File

@@ -0,0 +1,108 @@
using Managing.Domain.Shared.Helpers;
using Managing.Domain.Trades;
using Managing.Domain.Users;
using Xunit;
using static Managing.Common.Enums;
namespace Managing.Application.Tests;
public class TradingBoxAgentSummaryMetricsTests
{
[Fact]
public void CalculateAgentSummaryMetrics_AggregatesPositionsCorrectly()
{
var positions = new List<Position>
{
CreatePosition(
openPrice: 100m,
quantity: 2m,
direction: TradeDirection.Long,
realizedPnL: 10m,
netPnL: 8m,
uiFees: 1m,
gasFees: 1m,
stopLossPrice: 95m,
stopLossStatus: TradeStatus.Filled,
takeProfitPrice: 110m,
takeProfitStatus: TradeStatus.Filled),
CreatePosition(
openPrice: 200m,
quantity: 1m,
direction: TradeDirection.Long,
realizedPnL: -5m,
netPnL: -6m,
uiFees: 0.5m,
gasFees: 0.5m,
stopLossPrice: 210m,
stopLossStatus: TradeStatus.Cancelled,
takeProfitPrice: 190m,
takeProfitStatus: TradeStatus.Cancelled)
};
var metrics = TradingBox.CalculateAgentSummaryMetrics(positions);
Assert.Equal(5m, metrics.TotalPnL);
Assert.Equal(3m, metrics.TotalFees);
Assert.Equal(2m, metrics.NetPnL);
Assert.Equal(0.5m, metrics.TotalROI);
Assert.Equal(810m, metrics.TotalVolume);
Assert.Equal(400m, metrics.Collateral);
Assert.Equal(1, metrics.Wins);
Assert.Equal(1, metrics.Losses);
}
private static Position CreatePosition(decimal openPrice, decimal quantity, TradeDirection direction,
decimal realizedPnL, decimal netPnL, decimal uiFees, decimal gasFees,
decimal stopLossPrice, TradeStatus stopLossStatus, decimal takeProfitPrice,
TradeStatus takeProfitStatus)
{
var position = new Position(
Guid.NewGuid(),
accountId: 1,
originDirection: direction,
ticker: Ticker.BTC,
moneyManagement: new LightMoneyManagement
{
Name = "unit-test",
Timeframe = Timeframe.OneHour,
StopLoss = 0.02m,
TakeProfit = 0.04m,
Leverage = 1m
},
initiator: PositionInitiator.User,
date: DateTime.UtcNow,
user: new User { Id = 1, Name = "tester" });
position.Status = PositionStatus.Finished;
position.Open = BuildTrade(direction, TradeStatus.Filled, openPrice, quantity);
position.StopLoss = BuildTrade(direction == TradeDirection.Long ? TradeDirection.Short : TradeDirection.Long,
stopLossStatus, stopLossPrice, quantity);
position.TakeProfit1 = BuildTrade(direction == TradeDirection.Long ? TradeDirection.Short : TradeDirection.Long,
takeProfitStatus, takeProfitPrice, quantity);
position.ProfitAndLoss = new ProfitAndLoss
{
Realized = realizedPnL,
Net = netPnL
};
position.UiFees = uiFees;
position.GasFees = gasFees;
return position;
}
private static Trade BuildTrade(TradeDirection direction, TradeStatus status, decimal price, decimal quantity)
{
return new Trade(
date: DateTime.UtcNow,
direction: direction,
status: status,
tradeType: TradeType.Market,
ticker: Ticker.BTC,
quantity: quantity,
price: price,
leverage: 1m,
exchangeOrderId: Guid.NewGuid().ToString(),
message: "unit-trade");
}
}