Builder
Compose strategies from reusable modules
Visual strategy authoring is the primary workflow. Users snap together indicators, filters, entries, exits, risk, and execution.
Module palette
Available blocks
Click modules to add or remove them from the current strategy graph.
Strategy canvas
New Modular Strategy
These modules form the current graph and the generated JSON payload for upload.
1Price Feed
Normalize candles, volume, and spread into the graph.
2Fast EMA
Detect near-term direction and momentum shifts.
3Slow EMA
Track the broader trend so entries have context.
4Crossover Entry
Enter when fast momentum crosses above the slower trend.
5Trailing Exit
Exit when momentum rolls over or a stop is hit.
6Risk Engine
Cap per-trade exposure and portfolio drawdown.
7Webhook Executor
Emit buy/sell signals to connected API endpoints.
Definition
Upload payload
This is the JSON object the backend will persist as a strategy version.
{
"name": "New Modular Strategy",
"assetClass": "Multi-asset",
"timeframe": "1h",
"published": false,
"modules": [
{
"id": "price-feed",
"kind": "price_feed",
"label": "Price Feed",
"description": "Normalize candles, volume, and spread into the graph.",
"params": {
"source": "ohlcv"
},
"dependsOn": []
},
{
"id": "fast-ema",
"kind": "indicator",
"label": "Fast EMA",
"description": "Detect near-term direction and momentum shifts.",
"params": {
"period": 8,
"source": "close"
},
"dependsOn": [
"price-feed"
]
},
{
"id": "slow-ema",
"kind": "indicator",
"label": "Slow EMA",
"description": "Track the broader trend so entries have context.",
"params": {
"period": 21,
"source": "close"
},
"dependsOn": [
"price-feed"
]
},
{
"id": "entry-engine",
"kind": "entry",
"label": "Crossover Entry",
"description": "Enter when fast momentum crosses above the slower trend.",
"params": {
"direction": "long"
},
"dependsOn": [
"fast-ema",
"slow-ema",
"volatility-filter"
]
},
{
"id": "exit-engine",
"kind": "exit",
"label": "Trailing Exit",
"description": "Exit when momentum rolls over or a stop is hit.",
"params": {
"trailingStopPct": 2.2
},
"dependsOn": [
"entry-engine"
]
},
{
"id": "risk-engine",
"kind": "risk",
"label": "Risk Engine",
"description": "Cap per-trade exposure and portfolio drawdown.",
"params": {
"maxRiskPct": 0.75
},
"dependsOn": [
"entry-engine",
"exit-engine"
]
},
{
"id": "webhook-executor",
"kind": "execution",
"label": "Webhook Executor",
"description": "Emit buy/sell signals to connected API endpoints.",
"params": {
"retries": 3
},
"dependsOn": [
"risk-engine"
]
}
]
}