Swing RSI Capitulation Strategy Control · Research Mode

Strategy Header

identity · status · last backtest
Strategy
Swing RSI Capitulation
4-24h hold · 1.5-3% targets
Mode
LIVE · RUNNING
OKX EEA · signal loop alive
30d Tripwire
POSITIVE_EXTEND
all 3 KPIs clear · sample < 30
Last Backtest
2026-04-21
30d · 12 symbols
Expectancy
+18.35 bp
per probe ($0.13)
PnL (30d)
+$0.0048
20 trades

Strategy Spec

signal · exits · risk · execution
Admission Signal (NEW)
family
RSI mean reversion from capitulation
RSI lookback
60 bars (≈1h equiv)
oversold
RSI < 22 in last 30 bars
trigger
cross up through 30
drift band
−8% ≤ ret_4h ≤ −1%
vol gate
24h range ≥ 3%
cooldown
120 bars (2h) per symbol
Preserved 7-Sprint Stack
fractal regime
≥2/3 scales agree
liquidity inference
score < 0.80
exploration wallet
24h PnL > −$5
pre-probe guard
candle not collapsing
Execution
entry
post-only maker @ best bid · 30m timeout
probe
$0.13 (maker)
add1
$0.10 (maker, +0.5% continuation)
max assembled
$0.23
Exit Stack
TP1
+1.5% · take 75% · maker
BE
+0.02% after TP1 fires
TP2
+3.0% · runner · maker
trail arm
+2.0% · 1.0% giveback
SL
−1.2% · taker market
adverse cap
−2.0% · taker
struct break
close < 4h low − 0.5%
Hold States
mild timeout
12h scratch if flat
max hold
24h hard cap

Swing Tripwire

expectancy-primary · WR secondary
RuleThresholdObserved (30d)Fires
expectancy per probe> 0 bp +18.35 bp clear
TP1 capture rate≥ 40% 45.00% clear
win rate≥ 40% 45.00% clear
sample size≥ 30 trades 20 need more
Verdict: POSITIVE_EXTEND_SAMPLE Extend to 90 days to cross sample threshold → EDGE_CONFIRMED on hold.

Backtest · 30d Canonical (v4)

RSI 22/30 · ret_4h ∈ [−8%, −1%]
Signals
26
Fills
20
77% fill rate
Add1 fired
11
55%
TP1
45%
TP2
15%
Timeouts
0
root cause defeated
Exit Reasons
Reasonn%Maker/Taker
TP2315%maker
TRAIL_STOP15%taker
BE_STOP525%taker
SL525%taker
KILL_STRUCT_BREAK_4H525%taker
SCRATCH_MILD15%taker
TIMEOUT_FLAT00%
Winners hold ~430 min (7h), losers ~250 min (4h). Winners-longer-than-losers ✓ · hold-state logic functioning as designed.

Calibration Trajectory

each pass tightened toward positive
Pass RSI (ovr/trig) ret_4h filter n TP1 WR exp (bp) Verdict
v130 / 35≥ −6% 5317.0%17.0% −60.1DISABLE
v230 / 35≥ −6% 14427.1%31.9% −43.7DISABLE
v325 / 32≥ −6% 8129.6%33.3% −16.6DISABLE
v4 ★ 22 / 30 [−8%, −1%] 20 45.0% 45.0% +18.4 POSITIVE
v5 sens24 / 32[−8%, −1%] 2634.6%34.6% −11.9DISABLE
Each tightening of the signal improved expectancy. v4 converged on positive via deep-oversold RSI + capitulation-band drift filter. v5 sensitivity (loosened RSI by 2 points) dropped expectancy 30 bp — result is parameter-sensitive.

90-Day Validation

in progress · results pending
Full 90d
PENDING
fetching data
Train (first 45d)
PENDING
Test (second 45d)
PENDING
Pass/fail criteria:
  • Full 90d: expectancy > 0 bp across ≥ 50 trades → EDGE_CONFIRMED
  • Train / Test split: both halves must be positive. Positive train + negative test = in-sample fitting, not real edge.
  • Any failure returns the arm to DISABLE and research continues.

