모멘텀 트레이딩: 더블 이동 평균 크로스오버 전략


생성 날짜: 2024-04-01 11:53:14 마지막으로 수정됨: 2024-04-01 11:53:14
복사: 4 클릭수: 360
1
집중하다
1225
수행원

모멘텀 트레이딩: 더블 이동 평균 크로스오버 전략

개요

이 전략은 8주기 및 21주기 지수 이동 평균 ((EMA) 를 사용하여 시장 추세의 변화를 식별한다. 더 짧은 기간의 EMA가 더 긴 기간의 EMA를 가로지르면 구매 신호가 발생한다. 반대로 더 짧은 기간의 EMA가 더 긴 기간의 EMA를 가로지르면 판매 신호가 발생한다. 이 전략은 또한 3개의 연속적으로 더 높은 낮은 점 ((HLL) 와 3개의 연속적으로 더 낮은 높은 점 ((LLH) 을 결합하여 추세 반전의 신호를 추가적으로 확인한다.

전략 원칙

  1. 8주기 및 21주기 EMA를 계산하여 주요 트렌드 방향을 식별한다.
  2. 3개의 연속적으로 더 높은 낮은 점 ((HLL) 와 3개의 연속적으로 더 낮은 높은 점 ((LLH) 을 식별하여 트렌드 반전의 초기 신호로 사용한다.
  3. 8주기 EMA가 아래에서 21주기 EMA를 통과하고 HLL이 뚫리면 구매 신호가 발생한다. 8주기 EMA가 위에서 21주기 EMA를 통과하고 LLH이 뚫리면 판매 신호가 발생한다.
  4. 스톱로스 레벨은 입시 가격의 5%로, 스톱 레벨은 입시 가격의 16%로 설정하여 위험을 통제하고 수익을 잠금합니다.
  5. 역전 신호가 있을 때, 포지션을 청산하고 역전 포지션을 열어야 한다.

전략적 이점

  1. EMA와 가격 행동 패턴 ((HLL와 LLH) 을 결합하여 트렌드를 확인하고 신호의 신뢰성을 향상시킵니다.
  2. 명확한 스톱로스 및 스톱 레벨을 설정하여 위험을 통제하고 수익을 고정하는 데 도움이됩니다.
  3. 여러 시간 프레임과 다른 시장에 적용할 수 있고, 어느 정도 보편성을 갖는다.
  4. 논리적으로 명확하고, 이해하기 쉽고, 실행하기 쉽습니다.

전략적 위험

  1. 흔들리는 시장에서, 자주 교차하는 것은 여러번의 잘못된 신호로 이어져 손실을 초래할 수 있다.
  2. 고정된 중지 및 중지 수준은 다른 시장 환경에 적합하지 않을 수 있으며 잠재적인 기회 비용 또는 더 큰 손실을 초래할 수 있습니다.
  3. 전략은 역사적 데이터에 의존하고, 급격한 사건이나 근본적인 변화에 대한 적응력이 떨어질 수 있다.

전략 최적화 방향

  1. 변동률 (ATR과 같은) 에 기반한 자율적 중지 및 중지 메커니즘을 도입하여 다른 시장 상황에 더 잘 적응하기 위해 중지 및 중지 수준을 조정합니다.
  2. 거래량, 상대 강도 (RSI) 등과 같은 다른 지표 또는 요소와 결합하여 신호를 더욱 필터링하고 신뢰성을 향상시킵니다.
  3. 매개 변수 (EMA 주기, 스톱 스톱 비율 등) 를 최적화하여 특정 시장 또는 지표에서 가장 잘 작동하는 매개 변수 조합을 찾습니다.
  4. 단편 거래의 리스크 을 제어하기 위해 포지션 사이징과 같은 리스크 관리 조치를 도입하는 것을 고려하십시오.

요약하다

이 전략은 8주기 및 21주기 EMA의 교차, HLL 및 LLH 가격 모형과 결합하여 트렌드 반전을 식별하고 거래 신호를 생성합니다. 명확한 스톱 규칙은 위험을 제어하고 수익을 잠금하는 데 도움이됩니다. 그러나이 전략은 불안한 시장에서 거짓 신호를 생성 할 수 있으며 고정된 스톱 수준은 다른 시장 환경에 적응하지 않을 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-03-26 00:00:00
end: 2024-03-31 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Trend Following 8&21EMA with strategy tester [ukiuro7]', overlay=true, process_orders_on_close=true, calc_on_every_tick=true, initial_capital = 10000)

//INPUTS
lh3On = true
hl3On = true
emaOn = input(title='105ema / 30min', defval=true) 
assistantOn = input(title='Assistant', defval=true)
textOn = input(title='Text', defval=true)

showRiskReward = input.bool(true, title='Show Risk/Reward Area', group="TP/SL")
stopPerc = input.float(5.0, step=0.1, minval=0.1, title='Stop-Loss %:',group="TP/SL") / 100
tpPerc = input.float(16.0, step=0.1, minval=0.1, title='Take-Profit %:',group="TP/SL") / 100

backtestFilter = input(false, title='Backtest Entries to Date Range',group="Backtest Date Range")
i_startTime = input(defval=timestamp('01 Jan 2022 00:00'), inline="b_1", title='Start',group="Backtest Date Range")
i_endTime = input(defval=timestamp('01 Jan 2029 00:00'), inline="b_1", title='End',group="Backtest Date Range")
inDateRange = true

message_long_entry = input.string(title='Alert Msg: LONG Entry', defval ='', group='Alert Message')
message_short_entry = input.string(title='Alert Msg: SHORT Entry', defval='', group='Alert Message')
message_long_exit = input.string(title='Alert Msg: LONG SL/TP', defval='', group='Alert Message')
message_short_exit = input.string(title='Alert Msg: SHORT SL/TP', defval='', group='Alert Message')  

//CALCS
threeHigherLows() =>
    low[0] >= low[1] and low[1] >= low[2]

threeLowerHighs() =>
    high[2] >= high[1] and high[1] >= high[0]

breakHigher() =>
    padding = timeframe.isintraday ? .02 : .1
    high >= high[1] + padding

breakLower() =>
    padding = timeframe.isintraday ? .02 : .1
    low <= low[1] - padding

lh3 = threeLowerHighs() and lh3On
lh3bh = lh3[1] and breakHigher() and lh3On

hl3 = threeHigherLows() and hl3On
hl3bl = hl3[1] and breakLower() and hl3On

ema8 = ta.ema(close, 8)
ema21 = ta.ema(close, 21)

//VARS
var float longStop = na, var float longTp = na
var float shortStop = na, var float shortTp = na

//CONDS
isUptrend = ema8 >= ema21
isDowntrend = ema8 <= ema21
trendChanging = ta.cross(ema8, ema21)

buySignal = lh3bh and lh3[2] and lh3[3] and isUptrend and timeframe.isintraday
sellSignal = hl3bl and hl3[2] and hl3[3] and isDowntrend and timeframe.isintraday

goingDown = hl3 and isDowntrend and timeframe.isintraday
goingUp = lh3 and isUptrend and timeframe.isintraday

projectXBuy = trendChanging and isUptrend
projectXSell = trendChanging and isDowntrend

longCond = trendChanging and isUptrend and assistantOn
shortCond = trendChanging and isDowntrend and assistantOn

//STRATEGY
if shortCond and strategy.position_size > 0 and barstate.isconfirmed
    strategy.close('Long', comment='CLOSE LONG', alert_message=message_long_exit)

if longCond and strategy.position_size < 0 and barstate.isconfirmed
    strategy.close('Short', comment='CLOSE SHORT', alert_message=message_short_exit) 

if longCond and strategy.position_size <= 0 and barstate.isconfirmed and inDateRange
    longStop := close * (1 - stopPerc)
    longTp := close * (1 + tpPerc)
    strategy.entry('Long', strategy.long, comment='LONG', alert_message=message_long_entry)
    strategy.exit('Long Exit', 'Long', comment_loss="SL LONG", comment_profit = "TP LONG", stop=longStop, limit=longTp, alert_message=message_long_exit)

if shortCond and strategy.position_size >= 0 and barstate.isconfirmed and inDateRange
    shortStop := close * (1 + stopPerc)
    shortTp := close * (1 - tpPerc)
    strategy.entry('Short', strategy.short, comment='SHORT', alert_message=message_short_entry)
    strategy.exit('Short Exit', 'Short', comment_loss="SL SHORT", comment_profit="TP SHORT", stop=shortStop, limit=shortTp, alert_message=message_short_exit)

//PLOTS
plotshape(longCond, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.small, text='Buy')
plotshape(shortCond, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.small, text='Sell')
plotchar(trendChanging and isUptrend and close < open and assistantOn, char='!', location=location.abovebar, color=color.new(color.green, 0), size=size.small)

aa = plot(ema8, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(ema21, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.new(color.green,90) : color.new(color.red,90))
buyZone = isUptrend and lh3 and high < ema21 and timeframe.isintraday
sellZone = isDowntrend and hl3 and low > ema21 and timeframe.isintraday

L1 = plot(showRiskReward and strategy.position_size > 0 ? strategy.position_avg_price : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long Entry Price')
L2 = plot(showRiskReward and strategy.position_size > 0 ? longTp : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long TP Price')
L3 = plot(showRiskReward and strategy.position_size > 0 ? longStop : na, color=color.new(color.red, 0), linewidth=1, style=plot.style_linebr, title='Long Stop Price')

S1 = plot(showRiskReward and strategy.position_size < 0 ? strategy.position_avg_price : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short Entry Price')
S2 = plot(showRiskReward and strategy.position_size < 0 ? shortTp : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short TP Price')
S3 = plot(showRiskReward and strategy.position_size < 0 ? shortStop : na, color=color.new(color.maroon, 0), linewidth=1, style=plot.style_linebr, title='Short Stop Price')

fill(L1, L2, color=color.new(color.green, 90))
fill(L1, L3, color=color.new(color.red, 90))
fill(S1, S2, color=color.new(color.teal, 90))
fill(S1, S3, color=color.new(color.maroon, 90))

bgcolor(inDateRange == false ? color.new(color.red,90) : na, title="Backtest Off-Range")