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

저자:차오장, 날짜: 2023-11-16 17:50:52
태그:

img

전반적인 설명

이중 이동 평균 크로스오버 전략은 다른 기간의 이동 평균을 계산하여 가격 트렌드 방향을 판단하고 트렌드 다음을 실현합니다. 짧은 기간 MA가 긴 기간 MA를 넘을 때 길게 이동하고 짧은 기간 MA가 긴 기간 MA를 넘을 때 짧게 이동합니다. 이것은 전형적인 트렌드 다음 전략입니다.

전략 논리

이 전략은 9, 21 및 50 기간 기하급수적 이동 평균 (EMA) 을 기반으로합니다. 9 기간 EMA는 단기 트렌드를 나타냅니다. 21 기간 EMA는 중기 트렌드를 나타냅니다. 50 기간 EMA는 장기 트렌드를 나타냅니다.

9 기간 EMA가 21 기간 EMA를 넘을 때, 단기 상승 추세를 나타냅니다. 9 기간 EMA가 21 기간 EMA를 넘을 때, 단기 하락 추세를 나타냅니다. 크로스오버 (crossover) 함수는 MAs 사이의 크로스오버를 결정하는 데 사용됩니다.

긴/단기 엔트리, 수익을 취하고 손실을 중지하는 로직이 구성됩니다. 엔트리 조건은 MAs의 크로스오버입니다. 긴 수익은 입시 가격 * (1 + 입력 수익률), 짧은 이익은 입시 가격 * (1 - 입력 수익률). 긴 스톱 손실은 입시 가격 * (1 - 입력 스톱 손실 비율), 짧은 스톱 손실은 입시 가격 * (1 + 입력 스톱 손실 비율).

트렌드 필터와 같은 일부 필터도 추가됩니다. 측면을 피하기 위해 트렌드 필터와 전략 주식이 너무 낮을 때 거래를 피하기 위해 주식 필터. 이러한 필터는 일부 잘못된 신호를 피하는 데 도움이 될 수 있습니다.

요약하자면, 이 전략은 가격 트렌드 방향을 결정하기 위해 이중 EMA 크로스오버를 사용하며, 중장기 트렌드를 포착할 수 있는 적절한 수익 및 스톱 손실 논리를 사용합니다. 그러나 단일 요인 전략으로, 신호는 충분히 안정적이지 않을 수 있으며 더 이상 최적화 될 수 있습니다.

이점 분석

  • 트렌드 방향을 결정하기 위해 듀얼 MA 크로스오버를 사용하면 논리가 간단하고 이해하기 쉽습니다.

  • 서로 다른 기간의 EMA를 채택하면 단기 및 장기적 경향을 판단할 수 있습니다.

  • 이윤을 취하고 손실을 멈추는 논리는 이윤을 차단하고 위험을 통제합니다.

  • 필터 는 일부 거짓 신호 를 어느 정도 방지 하는 데 도움 이 된다.

  • 매개 변수는 자유롭게 구성 할 수 있으며, 기간은 다른 시장 환경에 최적화 될 수 있습니다.

위험 분석

  • 단일 요인 전략으로서, 거래 신호는 충분히 안정적이지 않을 수 있습니다. 가격 통합 중에 위프사가 발생할 수 있습니다.

  • 크로스오버가 발생했을 때, 가격이 이미 상승/하락한 것으로 나타났을 수도 있습니다. 높은 가격으로 구매하고 낮은 가격으로 판매할 위험이 있습니다.

  • 거래 비용은 고려되지 않습니다. 실제 수익은 더 낮을 수 있습니다.

  • 손해를 막지 않고, 극한 시장 조건에서 무제한 손실을 위험합니다.

해결책:

  1. 더 안정적인 신호를 위해 MA 기간을 최적화합니다.

  2. 신호 필터에 다른 표시기를 추가합니다.

  3. 비용의 영향을 줄이기 위해 무역 규모를 늘려라

  4. 최대 손실을 제한하기 위해 적절한 스톱 손실을 설정합니다.

