skip buy records not covered by selector

This commit is contained in:
2026-07-10 17:16:55 +01:00
parent 15bb408f9f
commit 52949200da
+15 -5
View File
@@ -68,7 +68,8 @@ func BuildReport(ctx context.Context, reader RecordReader, writer ReportWriter,
case <-ctx.Done(): case <-ctx.Done():
return ctx.Err() return ctx.Err()
case <-progTicker.C: case <-progTicker.C:
slog.InfoContext(ctx, "Progress update", slog.InfoContext(
ctx, "Progress update",
slog.Int64("total_records", buysCount+sellsCount), slog.Int64("total_records", buysCount+sellsCount),
slog.Int64("sell_records", sellsCount), slog.Int64("sell_records", sellsCount),
slog.Int64("buy_records", buysCount), slog.Int64("buy_records", buysCount),
@@ -108,10 +109,13 @@ func BuildReport(ctx context.Context, reader RecordReader, writer ReportWriter,
// processRecord either adds buys to the queue or consumes buys from the queue when processing a // processRecord either adds buys to the queue or consumes buys from the queue when processing a
// sell record. // sell record.
// Selectors are only applied on sells for performance reasons. It's much cheaper to just accumulate //
// buys and only actually inspect a record once a sell happens due to potential network requests to // NOTE: Selectors are only applied when processing sell records for performance reasons. It's much
// cheaper to just accumulate buys and only actually inspect any records once a sell happens. This
// avoids potential network requests to for every single record.
func processRecord(ctx context.Context, q *FillerQueue, rec Record, sel Selector, writer ReportWriter) error { func processRecord(ctx context.Context, q *FillerQueue, rec Record, sel Selector, writer ReportWriter) error {
slog.Debug("Report: processing record", slog.Debug(
"Report: processing record",
slog.String("symbol", rec.Symbol()), slog.String("symbol", rec.Symbol()),
slog.String("side", rec.Kind().String()), slog.String("side", rec.Kind().String()),
) )
@@ -122,7 +126,8 @@ func processRecord(ctx context.Context, q *FillerQueue, rec Record, sel Selector
case KindSell: case KindSell:
if !sel(rec) { if !sel(rec) {
slog.Debug("Report: skipping record", slog.Debug(
"Report: skipping record",
slog.String("symbol", rec.Symbol()), slog.String("symbol", rec.Symbol()),
slog.String("side", rec.Kind().String()), slog.String("side", rec.Kind().String()),
) )
@@ -137,6 +142,11 @@ func processRecord(ctx context.Context, q *FillerQueue, rec Record, sel Selector
return ErrInsufficientBoughtVolume return ErrInsufficientBoughtVolume
} }
// Since we don't apply selectors while processing buys we need to apply them here.
if !sel(buy) {
continue
}
matchedQty, filled := buy.Fill(unmatchedQty) matchedQty, filled := buy.Fill(unmatchedQty)
if filled { if filled {