ninth version
Deploy / Test, build and deploy (push) Failing after 1m6s

This commit is contained in:
2026-06-08 14:25:44 +00:00
parent e8b7d8e27c
commit 20cc8506ad
21 changed files with 847 additions and 148 deletions
+9 -55
View File
@@ -868,12 +868,13 @@ func (s *Scheduler) sendDailyReport(ctx context.Context, now time.Time, riskStat
}
}
msg := report.ComposeDaily(report.DailyInput{
Date: tradeDate,
Mode: s.cfg.Mode,
Signals: signals,
Positions: positionsList,
Orders: orders,
RiskStatus: riskStatus,
Date: tradeDate,
Mode: s.cfg.Mode,
Signals: signals,
Positions: positionsList,
Orders: orders,
AverageSlipBps: report.AverageAdverseSlippageBps(orders, 0),
RiskStatus: riskStatus,
})
if err := s.svc.Notifier.Report(ctx, msg); err != nil {
return err
@@ -1328,7 +1329,6 @@ func (s Scheduler) riskMetrics(ctx context.Context, now time.Time, portfolio dom
weekStart := today.AddDate(0, 0, -6)
var metrics preTradeMetrics
monthlyPnL := decimal.Zero
var closed []domain.Position
for _, pos := range positionsList {
if pos.Status != domain.PositionExitFilled {
continue
@@ -1347,64 +1347,18 @@ func (s Scheduler) riskMetrics(ctx context.Context, now time.Time, portfolio dom
if !closeDate.Before(monthStart) {
monthlyPnL = monthlyPnL.Add(pos.NetPnL)
}
closed = append(closed, pos)
}
if monthlyPnL.IsNegative() && portfolio.Equity.IsPositive() {
metrics.monthlyDrawdownPct = monthlyPnL.Neg().Div(portfolio.Equity)
}
avg, err := s.averageAdverseSlippageBps(ctx, closed, 10)
orders, err := s.svc.Repo.ListOrders(ctx, s.svc.AccountIDHash, monthStart.AddDate(0, 0, -7), today)
if err != nil {
return preTradeMetrics{}, err
}
metrics.avgSlippageBps10 = avg
metrics.avgSlippageBps10 = report.AverageAdverseSlippageBps(orders, 10)
return metrics, nil
}
func (s Scheduler) averageAdverseSlippageBps(ctx context.Context, positionsList []domain.Position, limit int) (decimal.Decimal, error) {
if limit <= 0 {
return decimal.Zero, nil
}
sort.Slice(positionsList, func(i, j int) bool {
return positionCloseTime(positionsList[i]).After(positionCloseTime(positionsList[j]))
})
signalsByDate := make(map[string][]domain.Signal)
var values []decimal.Decimal
for _, pos := range positionsList {
key := tradingDate(pos.OpenTradeDate).Format("2006-01-02")
signals, ok := signalsByDate[key]
if !ok {
var err error
signals, err = s.svc.Repo.ListSignals(ctx, tradingDate(pos.OpenTradeDate))
if err != nil && !errors.Is(err, sql.ErrNoRows) {
return decimal.Zero, err
}
signalsByDate[key] = signals
}
for _, sig := range signals {
if sig.InstrumentUID != pos.InstrumentUID || sig.Decision != domain.DecisionEnter {
continue
}
adverse := sig.NetEdgeBps.Sub(pos.RealizedEdgeBps)
if adverse.IsNegative() {
adverse = decimal.Zero
}
values = append(values, adverse)
break
}
if len(values) == limit {
break
}
}
if len(values) == 0 {
return decimal.Zero, nil
}
sum := decimal.Zero
for _, value := range values {
sum = sum.Add(value)
}
return sum.Div(decimal.NewFromInt(int64(len(values)))), nil
}
func positionCloseTime(pos domain.Position) time.Time {
if pos.ClosedAt != nil {
return pos.ClosedAt.UTC()