アダプティブ・ボラティリティ・ブレイク

作者: リン・ハーンチャオチャン,日付: 2024-01-25 12時43分43秒
タグ:

img

概要

この戦略は,トレンドを追跡する指標であるVFIと移動平均を逆転指標であるボリンジャー・バンドと組み合わせ,市場のトレンドと逆転を適応的に把握します.

戦略の論理

この戦略の主な構成要素は以下の通りである.

  1. 傾向を決定するVFI指標. 価格と取引量を合理的に一致させるために,典型的な価格と取引量のロガリズム変化率を使用します.

  2. 傾向を決定する EMA 差分指標. 中長期の傾向方向を判断するために 20 日 EMA と 50 日 EMA の割合差を計算します.

  3. ボリンジャー帯は,逆転を検出する. 中央帯は20日間のSMAで,帯の幅は中央帯の1.5標準偏差である.価格が上または下帯を突破すると取引信号が生成される.

  4. 疲労感を検知するためのVFI幅.VFIが限界 (0, 20) に近付いているとき,傾向の逆転の確率は高いと考えられる.

利点

  1. VFIの導入により,価格・量関係はより合理化され,盲目的に価格を追跡することは避けられます.

  2. EMA差とVFIの組み合わせにより,トレンド決定はより信頼性があります.

  3. ボリンジャーバンドとVFIの組み合わせにより,この戦略は市場における両方向の変動により適応可能になります.

リスク

  1. ボリューム価格指標では 誤ったブレイクのリスクが完全に回避できない.

  2. EMA差は少し遅れており,短期的な回転に間に合わない.

  3. ボリンジャー帯の不適切なパラメータは,過剰取引または市場占拠につながる可能性があります.

解決策:

  1. EMAパラメータを適切な値に調整する.

  2. 異なる市場条件で戦略に対するボリンガーパラメータの影響をテストする.

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

  1. VFIのパラメータを最適化して 感受性が向上させる

  2. 価格チャネルやエンベロープ指標に基づいて ブレイクアウト判断を追加します.

  3. OBV,PVTなどより多くの量価格指標の導入をテストする.

  4. 機械学習とAI技術を導入し,動的パラメータ最適化を実現する.

結論

この戦略は,両方向の市場変動を把握するために,VFI,EMA差とボリンジャーバンドを使用してトレンドフォローおよび逆転検出を包括的に検討しています.次のステップは,パラメータを最適化し,判断メトリックを豊かにし,適用性を拡大し,収益性を向上することです.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-24 00:00:00
period: 1h
basePeriod: 15m
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/
// © beststockalert

//@version=4

strategy(title="Super Bollinger Band Breakout", shorttitle = "Super BB-BO", overlay=true)
source = close

length = input(130, title="VFI length")
coef = input(0.2)
vcoef = input(2.5, title="Max. vol. cutoff")
signalLength=input(5)


// session 


pre = input( type=input.session, defval="0400-0935")
trade_session = input( type=input.session, defval="0945-1700")
use_trade_session = true
isinsession = use_trade_session ? not na(time('1', trade_session)) : true


is_newbar(sess) =>
    t = time("D", sess)
    not na(t) and (na(t[1]) or t > t[1])


is_session(sess) =>
    not na(time(timeframe.period, sess))

preNew = is_newbar(pre)
preSession = is_session(pre)

float preLow = na
preLow := preSession ? preNew ? low : min(preLow[1], low) : preLow[1]

float preHigh = na
preHigh := preSession ? preNew ? high : max(preHigh[1], high) : preHigh[1]



//   vfi 9lazybear 
ma(x,y) => 0 ? sma(x,y) : x

typical=hlc3
inter = log( typical ) - log( typical[1] )
vinter = stdev(inter, 30 )
cutoff = coef * vinter * close
vave = sma( volume, length )[1]
vmax = vave * vcoef
vc = iff(volume < vmax, volume, vmax) //min( volume, vmax )
mf = typical - typical[1]
vcp = iff( mf > cutoff, vc, iff ( mf < -cutoff, -vc, 0 ) )

vfi = ma(sum( vcp , length )/vave, 3)
vfima=ema( vfi, signalLength )


//ema diff


ema20 = ema(close,20)
ema50 = ema(close,50)


diff = (ema20-ema50)*100/ema20
ediff = ema(diff,20)

//
basis = sma(source, 20)
dev = 1.5 * stdev(source, 20)

upper = basis + dev
lower = basis - dev


ema9 = ema(source, 9)

if ( ((crossover(source, upper) and diff>ediff and diff>0) or (close>upper and (vfi >0 or vfima>0 or ediff>0.05) and (vfi<14 or vfima<14)) ))
    strategy.entry("Long", strategy.long)


if (crossunder(source, lower) or vfi>19 or vfima>19 or diff<(ediff+0.01) )
    strategy.close("Long")



もっと