On 2026-10-13 the 09:53 ET run placed six MOC orders and failed: the paper
account reports MOC orders as PendingSubmit until the closing auction and sent
no acknowledgement within 30 s, so confirm_orders treated them as rejected.
IBKR listed all six with permanent ids and filled them at the close, as it did
the 14 PendingSubmit orders of 2026-09-29. Every retry then stopped at "6 open
orders already exist", and after 15:45 ET at the order window, and the start
limit's 6-hour window reset at 15:50 ET, so the job restarted every 10 minutes
into the evening (42 restarts by 17:28 ET).
- confirm_orders accepts a PendingSubmit order once IBKR lists it with a
permanent id, re-reading this client's open orders every 5 s for up to 60 s.
- rebalance --submit succeeds without sending anything when every open order
comes from today's runs and IBKR still holds every order those runs sent;
a missing one still fails.
- The trade unit skips starts after 15:45 ET (ExecCondition), which systemd
does not restart.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On 2026-10-12 the Gateway answered account requests but every bar request
timed out from 09:50 to 10:24 ET: make gateway reported OK, so the Gateway was
never restarted, and six retries 5 minutes apart gave up after 35 minutes. The
data came back only with the Gateway's daily restart.
ibkr-quant gateway --history also requires SPY daily bars within 30 s; the
trade job's ExecStartPre passes it, so ensure-gateway.sh restarts a Gateway
whose data farm is down. The trade job now retries every 10 minutes until
about 15:30 ET (34 starts in 6 h) instead of giving up after 35 minutes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Under quant-trading's PIT research engine (S&P 500 members 2006-2026,
10 bp), overnight_recovery_top10 filled at the next close beat the
daily UpCap+MomGap by 10.5%/yr (paired Newey-West t 2.44) at 3x instead
of 29x yearly turnover. UpCap+MomGap was a CN champion there, and its
daily variant was never picked for the US book.
- strategy: overnight-return momentum (12m skip 1m) + distance from the
126-day low, ported from strategies/robust_momentum.py; top 10 equal
weight, a held name stays while ranked within 30. Scores and picks
match RobustMomentumStrategy on the IB bars (25 rebalances, 0 diffs).
- rebalance: every 10 sessions from strategy.anchor (2026-09-29), on
completed sessions through yesterday's close, MOC at today's close;
other sessions do nothing and weights drift.
- backtest trades only on rebalance sessions, like the live loop.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
On 2026-09-29 Gateway lost its connection, failed the reconnect's SSL
handshake and sat on an error dialog for 9 hours with its API port open:
clients connected, every startup request timed out, and systemd never
restarted it because java kept running.
- Broker connects with raiseSyncErrors, so a failed startup sync exits
instead of continuing with an empty portfolio(), which rebalance would
read as holding nothing.
- `ibkr-quant gateway` probes the Gateway under its own health_client_id.
- deploy/ensure-gateway.sh (`make gateway`) probes, waits a minute for a
self-reconnect, then restarts ibgateway.service and waits for it.
- The trade and fills units run `make gateway` as ExecStartPre; fills
now retries on failure like trade does.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
IBC clears JAVA_TOOL_OPTIONS before launching java. Also point the
service's http(s)/all proxy variables at 7892 instead of the user
manager's 7890.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
deploy/systemd holds an IB Gateway service (IBC under Xvfb, paper) and
timers for the 09:50 ET rebalance, 16:15 ET fills, and a weekly
constituents refresh; make install-units installs them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>