@rune-kit/rune 2.10.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +65 -6
- package/commands/rune.md +168 -168
- package/compiler/__tests__/detect-invariants.test.js +136 -0
- package/compiler/__tests__/doctor-mesh.test.js +229 -0
- package/compiler/__tests__/hook-dispatch.test.js +91 -0
- package/compiler/__tests__/hooks-antigravity.test.js +118 -0
- package/compiler/__tests__/hooks-cursor.test.js +139 -0
- package/compiler/__tests__/hooks-install.test.js +305 -0
- package/compiler/__tests__/hooks-merge.test.js +204 -0
- package/compiler/__tests__/hooks-tiers.test.js +519 -0
- package/compiler/__tests__/hooks-windsurf.test.js +115 -0
- package/compiler/__tests__/inject-claude-md.test.js +152 -0
- package/compiler/__tests__/load-invariants.test.js +408 -0
- package/compiler/__tests__/onboard-invariants.test.js +240 -0
- package/compiler/adapters/hooks/antigravity.js +140 -0
- package/compiler/adapters/hooks/claude.js +166 -0
- package/compiler/adapters/hooks/cursor.js +191 -0
- package/compiler/adapters/hooks/index.js +82 -0
- package/compiler/adapters/hooks/tier-emitter.js +182 -0
- package/compiler/adapters/hooks/windsurf.js +202 -0
- package/compiler/bin/rune.js +196 -6
- package/compiler/commands/hook-dispatch.js +87 -0
- package/compiler/commands/hooks/install.js +120 -0
- package/compiler/commands/hooks/merge.js +211 -0
- package/compiler/commands/hooks/presets.js +116 -0
- package/compiler/commands/hooks/status.js +112 -0
- package/compiler/commands/hooks/tiers.js +221 -0
- package/compiler/commands/hooks/uninstall.js +94 -0
- package/compiler/doctor.js +236 -0
- package/contexts/dev.md +34 -34
- package/contexts/research.md +43 -43
- package/contexts/review.md +55 -55
- package/extensions/ai-ml/PACK.md +88 -88
- package/extensions/ai-ml/skills/ai-agents.md +172 -172
- package/extensions/ai-ml/skills/code-sandbox.md +187 -187
- package/extensions/ai-ml/skills/deep-research.md +146 -146
- package/extensions/ai-ml/skills/embedding-search.md +66 -66
- package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
- package/extensions/ai-ml/skills/llm-architect.md +125 -125
- package/extensions/ai-ml/skills/llm-integration.md +64 -64
- package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
- package/extensions/ai-ml/skills/rag-patterns.md +66 -66
- package/extensions/ai-ml/skills/web-extraction.md +114 -114
- package/extensions/analytics/PACK.md +92 -92
- package/extensions/analytics/skills/ab-testing.md +72 -72
- package/extensions/analytics/skills/dashboard-patterns.md +83 -83
- package/extensions/analytics/skills/data-validation.md +68 -68
- package/extensions/analytics/skills/funnel-analysis.md +81 -81
- package/extensions/analytics/skills/sql-patterns.md +57 -57
- package/extensions/analytics/skills/statistical-analysis.md +79 -79
- package/extensions/analytics/skills/tracking-setup.md +71 -71
- package/extensions/backend/PACK.md +104 -104
- package/extensions/backend/skills/api-patterns.md +84 -84
- package/extensions/backend/skills/async-pipeline.md +193 -193
- package/extensions/backend/skills/auth-patterns.md +97 -97
- package/extensions/backend/skills/background-jobs.md +133 -133
- package/extensions/backend/skills/caching-patterns.md +108 -108
- package/extensions/backend/skills/cli-generation.md +133 -133
- package/extensions/backend/skills/database-patterns.md +87 -87
- package/extensions/backend/skills/middleware-patterns.md +104 -104
- package/extensions/chrome-ext/PACK.md +93 -93
- package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
- package/extensions/chrome-ext/skills/cws-publish.md +104 -104
- package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
- package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
- package/extensions/chrome-ext/skills/ext-storage.md +133 -133
- package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
- package/extensions/content/PACK.md +96 -96
- package/extensions/content/skills/blog-patterns.md +88 -88
- package/extensions/content/skills/cms-integration.md +131 -131
- package/extensions/content/skills/content-scoring.md +107 -107
- package/extensions/content/skills/i18n.md +83 -83
- package/extensions/content/skills/mdx-authoring.md +137 -137
- package/extensions/content/skills/reference.md +1014 -1014
- package/extensions/content/skills/seo-patterns.md +67 -67
- package/extensions/content/skills/video-repurpose.md +153 -153
- package/extensions/devops/PACK.md +101 -101
- package/extensions/devops/skills/chaos-testing.md +67 -67
- package/extensions/devops/skills/ci-cd.md +75 -75
- package/extensions/devops/skills/docker.md +58 -58
- package/extensions/devops/skills/edge-serverless.md +163 -163
- package/extensions/devops/skills/infra-as-code.md +158 -158
- package/extensions/devops/skills/kubernetes.md +110 -110
- package/extensions/devops/skills/monitoring.md +57 -57
- package/extensions/devops/skills/server-setup.md +64 -64
- package/extensions/devops/skills/ssl-domain.md +42 -42
- package/extensions/ecommerce/PACK.md +116 -116
- package/extensions/ecommerce/skills/cart-system.md +79 -79
- package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
- package/extensions/ecommerce/skills/order-management.md +126 -126
- package/extensions/ecommerce/skills/payment-integration.md +472 -472
- package/extensions/ecommerce/skills/shopify-dev.md +69 -69
- package/extensions/ecommerce/skills/subscription-billing.md +93 -93
- package/extensions/ecommerce/skills/tax-compliance.md +117 -117
- package/extensions/gamedev/PACK.md +142 -142
- package/extensions/gamedev/skills/asset-pipeline.md +74 -74
- package/extensions/gamedev/skills/audio-system.md +129 -129
- package/extensions/gamedev/skills/camera-system.md +87 -87
- package/extensions/gamedev/skills/ecs.md +98 -98
- package/extensions/gamedev/skills/game-loops.md +72 -72
- package/extensions/gamedev/skills/input-system.md +199 -199
- package/extensions/gamedev/skills/multiplayer.md +180 -180
- package/extensions/gamedev/skills/particles.md +105 -105
- package/extensions/gamedev/skills/physics-engine.md +89 -89
- package/extensions/gamedev/skills/scene-management.md +146 -146
- package/extensions/gamedev/skills/threejs-patterns.md +90 -90
- package/extensions/gamedev/skills/webgl.md +71 -71
- package/extensions/mobile/PACK.md +106 -106
- package/extensions/mobile/skills/app-store-connect.md +152 -152
- package/extensions/mobile/skills/app-store-prep.md +66 -66
- package/extensions/mobile/skills/deep-linking.md +109 -109
- package/extensions/mobile/skills/flutter.md +60 -60
- package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
- package/extensions/mobile/skills/native-bridge.md +66 -66
- package/extensions/mobile/skills/ota-updates.md +97 -97
- package/extensions/mobile/skills/push-notifications.md +111 -111
- package/extensions/mobile/skills/react-native.md +82 -82
- package/extensions/saas/PACK.md +116 -116
- package/extensions/saas/skills/billing-integration.md +200 -200
- package/extensions/saas/skills/feature-flags.md +130 -130
- package/extensions/saas/skills/multi-tenant.md +103 -103
- package/extensions/saas/skills/onboarding-flow.md +139 -139
- package/extensions/saas/skills/subscription-flow.md +95 -95
- package/extensions/saas/skills/team-management.md +144 -144
- package/extensions/security/PACK.md +99 -99
- package/extensions/security/skills/api-security.md +140 -140
- package/extensions/security/skills/compliance.md +68 -68
- package/extensions/security/skills/owasp-audit.md +64 -64
- package/extensions/security/skills/pentest-patterns.md +77 -77
- package/extensions/security/skills/secret-mgmt.md +65 -65
- package/extensions/security/skills/supply-chain.md +65 -65
- package/extensions/trading/PACK.md +80 -80
- package/extensions/trading/skills/chart-components.md +55 -55
- package/extensions/trading/skills/experiment-loop.md +125 -125
- package/extensions/trading/skills/fintech-patterns.md +47 -47
- package/extensions/trading/skills/indicator-library.md +58 -58
- package/extensions/trading/skills/quant-analysis.md +111 -111
- package/extensions/trading/skills/realtime-data.md +58 -58
- package/extensions/trading/skills/trade-logic.md +104 -104
- package/extensions/ui/PACK.md +130 -130
- package/extensions/ui/skills/a11y-audit.md +91 -91
- package/extensions/ui/skills/animation-patterns.md +127 -127
- package/extensions/ui/skills/component-patterns.md +100 -100
- package/extensions/ui/skills/design-decision.md +108 -108
- package/extensions/ui/skills/design-system.md +68 -68
- package/extensions/ui/skills/landing-patterns.md +155 -155
- package/extensions/ui/skills/palette-picker.md +173 -173
- package/extensions/ui/skills/react-health.md +90 -90
- package/extensions/ui/skills/type-system.md +125 -125
- package/extensions/ui/skills/web-vitals.md +153 -153
- package/extensions/zalo/PACK.md +145 -145
- package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
- package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
- package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
- package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
- package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
- package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
- package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
- package/hooks/auto-format/index.cjs +48 -48
- package/hooks/hooks.json +111 -111
- package/hooks/post-session-reflect/index.cjs +189 -189
- package/hooks/pre-compact/index.cjs +95 -95
- package/hooks/run-hook.cmd +1 -1
- package/hooks/secrets-scan/index.cjs +100 -100
- package/hooks/session-start/index.cjs +71 -71
- package/hooks/typecheck/index.cjs +65 -65
- package/package.json +63 -63
- package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
- package/references/ui-pro-max-data/charts.csv +26 -26
- package/references/ui-pro-max-data/colors.csv +161 -161
- package/references/ui-pro-max-data/styles.csv +68 -68
- package/references/ui-pro-max-data/typography.csv +74 -74
- package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
- package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
- package/skills/adversary/SKILL.md +283 -283
- package/skills/asset-creator/SKILL.md +157 -157
- package/skills/audit/SKILL.md +147 -2
- package/skills/autopsy/SKILL.md +335 -335
- package/skills/ba/SKILL.md +85 -1
- package/skills/brainstorm/SKILL.md +380 -342
- package/skills/browser-pilot/SKILL.md +169 -168
- package/skills/constraint-check/SKILL.md +165 -165
- package/skills/context-engine/SKILL.md +408 -404
- package/skills/cook/SKILL.md +917 -863
- package/skills/db/SKILL.md +273 -273
- package/skills/debug/SKILL.md +465 -465
- package/skills/dependency-doctor/SKILL.md +265 -235
- package/skills/deploy/SKILL.md +274 -231
- package/skills/design/DESIGN-REFERENCE.md +365 -365
- package/skills/design/SKILL.md +590 -589
- package/skills/doc-processor/SKILL.md +254 -254
- package/skills/docs/SKILL.md +374 -374
- package/skills/docs-seeker/SKILL.md +178 -177
- package/skills/fix/SKILL.md +332 -330
- package/skills/git/SKILL.md +339 -339
- package/skills/hallucination-guard/SKILL.md +220 -219
- package/skills/incident/SKILL.md +254 -253
- package/skills/integrity-check/SKILL.md +169 -169
- package/skills/journal/SKILL.md +241 -240
- package/skills/launch/SKILL.md +344 -344
- package/skills/logic-guardian/SKILL.md +269 -251
- package/skills/marketing/SKILL.md +351 -289
- package/skills/mcp-builder/SKILL.md +425 -425
- package/skills/neural-memory/SKILL.md +359 -362
- package/skills/onboard/SKILL.md +432 -403
- package/skills/onboard/references/invariants-template.md +76 -0
- package/skills/onboard/scripts/detect-invariants.js +439 -0
- package/skills/onboard/scripts/inject-claude-md.js +150 -0
- package/skills/onboard/scripts/onboard-invariants.js +194 -0
- package/skills/perf/SKILL.md +347 -346
- package/skills/plan/SKILL.md +435 -428
- package/skills/preflight/SKILL.md +415 -415
- package/skills/problem-solver/SKILL.md +380 -284
- package/skills/rescue/SKILL.md +474 -474
- package/skills/research/SKILL.md +4 -0
- package/skills/retro/SKILL.md +3 -1
- package/skills/review/SKILL.md +614 -588
- package/skills/review-intake/SKILL.md +249 -249
- package/skills/safeguard/SKILL.md +200 -200
- package/skills/sast/SKILL.md +190 -190
- package/skills/scaffold/SKILL.md +328 -287
- package/skills/scope-guard/SKILL.md +183 -180
- package/skills/scout/SKILL.md +269 -263
- package/skills/sentinel/SKILL.md +384 -381
- package/skills/sentinel-env/SKILL.md +254 -254
- package/skills/sequential-thinking/SKILL.md +234 -234
- package/skills/session-bridge/SKILL.md +595 -543
- package/skills/session-bridge/scripts/load-invariants.js +397 -0
- package/skills/skill-forge/SKILL.md +581 -581
- package/skills/skill-router/SKILL.md +3 -0
- package/skills/slides/SKILL.md +19 -0
- package/skills/surgeon/SKILL.md +215 -215
- package/skills/team/SKILL.md +557 -537
- package/skills/test/SKILL.md +620 -614
- package/skills/trend-scout/SKILL.md +145 -145
- package/skills/verification/SKILL.md +334 -326
- package/skills/video-creator/SKILL.md +201 -201
- package/skills/watchdog/SKILL.md +168 -168
- package/skills/worktree/SKILL.md +140 -140
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "quant-analysis"
|
|
3
|
-
pack: "@rune/trading"
|
|
4
|
-
description: "Quantitative analysis patterns — portfolio metrics, risk calculations, statistical edge detection, Monte Carlo simulation, and position sizing models."
|
|
5
|
-
model: sonnet
|
|
6
|
-
tools: [Read, Edit, Write, Grep, Glob, Bash]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# quant-analysis
|
|
10
|
-
|
|
11
|
-
Quantitative analysis patterns — portfolio metrics, risk calculations, statistical edge detection, Monte Carlo simulation, and position sizing models.
|
|
12
|
-
|
|
13
|
-
#### Workflow
|
|
14
|
-
|
|
15
|
-
**Step 1 — Define analysis scope**
|
|
16
|
-
Determine what the user needs: portfolio-level metrics (Sharpe, Sortino, max drawdown, VaR), strategy-level analysis (win rate, profit factor, expectancy, risk-of-ruin), or position sizing (Kelly criterion, fixed fractional, volatility-adjusted). Load trade history from data source (CSV, database query, API response).
|
|
17
|
-
|
|
18
|
-
**Step 2 — Calculate core metrics**
|
|
19
|
-
For portfolio analysis:
|
|
20
|
-
- **Sharpe Ratio**: (mean return - risk-free rate) / std(returns). Annualize with √252.
|
|
21
|
-
- **Sortino Ratio**: (mean return - risk-free rate) / downside_std. Only penalizes downside volatility.
|
|
22
|
-
- **Max Drawdown**: Largest peak-to-trough decline. Include recovery time.
|
|
23
|
-
- **Value at Risk (VaR)**: 95th/99th percentile loss using historical simulation or parametric method.
|
|
24
|
-
- **Calmar Ratio**: Annualized return / max drawdown. > 1.0 = good risk-adjusted return.
|
|
25
|
-
|
|
26
|
-
For strategy analysis:
|
|
27
|
-
- **Expectancy**: (win_rate × avg_win) - (loss_rate × avg_loss). Must be positive.
|
|
28
|
-
- **Profit Factor**: gross_profit / gross_loss. > 1.5 = viable, > 2.0 = strong.
|
|
29
|
-
- **Risk of Ruin**: probability of losing X% of capital given win rate and risk per trade.
|
|
30
|
-
|
|
31
|
-
**Step 3 — Monte Carlo simulation**
|
|
32
|
-
Run 10,000 random resamples of the trade sequence to estimate:
|
|
33
|
-
- Probability of reaching profit target within N trades
|
|
34
|
-
- Confidence interval for max drawdown (95th percentile)
|
|
35
|
-
- Optimal position size that maximizes geometric growth (Kelly fraction)
|
|
36
|
-
|
|
37
|
-
Emit results as structured data + visualization-ready format for `chart-components`.
|
|
38
|
-
|
|
39
|
-
**Step 4 — Position sizing recommendation**
|
|
40
|
-
Based on Monte Carlo results, recommend:
|
|
41
|
-
- **Conservative**: Half-Kelly (50% of optimal Kelly fraction)
|
|
42
|
-
- **Moderate**: Full Kelly
|
|
43
|
-
- **Aggressive**: 1.5x Kelly (with warning about increased ruin probability)
|
|
44
|
-
|
|
45
|
-
Save analysis to `.rune/trading/quant-analysis-<date>.md`.
|
|
46
|
-
|
|
47
|
-
#### Example
|
|
48
|
-
|
|
49
|
-
```typescript
|
|
50
|
-
import Decimal from 'decimal.js';
|
|
51
|
-
|
|
52
|
-
interface TradeResult {
|
|
53
|
-
pnl: Decimal;
|
|
54
|
-
entryPrice: Decimal;
|
|
55
|
-
exitPrice: Decimal;
|
|
56
|
-
size: Decimal;
|
|
57
|
-
duration: number; // minutes
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
interface QuantMetrics {
|
|
61
|
-
totalTrades: number;
|
|
62
|
-
winRate: Decimal;
|
|
63
|
-
profitFactor: Decimal;
|
|
64
|
-
expectancy: Decimal;
|
|
65
|
-
sharpeRatio: Decimal;
|
|
66
|
-
sortinoRatio: Decimal;
|
|
67
|
-
maxDrawdown: Decimal;
|
|
68
|
-
maxDrawdownDuration: number;
|
|
69
|
-
calmarRatio: Decimal;
|
|
70
|
-
valueAtRisk95: Decimal;
|
|
71
|
-
kellyFraction: Decimal;
|
|
72
|
-
riskOfRuin: Decimal;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function calculateExpectancy(trades: TradeResult[]): Decimal {
|
|
76
|
-
const wins = trades.filter(t => t.pnl.gt(0));
|
|
77
|
-
const losses = trades.filter(t => t.pnl.lte(0));
|
|
78
|
-
const winRate = new Decimal(wins.length).div(trades.length);
|
|
79
|
-
const avgWin = wins.length > 0
|
|
80
|
-
? wins.reduce((sum, t) => sum.plus(t.pnl), new Decimal(0)).div(wins.length)
|
|
81
|
-
: new Decimal(0);
|
|
82
|
-
const avgLoss = losses.length > 0
|
|
83
|
-
? losses.reduce((sum, t) => sum.plus(t.pnl.abs()), new Decimal(0)).div(losses.length)
|
|
84
|
-
: new Decimal(0);
|
|
85
|
-
return winRate.mul(avgWin).minus(new Decimal(1).minus(winRate).mul(avgLoss));
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function kellyFraction(winRate: Decimal, avgWinLossRatio: Decimal): Decimal {
|
|
89
|
-
// Kelly: f* = (p * b - q) / b where p=winRate, q=1-p, b=avgWin/avgLoss
|
|
90
|
-
const q = new Decimal(1).minus(winRate);
|
|
91
|
-
return winRate.mul(avgWinLossRatio).minus(q).div(avgWinLossRatio);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Monte Carlo: resample trades 10,000 times
|
|
95
|
-
function monteCarloDrawdown(trades: TradeResult[], simulations = 10000): Decimal {
|
|
96
|
-
const drawdowns: Decimal[] = [];
|
|
97
|
-
for (let i = 0; i < simulations; i++) {
|
|
98
|
-
const shuffled = [...trades].sort(() => Math.random() - 0.5);
|
|
99
|
-
let peak = new Decimal(0), maxDd = new Decimal(0), equity = new Decimal(0);
|
|
100
|
-
for (const t of shuffled) {
|
|
101
|
-
equity = equity.plus(t.pnl);
|
|
102
|
-
if (equity.gt(peak)) peak = equity;
|
|
103
|
-
const dd = peak.minus(equity).div(peak.gt(0) ? peak : new Decimal(1));
|
|
104
|
-
if (dd.gt(maxDd)) maxDd = dd;
|
|
105
|
-
}
|
|
106
|
-
drawdowns.push(maxDd);
|
|
107
|
-
}
|
|
108
|
-
drawdowns.sort((a, b) => a.cmp(b));
|
|
109
|
-
return drawdowns[Math.floor(simulations * 0.95)]; // 95th percentile
|
|
110
|
-
}
|
|
111
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: "quant-analysis"
|
|
3
|
+
pack: "@rune/trading"
|
|
4
|
+
description: "Quantitative analysis patterns — portfolio metrics, risk calculations, statistical edge detection, Monte Carlo simulation, and position sizing models."
|
|
5
|
+
model: sonnet
|
|
6
|
+
tools: [Read, Edit, Write, Grep, Glob, Bash]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# quant-analysis
|
|
10
|
+
|
|
11
|
+
Quantitative analysis patterns — portfolio metrics, risk calculations, statistical edge detection, Monte Carlo simulation, and position sizing models.
|
|
12
|
+
|
|
13
|
+
#### Workflow
|
|
14
|
+
|
|
15
|
+
**Step 1 — Define analysis scope**
|
|
16
|
+
Determine what the user needs: portfolio-level metrics (Sharpe, Sortino, max drawdown, VaR), strategy-level analysis (win rate, profit factor, expectancy, risk-of-ruin), or position sizing (Kelly criterion, fixed fractional, volatility-adjusted). Load trade history from data source (CSV, database query, API response).
|
|
17
|
+
|
|
18
|
+
**Step 2 — Calculate core metrics**
|
|
19
|
+
For portfolio analysis:
|
|
20
|
+
- **Sharpe Ratio**: (mean return - risk-free rate) / std(returns). Annualize with √252.
|
|
21
|
+
- **Sortino Ratio**: (mean return - risk-free rate) / downside_std. Only penalizes downside volatility.
|
|
22
|
+
- **Max Drawdown**: Largest peak-to-trough decline. Include recovery time.
|
|
23
|
+
- **Value at Risk (VaR)**: 95th/99th percentile loss using historical simulation or parametric method.
|
|
24
|
+
- **Calmar Ratio**: Annualized return / max drawdown. > 1.0 = good risk-adjusted return.
|
|
25
|
+
|
|
26
|
+
For strategy analysis:
|
|
27
|
+
- **Expectancy**: (win_rate × avg_win) - (loss_rate × avg_loss). Must be positive.
|
|
28
|
+
- **Profit Factor**: gross_profit / gross_loss. > 1.5 = viable, > 2.0 = strong.
|
|
29
|
+
- **Risk of Ruin**: probability of losing X% of capital given win rate and risk per trade.
|
|
30
|
+
|
|
31
|
+
**Step 3 — Monte Carlo simulation**
|
|
32
|
+
Run 10,000 random resamples of the trade sequence to estimate:
|
|
33
|
+
- Probability of reaching profit target within N trades
|
|
34
|
+
- Confidence interval for max drawdown (95th percentile)
|
|
35
|
+
- Optimal position size that maximizes geometric growth (Kelly fraction)
|
|
36
|
+
|
|
37
|
+
Emit results as structured data + visualization-ready format for `chart-components`.
|
|
38
|
+
|
|
39
|
+
**Step 4 — Position sizing recommendation**
|
|
40
|
+
Based on Monte Carlo results, recommend:
|
|
41
|
+
- **Conservative**: Half-Kelly (50% of optimal Kelly fraction)
|
|
42
|
+
- **Moderate**: Full Kelly
|
|
43
|
+
- **Aggressive**: 1.5x Kelly (with warning about increased ruin probability)
|
|
44
|
+
|
|
45
|
+
Save analysis to `.rune/trading/quant-analysis-<date>.md`.
|
|
46
|
+
|
|
47
|
+
#### Example
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import Decimal from 'decimal.js';
|
|
51
|
+
|
|
52
|
+
interface TradeResult {
|
|
53
|
+
pnl: Decimal;
|
|
54
|
+
entryPrice: Decimal;
|
|
55
|
+
exitPrice: Decimal;
|
|
56
|
+
size: Decimal;
|
|
57
|
+
duration: number; // minutes
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
interface QuantMetrics {
|
|
61
|
+
totalTrades: number;
|
|
62
|
+
winRate: Decimal;
|
|
63
|
+
profitFactor: Decimal;
|
|
64
|
+
expectancy: Decimal;
|
|
65
|
+
sharpeRatio: Decimal;
|
|
66
|
+
sortinoRatio: Decimal;
|
|
67
|
+
maxDrawdown: Decimal;
|
|
68
|
+
maxDrawdownDuration: number;
|
|
69
|
+
calmarRatio: Decimal;
|
|
70
|
+
valueAtRisk95: Decimal;
|
|
71
|
+
kellyFraction: Decimal;
|
|
72
|
+
riskOfRuin: Decimal;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function calculateExpectancy(trades: TradeResult[]): Decimal {
|
|
76
|
+
const wins = trades.filter(t => t.pnl.gt(0));
|
|
77
|
+
const losses = trades.filter(t => t.pnl.lte(0));
|
|
78
|
+
const winRate = new Decimal(wins.length).div(trades.length);
|
|
79
|
+
const avgWin = wins.length > 0
|
|
80
|
+
? wins.reduce((sum, t) => sum.plus(t.pnl), new Decimal(0)).div(wins.length)
|
|
81
|
+
: new Decimal(0);
|
|
82
|
+
const avgLoss = losses.length > 0
|
|
83
|
+
? losses.reduce((sum, t) => sum.plus(t.pnl.abs()), new Decimal(0)).div(losses.length)
|
|
84
|
+
: new Decimal(0);
|
|
85
|
+
return winRate.mul(avgWin).minus(new Decimal(1).minus(winRate).mul(avgLoss));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function kellyFraction(winRate: Decimal, avgWinLossRatio: Decimal): Decimal {
|
|
89
|
+
// Kelly: f* = (p * b - q) / b where p=winRate, q=1-p, b=avgWin/avgLoss
|
|
90
|
+
const q = new Decimal(1).minus(winRate);
|
|
91
|
+
return winRate.mul(avgWinLossRatio).minus(q).div(avgWinLossRatio);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Monte Carlo: resample trades 10,000 times
|
|
95
|
+
function monteCarloDrawdown(trades: TradeResult[], simulations = 10000): Decimal {
|
|
96
|
+
const drawdowns: Decimal[] = [];
|
|
97
|
+
for (let i = 0; i < simulations; i++) {
|
|
98
|
+
const shuffled = [...trades].sort(() => Math.random() - 0.5);
|
|
99
|
+
let peak = new Decimal(0), maxDd = new Decimal(0), equity = new Decimal(0);
|
|
100
|
+
for (const t of shuffled) {
|
|
101
|
+
equity = equity.plus(t.pnl);
|
|
102
|
+
if (equity.gt(peak)) peak = equity;
|
|
103
|
+
const dd = peak.minus(equity).div(peak.gt(0) ? peak : new Decimal(1));
|
|
104
|
+
if (dd.gt(maxDd)) maxDd = dd;
|
|
105
|
+
}
|
|
106
|
+
drawdowns.push(maxDd);
|
|
107
|
+
}
|
|
108
|
+
drawdowns.sort((a, b) => a.cmp(b));
|
|
109
|
+
return drawdowns[Math.floor(simulations * 0.95)]; // 95th percentile
|
|
110
|
+
}
|
|
111
|
+
```
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "realtime-data"
|
|
3
|
-
pack: "@rune/trading"
|
|
4
|
-
description: "Real-time data architecture — WebSocket lifecycle management, auto-reconnect with exponential backoff, event normalization, rate limiting, and TanStack Query cache invalidation."
|
|
5
|
-
model: sonnet
|
|
6
|
-
tools: [Read, Edit, Write, Grep, Glob, Bash]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# realtime-data
|
|
10
|
-
|
|
11
|
-
Real-time data architecture — WebSocket lifecycle management, auto-reconnect with exponential backoff, event normalization, rate limiting, and TanStack Query cache invalidation.
|
|
12
|
-
|
|
13
|
-
#### Workflow
|
|
14
|
-
|
|
15
|
-
**Step 1 — WebSocket setup and event normalization**
|
|
16
|
-
Use `Read` on existing data-fetching files to understand current polling or REST patterns. Replace with a WebSocket client class that emits typed, normalized events regardless of upstream message format. Define a `NormalizedTick` interface at the boundary.
|
|
17
|
-
|
|
18
|
-
**Step 2 — Implement exponential backoff reconnect**
|
|
19
|
-
In the WebSocket class, add a reconnect handler: attempt 1 after 1 s, attempt 2 after 2 s, attempt 3 after 4 s, cap at 30 s. Use `Bash` to run unit tests covering disconnect and reconnect sequences. Track `reconnectAttempts` in state; reset to 0 on successful open.
|
|
20
|
-
|
|
21
|
-
**Step 3 — Wire to TanStack Query cache invalidation**
|
|
22
|
-
On each normalized event received, call `queryClient.setQueryData(['ticker', symbol], tick)` for optimistic updates or `queryClient.invalidateQueries(['orderbook', symbol])` for full refresh. Use `Grep` to confirm no stale `setInterval` polling remains alongside the new WebSocket feed.
|
|
23
|
-
|
|
24
|
-
#### Example
|
|
25
|
-
|
|
26
|
-
```typescript
|
|
27
|
-
class TradingWebSocket {
|
|
28
|
-
private ws: WebSocket | null = null;
|
|
29
|
-
private reconnectAttempts = 0;
|
|
30
|
-
private readonly MAX_DELAY_MS = 30_000;
|
|
31
|
-
|
|
32
|
-
connect(url: string, onTick: (tick: NormalizedTick) => void): void {
|
|
33
|
-
this.ws = new WebSocket(url);
|
|
34
|
-
|
|
35
|
-
this.ws.onmessage = (event) => {
|
|
36
|
-
const raw = JSON.parse(event.data as string);
|
|
37
|
-
onTick(this.normalize(raw));
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
this.ws.onclose = () => {
|
|
41
|
-
const delay = Math.min(
|
|
42
|
-
1000 * 2 ** this.reconnectAttempts,
|
|
43
|
-
this.MAX_DELAY_MS,
|
|
44
|
-
);
|
|
45
|
-
this.reconnectAttempts += 1;
|
|
46
|
-
setTimeout(() => this.connect(url, onTick), delay);
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
this.ws.onopen = () => { this.reconnectAttempts = 0; };
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
private normalize(raw: unknown): NormalizedTick {
|
|
53
|
-
// map exchange-specific shape to shared interface
|
|
54
|
-
const r = raw as Record<string, unknown>;
|
|
55
|
-
return { symbol: String(r['s']), price: String(r['p']), ts: Date.now() };
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: "realtime-data"
|
|
3
|
+
pack: "@rune/trading"
|
|
4
|
+
description: "Real-time data architecture — WebSocket lifecycle management, auto-reconnect with exponential backoff, event normalization, rate limiting, and TanStack Query cache invalidation."
|
|
5
|
+
model: sonnet
|
|
6
|
+
tools: [Read, Edit, Write, Grep, Glob, Bash]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# realtime-data
|
|
10
|
+
|
|
11
|
+
Real-time data architecture — WebSocket lifecycle management, auto-reconnect with exponential backoff, event normalization, rate limiting, and TanStack Query cache invalidation.
|
|
12
|
+
|
|
13
|
+
#### Workflow
|
|
14
|
+
|
|
15
|
+
**Step 1 — WebSocket setup and event normalization**
|
|
16
|
+
Use `Read` on existing data-fetching files to understand current polling or REST patterns. Replace with a WebSocket client class that emits typed, normalized events regardless of upstream message format. Define a `NormalizedTick` interface at the boundary.
|
|
17
|
+
|
|
18
|
+
**Step 2 — Implement exponential backoff reconnect**
|
|
19
|
+
In the WebSocket class, add a reconnect handler: attempt 1 after 1 s, attempt 2 after 2 s, attempt 3 after 4 s, cap at 30 s. Use `Bash` to run unit tests covering disconnect and reconnect sequences. Track `reconnectAttempts` in state; reset to 0 on successful open.
|
|
20
|
+
|
|
21
|
+
**Step 3 — Wire to TanStack Query cache invalidation**
|
|
22
|
+
On each normalized event received, call `queryClient.setQueryData(['ticker', symbol], tick)` for optimistic updates or `queryClient.invalidateQueries(['orderbook', symbol])` for full refresh. Use `Grep` to confirm no stale `setInterval` polling remains alongside the new WebSocket feed.
|
|
23
|
+
|
|
24
|
+
#### Example
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
class TradingWebSocket {
|
|
28
|
+
private ws: WebSocket | null = null;
|
|
29
|
+
private reconnectAttempts = 0;
|
|
30
|
+
private readonly MAX_DELAY_MS = 30_000;
|
|
31
|
+
|
|
32
|
+
connect(url: string, onTick: (tick: NormalizedTick) => void): void {
|
|
33
|
+
this.ws = new WebSocket(url);
|
|
34
|
+
|
|
35
|
+
this.ws.onmessage = (event) => {
|
|
36
|
+
const raw = JSON.parse(event.data as string);
|
|
37
|
+
onTick(this.normalize(raw));
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
this.ws.onclose = () => {
|
|
41
|
+
const delay = Math.min(
|
|
42
|
+
1000 * 2 ** this.reconnectAttempts,
|
|
43
|
+
this.MAX_DELAY_MS,
|
|
44
|
+
);
|
|
45
|
+
this.reconnectAttempts += 1;
|
|
46
|
+
setTimeout(() => this.connect(url, onTick), delay);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
this.ws.onopen = () => { this.reconnectAttempts = 0; };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private normalize(raw: unknown): NormalizedTick {
|
|
53
|
+
// map exchange-specific shape to shared interface
|
|
54
|
+
const r = raw as Record<string, unknown>;
|
|
55
|
+
return { symbol: String(r['s']), price: String(r['p']), ts: Date.now() };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "trade-logic"
|
|
3
|
-
pack: "@rune/trading"
|
|
4
|
-
description: "Trading logic preservation and reasoning — entry/exit spec management, indicator parameter registry, strategy state tracking, and backtest result linkage. Prevents the #1 trading bot failure: AI sessions overwriting working logic without understanding it."
|
|
5
|
-
model: sonnet
|
|
6
|
-
tools: [Read, Edit, Write, Grep, Glob, Bash]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# trade-logic
|
|
10
|
-
|
|
11
|
-
Trading logic preservation and reasoning — entry/exit spec management, indicator parameter registry, strategy state tracking, and backtest result linkage. Prevents the #1 trading bot failure: AI sessions overwriting working logic without understanding it.
|
|
12
|
-
|
|
13
|
-
#### Workflow
|
|
14
|
-
|
|
15
|
-
**Step 1 — Load trading logic context**
|
|
16
|
-
Check if `logic-guardian` (L2) has a manifest loaded. If `.rune/logic-manifest.json` exists, read it and extract trading-specific components (ENTRY_LOGIC, EXIT_LOGIC, FILTER, INDICATOR). If no manifest exists, trigger `logic-guardian` Phase 3 to generate one with trading-aware scanning.
|
|
17
|
-
|
|
18
|
-
Trading-specific file patterns to scan:
|
|
19
|
-
- `**/scenarios/**`, `**/signals/**`, `**/strategies/**` — entry/exit logic
|
|
20
|
-
- `**/trailing/**`, `**/exit/**`, `**/stoploss/**` — exit engine components
|
|
21
|
-
- `**/indicators/**`, `**/core/indicators*` — technical indicator implementations
|
|
22
|
-
- `**/backtest/**`, `**/engine*` — backtesting mirrors of production logic
|
|
23
|
-
- `**/config/settings*`, `**/config/token*` — parameter source of truth
|
|
24
|
-
|
|
25
|
-
**Step 2 — Build trading logic spec**
|
|
26
|
-
For each trading component, extract a structured spec:
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
COMPONENT: RSI Entry Detector
|
|
30
|
-
TYPE: ENTRY_LOGIC
|
|
31
|
-
STATUS: ACTIVE (production)
|
|
32
|
-
LAYERS: [which layer in the trading pipeline this belongs to]
|
|
33
|
-
|
|
34
|
-
ENTRY CONDITIONS:
|
|
35
|
-
1. TrendPass ticket exists with available fires
|
|
36
|
-
2. RSI_MA crosses threshold (65 LONG / 35 SHORT)
|
|
37
|
-
3. Previous RSI in entry zone (30-55 LONG / 45-70 SHORT)
|
|
38
|
-
4. RSI crosses RSI_MA + 40% TF filter + EMA filter
|
|
39
|
-
|
|
40
|
-
PARAMETERS:
|
|
41
|
-
- rsi_period: 7 (source: settings.py)
|
|
42
|
-
- challenge_threshold_long: 65 (source: settings.py)
|
|
43
|
-
- entry_zone_long: [30, 55] (source: settings.py)
|
|
44
|
-
|
|
45
|
-
DEPENDENCIES: trend_pass.tracker, core.indicators
|
|
46
|
-
MIRROR: backtest/engine.py (must stay in sync with production)
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
**Step 3 — Enforce production-backtest sync**
|
|
50
|
-
For trading bots, production logic and backtest logic MUST be mirrors. Scan for:
|
|
51
|
-
- Production file: `src/worker/production_worker.py` or equivalent
|
|
52
|
-
- Backtest file: `backtest/engine.py` or equivalent
|
|
53
|
-
- Compare entry/exit function signatures and conditional branches
|
|
54
|
-
- Flag any divergence: "Production uses condition X but backtest doesn't"
|
|
55
|
-
|
|
56
|
-
**Step 4 — Parameter registry**
|
|
57
|
-
Build a parameter registry linking every configurable threshold to its source:
|
|
58
|
-
- Single source of truth file (e.g., `settings.py`)
|
|
59
|
-
- Per-token overrides (e.g., `token_config.py`, `final_config.json`)
|
|
60
|
-
- Scan for hardcoded magic numbers in logic files that should be in config
|
|
61
|
-
- Flag: "Hardcoded value 65 in detect.py:L42 — should reference settings.CHALLENGE_THRESHOLD_LONG"
|
|
62
|
-
|
|
63
|
-
**Step 5 — Strategy state machine documentation**
|
|
64
|
-
If the trading logic uses a multi-step state machine (e.g., 3-step RSI entry):
|
|
65
|
-
- Document each state and its transition conditions
|
|
66
|
-
- Generate a state diagram in text format
|
|
67
|
-
- Save to manifest as `state_machine` field on the component
|
|
68
|
-
|
|
69
|
-
```
|
|
70
|
-
State Machine: RSI Entry
|
|
71
|
-
[IDLE] --ticket_exists--> [STEP1_CHALLENGE]
|
|
72
|
-
[STEP1_CHALLENGE] --rsi_ma_crosses_threshold--> [STEP2_ZONE_CHECK]
|
|
73
|
-
[STEP2_ZONE_CHECK] --prev_rsi_in_zone--> [STEP3_ENTRY_POINT]
|
|
74
|
-
[STEP3_ENTRY_POINT] --rsi_crosses_rsi_ma + filters--> [SIGNAL_EMITTED]
|
|
75
|
-
[any_step] --ticket_expired--> [IDLE]
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
**Step 6 — Backtest result linkage**
|
|
79
|
-
Link logic components to their backtest performance:
|
|
80
|
-
- Scan `backtest/scan_results/` or equivalent for result files
|
|
81
|
-
- Associate each strategy variant with its performance metrics
|
|
82
|
-
- Record in manifest: "RSI Entry v5 with EMA Follow: $20,445 over 6mo backtest"
|
|
83
|
-
- Flag if logic was modified AFTER the latest backtest: "Logic changed since last backtest — results may be invalid"
|
|
84
|
-
|
|
85
|
-
#### Example
|
|
86
|
-
|
|
87
|
-
```python
|
|
88
|
-
# trade-logic generates this spec from code analysis:
|
|
89
|
-
# COMPONENT: EMA Follow Exit
|
|
90
|
-
# TYPE: EXIT_LOGIC
|
|
91
|
-
# STATUS: ACTIVE
|
|
92
|
-
# BUG_HISTORY: 2026-02-22 fixed wick detection (was using close, now uses candle_low/high)
|
|
93
|
-
#
|
|
94
|
-
# EXIT CONDITION:
|
|
95
|
-
# if candle_wick crosses EMA120 -> exit position
|
|
96
|
-
# (NOT candle_close — this was the V4 bug)
|
|
97
|
-
#
|
|
98
|
-
# PARAMETERS:
|
|
99
|
-
# ema_period: 120 (source: settings.py)
|
|
100
|
-
# use_wick: True (source: settings.py, changed from False in V4)
|
|
101
|
-
#
|
|
102
|
-
# MIRROR: backtest/exit_checker.py:check_ema_follow()
|
|
103
|
-
# BACKTEST: $22,481 (x2.0 adaptive variant, validated 2026-02-22)
|
|
104
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: "trade-logic"
|
|
3
|
+
pack: "@rune/trading"
|
|
4
|
+
description: "Trading logic preservation and reasoning — entry/exit spec management, indicator parameter registry, strategy state tracking, and backtest result linkage. Prevents the #1 trading bot failure: AI sessions overwriting working logic without understanding it."
|
|
5
|
+
model: sonnet
|
|
6
|
+
tools: [Read, Edit, Write, Grep, Glob, Bash]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# trade-logic
|
|
10
|
+
|
|
11
|
+
Trading logic preservation and reasoning — entry/exit spec management, indicator parameter registry, strategy state tracking, and backtest result linkage. Prevents the #1 trading bot failure: AI sessions overwriting working logic without understanding it.
|
|
12
|
+
|
|
13
|
+
#### Workflow
|
|
14
|
+
|
|
15
|
+
**Step 1 — Load trading logic context**
|
|
16
|
+
Check if `logic-guardian` (L2) has a manifest loaded. If `.rune/logic-manifest.json` exists, read it and extract trading-specific components (ENTRY_LOGIC, EXIT_LOGIC, FILTER, INDICATOR). If no manifest exists, trigger `logic-guardian` Phase 3 to generate one with trading-aware scanning.
|
|
17
|
+
|
|
18
|
+
Trading-specific file patterns to scan:
|
|
19
|
+
- `**/scenarios/**`, `**/signals/**`, `**/strategies/**` — entry/exit logic
|
|
20
|
+
- `**/trailing/**`, `**/exit/**`, `**/stoploss/**` — exit engine components
|
|
21
|
+
- `**/indicators/**`, `**/core/indicators*` — technical indicator implementations
|
|
22
|
+
- `**/backtest/**`, `**/engine*` — backtesting mirrors of production logic
|
|
23
|
+
- `**/config/settings*`, `**/config/token*` — parameter source of truth
|
|
24
|
+
|
|
25
|
+
**Step 2 — Build trading logic spec**
|
|
26
|
+
For each trading component, extract a structured spec:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
COMPONENT: RSI Entry Detector
|
|
30
|
+
TYPE: ENTRY_LOGIC
|
|
31
|
+
STATUS: ACTIVE (production)
|
|
32
|
+
LAYERS: [which layer in the trading pipeline this belongs to]
|
|
33
|
+
|
|
34
|
+
ENTRY CONDITIONS:
|
|
35
|
+
1. TrendPass ticket exists with available fires
|
|
36
|
+
2. RSI_MA crosses threshold (65 LONG / 35 SHORT)
|
|
37
|
+
3. Previous RSI in entry zone (30-55 LONG / 45-70 SHORT)
|
|
38
|
+
4. RSI crosses RSI_MA + 40% TF filter + EMA filter
|
|
39
|
+
|
|
40
|
+
PARAMETERS:
|
|
41
|
+
- rsi_period: 7 (source: settings.py)
|
|
42
|
+
- challenge_threshold_long: 65 (source: settings.py)
|
|
43
|
+
- entry_zone_long: [30, 55] (source: settings.py)
|
|
44
|
+
|
|
45
|
+
DEPENDENCIES: trend_pass.tracker, core.indicators
|
|
46
|
+
MIRROR: backtest/engine.py (must stay in sync with production)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Step 3 — Enforce production-backtest sync**
|
|
50
|
+
For trading bots, production logic and backtest logic MUST be mirrors. Scan for:
|
|
51
|
+
- Production file: `src/worker/production_worker.py` or equivalent
|
|
52
|
+
- Backtest file: `backtest/engine.py` or equivalent
|
|
53
|
+
- Compare entry/exit function signatures and conditional branches
|
|
54
|
+
- Flag any divergence: "Production uses condition X but backtest doesn't"
|
|
55
|
+
|
|
56
|
+
**Step 4 — Parameter registry**
|
|
57
|
+
Build a parameter registry linking every configurable threshold to its source:
|
|
58
|
+
- Single source of truth file (e.g., `settings.py`)
|
|
59
|
+
- Per-token overrides (e.g., `token_config.py`, `final_config.json`)
|
|
60
|
+
- Scan for hardcoded magic numbers in logic files that should be in config
|
|
61
|
+
- Flag: "Hardcoded value 65 in detect.py:L42 — should reference settings.CHALLENGE_THRESHOLD_LONG"
|
|
62
|
+
|
|
63
|
+
**Step 5 — Strategy state machine documentation**
|
|
64
|
+
If the trading logic uses a multi-step state machine (e.g., 3-step RSI entry):
|
|
65
|
+
- Document each state and its transition conditions
|
|
66
|
+
- Generate a state diagram in text format
|
|
67
|
+
- Save to manifest as `state_machine` field on the component
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
State Machine: RSI Entry
|
|
71
|
+
[IDLE] --ticket_exists--> [STEP1_CHALLENGE]
|
|
72
|
+
[STEP1_CHALLENGE] --rsi_ma_crosses_threshold--> [STEP2_ZONE_CHECK]
|
|
73
|
+
[STEP2_ZONE_CHECK] --prev_rsi_in_zone--> [STEP3_ENTRY_POINT]
|
|
74
|
+
[STEP3_ENTRY_POINT] --rsi_crosses_rsi_ma + filters--> [SIGNAL_EMITTED]
|
|
75
|
+
[any_step] --ticket_expired--> [IDLE]
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Step 6 — Backtest result linkage**
|
|
79
|
+
Link logic components to their backtest performance:
|
|
80
|
+
- Scan `backtest/scan_results/` or equivalent for result files
|
|
81
|
+
- Associate each strategy variant with its performance metrics
|
|
82
|
+
- Record in manifest: "RSI Entry v5 with EMA Follow: $20,445 over 6mo backtest"
|
|
83
|
+
- Flag if logic was modified AFTER the latest backtest: "Logic changed since last backtest — results may be invalid"
|
|
84
|
+
|
|
85
|
+
#### Example
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
# trade-logic generates this spec from code analysis:
|
|
89
|
+
# COMPONENT: EMA Follow Exit
|
|
90
|
+
# TYPE: EXIT_LOGIC
|
|
91
|
+
# STATUS: ACTIVE
|
|
92
|
+
# BUG_HISTORY: 2026-02-22 fixed wick detection (was using close, now uses candle_low/high)
|
|
93
|
+
#
|
|
94
|
+
# EXIT CONDITION:
|
|
95
|
+
# if candle_wick crosses EMA120 -> exit position
|
|
96
|
+
# (NOT candle_close — this was the V4 bug)
|
|
97
|
+
#
|
|
98
|
+
# PARAMETERS:
|
|
99
|
+
# ema_period: 120 (source: settings.py)
|
|
100
|
+
# use_wick: True (source: settings.py, changed from False in V4)
|
|
101
|
+
#
|
|
102
|
+
# MIRROR: backtest/exit_checker.py:check_ema_follow()
|
|
103
|
+
# BACKTEST: $22,481 (x2.0 adaptive variant, validated 2026-02-22)
|
|
104
|
+
```
|