이중 이동 평균 크로스오버 거래 전략

저자:차오장, 날짜: 2023-12-27 16:07:49
태그:

img

전반적인 설명

이 전략은 이동 평균의 황금 십자 및 죽음의 십자 기반의 구매 및 판매 신호를 생성합니다. 구체적으로 5 일 지수 지수 이동 평균 (EMA) 및 34 일 이중 지수 이동 평균 (DEMA) 을 사용합니다. 단기 5 일 EMA가 장기 34 일 DEMA보다 높을 때 구매 신호가 생성됩니다. 단기 5 일 EMA가 장기 34 일 DEMA보다 낮을 때 판매 신호가 생성됩니다.

전략 논리

  1. 5일 EMA와 34일 DEMA를 계산합니다.
  2. 단기 5일 EMA가 장기 34일 DEMA를 넘을 때 구매 신호를 생성합니다.
  3. 단기 5일 EMA가 장기 34일 DEMA보다 낮을 때 판매 신호를 생성합니다.
  4. 특정 거래 세션에서만 거래할 수 있는 옵션
  5. 트래일링 스톱 로스를 사용하는 옵션

이 전략은 안정적인 성과를 위해 트렌드 다음과 이동 평균 크로스오버 요인을 결합합니다. 트렌드 다음 지표로 이동 평균은 시장 트렌드를 효과적으로 식별 할 수 있습니다. EMA와 DEMA 조합은 거래 신호를 생성하기 위해 가격 데이터를 효과적으로 매끄럽게 할 수 있습니다. 단기 및 장기 이동 평균 사이의 크로스오버는 주요 트렌드 변화가 발생할 때 초기 거래 신호를 제공할 수 있습니다.

이점 분석

  1. 단순하고 명확한 전략 논리, 이해하기 쉽고 실행하기 쉬운
  2. 이동 평균의 조합 사용은 트렌드 판단과 가격 데이터 평형화 모두를 고려합니다.
  3. 단기 및 장기 이동 평균 사이의 크로스오버는 주요 전환점에 초기 신호를 제공 할 수 있습니다.
  4. 매개 변수는 다양한 제품 및 시간 프레임에 대한 이동 평균 길이를 조정하도록 최적화 할 수 있습니다.
  5. 두 가지 요인을 통합하면 전략 안정성이 향상 될 수 있습니다.

위험 분석

  1. 다양한 시장에서 더 많은 잘못된 신호가 발생할 수 있습니다.
  2. 부적절한 이동 평균 길이가 신호 지연을 일으킬 수 있습니다.
  3. 부적절한 거래 시간 및 중지 손실 설정은 전략 수익성에 영향을 줄 수 있습니다.

이러한 위험은 이동 평균 길이를 조정하고 거래 시간을 최적화하고 합리적인 스톱 로스를 설정함으로써 줄일 수 있습니다.

최적화 방향

  1. 각기 다른 거래 상품 및 시간 프레임에 대한 이동 평균 길이 매개 변수를 조정합니다.
  2. 가장 활동적인 기간 동안 거래하기 위해 거래 세션 매개 변수를 최적화
  3. 고정 스톱 로스 대 후속 스톱 로스 비교
  4. 전략에 대한 다른 가격 소스 옵션의 영향 테스트

결론

이 전략은 트렌드 추적 및 데이터 평형화 기술과 결합하여 이중 이동 평균 크로스오버를 통해 거래 신호를 생성합니다. 이것은 간단하고 실용적인 트렌드 추적 전략입니다. 매개 변수 조정 및 논리 정리를 통해 다른 제품과 시간 프레임에 적응하고 주요 트렌드 변화에 대한 초기 신호를 제공하며 잘못된 신호를 피할 수 있습니다. 권장하고 적용 할 가치가 있습니다.


/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_1",false]]
*/