Seven-Arm Research History

swing is the first positive
Arm n TP1 Exp (bp) Verdict
CDV baseline (taker, 45-120m) 10,4440.3-1.2% ~−19 DISABLE
CDV probe-press 25140.6% −13.8 DISABLE
CDV probe-harvest (taker) 1,35837.2% −34.4 DISABLE
CDV probe-harvest + maker 2,24333.2% −19.7 DISABLE
CDV confirmed-only (pre-entry gate) 10331.1% −21.2 DISABLE
OFI continuation (1m microstructure) 11215.2% −19.2 DISABLE
Swing RSI capitulation (4-24h) 20 45.0% +18.4 POSITIVE
Every prior arm landed in the −14 to −34 bp band regardless of execution tweaks or signal direction. Widening the horizon from intraday to swing cleared the band for the first time — confirming the "horizon × cost mismatch" diagnosis.

5-LLM Command Layer

research spec · not wired to live engine
Operating principle: Use 5 LLMs as a command layer above the bot. One reads market regime, one finds setups, one controls risk, one builds execution plans, and one learns from finished trades — while the bot itself does the actual trading.
LLM 1 — Regime
every 4h
Job
Decide what market you are in: trend up / trend down / chop / high vol / low vol.
Output contract
REGIME = TREND / CHOP / REVERSAL
ALLOW_TRADING = YES / NO
ALLOW_SYMBOLS = [top symbols only]
Why
Prevents the bot from trading the wrong strategy in the wrong market.
LLM 2 — Signal
on candidate
Job
Read the slower setup and build trade ideas: 4h trend, 1d structure, support/resistance, momentum, mean-reversion condition, funding / market context.
Output contract (per symbol)
side = LONG / SHORT / SKIP
entry_zone = [lo, hi]
invalidation = px
tp1, tp2 = px
confidence = 0..1
Why
Idea generator. Only runs on symbols LLM 1 allows.
LLM 3 — Risk
on idea
Job
Reject bad ideas. Checks: RR too poor, invalidation too wide, symbol weakness, correlation with open trades, daily-loss cap nearness, same-side crowding.
Output contract
verdict = APPROVE / REJECT / REDUCE_SIZE
max_positions = N
daily_risk_state = GREEN / AMBER / RED
Why
Keeps the bot from doing stupid size and duplicate exposure.
LLM 4 — Execution
on approval
Job
Turn approved idea into an exact execution plan: maker-only, entry ladder, timeouts, post-only flags, TP ladder, stop logic, cancel conditions.
Output contract (example)
entry_1 = 30% · entry_2 = 30% · entry_3 = 40%
post_only = YES · timeout = 30m
cancel_if = price_runs_away
tp1 = 50% · tp2 = 30% · runner = 20%
Why
Makes the idea executable by the bot.
LLM 5 — Review / Learning
after each exit + weekly
Job
After trade closes, review what happened. Did signal work? Did execution help or hurt? Did regime match? Was stop too tight? Was TP too far? Should the symbol be downgraded?
Output contract
action = KEEP / DOWNGRADE_SYMBOL / DISABLE_SETUP / ADJUST_THRESHOLD
weekly_report = markdown text rolling up 7 days
Why
This is how the system improves without guessing.
Full bot sequence (one decision cycle)
Step Actor Action Cadence
1BotMarket scan — OHLCV, trend data, symbol stats, volatility, spread/liquidity continuous
2LLM 1 Regime verdict · allow_trading flag · allow_symbols list every 4h
3LLM 2 Build trade ideas only for allowed symbols on candidate signal
4LLM 3 Filter weak / duplicate ideas, set size on each idea
5LLM 4 Convert approved idea into exact order plan on approval
6Bot Place order · manage fills · manage stops · manage TP · cancel if invalid live, no LLM
7LLM 5 Score the trade · update symbol / setup / regime quality after exit + weekly roll-up
Deterministic bot owns
  • exchange connection
  • price ingestion
  • order placement
  • position tracking
  • stop loss
  • take profit
  • daily stop
  • blacklist
  • logging
