これは典型的なトレンドフォローシステムである.トレンド方向を決定するために移動平均クロスオーバーを使用し,価格がドンチアンチャネルを突破すると入力する. 短期市場のノイズをフィルタリングするためにドンチアンチャネルパラメータは50日に設定されている. 移動平均は40日および120日指数関数移動平均で,中長期のトレンドをよりよく把握することができます. ストップロスは個々の取引で損失を効果的に制御するために価格の下の4倍ATRに設定されています.
この戦略は主に以下の点に基づいています
40日および120日指数関数移動平均は,トレンド決定指標を構築するために使用されます. 速い線が下からスローラインを越えると,それは上向きを示唆する黄色のクロス信号です. 速い線が上からスローラインを下に越えると,それはダウントレンドを示唆する死亡クロス信号です.
ドンチアン・チャネルパラメータは,市場の騒音をフィルタリングするために50日間に設定されています.価格は上部帯を超えるとだけロングで,価格が下部帯を超えるとだけショートで,罠にはまらないようにします.
ストップ・ロスは価格を下回る4倍に設定される.ATRは市場変動とリスクを効果的に測定することができる.ストップ・ロスをその倍数に設定することで,個々の取引での損失を制御することができる.
指数関数移動平均は現在の価格動向に適しており,単純な移動平均は滑らかすぎます.
50日間のチャネル期間は 40日間の移動平均値と 120日間の移動平均値とうまく機能し,誤ったブレイクを効果的にフィルタリングします.
この戦略の利点は以下の通りです.
移動平均の組み合わせは,市場のトレンド方向を効果的に決定することができます. 40 日間MAは短期的なトレンドを捉え, 120 日間MAは長期的なトレンドを判断します.
ドンチアン運河はノイズをフィルターし,上と下を追いかけるのを避けます. 運河のブレイクアウトに侵入するだけで,真ん中の統合領域の取引を効果的に避けることができます.
ストップロスの設定は,個々の取引での損失を制御し,口座の膨張を避けるために合理的です.単一の取引損失を制御することで利益の持続が保証されます.
指数関数移動平均は価格変動傾向により適しており,トレンド取引の考えに合致するより長い保持期間を可能にします.
移動平均のパラメータは,トレンドキャプチャ感度とノイズフィルターの安定性とのバランスをとります.
この戦略のリスクは以下のとおりです.
長期保有期間リスク: 傾向を追求する戦略として,長期にわたる横向の範囲や傾向の逆転で大きな損失が発生することがあります.
偽ブレイクリスク:価格がチャネル帯近くに触ると,不必要な取引を引き起こす場合,偽ブレイクの割合がある可能性があります.
リスク設定パラメータ: 移動平均値とチャネルの設定は主観的です.異なる市場では調整された組み合わせが必要で,そうでなければシステムの安定が影響されます.
ストップ・ロスの制限が過度に厳しいリスク:ストップ・ロスの制限が過度に厳しい場合,ストップ・アウトが過度に多くなり,収益性に影響を与える可能性があります.
解決策:
戦略は以下の側面で最適化できます.
最適パラメータを見つけるために異なる移動平均の組み合わせをテストする.様々な単純な指数関数的なハル移動平均をテストすることができる.
チャンネルの期間と設定を最適化して,ブレイクアウト信号をより効果的にします. 市場の変動頻度に基づいて最適化します.
ストップ・ロスの戦略を最適化する.トレンド期間のトライリングストップとトレンド終了後の固定ストップを採用する.
MACD,KDのような確認指標を追加して信号の精度を向上させる.
ポジションのサイズ戦略を導入する トレンド期間のピラミッドで利益を最適化する
システムをより堅牢にするため,異なる製品特性に応じてパラメータの組み合わせを選択します.
ストップ・ロスト戦略は,量子システム開発のための基本的なフレームワークとして機能し,比較的安定した利益のために直接展開することもできます. テストによるさらなる最適化はシステム安定性と収益性を向上させることができます. 要するに,この戦略は使いやすさと汎用性を備えており,基本的な定量的な取引戦略として適しています.
/*backtest start: 2023-10-15 00:00:00 end: 2023-11-14 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/ // © Robrecht99 //@version=5 strategy("Long Term Trend Following System", overlay=true, margin_long=0, margin_short=0, pyramiding=4) // Backtest Range // Start = input(defval = timestamp("01 Jan 2017 00:00 +0000"), title = "Backtest Start Date", group = "backtest window") Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", group = "backtest window") //Moving Averages // len1 = input.int(40, minval=1, title="Length Fast EMA", group="Moving Average Inputs") len2 = input.int(120, minval=1, title="Length Slow EMA", group="Moving Average Inputs") src1 = input(close, title="Source Fast MA") src2 = input(close, title="Source Slow MA") maFast = input.color(color.new(color.red, 0), title = "Color Fast EMA", group = "Moving Average Inputs", inline = "maFast") maSlow = input.color(color.new(color.blue, 0), title = "Color Slow EMA", group = "Moving Average Inputs", inline = "maSlow") fast = ta.ema(src1, len1) slow = ta.ema(src2, len2) plot(fast, color=maFast, title="Fast EMA") plot(slow, color=maSlow, title="Slow EMA") // Donchian Channels // Length1 = input.int(title="Length Upper Channel", defval=50, minval=1, group="Donchian Channels Inputs") Length2 = input.int(title="Length Lower Channel", defval=50, minval=1, group="Donchian Channels Inputs") h1 = ta.highest(high[1], Length1) l1 = ta.lowest(low[1], Length2) fillColor = input.color(color.new(color.purple, 95), title = "Fill Color", group = "Donchian Channels Inputs") upperColor = input.color(color.new(color.orange, 0), title = " Color Upper Channel", group = "Donchian Channels Inputs", inline = "upper") lowerColor = input.color(color.new(color.orange, 0), title = " Color Lower Channel", group = "Donchian Channels Inputs", inline = "lower") u = plot(h1, "Upper", color=upperColor) l = plot(l1, "Lower", color=upperColor) fill(u, l, color=fillColor) strategy.initial_capital = 50000 //ATR and Position Size // length = input.int(title="ATR Period", defval=14, minval=1, group="ATR Inputs") risk = input(title="Risk Per Trade", defval=0.01, group="ATR Inputs") multiplier = input(title="ATR Multiplier", defval=2, group="ATR Inputs") atr = ta.atr(length) amount = (risk * strategy.initial_capital / (multiplier * atr)) // Buy and Sell Conditions // entrycondition1 = ta.crossover(fast, slow) entrycondition2 = fast > slow sellcondition1 = ta.crossunder(fast, slow) sellcondition2 = slow > fast // Buy and Sell Signals // if (close > h1 and entrycondition2) strategy.entry("long", strategy.long, qty=amount) stoploss = close - atr * 4 strategy.exit("exit sl", stop=stoploss, trail_offset=stoploss) if (sellcondition1 and sellcondition2) strategy.close(id="long") if (close < l1 and sellcondition2) strategy.entry("short", strategy.short, qty=amount) stoploss = close + atr * 4 strategy.exit("exit sl", stop=stoploss, trail_offset=stoploss) if (entrycondition1 and entrycondition2) strategy.close(id="short")