EMA와 히든 다이버전스를 기반으로 한 트렌드 추종 전략


생성 날짜: 2024-02-02 16:54:27 마지막으로 수정됨: 2024-02-02 16:54:27
복사: 0 클릭수: 833
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

EMA와 히든 다이버전스를 기반으로 한 트렌드 추종 전략

개요

이 전략은 EMA 평균선과 RSI 지표의 숨겨진 이탈 신호를 기반으로 다단위 포지션을 열고, 숨겨진 다단위 이탈이 형성되는 특징점을 식별하여 현재 상승 추세의 시작을 판단하여 포지션 개시 신호로 사용한다. 동시에, EMA 평균선과 결합한 금 크로스 및 K 선의 종료 가격은 EMA 평균선 위에 위치하여 상승 추세를 보장한다. 이 전략은 중간 선의 긴 추세를 추적하고, 디스플레이가 끝나고 다시 상승하는 단계에서 다단위 포지션을 열기에 적합하다.

전략 원칙

  1. EMA 평균선 전략: 50주기 EMA 평균선과 250주기 EMA 평균선을 이용하여 금이 트렌드를 판단하기 위해 교차한다. 가격이 50EMA를 넘으면 다중 신호로 간주한다.

  2. RSI 숨겨진 이탈 전략: RSI 지표가 낮은 낮은 지점을 나타내고, 가격이 높은 낮은 지점을 나타낸 숨겨진 다중 헤드 이탈 신호는 반전의 시작을 예고한다. 제한된 이탈 포인트 수와 함께, 가짜 신호를 필터링 할 수 있다.

  3. K선 종료 전략: K선 종료 가격이 50EMA를 초과할 때 더 많은 포지션을 다.

위 세 가지 전략의 합성으로 현재 트렌드가 상승하기 시작했고, 더 많은 포지션을 개설했다.

우위 분석

  1. EMA 평균선을 사용하여 트렌드 방향을 판단하고, RSI 지표의 반전 신호와 함께 트렌드 초기 단계에서 포지션을 열 수 있다.

  2. 이중 확인 메커니즘은 EMA, RSI, K선 종결 가격의 조합 판단을 사용하여 가짜 신호를 효과적으로 필터링 할 수 있습니다.

  3. 중장선 트렌드를 추적하여 재조정 후 새로운 상승 추세가 시작되는 것을 판단하는 것이 좋습니다.

위험 분석

  1. EMA 평평선에서 사각지대가 발생했을 때, 적시적으로 평정해야 한다.

  2. RSI 은 숨은 신호에서 벗어난 판단은 약간의 경험이 필요하며, 파라미터를 적절하게 설정하지 않으면 신호를 놓치거나 판단 오류가 발생할 수 있습니다.

  3. 거래 품종에 대한 파라미터는 최적화 설정이 필요합니다.

최적화 방향

  1. 동적으로 EMA 평균선의 변수를 조정하여 추세를 판단하는 정확도를 최적화한다.

  2. RSI 파라미터를 조정하여 숨겨진 오차를 판단하는 정확성을 최적화합니다.

  3. ATR 중지 또는 퍼센트 중지와 같은 위험을 제어하는 손실 메커니즘에 가입하십시오.

  4. 하향 추세에서 공백으로 공백 포지션을 열 수 있는 공백 거래 전략을 개발한다.

요약하다

이 전략은 EMA 평균선을 종합적으로 사용하여 큰 트렌드를 판단하고, RSI 지표와 함께 판단 정확도를 높이고, 재조정 종료 후 새로운 상승 트렌드를 판단하기 시작하며, 보다 보수적인 트렌드 추적 전략에 속한다. 최적화 파라미터 설정과 스톱 수단을 추가함으로써 더 나은 효과를 얻을 수 있다. 간단한 이동 평균 전략에 비해 상승 트렌드를 판단하는 정확도가 높고, 승률이 높으며, 실용적인 전략에 속한다.

