Add more tests + Log pnl for each backtest
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user