이중 MA 크로스오버 트렌드 추적 전략

저자:차오장, 날짜: 2023-12-21 16:10:22
태그:

img

전반적인 설명

이 전략은 트렌드를 추적하는 전형적인 방법인 이중 이동 평균 크로스오버를 채택하고 있으며, 트렌드 시장에서 큰 수익을 얻는 것을 목표로 스톱 로스, 영리 및 트레일 스톱 로스 등의 리스크 관리 메커니즘과 결합됩니다.

전략 논리

  1. N-day EMA를 단기적인 빠른 라인으로 계산합니다.
  2. m-day EMA를 장기적으로 느린 라인으로 계산합니다.
  3. 빠른 선이 느린 선을 깨고 위로 갈 때 길게, 아래로 갈 때 짧게
  4. 출구 신호: 역차 교차 (예를 들어, 긴 교차가 발생하면 긴 출구).
  5. 스톱 로스를 이용하고, 수익을 취하고, 리스크를 관리하기 위해 스톱 로스를 사용하세요.

이점 분석

  1. 이중 EMA 라인을 채택하면 가격 트렌드 반전 지점을 더 잘 결정하고 트렌드 움직임을 파악 할 수 있습니다.
  2. 스톱 로스, 취득 및 트레일링 스톱을 결합하면 단일 거래 손실을 제한하고 수익을 차단하고 마감량을 줄이는 데 도움이됩니다.
  3. 다양한 제품과 시장 환경에 맞게 조정 및 최적화 할 수있는 많은 사용자 정의 가능한 매개 변수가 있습니다.
  4. 전략 논리는 간단하고 명확하고 이해하기 쉽고 수정하기 쉽습니다.
  5. 다양한 시장 조건에 적응할 수 있는 장기 및 단기 운영을 지원합니다.

위험 분석

  1. 이중 MA 전략은 거짓 탈출에 매우 민감하고 함정에 빠질 가능성이 높습니다.
  2. 부적절한 매개 변수 설정은 거래의 빈도, 거래 비용 증가 및 미끄러짐 손실로 이어질 수 있습니다.
  3. 전략 자체는 트렌드 반전 지점을 결정할 수 없으며 다른 지표와 결합되어야합니다.
  4. 다양한 시장에서 거래 신호를 생성하는 것은 쉽지만 실제 수익성은 낮은 경향이 있습니다.
  5. 매개 변수들은 다양한 제품과 시장 환경에 최적화되어야 합니다.

위험은 다음과 같이 감소 할 수 있습니다.

  1. 거짓 신호를 다른 신호로 필터링합니다.
  2. 거래 빈도를 낮추기 위해 매개 변수 최적화
  3. 시장 거래의 범위를 피하기 위해 트렌드 판단 지표를 추가합니다.
  4. 단일 거래 위험을 낮추기 위해 포지션 크기를 조정합니다.

최적화 방향

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

  1. 다른 제품과 시장에 대한 빠른 및 느린 MA 기간을 최적화합니다.
  2. 추세를 결정하고 잘못된 신호를 필터하는 다른 지표를 추가하십시오. 예를 들어 MACD, KDJ 등.
  3. EMA를 SMA 또는 WMA로 대체하는 것을 고려하십시오.
  4. 동적으로 ATR에 기반한 스톱 손실을 조정합니다.
  5. 포지션 크기를 조정하는 방법론에 따라 단일 포지션 크기를 유연하게 조정합니다.
  6. 상관관계 및 변동성 메트릭을 기반으로 파라미터 자율 적응 최적화

요약

요약하자면, 이것은 전형적인 이중 EMA 크로스오버 트렌드 추적 전략이다. 이는 스톱 로스, 영리 및 트레일링 스톱 로스와 같은 위험 관리 메커니즘과 통합된 트렌드 움직임을 캡처하는 장점을 가지고 있다. 그러나 소음과 범위 제한 시장에 대한 높은 민감성, 함락되기 쉬운 것과 같은 몇 가지 전형적인 약점도 있다. 추가 지표, 매개 변수 최적화, 동적 조정 및 포트폴리오 사용을 도입하여 전략의 성능을 향상시킬 수 있다. 전반적으로, 적절한 매개 변수 조정과 제품 및 시장 조건에 대한 좋은 적합성으로, 이 전략은 괜찮은 결과를 얻을 수 있다.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

strategy(title = "Strategy Code Example", shorttitle = "Strategy Code Example", overlay = true)

// Revision:        1
// Author:          @JayRogers
//
// *** THIS IS JUST AN EXAMPLE OF STRATEGY RISK MANAGEMENT CODE IMPLEMENTATION ***

// === GENERAL INPUTS ===
// short ma
maFastSource   = input(defval = open, title = "Fast MA Source")
maFastLength   = input(defval = 14, title = "Fast MA Period", minval = 1)
// long ma
maSlowSource   = input(defval = open, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

// === STRATEGY RELATED INPUTS ===
tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// the risk management inputs
inpTakeProfit   = input(defval = 1000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 200, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 200, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// === SERIES SETUP ===
/// a couple of ma's..
maFast = ema(maFastSource, maFastLength)
maSlow = ema(maSlowSource, maSlowLength)

// === PLOTTING ===
fast = plot(maFast, title = "Fast MA", color = green, linewidth = 2, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = red, linewidth = 2, style = line, transp = 50)

// === LOGIC ===
// is fast ma above slow ma?
aboveBelow = maFast >= maSlow ? true : false
// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// === STRATEGY - LONG POSITION EXECUTION ===
enterLong() => not tradeDirection[1] and tradeDirection // functions can be used to wrap up and work out complex conditions
exitLong() => tradeDirection[1] and not tradeDirection
strategy.entry(id = "Long", long = true, when = enterLong()) // use function or simple condition to decide when to get in
strategy.close(id = "Long", when = exitLong()) // ...and when to get out
// === STRATEGY - SHORT POSITION EXECUTION ===
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 RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)


더 많은