モメンタムチャネルフォロー戦略


作成日: 2023-12-25 13:14:24 最終変更日: 2023-12-25 13:14:24
コピー: 0 クリック数: 729
1
フォロー
1621
フォロワー

モメンタムチャネルフォロー戦略

概要

この戦略は,動量チャネル指標に基づいて取引シグナルを設計し,価格突破チャネル上下軌道に応じて買入と売却のシグナルを生成する.この戦略は,複数頭での取引のみを行い,売却のシグナルが発生した場合,平仓状態から空仓状態にします.

戦略原則

この戦略は,SMA平均とATRの実際の波動幅を用いて動力チャネルを構築する.チャネルの上線と下線は,それぞれ:

線路上 = SMA + ATR *係数 下線 = SMA - ATR *係数

価格が上から軌道に乗ったとき,買いのシグナルを生じ;価格が下から軌道に乗ったとき,売りのシグナルを生じ。

複数頭しか作れないので,出売シグナルが出た場合,前回の開仓注文をキャンセルし,平仓を空仓状態にします.

具体的には,戦略の論理は以下の通りです.

  1. SMAとATRを使用して動力通路を構築する
  2. 価格が上昇すると,開店価格を設定し,多額の注文をします.
  3. 価格が下落すると,前回の多額の注文を平らにして,ポジションを空置する

優位分析

この戦略は以下の利点があります.

  1. 戦略の論理はシンプルで明快で,実行は簡単です.
  2. 動力チャネル指標は直感的で,市場動向を正確に判断します.
  3. 複数の取引で,ストップ・ロスのリスクを避ける
  4. 条件を順番に並べて,精密なエントリーに役立ちます.

リスク分析

この戦略にはいくつかのリスクがあります.

  1. 市場が揺れ動いている時,頻繁に空調が発生する可能性があります.
  2. 余分な仕事で空いた機会を利用できない.
  3. 退出の仕組みはなく,人工的に退出点を判断する必要があります.

対策として

  1. 経路パラメータを最適化し,誤差信号を減らす
  2. 追加した空頭モジュールで 2 方向の取引を行う
  3. モバイルストップ,トレーリングストップなどの退出メカニズムを追加

最適化の方向

この戦略は以下の点で最適化できます.

  1. 最適化パラメータ,調整チャネル周期,波動率係数など
  2. 空頭モジュールを追加し,価格の下下走行によってセールシグナルを生成
  3. ATR付随のストップと,ストップメカニズムへの加入
  4. フィルタリング条件の追加を検討して 誤った信号を避ける
  5. 異なる品種の契約の効果をテストする

要約する

この戦略は,動量チャネル指標に基づいて,簡単に効果的に市場トレンドを捉えます.戦略の論理は明確で分かりやすく,価格突破チャネルを軌道上下して取引シグナルを生成します.多頭と退出メカニズムがないだけでは不十分ですが,パラメータ最適化,空頭モジュールの追加,ストップの追加などで改善することができます.全体的に,この戦略は,改善の余地が非常に大きく,深度な研究と適用の価値のある量化戦略です.

ストラテジーソースコード
/*backtest
start: 2023-11-24 00:00:00
end: 2023-12-24 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Keltner Channel Strategy", overlay=true)
source = close

useTrueRange = input(true)
length = input(20, minval=1)
mult = input(1.0)

ma = sma(source, length)
range = useTrueRange ? tr : high - low
rangema = sma(range, length)
upper = ma + rangema * mult
lower = ma - rangema * mult

crossUpper = crossover(source, upper)
crossLower = crossunder(source, lower)

bprice = 0.0
bprice := crossUpper ? high+syminfo.mintick : nz(bprice[1])

sprice = 0.0
sprice := crossLower ? low -syminfo.mintick : nz(sprice[1]) 

crossBcond = false
crossBcond := crossUpper ? true 
 : na(crossBcond[1]) ? false : crossBcond[1]

crossScond = false
crossScond := crossLower ? true 
 : na(crossScond[1]) ? false : crossScond[1]

cancelBcond = crossBcond and (source < ma or high >= bprice )
cancelScond = crossScond and (source > ma or low <= sprice )

if (cancelBcond)
    strategy.cancel("KltChLE")

if (crossUpper)
    strategy.entry("KltChLE", strategy.long, stop=bprice, comment="KltChLE")

if (cancelScond)
    strategy.cancel("KltChSE")

if (crossLower)
    strategy.entry("KltChSE", strategy.short, stop=sprice, comment="KltChSE")

//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)