더블 이동 평균 돌파 전략


생성 날짜: 2023-12-11 15:21:58 마지막으로 수정됨: 2023-12-11 15:21:58
복사: 0 클릭수: 637
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

더블 이동 평균 돌파 전략

개요

쌍평평선 돌파 전략은 두 개의 다른 주기에서 움직이는 평균의 교차로 구매 시드널을 기반으로 한 트렌드 추적 전략이다. 이 전략은 빠른 평균과 느린 평균의 교차점을 거래 입시점으로 사용하고, 교차 후 트렌드 방향을 판단하고 그에 따른 상위 또는 공수 위치를 구축한다. 그것은 중간 수준의 트렌드를 포착 할 수 있으며, 불필요한 변동으로 인한 거래 빈도 문제가 줄어들 수 있습니다.

전략 원칙

이 전략은 두 개의 이동 평균을 사용한다: 빠른 MA와 느린 MA. 빠른 MA 사이클은 일반적으로 단기적인 가격 변화를 포착하기 위해 짧은 기간에 설정된다 (예: 15 주기); 느린 MA 사이클은 일반적으로 긴 기간에 설정된다 (예: 21 주기), 주요 트렌드 방향을 판단하기 위해. 전략의 거래 신호는 두 MA의 교차로부터 온다: 빠른 MA 상에서 느린 MA를 통과할 때 구매 신호; 빠른 MA 아래에서 느린 MA를 통과할 때 판매 신호.

다양한 MA 주기 포트폴리지를 설정하여 전략이 트렌드를 잡는 시간의 길이를 조정할 수 있다. 짧은 MA 포트폴리지는 짧은 소기간의 가격 변동 기회를 잡을 수 있다. 더 긴 MA 포트폴리지는 긴 라인 레벨의 트렌드만을 잡을 수 있는 흔들림을 필터링할 수 있다.

이 전략은 또한 위험 관리 모듈을 포함합니다: 중지, 중지, 이동 중지. 이것은 단일 거래의 최대 손실을 제한하고 전체 수익을 보호하는 데 도움이됩니다.

전략적 이점

두 가지 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 개념이 단순하고, 이해하기 쉽고, 실행이 쉽다는 것을 의미합니다.
  2. 다른 시장 환경에 적응하기 위해 MA 주기를 조정하여 다른 시간대의 트렌드를 포착할 수 있습니다.
  3. 이 거래는 매우 안정적이고, 너무 자주 거래되는 것을 피합니다.
  4. 제약이 있는 경우, 제약이 없는 경우, 제약이 없는 경우, 제약이 없는 경우, 제약이 없는 경우.
  5. 최적화하기 쉽고, MA 주기, 위험 관리 매개 변수 등을 조정할 수 있으며, 효과를 더욱 높일 수 있다.

위험 분석

이중 일률적 전략은 다음과 같은 몇 가지 측면에 초점을 맞추고 있습니다.

  1. 충격적인 평정 단계에서 MA 교차 신호가 너무 자주 발생하여 거래 빈도가 너무 높다는 문제가 발생할 수 있습니다.
  2. 쌍평준선 사이에 지연이 존재하여 가격 반전점을 놓칠 수 있으며, 적시에 손실을 막을 수 없습니다.
  3. 가짜 침입을 효과적으로 차단하지 못해 불필요한 손실을 초래할 수 있습니다.
  4. MA는 가격에 대해 느리게 반응하여 가격 변화를 완전히 추적할 수 없습니다.

이러한 위험은 MA 매개 변수를 조정하고, 필터링 조건을 추가하고, 스톱 로직을 최적화함으로써 개선되고 최적화될 수 있다.

최적화 방향

이중 일률적인 전략은 다음과 같은 측면에서 최적화될 수 있습니다.

  1. 거래량이나 변동 지표와 같은 필터를 추가하여 흔들림과 가짜 돌파구에서 빈번하게 창고를 피하십시오.
  2. MA 사이클과 조합은 다양한 사이클과 품종의 특성에 맞게 다양하게 조정할 수 있습니다.
  3. 다른 종류의 MA를 테스트할 수 있습니다. 예를 들어, EMA, LWMA 등과 같이, 가격 반응에 가장 민감한 MA 형태를 선택합니다.
  4. 기계 학습 알고리즘을 추가하여 자동으로 MA 파라미터, 스톱 패러미터와 같은 초 파라미터를 최적화 할 수 있습니다.
  5. 다양한 손실을 테스트할 수 있습니다. 예를 들어, 점프 손실, 추적 손실, 평균 손실 등이 있습니다.

이러한 최적화와 개선을 통해 전략의 성공률, 수익률, 리스크 수익률을 크게 향상시킬 수 있습니다.

요약하다

쌍평선 돌파구 전략은 전반적으로 실행 및 최적화하기 쉬운 트렌드 추적 전략입니다. 그것은 작동의 단순성, 유연한 조정 가능성과 위험 제어 가능성의 장점을 가지고 있으며, 양적 거래의 입문 전략으로 매우 적합합니다. 지속적인 테스트 및 최적화를 통해이 전략은 지속적으로 개선 될 수 있으며 양적 전략이 될 잠재력을 가지고 있습니다.

전략 소스 코드
/*backtest
start: 2022-12-10 00:00:00
end: 2023-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)

maFastSource   = input(defval = ohlc4, title = "Fast MA Source")
maFastLength   = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource   = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit   = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
startYear       = input(defval = 2018, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

startTimeOk() =>
    inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    timeOk = time > inputTime ? true : false
    r = (useTimeLimit and timeOk) or not useTimeLimit

maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)

fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)

aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

if( startTimeOk() )
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    //strategy.close( id = "Long", when = exitLong )
    
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    //strategy.close( id = "Short", when = exitShort )
    
    strategy.exit("Exit Long", from_entry = "Long",  profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
    strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)