通用策略文件格式
目前支援 JSON 策略設定檔,上傳後會使用系統內建 OHLCV 資料執行回測。
上傳規範
檔案類型
.json,UTF-8 或 UTF-8 BOM 皆可。大小限制單一策略文件最多 200 KB。
策略引擎支援
strategy.type = "rule_based" 與既有 strategy.name = "trend_following"。策略原始週期上傳時選擇此策略參數原本對應的 K 線週期,例如
5m 或 1d。週期切換勾選「依週期縮放參數」時,系統會依目標週期換算快慢線、量能、ATR 與最多持有根數。
必要區塊
run_name:策略顯示名稱與儲存檔名來源。backtest:資金、成本、日期範圍。strategy:策略類型、方向、進場規則、出場規則。risk:單筆風險、倉位與停損。verdict:裁決門檻與 bootstrap 設定。
建議原則
- 通用策略優先使用
strategy.type: "rule_based"。 all表示所有條件都要成立,any表示任一條件成立。- 均線交叉用
crosses_above/crosses_below,例如 EMA20 上穿 EMA50。 - 複合條件可使用 expression 運算樹,例如
close > previous_close + ATR * 2。 - 突破前 N 根高點時,用
highest搭配shift: 1,避免把目前這根 K 棒納入比較。 - 日線策略可用
max_holding_days表示天數;日內策略在系統中代表 K 棒數。 - 加密貨幣通常使用
allow_fractional_shares: true。 - 先用保守成本,例如手續費
0.001與滑價8bps。
欄位說明
backtest.initial_cash期初資金,數字。
backtest.commission_rate單邊手續費率,例如
0.001 代表 0.1%。backtest.commission_per_unit每單位固定手續費;期貨可用來表示每口固定費用。
backtest.transaction_tax_rate交易稅率,平倉時計入成本;不需要時填
0 或省略。backtest.slippage_bps滑價,bps 單位;
8 代表 0.08%。backtest.start_date
null 或 YYYY-MM-DD。backtest.trade_start_date
null 或 YYYY-MM-DD;可用更早資料暖機指標,但只從此日期後開始交易。backtest.end_date
"latest" 或 YYYY-MM-DD。strategy.type通用規則策略請填
"rule_based"。strategy.side
"long"、"short" 或 "both";both 代表多空雙向。strategy.entry / exit單向策略使用這兩個欄位,可使用
all、any 或單一條件。long_entry / long_exit
side: "both" 時的做多進出場規則。short_entry / short_exit
side: "both" 時的做空進出場規則。condition.left / right可填價格欄位、數字或指標物件。
condition.operator支援
>、>=、<、<=、==、!=、crosses_above、crosses_below。indicator支援
sma、ema、rsi、atr、macd、bollinger、roc、momentum、volume_sma、volume_ema、highest、lowest。macd.component支援
line、signal、histogram;可設定 fast_window、slow_window、signal_window。bollinger.band支援
upper、middle、lower;可設定 window 與 stddev。expression支援
{"op":"add","args":[...]}、subtract、multiply、divide。source支援
open、high、low、close、volume。shift指標往前位移 N 根。突破前 20 根高點可用
{"indicator":"highest","source":"high","window":20,"shift":1}。strategy.atr_windowATR 計算視窗,整數。
risk.risk_per_trade_pct單筆最大風險占資金比例,例如
0.01。risk.max_position_pct單一部位最大資金比例,例如
0.2。risk.max_open_positions全策略同一時間最多可持有的未平倉單數;設為
1 時,平倉前不會再建立第二張單。risk.max_position_units單一部位的數量上限;期貨設為
1 即限制每筆最多一口。backtest.position_accounting
cash 為現貨資金交割,futures 為保證金與逐點損益模式。backtest.contract_multiplier每一價格點對應的金額;臺股期貨 TX 為
200。backtest.margin_per_unit每口原始保證金;會限制可建立的期貨口數。
risk.atr_stop_multiple通用初始停損 ATR 倍數。
risk.long_atr_stop_multiple多單專用初始停損 ATR 倍數;未設定時使用
atr_stop_multiple。risk.short_atr_stop_multiple空單專用初始停損 ATR 倍數;未設定時使用
atr_stop_multiple。risk.trailing_stop_atr_multiple移動停損 ATR 倍數;可用
null 關閉。risk.take_profit_pct固定百分比止盈;例如
0.3 代表獲利 30% 觸發止盈,null 代表不使用固定止盈。risk.long_take_profit_pct多單專用固定止盈比例;未設定時使用
take_profit_pct。risk.short_take_profit_pct空單專用固定止盈比例;未設定時使用
take_profit_pct。通用 rule_based JSON 範本
{
"run_name": "ema_macd_expression_combo",
"description": "Rule-based long strategy using EMA cross, MACD momentum, volume, and ATR expression.",
"market": "crypto:binance",
"backtest": {
"initial_cash": 100000.0,
"commission_rate": 0.001,
"commission_per_unit": 0.0,
"transaction_tax_rate": 0.0,
"slippage_bps": 8.0,
"allow_fractional_shares": true,
"position_accounting": "cash",
"contract_multiplier": 1.0,
"margin_per_unit": null,
"annualization_factor": 365,
"start_date": null,
"trade_start_date": null,
"end_date": "latest"
},
"strategy": {
"type": "rule_based",
"side": "long",
"atr_window": 14,
"max_holding_days": 120,
"entry": {
"all": [
{
"left": { "indicator": "ema", "source": "close", "window": 20 },
"operator": "crosses_above",
"right": { "indicator": "ema", "source": "close", "window": 50 }
},
{
"left": { "indicator": "macd", "source": "close", "component": "line" },
"operator": ">",
"right": { "indicator": "macd", "source": "close", "component": "signal" }
},
{
"left": "volume",
"operator": ">",
"right": { "indicator": "volume_ema", "window": 20 }
},
{
"left": "close",
"operator": ">",
"right": {
"op": "add",
"args": [
{ "field": "close", "shift": 1 },
{
"op": "multiply",
"args": [
{ "indicator": "atr", "window": 14 },
0.5
]
}
]
}
}
]
},
"exit": {
"any": [
{
"left": "close",
"operator": "<",
"right": { "indicator": "ema", "source": "close", "window": 20 }
},
{
"left": "close",
"operator": ">",
"right": { "indicator": "bollinger", "source": "close", "window": 20, "band": "upper", "stddev": 2.0 }
}
]
}
},
"risk": {
"risk_per_trade_pct": 0.01,
"max_position_pct": 0.2,
"max_open_positions": 5,
"max_position_units": null,
"atr_stop_multiple": 2.0,
"long_atr_stop_multiple": null,
"short_atr_stop_multiple": null,
"trailing_stop_atr_multiple": 2.5,
"take_profit_pct": null,
"long_take_profit_pct": null,
"short_take_profit_pct": null
},
"verdict": {
"min_trades": 10,
"min_profit_factor": 1.1,
"max_drawdown_pct": 0.3,
"min_bootstrap_positive_probability": 0.6,
"bootstrap_iterations": 500,
"random_seed": 42
}
}
多空雙向範例
{
"run_name": "ema_dual_side_strategy",
"market": "crypto:binance",
"backtest": {
"initial_cash": 100000.0,
"commission_rate": 0.001,
"slippage_bps": 8.0,
"allow_fractional_shares": true,
"start_date": null,
"end_date": "latest"
},
"strategy": {
"type": "rule_based",
"side": "both",
"atr_window": 14,
"max_holding_days": 120,
"long_entry": {
"left": { "indicator": "ema", "source": "close", "window": 20 },
"operator": "crosses_above",
"right": { "indicator": "ema", "source": "close", "window": 50 }
},
"long_exit": {
"left": { "indicator": "ema", "source": "close", "window": 20 },
"operator": "crosses_below",
"right": { "indicator": "ema", "source": "close", "window": 50 }
},
"short_entry": {
"left": { "indicator": "ema", "source": "close", "window": 20 },
"operator": "crosses_below",
"right": { "indicator": "ema", "source": "close", "window": 50 }
},
"short_exit": {
"left": { "indicator": "ema", "source": "close", "window": 20 },
"operator": "crosses_above",
"right": { "indicator": "ema", "source": "close", "window": 50 }
}
},
"risk": {
"risk_per_trade_pct": 0.01,
"max_position_pct": 0.2,
"max_open_positions": 5,
"max_position_units": null,
"atr_stop_multiple": 2.0,
"long_atr_stop_multiple": null,
"short_atr_stop_multiple": null,
"trailing_stop_atr_multiple": 2.5,
"take_profit_pct": null,
"long_take_profit_pct": null,
"short_take_profit_pct": null
}
}