더블 MA 크로스오버 추세 추종 전략


생성 날짜: 2023-12-21 16:10:22 마지막으로 수정됨: 2023-12-21 16:10:22
복사: 1 클릭수: 363
1
집중하다
1214
수행원

더블 MA 크로스오버 추세 추종 전략

개요

이 전략은 양평선 교차의 전형적인 트렌드 추적 방법을 사용하며, 트렌드 행태로 인한 수익을 포착하기 위해 스톱로스, 스톱스, 스톱로스 추적과 같은 위험 관리 메커니즘을 결합합니다.

전략 원칙

  1. 빠른 기간 n일 동안의 EMA 평균선을 계산하고, 단기 평균선으로;
  2. 느린 기간 m일 동안의 EMA 평균선을 계산하고, 장기 평균선으로;
  3. 단기평균이 아래로 올라가면 더 많이 하고, 위로 내려가면 더 많이 합니다.
  4. 평상시 조건: 역으로 돌파 ((중번 돌파하면 역으로 돌파하면 평상시) )
  5. 손실을 중지, 중지, 추적하는 등의 방법으로 위험을 관리하십시오.

우위 분석

  1. 이중 EMA 평균선을 사용하여 가격 트렌드 전환점을 더 잘 판단하고 트렌드 상황을 포착할 수 있다.
  2. 스톱로스, 스톱스, 그리고 추적 스톱로스가 결합되어, 단일 손실을 효과적으로 제어하고, 수익을 잠금화하고, 회수율을 낮출 수 있다.
  3. 사용자 정의 가능한 파라미터가 많으며, 다양한 품종과 실황에 따라 조정 및 최적화 할 수 있습니다.
  4. 전략 논리는 간단하고 명확하며, 이해하기 쉽고 수정하기 쉽습니다.
  5. 다양한 유형의 상황에 적응할 수 있는 다중 공백 동작을 지원한다.

위험 분석

  1. 두 개의 일률적인 전략은 가짜 침입에 매우 민감하며, 함정에 빠지기 쉽다.
  2. 잘못된 매개 변수 설정은 거래 빈도를 증가시키고 거래 비용과 지점 손실을 초래할 수 있습니다.
  3. 전략 자체로는 트렌드 전환점을 파악할 수 없으며, 다른 지표와 결합하여 판단하는 것이 더 효과적입니다.
  4. “이런 상황에서는 거래 신호를 쉽게 만들어 낼 수 있지만 실제 수익성은 좋지 않다”.
  5. 다양한 품종과 시장 환경에 맞게 최적화해야 합니다.

위험은 다음과 같은 방법으로 줄일 수 있습니다.

  1. 다른 지표와 함께 필터링 가짜 돌파구.
  2. 매개 변수 설정을 최적화하고 거래 빈도를 낮추는 것.
  3. 트렌드를 판단하는 지표를 늘리고, 흔들리는 거래 상황을 피한다.
  4. 포지션 관리를 조정하여 단위 위험을 줄입니다.

최적화 방향

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

  1. 다양한 품종과 시장 환경에 적응하기 위해 속속 평균선의 주기적 변수를 최적화한다.
  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)