//@version=2
strategy(title='[STRATEGY][RS]MicuRobert EMA cross V2', shorttitle='S', overlay=true)
USE_TRADESESSION = input(title='Use Trading Session?', type=bool, defval=true)
USE_TRAILINGSTOP = input(title='Use Trailing Stop?', type=bool, defval=true)
trade_session = input(title='Trade Session:',  defval='0400-1500', confirm=false)
istradingsession = not USE_TRADESESSION ? false : not na(time('1', trade_session))
bgcolor(istradingsession?gray:na)
trade_size = input(title='Trade Size:', type=float, defval=1)
tp = input(title='Take profit in pips:', type=float, defval=55.0) * (syminfo.mintick*10)
sl = input(title='Stop loss in pips:', type=float, defval=22.0) * (syminfo.mintick*10)
ma_length00 = input(title='EMA length:', defval=5)
ma_length01 = input(title='DEMA length:',  defval=34)
price = input(title='Price source:', defval=open)

//  ||--- NO LAG EMA, Credit LazyBear:  ---||
f_LB_zlema(_src, _length)=>
    _ema1=ema(_src, _length)
    _ema2=ema(_ema1, _length)
    _d=_ema1-_ema2
    _zlema=_ema1+_d
//  ||-------------------------------------||

ma00 = f_LB_zlema(price, ma_length00)
ma01 = f_LB_zlema(price, ma_length01)
plot(title='M0', series=ma00, color=black)
plot(title='M1', series=ma01, color=black)

isnewbuy = change(strategy.position_size)>0 and change(strategy.opentrades)>0
isnewsel = change(strategy.position_size)<0 and change(strategy.opentrades)>0

buy_entry_price = isnewbuy ? price : buy_entry_price[1]
sel_entry_price = isnewsel ? price : sel_entry_price[1]
plot(title='BE', series=buy_entry_price, style=circles, color=strategy.position_size <= 0 ? na : aqua)
plot(title='SE', series=sel_entry_price, style=circles, color=strategy.position_size >= 0 ? na : aqua)
buy_appex = na(buy_appex[1]) ? price : isnewbuy ? high : high >= buy_appex[1] ? high : buy_appex[1]
sel_appex = na(sel_appex[1]) ? price : isnewsel ? low : low <= sel_appex[1] ? low : sel_appex[1]
plot(title='BA', series=buy_appex, style=circles, color=strategy.position_size <= 0 ? na : teal)
plot(title='SA', series=sel_appex, style=circles, color=strategy.position_size >= 0 ? na : teal)
buy_ts = buy_appex - sl
sel_ts = sel_appex + sl
plot(title='Bts', series=buy_ts, style=circles, color=strategy.position_size <= 0 ? na : red)
plot(title='Sts', series=sel_ts, style=circles, color=strategy.position_size >= 0 ? na : red)

buy_cond1 = crossover(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
buy_cond0 = crossover(price, ma00) and ma00 > ma01 and (USE_TRADESESSION ? istradingsession : true)
buy_entry = buy_cond1 or buy_cond0
buy_close = (not USE_TRAILINGSTOP ? low <= buy_entry_price - sl: low <= buy_ts) or high>=buy_entry_price+tp//high>=last_traded_price + tp or low<=last_traded_price - sl //high >= hh or 
sel_cond1 = crossunder(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
sel_cond0 = crossunder(price, ma00) and ma00 < ma01 and (USE_TRADESESSION ? istradingsession : true)
sel_entry = sel_cond1 or sel_cond0
sel_close = (not USE_TRAILINGSTOP ? high >= sel_entry_price + sl : high >= sel_ts) or low<=sel_entry_price-tp//low<=last_traded_price - tp or high>=last_traded_price + sl //low <= ll or 

strategy.entry('buy', long=strategy.long, qty=trade_size, comment='buy', when=buy_entry)
strategy.close('buy', when=buy_close)
strategy.entry('sell', long=strategy.short, qty=trade_size, comment='sell', when=sel_entry)
strategy.close('sell', when=sel_close)

더 많은