전략 소스 코드
/*backtest
start: 2024-01-25 00:00:00
end: 2024-02-01 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="EMA RSI ATR Hidden Div Strat", shorttitle="Hidden Div Strat", overlay = true, pyramiding = 0, max_bars_back=3000, calc_on_order_fills = false, commission_type =  strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, initial_capital=5000, currency=currency.USD)

// Time Range
FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12)
FromDay=input(defval=1,title="FromDay",minval=1,maxval=31)
FromYear=input(defval=2020,title="FromYear",minval=2016)
ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12)
ToDay=input(defval=1,title="ToDay",minval=1,maxval=31)
ToYear=input(defval=9999,title="ToYear",minval=2017)
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>true

// Bar's time happened on/after start date?
afterStartDate = time >= start and time<=finish?true:false

//EMA'S
emasrc = close

len1 = input(50, minval=1, title="EMA1")
ema1 = ema(emasrc, len1)
col1 = color.white

len2 = input(250, minval=1, title="EMA2")
ema2 = ema(emasrc, len2)
col2 = color.yellow

//Plots
plot(ema1, title="EMA1", linewidth=1, color=col1)
plot(ema2, title="EMA2", linewidth=1, color=col2)

//Stoch
periodK = input(4, title="K", minval=1)
periodD = input(4, title="D", minval=1)
smoothK = input(3, title="Smooth", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)

//Hidden Divergence Indikator

len = input(title="RSI Period", minval=1, defval=14)
src = input(title="RSI Source", defval=close)
lbR = input(title="Pivot Lookback Right", defval=1)
lbL = input(title="Pivot Lookback Left", defval=19)
rangeUpper = input(title="Max of Lookback Range", defval=20)
rangeLower = input(title="Min of Lookback Range", defval=4)
hiddenBullColor = color.new(color.green, 80)
textColor = color.white
noneColor = color.new(color.white, 100)
osc = rsi(src, len)

plFound = na(pivotlow(osc, lbL, lbR)) ? false : true
phFound = na(pivothigh(osc, lbL, lbR)) ? false : true
_inRange(cond) =>
	bars = barssince(cond == true)
	rangeLower <= bars and bars <= rangeUpper

//------------------------------------------------------------------------------
// Hidden Bullish
// Osc: Lower Low

oscLL = osc[lbR] < valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1])

// Price: Higher Low

priceHL = low[lbR] > valuewhen(plFound, low[lbR], 1)
hiddenBullCond = priceHL and oscLL and plFound

//buy Conditions
buyhiddenbull = hiddenBullCond[1] or hiddenBullCond[2] or hiddenBullCond[3] or hiddenBullCond[4] or hiddenBullCond[5] or hiddenBullCond[6] or hiddenBullCond[7] or hiddenBullCond[8] or hiddenBullCond[9] or hiddenBullCond[10]
emacondition = ema1 > ema2
upcondition = close[1] > ema1[1] and ema2[1] and close[2] > ema1[2] and ema2[2] and close[3] > ema1[3] and ema2[3]
crossup = k[0] >= d[0] and k[1] <= d[1]
longcondition = emacondition and upcondition and crossup and buyhiddenbull

if (afterStartDate)
    strategy.entry("Long", strategy.long, when = longcondition)

//TakeProfit, StopLoss lowest low
profitfactor = input(title="Profitfactor", type=input.float, step=0.1, defval=1.6)
loLen = input(title="Lowest Low Lookback", type=input.integer,
  defval=38, minval=2)
stop_level = lowest(low, loLen)[1]
bought = strategy.position_size[1] < strategy.position_size
barsbought = barssince(bought)

if strategy.position_size>0
    profit_level = strategy.position_avg_price + ((strategy.position_avg_price - stop_level[barsbought])*profitfactor)
    strategy.exit(id="TP/ SL", stop=stop_level[barsbought], limit=profit_level)