이 전략은 트렌드를 따르는 지표인 VFI와 이동 평균을 반전 지표인 볼링거 밴드와 결합하여 시장의 트렌드와 반전을 적응적으로 파악합니다.
이 전략의 주요 구성 요소는 다음과 같습니다.
트렌드를 결정하기 위한 VFI 지표. 가격과 거래량을 합리적으로 일치시키기 위해 전형적인 가격과 거래량의 로가리듬 변화율을 사용합니다.
트렌드를 결정하는 EMA 차이 지표. 중장기 트렌드 방향을 판단하기 위해 20일 EMA와 50일 EMA 사이의 비율 차이를 계산합니다.
반전을 감지하기 위한 볼링거 밴드. 중간 밴드는 20일 SMA이며, 밴드의 폭은 중간 밴드의 1.5 표준편차입니다. 가격은 상위 또는 하위 밴드를 넘을 때 거래 신호가 생성됩니다.
피로를 감지하기 위한 VFI 진폭: VFI가 그 한계에 접근하면 (0, 20) 트렌드 반전 확률이 더 높다고 간주됩니다.
가격이 볼링거 밴드 상위권 이상과 VFI와 EMA 차이는 상승 추세를 나타낼 때, 길게 가십시오. 가격이 하위권 이하로 넘어갈 때 또는 VFI가 한계에 도달하면, 포지션을 닫습니다.
VFI의 도입은 가격과 부피의 관계를 더 합리화하고 가격을 맹목적으로 따르는 것을 피합니다.
EMA 차이와 VFI의 조합은 트렌드 결정이 더 신뢰할 수 있게 합니다.
볼링거 반드와 VFI의 조합은 시장의 양방향 변동에 더 적응할 수 있는 전략을 만듭니다.
부피 가격 지표는 거짓 파업의 위험을 완전히 피할 수 없습니다.
EMA 차이는 약간의 지연을 가지고 있으며 단기 전환에 신속하게 반응할 수 없습니다.
부적절한 볼링거 밴드 매개 변수는 과잉 거래 또는 시장 점유로 이어질 수 있습니다.
해결책:
하나의 지표에 의존하지 않기 위해 더 많은 지표를 결합하여 추세를 결정합니다.
EMA 매개 변수를 적절한 값으로 조정합니다.
다양한 시장 조건에서 전략에 대한 볼링거 매개 변수의 영향을 테스트합니다.
더 민감하게 만들기 위해 VFI 매개 변수를 계속 최적화하십시오.
가격 채널 또는 앙벨트 지표에 기반한 파업 판단을 추가합니다.
OBV, PVT 등과 같은 더 많은 부피 가격 지표의 도입을 테스트하십시오.
기계 학습 및 인공지능 기술을 도입하여 동적 매개 변수 최적화를 실현합니다.
이 전략은 양방향 시장 변동을 파악하기 위해 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")