5 LLMs own
  • regime understanding
  • signal ranking
  • risk filtering
  • execution shaping
  • post-trade learning
Practical rule. Do not let all 5 LLMs vote on every order — slow and messy. Use: LLMs 1-3 before entry, LLM 4 at order-plan time, LLM 5 after exit. That is the clean sequence.
LLM layer implementation status · WIRED 2026-04-21
LLM 1 · Regime
LIVE
anthropic · claude-haiku-4-5
LLM 2 · Signal
LIVE
gemini · gemini-2.5-flash
LLM 3 · Risk
LIVE
mistral · mistral-small-latest
LLM 4 · Execution
LIVE
openrouter · claude-haiku-4-5
LLM 5 · Review
LIVE
anthropic · claude-haiku-4-5
CLI: python openclaw_v1/spot_aggro/llm_sequence/run_sequence.py status · smoke · cycle · review
Artifacts: runtime/llm_sequence/runs/*.json
Note: OpenAI key in .env returns 401 (rotated/stale). Roles reassigned to 4 working providers; OpenAI slot vacant.

Exact Bot Rules

profit ladder · runner · loss rules · sizing · $10 trade
Principle: Sell most at TP1, protect the trade, then let a small remainder run with a trailing stop. Lock profit early · don't close the whole winner too soon · let best trades keep growing · cut weak trades fast.
TP1 · +1.50%
60% off
Sell 60% of position
Move stop on remaining 40% to:
  • entry price, OR
  • entry + 0.20%
TP2 · +2.00%
25% off
If price keeps going and hits +2.00%:
  • Sell 25%
  • Keep last 15% running
Runner · 15%
trail 0.50%
Trailing stop = 0.50% below highest:
  • If price keeps rising → keep holding
  • If price drops 0.50% from peak → exit
Strength filter — before letting the runner keep going
Only allow the bot to keep the runner if at least 3 of 4 are true:
#CheckPass when
1Higher highsprice still making HH on recent bars
2Higher lowsprice still making HL on recent bars
3Buy pressurebuyers still stronger than sellers
4No rejectionno sharp rejection candle / no breakdown
If less than 3 of 4 are true: exit the rest early. Do not wait.
Fast Kill
2 of 4 fire
Exit immediately if any 2 of these happen:
  • Price breaks structure
  • Buyers disappear
  • Momentum dies
  • Price cannot hold above entry
Hard Stop
−0.80%
If price hits −0.80%:
  • Exit full trade
  • No exceptions
  • No waiting for recovery
Entry sizing — for each $10 trade
Probe
$5
initial entry
Add 1
$3
trade confirmed
Add 2
$2
still strong post-TP1 / breakout
LegSizeCondition
Probe$5entry fills (maker-only)
Add 1$3only when trade is confirmed
Add 2$2only when trade is still strong after TP1 zone or breakout continuation
Simple bot logic — full sequence
#ActionTrigger
1Enter with $5 (probe)signal + maker fill
2Add $3 if trade looks strongconfirmation
3Add $2 if still strongTP1 zone / breakout continuation
4At +1.50%, sell 60%TP1 hit
5Move stop to breakeven / small profitright after TP1
6At +2.00%, sell 25%TP2 hit
7Let last 15% run with 0.50% trailing stoppost-TP2 if strength filter passes
8If strength disappears, exit immediatelyany time <3 of 4 strength checks
Implementation status. These exact rules are not yet applied to the simulator. Current sim uses: probe $0.13 / add1 $0.10 (no add2) · TP1 +1.50% take 75% · BE +0.02% · TP2 +3.0% · SL −1.2%. To apply these rules: scale to $10 trade ($5/$3/$2 split), add TP2 +2.00% (take 25%) with 15% runner, drop TP2 from +3.0% to +2.0%, tighten SL from −1.2% to −0.80%, add 3-of-4 strength filter on runner, add 2-of-4 fast-kill. Will regenerate the 30d + 90d backtest after the rule swap.
One-line version: Sell most at TP1, protect the trade, then let a small remainder run with a trailing stop.

Crypto.com Confirmation Layer

second set of eyes · not the main brain
Principle: Use Crypto.com API as a second set of eyes, not as the main brain. OKX stays the execution venue. Crypto.com answers one question only — "is this move real?"
OKX — Primary / Execution
  • WebSocket market data + order-book depth (recommended by OKX)
  • Signal detection
  • Maker-only entry
  • TP / SL / trailing management
  • Position tracking
Crypto.com — Confirmation Only
  • REST + WebSocket: order book, ticker, candles, mark, index, funding, trades
  • Pre-entry truth check
  • Divergence monitoring while in trade
  • Symbol quality scoring
  • Data redundancy (pause if feed glitches)
Entry gate — 3 checks before the bot trades
# Check Pass rule If fails
1 Price direction agreement Both exchanges moving same way skip
2 Order book agreement Both books support the same side skip
3 Divergence check OKX moving AND CDC moving same direction skip (fake move)
Entry rule: Trade only when OKX setup is confirmed by Crypto.com. Fewer trades, higher quality.
A · Cross-exchange truth check
If OKX says "go long" but Crypto.com looks weak, the move may be fake. Block entry.
B · Symbol blacklist
If a symbol keeps showing bad agreement between OKX and Crypto.com, block it for the session.
C · Funding / regime filter
Crypto.com provides funding and mark/index streams. Use them to avoid crowded or distorted perp conditions.
D · Data redundancy
If one exchange feed glitches, the bot pauses instead of trading blind.
Do NOT use it for
  • another random signal
  • another chart
  • another API with no filter logic
Use it FOR
  • confirmation
  • divergence block
  • symbol quality scoring
  • market regime check
Full bot sequence with Crypto.com
Step Actor Action
1OKXscan for setup
2Crypto.comconfirm (direction + book + divergence)
3Gatepass / fail
4OKXexecute maker entry
5Crypto.commonitor divergence while in trade
6Botexit / blacklist if mismatch grows
Most useful rule. If OKX setup appears, but Crypto.com does not confirm price direction or order-book support, do not trade. That is the cleanest upgrade.
Practical constraints (from Crypto.com docs)
ConstraintValueImplication
Market-data WS channel separate from user WS Run on its own connection, not mixed with order-side traffic
Subscription limit 400 per connection Stay under 400 symbols × channels; shard if needed
Heartbeat requirement reply every 30 s Dedicated heartbeat handler — do not share with execution loop
Role dedicated confirmation service Isolate from execution path; pause = skip, not block
Implementation status. Crypto.com candle puller exists in the backtest cache (runtime/backtest/cache/cdc_*_1m.json) and data_puller.fetch_cdc_candles is already implemented. Not yet wired into the swing-rsi live gate — the current backtest runs with pull_cdc=False. Next step: enable CDC fetch in the simulator, add the 3-check entry gate, and re-run 90d validation. WebSocket live-gate layer (divergence monitoring while in trade) is a separate phase.
Layer status
CDC REST candles
AVAILABLE
cache + puller live
CDC entry gate
SPEC
not wired
CDC divergence monitor
SPEC
not wired
CDC WebSocket
SPEC
separate phase
Simple conclusion: Crypto.com API improves your bot by helping it reject fake setups. It should be your confirmation layer, not your main trading layer.

Layer 0 Governance Framework

last-door governor · 3+3 layers · hash-chained
Current State
APPROVED_FOR_PAPER
demo cycle result
L0 Chain
1
verdicts recorded
Test Chain
1
reports recorded
Gov Chain
1
approvals recorded
Testing (L1/L2/L3) measures
Runs numeric checks against hard thresholds. PASS / FAIL / INCONCLUSIVE — deterministic, replayable. No judgement, no discretion.
Governance (G1/G2/G3) judges
Operator-driven APPROVED / REJECTED / HELD on top of test PASS. Cannot APPROVE if test ≠ PASS (hard-preflight). Each layer bound to one maturity step.
Layer 0 ratifies
Final progression authority. Reads evidence, checks artifact pack, emits ONE of 7 verdicts. Hash-chained. No trading, no signals, no orders.
State machine — legal transitions only
RESEARCH → APPROVED_FOR_PAPER → PAPER → APPROVED_FOR_MICRO_LIVE
→ MICRO_LIVE → APPROVED_FOR_SCALE → SCALED_LIVE
safety: any → FROZEN | DISABLED | ROLLED_BACK
Layer 0 verdicts — the ONLY 7 allowed
VerdictEffectAck required
APPROVE_NEXT_LAYERadvance to next maturity stateYES
APPROVE_SCALE_UPMICRO_LIVE → APPROVED_FOR_SCALEYES
HOLD_CURRENT_LAYERstay, no state changeno
REJECT_AND_REWORKsend back to research/testno
FREEZE_STRATEGYany → FROZEN (pause)YES
DISABLE_LIVEany → DISABLED (hard stop)YES
ROLLBACK_TO_SAFE_MODEany → ROLLED_BACKYES
3 Testing × 3 Governance layer pairs
L1 Logic / Decision Truth
Proves logic/LLMs/filters/state machine/fee model/tripwires are correct before live routing.
13 hard checks
expectancy ≥ 0 · TP1 ≥ 40% · walkforward both halves +ve · determinism · LLM contracts · tripwire defined
G1 Research Approval
L2 Execution Truth
Paper + live-connected execution. Proves bot handles real order-lifecycle without fakes.
15 hard checks
maker fill ≥ 50% · 0 orphans · 0 dup orders · slippage ≤ 7bp · CDC feed ≥ 95% healthy · live-paper drift ≤ 8bp
G2 Deployment Approval
L3 Capital Truth
Real capital, micro size. Only layer that gates scale-up.
11 hard checks
realized exp ≥ 0 · DD ≤ $5 · streak ≤ 6 · drift ≤ 10bp · regime match ≥ 60% · 0 tripwire breaches
G3 Capital Approval
Artifact pack — required per progression step
Artifact L1 → Paper L2 → Micro-live L3 → Scale Safety
canonical_config
run_manifest
test_report
governance_verdict
tripwire_sheet
incident_log
audit_trail
exchange_divergence_report
symbol_risk_report
scale_recommendation
rollback_record
Failure model — every failure maps to one L0 verdict
FailureProposed L0 verdict
test_l1_failREJECT_AND_REWORK
test_l2_failREJECT_AND_REWORK
test_l3_failROLLBACK_TO_SAFE_MODE
exchange_feed_driftFREEZE_STRATEGY
okx_cdc_disagreementFREEZE_STRATEGY
orphan_positionDISABLE_LIVE
duplicate_ordersDISABLE_LIVE
tripwire_breach_hardDISABLE_LIVE
daily_loss_cap_hitHOLD_CURRENT_LAYER
live_paper_drift_highROLLBACK_TO_SAFE_MODE
Governance layer implementation status · WIRED 2026-04-21
L0
LIVE
last-door
L1 Test
LIVE
13 checks
G1 Gov
LIVE
research
L2 Test
LIVE
15 checks
G2 Gov
LIVE
deployment
L3 Test
LIVE
11 checks
G3 Gov
LIVE
capital
CLI: python openclaw_v1/spot_aggro/governance_l0/run_governance.py --strategy swing_rsi {status|propose|demo|approve|hold|reject|freeze|disable|rollback|verify}
Artifacts: runtime/governance_l0/artifacts/ and runtime/governance_l0/verdicts/
Blueprint: governance_l0_blueprint_2026-04-21.md

Telegram Notifier

every buy/sell · PnL every 3h
🟢 Every BUY
LIVE
Fires on every entry fill (probe / add1 / add2). Shows symbol, leg, price, size, order_id. Bot calls events.trade_opened(...).
❌ Every SELL
LIVE
Fires on every exit fill (TP1 / TP2 / SL / BE_STOP / TRAIL_STOP / KILL_*). Shows entry→exit, PnL $ + %, hold time, reason. Bot calls events.trade_closed(...).
📈 PnL every 3h
LIVE
Background loop sends rollup every 10800s. Shows last 3h · today (UTC) · since start · WR · best/worst symbol · exit distribution.
Message formats
🟢 BUY · SOLUSDT swing_rsi · leg=probe · LONG price: 160.2 size: $5.00 order: okx-demo-001 17:01:10 UTC
SELL · SOLUSDT swing_rsi · LONG · TP1 entry → exit: 160.2 → 162.6 pnl: +$0.0748 (+1.50%) size: $5.00 hold: 7h 15m 17:01:18 UTC
SELL · DOGEUSDT swing_rsi · LONG · SL entry → exit: 0.148 → 0.1458 pnl: −$0.0446 (−1.49%) size: $3.00 hold: 3h 17:01:21 UTC
📈 PnL Report · 3h swing_rsi 2026-04-20 17:04 UTC Last 3 hours realized: +$0.0302 trades: 2 close · 1 open WR: 50.0% (1W / 1L) exits: TP1:1 · SL:1 best: SOLUSDT (+$0.0748) worst: DOGEUSDT (−$0.0446) Today (UTC) realized: +$0.0302 Since start realized: +$0.0302 trades: 2 · WR 50.0%
Background loop status
Channel
LIVE
@claw8403bot
Interval
3h
10800 s
Last send
just now
on-demand + loop
Log
JSONL
runtime/notifier/
CLI:
python openclaw_v1/spot_aggro/notifier/run_notifier.py test-send
python ... send-buy --symbol BTCUSDT --price 75421 --size 5.0
python ... send-sell --symbol BTCUSDT --entry 75421 --exit 76550 --size 5.0 --pnl 0.75 --reason TP1 --hold-min 435
python ... pnl-now
python ... pnl-loop --interval-s 10800

Artifacts:
runtime/notifier/events.jsonl · trades.jsonl · pnl_state.json
Bot integration hook. The bot's deterministic execution layer should import openclaw_v1.spot_aggro.notifier.events and call trade_opened() on every fill and trade_closed() on every exit. That's the only change needed — the notifier owns Telegram + event log + PnL loop. All calls are best-effort (never raise) and fail-open (Telegram failure doesn't block the bot).

Per-Trade Notional

user-editable · live re-read on every entry
Default is $10/trade split across three legs: probe $5, add1 $3, add2 $2. Edit below, press Save, then run the shown command on your host — the executor re-reads the config file on every entry attempt, so the next entry uses the new sizing.
Probe ($)
initial entry — $0.10 to $100
Add 1 ($)
on confirmation — 0 disables
Add 2 ($)
post-TP1 strong — 0 disables
Total per trade
$10.00
hard cap from safety.py still applies: max gross $1000 across all positions
To apply to a running executor (one of):
# option 1 — CLI (easiest):
python openclaw_v1/spot_aggro/live_executor/run_live.py config --set-probe 5 --set-add1 3 --set-add2 2

# option 2 — Download the JSON above and save to:
runtime/live_executor/user_config.json
Note: this panel is static HTML on Cloudflare Pages — it cannot write to your laptop's filesystem directly. Your browser saves values to localStorage for convenience. To apply them to the executor, run the CLI command or download the JSON and drop it in runtime/live_executor/.

Laptop Health + One-Click Flipper

sleep/wake/network alerts · one-click live swap
Events that fire a Telegram message
EventTriggerMessage
😴 SleepKernel-Power event 42"Laptop entering sleep" + network/power/executor state
⏰ WakeKernel-Power event 107"Laptop woke from sleep" + current executor state
⚠️ CrashKernel-Power event 41"Unexpected shutdown detected" (ran on next boot)
📡 NetworkNIC state change (heartbeat detects)"Network went DOWN / came back up"
🌐 Internetping 1.1.1.1 fails / recovers"Internet unreachable / reachable again"
🔋 DCUnplugged from AC"Switched to battery" — sleep may override powercfg on low battery
🔌 ACReconnected to AC"Back on AC power"
💓 HeartbeatEvery ~3h"Host heartbeat — all checks ok"
🤖 Executor stateScheduled Task state change"Executor task state changed Running → Ready" (etc)
Desktop shortcuts (one-click actions)
🚨 FLIP TO LIVE
Swaps executor from DryRun to Live mode. Requires typing FLIP to confirm. Auto-reads AUTHORIZATION_PHRASE from run_live.py — you never paste it.
FLIP TO LIVE — Swing RSI.lnk
↩️ FLIP TO DRY-RUN
Rolls back to DryRun. No confirmation needed (safer state). Open live positions get flattened on exit.
FLIP TO DRY-RUN — Swing RSI.lnk
🛑 EMERGENCY STOP
Immediately stops executor. Flatten-on-exit cancels open orders + market-sells every position. Fires Telegram before exit.
EMERGENCY STOP — Swing RSI.lnk
⏸️ PAUSE
Block NEW entries. Existing positions keep running — TP/SL/trail/fast-kill all stay active. Creates a PAUSED flag file the executor reads before every probe. Fires Telegram.
PAUSE — Swing RSI.lnk
▶️ RESUME
Delete the PAUSED flag. New entries allowed again within 60s (next signal poll). Fires Telegram.
RESUME — Swing RSI.lnk
🕒 FIX CLOCK (auto-elevates)
Starts Windows Time service + forces NTP sync. Required once if OKX returns error 50102 Timestamp request expired — your clock drifted past OKX's 30s window. Triggers a UAC prompt (needs admin), runs, verifies offset, then exits.
FIX CLOCK — Swing RSI.lnk · script: Fix-SystemClock.ps1
Pause vs Stop — which do I use?
PAUSE = soft. Block new entries, keep managing open trades. Click RESUME to unpause. Good for when you're away for a short stretch or news event.
EMERGENCY STOP = hard. Kill the executor entirely, flatten-on-exit cancels orders + market-sells positions. Use when something looks wrong.
Scheduled Tasks on this laptop
TaskPurposeTrigger
SwingRsiExecutorMain executor (DryRun default)at logon + on demand
SwingRsiExecutorWatchdogRestarts main if stale > 10 minevery 5 min
SwingRsiHealth_SleepTelegram on sleepKernel-Power event 42
SwingRsiHealth_WakeTelegram on wakeKernel-Power event 107
SwingRsiHealth_CrashTelegram on crash-bootKernel-Power event 41
SwingRsiHealth_HeartbeatNetwork/power/executor diff + periodic alive pingevery 5 min
Logs: runtime/live_executor/logs/health_YYYY-MM-DD.log · heartbeat_YYYY-MM-DD.log · wrapper_YYYY-MM-DD.log
State: runtime/live_executor/health_state.json (previous values for change detection)
Scripts: openclaw_v1/spot_aggro/live_executor/deploy/windows/*.ps1

Live Executor

staged · two-key launch · not running
What's built
  • okx_client.py — REST + HMAC auth, dry_run default, audit log
  • signal_loop.py — 1m candle poll, swing_rsi evaluator (reuses sim predicate)
  • order_manager.py — probe/add1/add2, TP1 maker (60%), TP2 / trail / SL taker
  • safety.py — $1000 gross cap, −$3 daily cap, −$15 session hard-disable, 5 concurrent max, 120s per-symbol cooldown
  • run_live.py — CLI: status · dry-run · live --authorize "…"
  • Notifier wired: every BUY, SELL, ERROR, gated-entry fires Telegram
  • HOST_247.md — VPS setup + systemd unit + watchdog + kill-switch
What's NOT built (v1 limits)
  • WebSocket fill confirmation (uses REST polling)
  • CDC cross-exchange gate (spec only — sec 7.7)
  • 5-LLM gate on live entries (spec only — sec 7.5)
  • Partial-fill reconciliation vs exchange truth
  • 24/7 host (your laptop sleeps — see HOST_247.md)
Hard safety caps (in code, not config)
CapValueBehavior
max gross exposure$1000new entries refused if total open notional would exceed
daily loss cap−$3all new entries blocked until next UTC day (open positions managed)
session hard-disable−$15full shutdown + flatten-on-exit
max concurrent positions56th entry refused
per-symbol cooldown120sno re-entry same symbol within 2 min
flatten on exitONSIGINT/SIGTERM → cancel all + market-sell positions
Two-key launch
run_live.py will NOT place real orders unless you pass --live --authorize "…" with the exact phrase below. Default is dry-run.
# 1. Check credentials + reachability (read-only)
python3 openclaw_v1/spot_aggro/live_executor/run_live.py status

# 2. Dry-run 24-72h (zero capital risk, real candles, real Telegram)
python3 openclaw_v1/spot_aggro/live_executor/run_live.py dry-run --poll-s 60

# 3. ONLY after (2) passes, promote to live:
python3 openclaw_v1/spot_aggro/live_executor/run_live.py live \
    --authorize "<LITERAL PHRASE — see run_live.py constant AUTHORIZATION_PHRASE on the host>" \
    --poll-s 60
Op-sec note: the actual literal authorization string is defined in openclaw_v1/spot_aggro/live_executor/run_live.py as the constant AUTHORIZATION_PHRASE. It is intentionally not published in this public panel. Edit that constant to rotate.
24/7 hosting (required)
Your laptop will sleep. A live executor needs an always-on host. Three docs cover the end-to-end launch:
  • deploy/bootstrap.sh — one-shot Ubuntu VPS bootstrap
  • deploy/swing-rsi-executor.service — systemd unit (DRY-RUN default)
  • deploy/watch-executor.sh — 5-min watchdog + Telegram alerts
  • deploy/env.example — all required env vars
  • RUNBOOK.md — exact 10-step launch sequence
  • GAPS.md — v1 limitations, honestly
  • HOST_247.md — manual setup notes
Component status
OKX adapter
BUILT
REST + auth
Signal loop
BUILT
1m poll
Order mgr
BUILT
TP/SL/trail
Safety rails
BUILT
6 caps
Smoke tested
PASSED
auth ✓ · EEA shard · ping 91ms
Running
LIVE
signal loop · 60s poll
Artifacts: runtime/live_executor/logs/dry_run_YYYY-MM-DD.jsonl, live_YYYY-MM-DD.jsonl, safety_state.json
Governance: This arm has NOT passed L1/L2/L3 testing or G1/G2/G3 governance. Deploy under operator override, explicit rule skip recorded in session ledger.

Actions

research mode only
Decision tree
  1. If 90d full shows expectancy > 0 bp across ≥ 50 trades AND walk-forward test half stays positive → enable paper trade at $0.13 probe for 14 days.
  2. If paper confirms expectancy > 0 across ≥ 20 trades with live fills matching maker assumption → graduate to $1 probe notional.
  3. If 90d fails or walk-forward test half is negative → result was noise; return to signal research.
  4. Never deploy without both 90d extension AND walk-forward validation.
Static · Research mode · Backtest source openclaw_v1/spot_aggro/backtest/simulator_swing_horizon.py