
この戦略は,価格の平らな波動率に基づいて,価格目標帯を生成し,価格が目標帯を破るとき,取引信号を生成する.
この戦略は,まず,価格が一定の周期で平均波動幅を計算し,指数移動平均によって波動幅の平滑処理を行い,平滑波動率を生成する.平滑波動率を係数で掛けると,ターゲット帯の範囲が得られる.価格がターゲット帯を突破して軌道上になると,買入シグナルを生成する.価格がターゲット帯を突破して軌道下になると,売出シグナルを生成する.
具体的には,戦略では,smoothrng関数を使用して滑動率smrngを計算し,smrng値に基づいてターゲット帯の上下軌道のhbandとlbandを計算する.この基礎で,ロングポジション条件longConditionとショートポジション条件shortConditionを設定する.ロングポジション条件が満たされると,買取シグナルを生成する.ショートポジション条件が満たされると,売り出しシグナルを生成する.
この戦略の利点は以下の通りです.
価格の変動率を使って取引シグナルを構築し,市場の変化を効果的に追跡することができる.
指数移動平均の平らな波動率により,ノイズをフィルターし,より信頼性の高い取引信号を生成する.
ターゲット帯域は波動率係数で調整され,戦略をより柔軟にすることができる.
価格の突破判断と組み合わせて,トレンドが逆転した時に取引機会を把握できます.
この戦略にはいくつかのリスクがあります.
市場が異常な波動を起こすとき,平滑の波動率は,実際の波動を正確に反映できない可能性があり,誤った信号を引き起こす.パラメータを調整することでモデルを最適化することができる.
ターゲット帯域は,正しく設定されていない場合,取引頻度が過高または信号不足を引き起こす可能性があります.最適な範囲を見つけるために,異なるパラメータをテストできます.
突破信号の判断には時間遅れがあり,入場が早すぎたり遅すぎたりする可能性がある.他の指標と組み合わせて確認することができる.
この戦略は以下の方向から最適化できます.
異なる価格データ周期をテストし,波動率を計算するのに最も適した周期パラメータを見つけます.
線形加重移動平均などの異なる移動平均アルゴリズムを試す.
取引量または他の指標を導入して突破信号を確認する.
単発のストップを制御するためにストップまたはトレーリングストップを設定します.
最適なターゲット帯域を決定するために,波動率係数multの値を最適化します.
この戦略の全体的な考え方は明確で,価格変動率によってターゲット帯を構成し,価格突破を利用して取引シグナルを生成し,市場変化のトレンドを効果的に追跡することができる.しかし,一定の改善の余地があり,パラメータの最適化,確認指標の導入などの手段によって戦略をより安定して信頼性のあるものにすることができる.
/*backtest
start: 2023-01-22 00:00:00
end: 2024-01-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("1SmSm1 Strategy", shorttitle="1SmSm1", overlay=true)
// Source
src = input(defval=close, title="Source")
// Sampling Period
per = input(defval=100, minval=1, title="Sampling Period")
// Range Multiplier
mult = input(defval=3.0, minval=0.1, title="Range Multiplier")
// Smooth Average Range
smoothrng(x, t, m) =>
wper = (t * 2) - 1
avrng = ema(abs(x - x[1]), t)
smoothrng = ema(avrng, wper) * m
smoothrng
smrng = smoothrng(src, per, mult)
// Range Filter
rngfilt(x, r) =>
rngfilt = x
rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
rngfilt
filt = rngfilt(src, smrng)
// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])
// Target Bands
hband = filt + smrng
lband = filt - smrng
// Breakouts
longCondition = (src > filt) and (src > src[1]) and (upward > 0)
shortCondition = (src < filt) and (src < src[1]) and (downward > 0)
strategy.entry("Buy", strategy.long, when = longCondition)
strategy.entry("Sell", strategy.short, when = shortCondition)
// Plotting
plot(filt, color=upward > 0 ? color.lime : downward > 0 ? color.red : color.orange, linewidth=3, title="Range Filter")
hbandplot = plot(hband, color=color.aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=color.fuchsia, transp=100, title="Low Target")
// Fills
fill(hbandplot, lbandplot, color=color.aqua, title="Target Range")
// Bar Color
barcolor(longCondition ? color.green : shortCondition ? color.red : na)
// Alerts
alertcondition(longCondition, title="Buy Alert", message="BUY")
alertcondition(shortCondition, title="Sell Alert", message="SELL")