これは,スーパートレンド指標に基づくビットコインの自動化された定量取引戦略である.市場動向を決定するためにスーパートレンド指標を使用し,リスクを制御するためにATRストップ損失原則を組み合わせ,長期および短期取引を可能にします.この戦略の最大の利点は,良いリスク・リワード比率と中長期保有に適した信頼できるストップ損失戦略です.この戦略は,Coinbase Proのような主流の取引所で4時間のタイムフレームを使用して適用できます.
この戦略は,スーパートレンド指標を使用して市場のトレンドの方向性を決定します.スーパートレンド指標がダウントレンドからアップトレンドに変化したとき,スーパートレンド指標がアップトレンドからダウントレンドに変化したとき,長くなります.
具体的には,この戦略は,まず14バーのATR期間を計算し,ATRストップ損失倍数 (1.5xなど) でそれを掛けることで,各取引のストップ損失距離を決定します.その後,デフォルトパラメータ (ATR期間=9,スーパートレンド倍数=2.5) を使用してスーパートレンド指標を計算します.スーパートレンド指標が方向を変更すると,取引信号が生成されます.
トレードに入ると,ストップ・ロスはATRストップ・ロスの上または下に固定される.最初のテイク・プロフィートレベルはリスク・報酬比に基づいて計算され,デフォルトは0.75である.つまり,テイク・プロフィートの距離はストップ・ロスの距離の0.75倍である.価格が最初のテイク・プロフィートレベルに達すると,ポジションの50%が閉鎖され,ストップ・ロスはエントリー価格 (ブレイク・イブン) に移動され,利益をロックする.第2テイク・プロフィートレベルは0.75のリスク・報酬比を使用し続けます.価格がストップ・ロスを打つ場合,残りのポジションはストップ・ロスを通して閉鎖されます.
この戦略は,中期から長期投資戦略に適した部分的な利益を得ることで,制御可能なストップ損失リスクを確保し,利益を固定します.
この戦略の最大の利点は,中期から長期にわたる保有を可能にする良質なリスク・リターン比である.
スーパートレンドを使って 市場の動向を特定し 市場のノイズをフィルタリングし 主要な動向を把握します
ストップ・ロスの動的ATR追跡,単一の取引損失を信頼的に制御する.
部分的な利益は利益に固定され リスクと報酬の比率が高くなります
ストップロスの入場価格に移動すると TP1で利益が固定され 戦略の安定性が向上します
非常にシンプルな論理で 簡単に理解し 実行できます
日中のデータや高周波データを使用する主流の取引所に適用され,柔軟性が高い.
この戦略には,主に次の分野において,いくつかのリスクがあります.
ギャップリスクがストップ損失を誘発できず,大きな損失に直面します.リスクを減らすためにATRストップ損失倍数を調整できます.
スーパートレンドは正しいトレンドを特定できず 間違ったトレード信号が表示されます
利潤比率が高すぎると 傾向に追いつかない
取引頻度は高すぎたり低すぎたりします.スーパートレンドパラメータを調整することで最適なバランスを取るべきです.
この戦略の最適化には,主に以下の分野において,まだ大きな余地があります.
固定ATR,モメントストップ,ボリンジャーストップ・ロスのような異なるATRストップ・ロスの方法をテストします.
最適なパラメータを ウォークフォワードや遺伝子アルゴリズムを使って 超トレンドパラメータを最適化します
ドンチアンチャネルのようなストップ損失の 2つ目の層を追加して
リスクバランスと最適な利益を取るために 異なる利益率をテストします ダイナミックにしてください
ダイナミックストップ損失,位置調整などのための機械学習技術を探求します
これはトレンド,ATRダイナミックストップおよび部分的な利益を得るためのスーパートレンドに基づいた定量戦略である.これはバランスのとれたリスク・リターン比を有し,アルゴ取引に適している.パラメータ,ストップ損失,利益取得などを最適化するのに十分な余地がある.長期の調整と適用に価値がある.
/*backtest start: 2024-01-06 00:00:00 end: 2024-02-05 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // Developed by © StrategiesForEveryone //@version=5 strategy("SuperTrend Strategy for BTCUSD 4H", overlay=true, process_orders_on_close = true, initial_capital = 100, default_qty_type = strategy.cash, precision = 2, slippage = 50, commission_value = 0.03, backtest_fill_limits_assumption = 50) // ------ Date filter (obtained from ZenAndTheArtOfTrading) --------- initial_date = input(title="Initial date", defval=timestamp("10 Feb 2014 13:30 +0000"), group="Time filter", tooltip="Enter the start date and time of the strategy") final_date = input(title="Final date", defval=timestamp("01 Jan 2030 19:30 +0000"), group="Time filter", tooltip="Enter the end date and time of the strategy") dateFilter(int st, int et) => time >= st and time <= et colorDate = input.bool(defval=false, title="Date background", tooltip = "Add color to the period of time of the strategy tester") bgcolor(colorDate and dateFilter(initial_date, final_date) ? color.new(color.blue, transp=90) : na) // ------------ Super Trend ---------- atrPeriod = input(9, "ATR Length SuperTrend") factor = input.float(2.5, "Factor SuperTrend", step = 0.05) [supertrend, direction] = ta.supertrend(factor, atrPeriod) show_supertrend = input.bool(defval = false, title="Show supertrend ?", group = "Appearance") bodyMiddle = plot(show_supertrend ? ((open + close) / 2) : na, display=display.none) upTrend = plot(show_supertrend and direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr) downTrend = plot(show_supertrend and direction > 0 ? supertrend : na, "Down Trend", color = color.red, style=plot.style_linebr) fill(bodyMiddle, upTrend, color.new(color.green, 90), fillgaps=false) fill(bodyMiddle, downTrend, color.new(color.red, 90), fillgaps=false) // ---------- Atr stop loss (obtained from garethyeo) source_atr = input(close, title='Source', group = "Atr stop loss", inline = "A") length_atr = input.int(14, minval=1, title='Period', group = "Atr stop loss" , inline = "A") multiplier = input.float(1.5, minval=0.1, step=0.1, title='Atr multiplier', group = "Atr stop loss", inline = "A", tooltip = "Defines the stop loss distance based on the Atr stop loss indicator") shortStopLoss = source_atr + ta.atr(length_atr) * multiplier longStopLoss = source_atr - ta.atr(length_atr) * multiplier show_atr_stoploss = input.bool(defval=false, title="Show Atr stop loss ?", group = "Appearance") plot(show_atr_stoploss ? longStopLoss : na, color=color.white, style = plot.style_circles) plot(show_atr_stoploss ? shortStopLoss : na, color=color.white, style = plot.style_circles) // ------------- Money management -------------- strategy_contracts = strategy.equity / close distance_sl_atr_long = -1 * (longStopLoss - close) / close distance_sl_atr_short = (shortStopLoss - close) / close risk = input.float(2.5, '% Account risk per trade', step=1, group = "Risk management for trades", tooltip = "Percentage of total account to risk per trade") long_amount = strategy_contracts * (risk / 100) / distance_sl_atr_long short_amount = strategy_contracts * (risk / 100) / distance_sl_atr_short // ---------- Risk management --------------- risk_reward_breakeven_long= input.float(title="Risk/reward for breakeven long", defval=0.75, step=0.05, group = "Risk management for trades") risk_reward_take_profit_long= input.float(title="Risk/reward for take profit long", defval=0.75, step=0.05, group = "Risk management for trades") risk_reward_breakeven_short= input.float(title="Risk/reward for break even short", defval=0.75, step=0.05, group = "Risk management for trades") risk_reward_take_profit_short= input.float(title="Risk/reward for take profit short", defval=0.75, step=0.05, group = "Risk management for trades") tp_percent=input.float(title="% of trade for first take profit", defval=50, step=5, group = "Risk management for trades", tooltip = "Closing percentage of the current position when the first take profit is reached.") // ------------ Trade conditions --------------- bought = strategy.position_size > 0 sold = strategy.position_size < 0 long_supertrend=ta.crossover(close, supertrend) short_supertrend=ta.crossunder(close, supertrend) var float sl_long = na var float sl_short = na var float be_long = na var float be_short = na var float tp_long = na var float tp_short = na if not bought sl_long:=na if not sold sl_short:=na // ---------- Strategy ----------- // Long position if not bought and long_supertrend sl_long:=longStopLoss long_stoploss_distance = close - longStopLoss be_long := close + long_stoploss_distance * risk_reward_breakeven_long tp_long:=close+(long_stoploss_distance*risk_reward_take_profit_long) strategy.entry('L', strategy.long, long_amount, alert_message = "Long") strategy.exit("Tp", "L", stop=sl_long, limit=tp_long, qty_percent=tp_percent) strategy.exit('Exit', 'L', stop=sl_long) if high > be_long sl_long := strategy.position_avg_price strategy.exit("Tp", "L", stop=sl_long, limit=tp_long, qty_percent=tp_percent) strategy.exit('Exit', 'L', stop=sl_long) if bought and short_supertrend strategy.close("L", comment="CL") // Short position if not sold and short_supertrend sl_short:=shortStopLoss short_stoploss_distance=shortStopLoss - close be_short:=((short_stoploss_distance*risk_reward_breakeven_short)-close)*-1 tp_short:=((short_stoploss_distance*risk_reward_take_profit_short)-close)*-1 strategy.entry("S", strategy.short, short_amount, alert_message = "Short") strategy.exit("Tp", "S", stop=sl_short, limit=tp_short, qty_percent=tp_percent) strategy.exit("Exit", "S", stop=sl_short) if low < be_short sl_short:=strategy.position_avg_price strategy.exit("Tp", "S", stop=sl_short, limit=tp_short, qty_percent=tp_percent) strategy.exit("Exit", "S", stop=sl_short) if sold and long_supertrend strategy.close("S", comment="CS") // ---------- Draw position on chart ------------- if high>tp_long tp_long:=na if low<tp_short tp_short:=na if high>be_long be_long:=na if low<be_short be_short:=na show_position_on_chart = input.bool(defval=true, title="Draw position on chart ?", group = "Appearance", tooltip = "Activate to graphically display profit, stop loss and break even") position_price = plot(show_position_on_chart? strategy.position_avg_price : na, style=plot.style_linebr, color = color.new(#ffffff, 10), linewidth = 1) sl_long_price = plot(show_position_on_chart and bought ? sl_long : na, style = plot.style_linebr, color = color.new(color.red, 10), linewidth = 1) sl_short_price = plot(show_position_on_chart and sold ? sl_short : na, style = plot.style_linebr, color = color.new(color.red, 10), linewidth = 1) tp_long_price = plot(strategy.position_size>0 and show_position_on_chart? tp_long : na, style = plot.style_linebr, color = color.new(#11eb47, 10), linewidth = 1) tp_short_price = plot(strategy.position_size<0 and show_position_on_chart? tp_short : na, style = plot.style_linebr, color = color.new(#11eb47, 10), linewidth = 1) breakeven_long = plot(strategy.position_size>0 and high<be_long and show_position_on_chart ? be_long : na , style = plot.style_linebr, color = color.new(#00ff40, 60), linewidth = 1) breakeven_short = plot(strategy.position_size<0 and low>be_short and show_position_on_chart ? be_short : na , style = plot.style_linebr, color = color.new(#00ff40, 60), linewidth = 1) position_profit_long = plot(bought and show_position_on_chart and strategy.openprofit>0 ? close : na, style = plot.style_linebr, color = color.new(#4cd350, 10), linewidth = 1) position_profit_short = plot(sold and show_position_on_chart and strategy.openprofit>0 ? close : na, style = plot.style_linebr, color = color.new(#4cd350, 10), linewidth = 1) fill(plot1 = position_price, plot2 = position_profit_long, color = color.new(color.green,90)) fill(plot1 = position_price, plot2 = position_profit_short, color = color.new(color.green,90)) fill(plot1 = position_price, plot2 = sl_long_price, color = color.new(color.red,90)) fill(plot1 = position_price, plot2 = sl_short_price, color = color.new(color.red,90)) fill(plot1 = position_price, plot2 = tp_long_price, color = color.new(color.green,90)) fill(plot1 = position_price, plot2 = tp_short_price, color = color.new(color.green,90))