Skip to content

Commit 38f5cf6

Browse files
committed
Add candle time monotonicity check to BacktestEventTimesAreMonotonicallyIncreasing
1 parent 096e6fe commit 38f5cf6

1 file changed

Lines changed: 22 additions & 3 deletions

File tree

Tests/BacktestingTests.cs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,14 +1032,17 @@ public async Task BacktestEventTimesAreMonotonicallyIncreasing()
10321032
DateTime? lastOrderTime = null;
10331033
DateTime? lastTradeTime = null;
10341034
DateTime? lastPnLTime = null;
1035+
DateTimeOffset? lastCandleTime = null;
10351036

10361037
var tradeTimeErrors = new List<string>();
10371038
var pnlTimeErrors = new List<string>();
10381039
var orderTimeErrors = new List<string>();
1040+
var candleTimeErrors = new List<string>();
10391041

10401042
var orderCount = 0;
10411043
var tradeCount = 0;
10421044
var pnlCount = 0;
1045+
var candleCount = 0;
10431046

10441047
strategy.OrderReceived += (sub, order) =>
10451048
{
@@ -1068,6 +1071,21 @@ public async Task BacktestEventTimesAreMonotonicallyIncreasing()
10681071
lastTradeTime = time;
10691072
};
10701073

1074+
connector.CandleReceived += (sub, candle) =>
1075+
{
1076+
if (candle.State != CandleStates.Finished)
1077+
return;
1078+
1079+
var time = candle.OpenTime;
1080+
candleCount++;
1081+
1082+
if (lastCandleTime.HasValue && time < lastCandleTime.Value)
1083+
{
1084+
candleTimeErrors.Add($"Candle[{candleCount}] OpenTime decreased: {lastCandleTime.Value:O} -> {time:O}");
1085+
}
1086+
lastCandleTime = time;
1087+
};
1088+
10711089
strategy.PnLReceived2 += (s, pf, time, realized, unrealized, commission) =>
10721090
{
10731091
pnlCount++;
@@ -1100,16 +1118,17 @@ public async Task BacktestEventTimesAreMonotonicallyIncreasing()
11001118
Fail("Backtest did not complete in time");
11011119
}
11021120

1103-
var totalEvents = orderCount + tradeCount + pnlCount;
1121+
var totalEvents = orderCount + tradeCount + pnlCount + candleCount;
11041122
IsTrue(totalEvents > 0, "Expected to receive some events");
11051123

1106-
Console.WriteLine($"Events: Orders={orderCount}, Trades={tradeCount}, PnL={pnlCount}");
1124+
Console.WriteLine($"Events: Orders={orderCount}, Trades={tradeCount}, PnL={pnlCount}, Candles={candleCount}");
11071125

1108-
// Check within-type monotonicity for orders, trades, and PnL
1126+
// Check within-type monotonicity for orders, trades, PnL, and candles
11091127
var allErrors = new List<string>();
11101128
allErrors.AddRange(orderTimeErrors);
11111129
allErrors.AddRange(tradeTimeErrors);
11121130
allErrors.AddRange(pnlTimeErrors);
1131+
allErrors.AddRange(candleTimeErrors);
11131132

11141133
if (allErrors.Count > 0)
11151134
{

0 commit comments

Comments
 (0)