# Needs IB Gateway or TWS running and logged in, with # "Enable ActiveX and Socket Clients" on and the port matching config.toml. # Daily flow, 09:31-15:45 ET on a trading day: `make bars` (picks up today's # open), `make plan` to review, `make submit` to send MOC orders filled at the close. # Only rebalance sessions (every strategy.rebalance_every from strategy.anchor) # trade; on other days plan and submit say so and do nothing. # With delayed data (market_data_type = 3) today's bar appears ~15 min after the # open, so start after 09:47 ET. RUN = uv run ibkr-quant .PHONY: test universe check gateway bars plan submit fills backtest install-units test: uv run pytest -q universe: $(RUN) universe check: $(RUN) check # On the server: probe the Gateway and restart it if it has lost IBKR's servers. # The trade job passes GATEWAY_ARGS=--history to require historical bars too. gateway: sh deploy/ensure-gateway.sh $(GATEWAY_ARGS) bars: $(RUN) bars plan: $(RUN) rebalance submit: $(RUN) rebalance --submit fills: $(RUN) fills # e.g. make backtest ARGS="--top-n 5 10 20 --every 1 5 --capital 10000" backtest: $(RUN) backtest $(ARGS) # On the server: install the systemd user units from deploy/systemd. The timers # start now; the Gateway is only enabled for boot, so start it by hand # (systemctl --user start ibgateway) once ~/ibc/config.ini has the credentials. install-units: mkdir -p ~/.config/systemd/user cp deploy/systemd/* ~/.config/systemd/user/ systemctl --user daemon-reload systemctl --user enable ibgateway.service systemctl --user enable --now ibkr-quant-trade.timer ibkr-quant-fills.timer ibkr-quant-universe.timer