ダイナミック・チャネル・ブレークスルー戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-27 15:15:07
タグ:

img

概要

この戦略は,移動平均線と組み合わせたケルトナーチャネル指標を使用して,ダイナミックなブレイクアウト購入と販売価格を設定し,低購入高販売ブレイクアウト操作を達成します. 戦略は自動的にチャネルブレイクアウト購入と販売機会を特定することができます.

戦略原則

  1. チャンネルの中間値を計算する: チャンネルの価格の中間値を計算するために指数的な移動平均を使用します.
  2. チャンネル帯域幅を計算する: チャンネル帯域幅を計算するために,実際の変動,平均的な実際の変動,または価格幅の移動平均を使用します.
  3. チャンネル上部と下部レール: 中間数 ± N × チャンネル帯域幅
  4. 入力順序:価格が上方レールに触ると,突破買い価格を設定し,突破を待つ.価格が下部レールに触ると,突破販売価格を設定し,突破を待つ.
  5. 出口命令: 価格が購入後の中間値に戻り,または最高価格がエントリー価格を超えるとストップ損失; 価格が販売後中間値に戻り,または最低価格がエントリー価格を下回るとストップ損失

利点分析

  1. ダイナミックなチャネルの利用により,市場の動向の変化を迅速に把握できます
  2. 価格動向の方向性を判断するのにメディアンを使うことが便利です
  3. N × 帯域幅設定は,頻度の位置調整を避けるためにチャネル範囲を合理化します
  4. 突破のメカニズムを使うことは 傾向理論に合致し 傾向を追います
  5. ストップ・ロスの条件を設定することで,リスクは厳格に制御されます.

リスク分析

  1. 中間線を計算する方法は,チャンネル範囲と価格のマッチング効果に影響を与える.
  2. 戦略の収益率に影響を与える N 倍数が大きすぎたり小さい場合
  3. 突破的な買い物と売り物は 誤った信号を形成する傾向があり 厳格に停止されるべきです

オプティマイゼーションの方向性

  1. 最適なパラメータを見つけるために,異なる中間線計算方法を試してみましょう
  2. 適正な倍数を見つけるために異なるN値をテストする
  3. 誤った信号を避けるために突破幅を増やす
  4. 単一の損失を厳格に制御するためにストップ損失ロジックを最適化

概要

総合戦略は,動的チャネル指標を通じて価格動向と方向性を判断するための科学的で合理的な方法を使用して,突破信号を捕捉するために合理的なパラメータを設定し,低買い高売りを達成し,過剰収益を得ます.同時に,戦略のリスクを継続的に最適化して,さまざまな市場で安定的に実行することができます.


/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Keltner Strategy", overlay=true)
length = input.int(20, minval=1)
mult = input.float(2.0, "Multiplier")
src = input(close, title="Source")
exp = input(true, "Use Exponential MA")
BandsStyle = input.string("Average True Range", options = ["Average True Range", "True Range", "Range"], title="Bands Style")
atrlength = input(10, "ATR Length")
esma(source, length)=>
	s = ta.sma(source, length)
	e = ta.ema(source, length)
	exp ? e : s
ma = esma(src, length)
rangema = BandsStyle == "True Range" ? ta.tr(true) : BandsStyle == "Average True Range" ? ta.atr(atrlength) : ta.rma(high - low, length)
upper = ma + rangema * mult
lower = ma - rangema * mult
crossUpper = ta.crossover(src, upper)
crossLower = ta.crossunder(src, 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 (src < ma or high >= bprice )
cancelScond = crossScond and (src > 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")

もっと