
이 전략은 OBV 지표의 다공간 경향을 판단하기 위해 이중 EMA 평균선 간격을 사용하며, 트렌드 방향에 따라 긴 짧은 방법을 취한다. 이 중 OBV 지표는 가격과 거래량 관계를 더 명확하게 반영하고, 시장 참가자의 의지를 판단하여 시장 경향을 포착하는 데 사용할 수 있다. 이 전략은 이동 평균의 지표 평준 처리를 결합하여 시장 소음을 효과적으로 제거하고 주요 경향을 포착한다.
이 전략은 주로 OBV 지표가 상승 추세에 있는지 여부를 판단하기 위해 다면 입시 시기를 판단한다. 구체적으로, OBV의 6일 EMA와 24일 EMA를 계산하여, 6일 EMA 위에 24일 EMA를 통과하면 다면 신호가 발생한다. 마찬가지로, 6일 EMA 아래 24일 EMA를 통과하면 공백 신호가 발생한다. 또한, 전략은 3%의 스톱로스를 설정한다.
이 전략의 트렌드를 판단하는 핵심은 OBV 지표에 있다. OBV 지표는 큰 자본의 집단적 의지를 반영하여 시장 참여자의 태도를 효과적으로 반영할 수 있다. 이동 평균 처리에 결합하여 일부 잡음을 제거하여 신호를 더 명확하고 신뢰할 수 있게 한다. 전략은 빠른 EMA 라인을 사용하고 느린 EMA 라인을 사용하여 거래 신호를 구성하여 가격 데이터를 평형화 할 수 있으며 동시 트렌드 변화를 더 민감하게 캡처 할 수 있다.
이 전략에는 다음과 같은 장점이 있습니다.
거래량에 기반한 OBV 지표는 시장 참여자의 의지를 명확하게 판단할 수 있으며, 신호는 더 신뢰할 수 있다.
이중 EMA 일선 처리는 일부 잡음을 제거하여 신호를 더 명확하게 만든다.
빠른 느린 EMA 라인 조합을 사용하면 평평한 가격과 잡기 트렌드 변화를 병행 할 수 있습니다.
전략은 간단하고 쉽게 실행할 수 있습니다.
이 전략에는 몇 가지 위험도 있습니다.
OBV 지표는 때때로 잘못된 신호를 발산하여 전략이 손실될 수 있습니다.
극한 상황에서는 EMA 라인 처리가 지연되어 최적의 진입 지점을 놓칠 수 있다.
고정된 스톱로스 설정은 시장의 변화에 적응할 수 없는 너무 딱딱할 수 있다.
대책:
다른 지표와 함께 확인하여 잘못된 신호를 피하십시오.
EMA 라인을 더 민감하게 만들기 위해 파라미터 설정을 최적화하십시오.
동적 정지 설정.
이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.
EMA 변수 조합을 최적화하여 더 잘 어울리는 평균선 변수를 찾습니다.
MACD, RSI 등과 같은 신호 확인을 위한 다른 지표를 추가하여 신호 정확도를 향상시킨다.
동적 스톱로드를 설정하여 시장의 변동에 따라 실시간으로 스톱로드를 조정할 수 있습니다.
배열을 최적화하여 최적의 배열을 찾습니다.
이 전략은 전체적으로 비교적 단순하고 신뢰할 수 있는 트렌드 추적 전략이다. OBV 지표와 쌍 EMA 평선을 결합하여 트렌드에 대한 판단을 실현한다. 장점은 조작이 간단하고 신호가 명확하여 트렌드를 효과적으로 추적할 수 있다. 단점은 잘못된 신호가 발생할 수 있으며 EMA 선 처리가 지연되어 있다.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("OBV EMA X BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)
/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
/////////////// OBV ///////////////
src = close
atr = atr(input(title="ATR Period", defval=3, minval=1))
atrmult = input(title="ATR Mult", defval=1, minval=0)
obv = cum(change(src) > 0 ? volume * (volume / atr) : change(src) < 0 ? -volume * (volume / atr) : 0 * volume / atr)
e1 = ema(obv, input(24))
e2 = ema(obv, input(6))
/////////////// Strategy ///////////////
long = crossover(e2, e1)
short = crossunder(e2, e1)
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
//////////////// Stop loss ///////////////
sl_inp = input(3.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
/////////////// Execution ///////////////
if testPeriod()
strategy.entry("L", strategy.long, when=long)
strategy.entry("S", strategy.short, when=short)
strategy.exit("L SL", "L", stop=long_sl, when=since_longEntry > 0)
strategy.exit("S SL", "S", stop=short_sl, when=since_shortEntry > 0)
/////////////// Plotting ///////////////
plot(e1, color = e1 > e1[1] ? color.lime : e1 < e1[1] ? color.red : color.white, linewidth = 2, offset = 0)
plot(e2, color = e2 > e2[1] ? color.lime : e2 < e2[1] ? color.red : color.white, linewidth = 1)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)