この戦略は,価格の歴史的な変動幅に基づいて取引信号を生成する.特定の期間における最高値と最低値の差を計算し,移動平均値を使用して変動幅を形成する.価格がレンジの上下帯を突破すると取引信号が起動する.これはトレンドフォローブレイク戦略に属する.
基本指標は,価格の歴史的な変動です. 具体的な計算は:
過去のNバー間の最高値と最低値の違いを計算します.
Nバーの最高値と最低値の平均を計算する, avg ((H, L)
波動性 = HL / AVG ((H, L)
ここで N は
波動性を得ると,帯は以下のように計算されます.
上部帯 = 現行閉店 + 現行閉店 * 不安定性
ローナー・バンド = 現在の閉店 - 現在の閉店 * 変動
帯は,WMAによって平ら化され,周期は
価格が上位帯を突破すると,ロング,下位帯を突破するとショート.
出口信号は"出口タイプ"で定義される.
価格がWMAを下回るときに退場する.
価格が帯を下回るときに退場します.
リスクは以下によって軽減できます.
戦略は以下によって改善できます.
最適な組み合わせを見つけるために異なる長度値をテストします
例えば,価格が上位帯を突破すると,MACDも黄金線を突破しているかどうかを確認します.
シンプルなレンジブレイクストップの代わりに 後ろのストップに最適化します
停止後に再びトレンドを捉えるように 再入力のルールを設定します
市場変動に基づいて ダイナミックにサイズを調整します
この戦略は,トレンド強さを測定するために波動性ベースのバンドとブレイクアウト信号のための信頼できる取引範囲を形成するために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))