Executor pattern, RobinhoodClient, deferred task scheduler#53
Executor pattern, RobinhoodClient, deferred task scheduler#53IamJasonBian wants to merge 3 commits intomainfrom
Conversation
- Split SafeCashBot into RobinhoodClient (thin broker wrapper) and Executor (execution quality layer: PDT gate, spread checker, fill logger/auditor) - Add Brokerage ABC for dependency inversion - Add TradeTask, ScheduledTask, DeferredTask for Command/Strategy pattern - Executor owns deferred queue; PDT-blocked orders deferred to next trading day - Fix cancel_order_by_id → cancel_order throughout tests and main - Align lot_size and strategy pricing defaults across tests
- Singleton: create() returns cached instance, one login per process - Factory: create() owns env/auth/verify, __init__ is a plain setter - Fix: _execute_stale_refresh passed dry_run kwarg cancel_order doesn't accept - Fix: verbose print blocks in _execute_* now only fire in dry_run; live logging owned by RobinhoodClient - Fix: validate_buy_order accepts buying_power to skip redundant API call; called once upstream in _execute_buy_order - Remove: _compute_btc_correlations, _get_daily_returns, _pearson_from_return_dicts (unused in RobinhoodClient)
Code Review — PR #53Overall: Well-structured refactor splitting Issues
Strengths
Generated by Claude Code |
Follow-up Review — PR #53A few additional items not covered in the initial review:
Generated by Claude Code |
|
Stale PR notice — This PR has been open for 15 days with no new commits since Mar 27. Two code reviews have been posted with actionable items (e.g., Generated by Claude Code |
|
Stale — 4 weeks, no activity since Mar 27. Two prior reviews identified actionable bugs: Generated by Claude Code |
Summary
SafeCashBotintoRobinhoodClient(thin broker wrapper) andExecutor(execution quality layer)BrokerageABC (utils/brokerage.py) for dependency inversion —Executordepends on the interface, not the concrete clientTradeTask/ScheduledTask/DeferredTask(trade_task.py) using Command + Strategy patterns_deferred_queue, drained at top of each engine cyclecancel_order_by_id→cancel_orderacrossmain.pyand all testslot_sizeand strategy pricing defaults so tests match live configTest plan
pytest tests/— all 166 tests pass