최적화 방향

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

  1. 가장 좋은 조합을 찾기 위해 MA 기간을 최적화하거나 최적화를 사용하여 가장 좋은 기간을 동적으로 선택하십시오.

  2. 신호를 필터링하고 품질을 향상시키기 위해 MACD, KD 등과 같은 다른 기술 지표를 추가하거나 신호를 점수하고 잘못된 것을 필터하기 위해 기계 학습을 사용하십시오.

  3. 부피 분석을 포함합니다. MA 크로스오버에서 부피가 충분하지 않으면 신호를 받지 마십시오.

  4. 크로스오버가 일어나기 전에 가격 변동을 확인합니다. 범위 시장에서 크로스오버는 잘못된 신호가 될 수 있습니다.

  5. 트레일링 스톱 손실, 들리어 출구 등과 같은 동적 스톱 손실 메커니즘을 구축하여 스톱 손실 거리를 줄이면서도 효과적으로 유지하십시오.

  6. 고정/동적/레버레이드 같은 포지션 크기를 최적화하여 더 합리적인 이익/손실 비율을 달성합니다.

  7. 종합적으로 거래 비용, 미끄러짐을 고려합니다. 라이브 거래에서 수익성을 보장하기 위해 이익 / 손실 중단 비율을 최적화하십시오.

결론

이 전략의 전반적인 구조는 트렌드 방향을 결정하기 위해 이중 EMA 크로스오버의 간단한 논리로, 트렌드를 포착하기 위해 수익을 취하고 손실을 멈추는 논리와 결합되어 건전합니다. 단일 요인 전략으로서, 매개 변수, 신호 필터 등을 더욱 견고하게 만들기 위해 추가로 최적화 할 수 있습니다. 적절한 스톱 손실 및 위치 사이징으로 위험은 추가로 줄일 수 있습니다. 전반적으로 최적화 및 조정 후 일관된 이익을 얻을 수있는 전략 프레임워크에 따라 탄탄한 트렌드를 제공합니다.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TradingMentalist

//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")

//turn on/off / adjust trade filters (average range/average equity)
sidein2     = input(200, step=10, title='lookback for average range (bars)')
sidein      = input(1, title='filter trades if range is less than (%)')/100
equityIn    = input(40, title='filter trades if equity is below ema()')
sidewayssw  = input(true, title='sideways filter?')
equitysw    = input(true, title='equity filter?')
longtpin    = input(1,step=0.1, title='long TP %')/100
longslin    = input(0.4,step=0.1, title='long SL %')/100
shorttpin   = input(1,step=0.1, title='short TP %')/100
shortslin   = input(0.4,step=0.1, title='short SL %')/100

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1       = (close[1] + close[sidein2]) / 2
side2       = close[1] - close[sidein2] 
side3       = side2 / side1
notsideways = side3 > sidein
equityMa    = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon   = strategy.equity >= equityMa

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)

plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1  = crossover(ma2,ma3)
longCondition2  = close[5] > close[10]
longCondition3  = close[1] > close[2]

shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]

closelong       = shortCondition1
closeshort      = longCondition1
//-------------------------------------------

//(leave as is)
longCondition1in  = longCondition1
longCondition2in  = lConSw2 ? longCondition2 : true
longCondition3in  = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions    = longCondition1in and longCondition2in and longCondition3in
shortConditions   = shortCondition1in and shortCondition2in and shortCondition3in

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long            = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short           = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel     = strategy.position_avg_price * (1 + longtpin)
longsllevel     = strategy.position_avg_price * (1 - longslin)
shorttplevel    = strategy.position_avg_price * (1 - shorttpin)
shortsllevel    = strategy.position_avg_price * (1 + shortslin)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear   = 2000
startmonth  = 1
startday    = 1

stopyear    = 9999
stopmonth   = 12
stopday     = 31
//-------------------------------------------

//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop  = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe()    =>
    time >= startperiod and time <= periodstop ? true : false

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
    if longinc
        if strategy.position_size == 0 or strategy.position_size > 0 
            strategy.entry(id="long", long=true, when=long, comment=" ")
            strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
            strategy.close(id="long", when=closelong, comment = " ")
    if shotinc
        if strategy.position_size == 0 or strategy.position_size < 0 
            strategy.entry(id="short", long=false, when=short, comment = " ")
            strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
            strategy.close(id="short", when=closeshort, comment = " ")

더 많은