これはチャネル指標に基づいたブレークアウト取引戦略である.チャネルバンドの振動特性を利用して,価格が上部バンドを突破するとロング,下部バンドを突破するとショートする.トレンドフォロー戦略カテゴリーに属する.
この戦略は,まずSMAを使用してチャネルのミッドラインを計算する.上帯はミッドラインプラスパラメータ値で,下帯はミッドラインマイナスパラメータ値で設定され,価格チャネルを形成する.その後,価格が上または下帯から突破するかどうかを判断し,開通信号として取引量の激増と組み合わせます.価格がチャネルに戻ると,閉じる信号として機能します.
具体的には,取引の論理は次のとおりです.
中間線を計算する:SMA (近,N)
上部帯: 中間線 + パラメータ値
下帯: 中間線 - パラメータ値
取引量が前期の2倍以上の場合 ロングにします
価格がチャネルに戻ると,ロングポジションを閉じる.
価格が下帯を下回ると,取引量が前期の2倍以上になると,ショートします.
価格がチャネルに戻ると,ショートポジションを閉じる.
この戦略の利点は次のとおりです.
チャネルインジケーターを使うことで 価格動向を効果的に追跡できます
取引量の急増と組み合わせると 偽のブレイクがうまくフィルターされます
チャンネルに戻ると,ストップ・ロスのメカニズムとして機能し,取引ごとに損失を制限します.
振動特性は中期トレンドを捉えるのに適しています
シンプルな論理は理解し実行しやすいのです
リスクもあります:
連続して同じ方向で取引する時 価格が長時間 損失のリスクが増えるため チャンネルの片側にとどまります
チャンネルパラメータの設定が正しくない場合,誤った信号が過剰に発生する可能性があります.
取引量の急上昇の誤った基準は 真のブレイクシグナルを見逃す可能性があります
ストップ・ロスのメカニズムは 保守的すぎるかもしれないし 大きな動きを 見逃しているかもしれない
戦略は以下の側面で最適化できます.
チャンネルパラメータを最適化し,異なる市場特性に合わせる.
オープンポジションの基準を高め,例えば MAクロスオーバーやキャンドルスタイクパターンを考慮して,偽のブレイクを避ける.
ストップ・ロスのメカニズムを最適化し 早期出口を避けるため ストップ・ロスの範囲を広げます
ポジションのサイズと資本利用を市場状況に基づいて調整するためのポジションサイズ付けルールを追加する.
一般的なトレンドの方向性を決定するためにより多くの指標を組み込み,主要なトレンドに反する取引を避ける.
概要すると,これはシンプルで実践的なトレンドフォロー戦略である.チャネル振動を利用することで,中期トレンドを効果的に把握することができる.しかし,異なる市場に適合するためにパラメータ調整が必要であり,リスクは監視されるべきである.より多くの指標と技術によるさらなる最適化は,安定性と収益性を向上させる.
/*backtest start: 2022-11-08 00:00:00 end: 2023-11-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Copyright, 2022, Cache_that_pass. You are free to use this script however you see fit and reproduce it in any manner. //@version=5 ////// Name the strategy between the 2 quotation marks. Consider setting commission type and value in strategy header to match exchanges rates. ////// strategy("Oscillating SSL Channel Strategy", "O-SSL Strat", overlay=true, pyramiding=1, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 100, calc_on_order_fills=true) ////// Inputs and calculations used by script ////// period = input(title='Period', defval=25) len = input(title='Period', defval=25) smaHigh = ta.sma(high, len) smaLow = ta.sma(low, len) Hlv = int(na) Hlv := close > smaHigh ? 1 : close < smaLow ? -1 : Hlv[1] sslDown = Hlv < 0 ? smaHigh : smaLow sslUp = Hlv < 0 ? smaLow : smaHigh ////// Show me the money ////// plot(sslDown, linewidth=2, color=color.new(color.red, 0)) plot(sslUp, linewidth=2, color=color.new(color.lime, 0)) ////// Trade execution logic ////// //pseudo-code// //Go long when high (or maybe close) breaks above the sslUp and volume is 2x or > Volume[1] and sslUp > sslDown //Close the above longs when sslUp crosses under sslDown (or set takeprofit and stop loss exits) // //Go short when low is lower than the sslUp and volume is 2x or > Volume[1] and sslDown > sslUp //Close shorts when sslDown crosses under sslUp longCondition1 = (sslUp > sslDown) longCondition2 = ta.crossover(high, sslUp) //longCondition3 = (volume >= (volume[1]*1.89)) longCondition = ((longCondition1) and (longCondition2))// and (longCondition3)) longExit = ta.crossunder(sslUp, sslDown) ////// Bring It ////// if (longCondition) strategy.entry("Bring It", strategy.long) ////// Sling It ////// if (longExit) strategy.close("Bring It", comment="Sling It") shortCondition1 = (sslDown) > (sslUp) shortCondition2 = ta.crossunder(low, sslUp) //shortCondition3 = (volume >= (volume[1]*1.89)) shortCondition = ((shortCondition1) and (shortCondition2))// and (shortCondition3)) shortExit = ta.crossunder(sslDown, sslUp) ////// Bring It ////// if (shortCondition) strategy.entry("Bring It", strategy.long) ////// Sling It ////// if (shortExit) strategy.close("Bring It", comment="Sling It") ////// Sling It ////// if (shortCondition) strategy.entry("Sling It", strategy.short) ////// Bling It ////// if (shortExit) strategy.close("Sling It", comment="Bring It")