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

저자:차오장, 날짜: 2023-11-27 16:21:45
태그:

img

전반적인 설명

이 전략은 빠른 30일 간편 이동 평균과 주식 가격의 느린 33일 간편 이동 평균이 교차할 때 LONG 또는 SHORT 엔트리 신호를 생성합니다. 반대 신호가 발생하면 즉시 포지션을 종료합니다. 이것은 트렌드의 변화를 효과적으로 파악 할 수 있습니다.

전략 원칙

이 전략의 핵심은 빠른 30 일 MA와 느린 33 일 MA를 계산하는 것입니다. 빠른 라인은 가격 변화에 더 빨리 반응 할 수 있으며 느린 라인은 더 나은 필터링 효과를 가지고 있습니다. 빠른 라인이 느린 라인을 위로 돌파하면 구매 신호가 생성됩니다. 이것은 가격이 상승하기 시작하고 느린 라인이 여전히 뒤떨어지는 동안 빠른 라인이 반응했다는 것을 나타냅니다. 빠른 라인이 느린 라인을 아래로 돌파하면 판매 신호가 생성됩니다. 이것은 빠른 라인이 반응하지만 느린 라인이 여전히 뒤떨어지는 동안 가격이 감소하기 시작한다는 것을 나타냅니다.

이러한 빠르고 느린 MA 크로스오버 디자인을 통해 새로운 트렌드가 시작되면 거래 신호를 생성하고 반대 신호에서 종료하여 중장기 가격 추세를 효과적으로 파악 할 수 있습니다. 한편으로는 너무 많은 시장 변동에 의해 잘못 인도되는 것을 피할 수 있습니다.

이점 분석

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

  1. 간단한 이동 평균을 사용 하 여, 그것은 이해 하 고 실행 하기 쉽다
  2. 빠른 라인과 느린 라인의 조합은 가격 변화에 신속하게 반응 할 수 있으며 필터링 효과도 있습니다.
  3. 금색 십자가와 죽음의 십자가 신호는 간단하고 명확하고 조작이 쉽습니다.
  4. 중장기 동향을 효과적으로 파악할 수 있습니다.
  5. 위험 조절을 위해 반대 신호로 빠르게 종료합니다.

위험 분석

이 전략에는 몇 가지 위험도 있습니다.

  1. 가격 범위가 제한되면 여러 가지 잘못된 신호를 생성 할 수 있습니다. 과잉 거래로 인해
  2. 예상치 못한 사건으로 인한 극심한 가격 변동에 잘 대처할 수 없습니다.
  3. MA 기간과 같은 매개 변수는 최적화가 필요할 수 있습니다. 부적절한 설정은 전략 성능에 영향을 줄 수 있습니다.
  4. 거래 비용은 수익성에 어느 정도 영향을 미칩니다.

매개 변수 최적화, 스톱 로스 레벨 설정, 트렌드가 명확할 때만 거래 등과 같은 방법은 이러한 위험을 제어하고 줄이기 위해 사용될 수 있습니다.

최적화 방향

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

  1. 최적의 매개 변수 조합을 찾기 위해 MA 기간과 크로스오버 유형을 최적화합니다.
  2. 다른 기술적 지표 필터를 추가합니다. 예를 들어 거래량, MACD 등은 잘못된 신호를 줄이기 위해
  3. 단순히 반대 신호 중지 손실 대신 적응 스톱 손실 메커니즘을 추가
  4. 디자인 파라미터 세트 및 다른 제품들에 대한 스톱 손실 규칙
  5. 매개 변수를 동적으로 조정하기 위해 기계 학습 방법을 통합

테스트와 최적화를 통해 전략 규칙을 지속적으로 개선하여 다른 시장 환경에서 더 신뢰할 수있는 거래 신호를 얻을 수 있습니다.

요약

요약하자면, 이 두 개의 MA 크로스오버 브레이크아웃 전략은 매우 간단하고 실용적입니다. 빠른 MA와 느린 MA를 결합함으로써 중장기 트렌드의 시작을 효과적으로 식별하고 비교적 신뢰할 수있는 거래 신호를 생성 할 수 있습니다. 또한, 중지 손실 규칙은 구현하기가 쉽습니다. 추가 최적화로,이 전략은 가치있는 장기 양적 시스템으로 변할 수 있습니다.


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

//@version=3
//future strategy
//strategy(title = "es1!_1minute_hull", default_qty_type = strategy.fixed, initial_capital=250000,  overlay = true, commission_type=strategy.commission.cash_per_contract,commission_value=2, calc_on_order_fills=false, calc_on_every_tick=false,pyramiding=0)
//strategy.risk.max_position_size(2)
//stock strategy
strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=1000000, overlay = false)//, calc_on_order_fills=true, calc_on_every_tick=true)
//forex strategy
//strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100,  overlay = true,initial_capital=250000, default_qty_type = strategy.percent_of_equity)
//crypto strategy
//strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100,  overlay = true, commission_type=strategy.commission.percent,commission_value=.005,default_qty_value=10000)
//strategy.risk.allow_entry_in(strategy.direction.long) // There will be no short entries, only exits from long.




testStartYear = 2010
testStartMonth = 1
testStartDay = 1
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)


testEndYear = 2039
testEndMonth = 1
testEndDay = 1
testPeriodEnd = timestamp(testEndYear,testEndMonth,testEndDay,0,0)


testPeriod() =>
    //true
    time >= testPeriodStart and time <= testPeriodEnd ? true : false

fast_length = 30
slow_length = 33

ema1 = 0.0
ema2 = 0.0

volumeSum1 = sum(volume, fast_length)
volumeSum2 = sum(volume, slow_length)

//ema1 := (((volumeSum1 - volume) * nz(ema1[1]) + volume * close) / volumeSum1)
ema1 :=  ema(close,fast_length)
//ema2 := (((volumeSum2 - volume) * nz(ema2[1]) + volume * close) / volumeSum2)
ema2 :=  ema(close,slow_length)



plot(ema1,color=#00ff00, linewidth=3)
plot(ema2, color=#ffff00, linewidth=3)

go_long = crossover(ema1,ema2)
go_short = crossunder(ema1,ema2)

if testPeriod()
    strategy.entry("long_ride", strategy.long, when=go_long)
    strategy.entry("short_ride", strategy.short,when=go_short)
    
        
    strategy.close("long_ride",when=go_short)
    strategy.close("short_ride",when=go_long)
    

더 많은