波動性範囲外取引戦略

作者: リン・ハーンチャオチャン, 日時: 2023-09-21 20:38:29
タグ:

概要

この戦略は,価格の歴史的な変動幅に基づいて取引信号を生成する.特定の期間における最高値と最低値の差を計算し,移動平均値を使用して変動幅を形成する.価格がレンジの上下帯を突破すると取引信号が起動する.これはトレンドフォローブレイク戦略に属する.

戦略の論理

基本指標は,価格の歴史的な変動です. 具体的な計算は:

  1. 過去のNバー間の最高値と最低値の違いを計算します.

  2. Nバーの最高値と最低値の平均を計算する, avg ((H, L)

  3. 波動性 = HL / AVG ((H, L)

ここで N は 波動長度パラメータです.

波動性を得ると,帯は以下のように計算されます.

上部帯 = 現行閉店 + 現行閉店 * 不安定性

ローナー・バンド = 現在の閉店 - 現在の閉店 * 変動

帯は,WMAによって平ら化され,周期は平均長として設定される.

価格が上位帯を突破すると,ロング,下位帯を突破するとショート.

出口信号は"出口タイプ"で定義される.

  1. 価格がWMAを下回るときに退場する.

  2. 価格が帯を下回るときに退場します.

利点

  • 波動はトレンドをうまく捉える
  • WMAは帯をより安定して信頼性のあるものにする
  • 突破信号はタイミングでトレンドを回転します
  • WMA/バンドに基づく出口は損失を迅速に削減する
  • 異なる市場のためのパラメータ調整のための多くの余地

リスク

  • ブレイクアウトは,価格逆転を伴います.
  • トレンド逆転で大きな損失のリスク
  • WMA は 時々 傾向 の 転換 を 検出 する こと が 遅い こと が あり ます
  • パラメータの最適化は簡単ではなく,多くの試行錯誤が必要です
  • リスク管理の良さが必要

リスクは以下によって軽減できます.

  • より信頼性の高い帯域のためのパラメータの最適化
  • 他の指標を追加して,ウィップソウを避ける
  • 規模を小さくし,リスク管理を改善する
  • 再入国を検討する

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

戦略は以下によって改善できます.

  1. パラメータ調整

最適な組み合わせを見つけるために異なる長度値をテストします

  1. 他の指標を追加する

例えば,価格が上位帯を突破すると,MACDも黄金線を突破しているかどうかを確認します.

  1. ストップ・ロスはいい

シンプルなレンジブレイクストップの代わりに 後ろのストップに最適化します

  1. 再入国

停止後に再びトレンドを捉えるように 再入力のルールを設定します

  1. 位置サイズ

市場変動に基づいて ダイナミックにサイズを調整します

概要

この戦略は,トレンド強さを測定するために波動性ベースのバンドとブレイクアウト信号のための信頼できる取引範囲を形成するためにWMAを使用して,一般的にトレンド市場のためにうまく機能します.しかし,遅れのトレンド検出,改善可能なストップなど,いくつかの問題があります.パラメータとルールを調整するために,誤った信号を削減し,異なる市場条件で堅牢にするために実際のデータを使用して広範なバックテストと最適化が必要です.また,厳格なリスク管理は長期的な収益性の鍵です.


/*backtest
start: 2023-09-13 00:00:00
end: 2023-09-20 00:00:00
period: 5m
basePeriod: 1m
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/
// © wbburgin

//@version=5
strategy("Volatility Range Breakout Strategy [wbburgin]", shorttitle = "VRB Strategy [wbburgin]", overlay=true,
 pyramiding=20,max_bars_back=2000,initial_capital=10000)

wma(float priceType,int length,float weight) =>
    norm = 0.0
    sum = 0.0
    for i = 0 to length - 1
        norm := norm + weight
        sum := sum + priceType[i] * weight
    sum / norm

// This definition of volatility uses the high-low range divided by the average of that range.
volatility(source,length) =>
    h = ta.highest(source,length)
    l = ta.lowest(source,length)
    vx = 2 * (h - l) / (h + l)
    vx

vm1 = input.int(100,"Average Length")
volLen = input.int(100,"Volatility Length")
vsrc = input.source(close,"Volatility Source")
cross_type = input.source(close,"Exit Source")
exit_type = input.string("Volatility MA",options=["Volatility MA","Range Crossover"],title="Exit Type")

volatility = volatility(vsrc,volLen)

highband1 = close + (close * volatility)
lowband1 = close - (close * volatility)
hb1 = wma(highband1,vm1,volatility)
lb1 = wma(lowband1,vm1,volatility)
hlavg = math.avg(hb1,lb1)

upcross = ta.crossover(high,hb1)    //Crossing over the high band of historical volatility signifies a bullish breakout
dncross = ta.crossunder(low,lb1)    //Crossing under the low band of historical volatility signifies a bearish breakout

vlong = upcross
vshort = dncross
vlong_exit = switch
    exit_type == "Volatility MA" => ta.crossunder(cross_type,hlavg)
    exit_type == "Range Crossover" => ta.crossunder(cross_type,hb1)
vshort_exit = switch
    exit_type == "Volatility MA" => ta.crossover(cross_type,hlavg)
    exit_type == "Range Crossover" => ta.crossover(cross_type,lb1)

if vlong
    strategy.entry("Long",strategy.long)
if vlong_exit
    strategy.close("Long")
if vshort
    strategy.entry("Short",strategy.short)
if vshort_exit
    strategy.close("Short")

plot(hlavg,color=color.white,title="Weighted Volatility Moving Average")
t = plot(hb1,color=color.new(color.red,50),title="Volatility Reversal Band - Top")
b = plot(lb1,color=color.new(color.green,50),title="Volatility Reversal Band - Bottom")

alertcondition(vlong,"Volatility Long Entry Signal")
alertcondition(vlong_exit,"Volatility Long Exit Signal")
alertcondition(vshort,"Volatility Short Entry Signal")
alertcondition(vshort_exit,"Volatility Short Exit Signal")

fill(t,b,color=color.new(color.aqua,90))

もっと