듀얼 모멘텀 지표 돌파 전략


생성 날짜: 2023-11-16 17:00:54 마지막으로 수정됨: 2023-12-01 14:59:44
복사: 1 클릭수: 648
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

듀얼 모멘텀 지표 돌파 전략

개요

이 전략은 쌍동력 지표 돌파 전략이다. 이 전략은 두 개의 서로 다른 파라미터 세트의 동력 지표를 사용하여, 두 개의 동력 지표가 모두 0 축을 돌파할 때 거래 신호를 발생시킨다. 이 전략은 다중 엔트리만을 하고, 공백은 평점 포지션에만 사용된다.

전략 원칙

코드는 먼저 정책 속성을 설정합니다. 위탁 모드, 수수료 모드 등등. 그리고 두 가지 동력 지표를 계산합니다.

// Momentum settings

i_len           = input(defval = 12, title = "Length", minval = 1) 
i_src           = input(defval = close, title = "Source")
i_percent       = input(defval = true, title = "Percent?")
i_mom           = input(defval = "MOM2", title = "MOM Choice", options = ["MOM1", "MOM2"])

// Momentum code

mom0 = momentum(i_src, i_len, i_percent) 
mom1 = momentum(mom0, 1, i_percent)
mom2 = momentum(i_src, 1, i_percent)

momX = mom1 

if i_mom == "MOM2"
    momX := mom2

mom0은 기본 동력 지표이며, 길이는 i_len이며, 데이터 소스는 i_src이며, 백분율을 계산하는 것은 i_percent에 의해 결정된다.

mom1은 mom0을 데이터 소스로 하고, 길이는 1인 운동 지표이다.

mom2는 원시 데이터 i_src를 소스로 하고, 길이는 1의 동력 지표이다.

최종적으로 사용된 운동 지표는 momX입니다. 기본적으로는 mom1을 사용하며, mom2을 선택할 수도 있습니다.

mom0과 momX가 동시에 0축을 초과할 때, 더 많이 하고; mom0과 momX가 동시에 0축을 밑으로 할 때, 평점으로 한다.

전략적 이점

  1. 이중 동적량 지표가 서로 다른 변수 설정과 결합되어 거래 신호의 신뢰성을 높일 수 있으며, 이중 확인은 가짜 신호를 감소시킨다.

  2. 다중 엔트리만 하고, 빈 헤드는 평위 포지션에만 사용되므로 거래 빈도를 낮추고 거래 비용을 줄일 수 있다.

  3. 동력 지표의 매개 변수는 다른 시장 환경에 맞게 조정할 수 있다.

  4. 코드 구조는 명확하고 이해하기 쉽고 수정할 수 있습니다.

  5. 자동 거래 시스템과 연동할 수 있는 거래 메시지 설정이 추가되었다.

전략적 위험

  1. 이진량 지표는 가짜 신호를 줄일 수 있지만, 약한 트렌드 신호를 놓칠 수도 있다.

  2. 하지만, 이 거래는 단지 다중 거래로만 이루어질 수 있고, 공허 거래의 기회를 놓칠 수도 있습니다.

  3. 동력 지표 매개 변수 설정이 잘못되면 거래가 너무 자주 또는 너무 느려질 수 있습니다.

  4. 미흡한 재검토 데이터로 인해 매개 변수가 지나치게 잘 어울릴 수 있다.

  5. 이중 확인은 가짜 신호를 감소시키기는 하지만 완전히 피할 수는 없으며, 실판 거래는 여전히 돌파구 효과에 주의를 기울여야 한다.

전략 최적화 방향

  1. 다양한 길이의 변수 조합을 테스트할 수 있으며, 또한 퍼센티지를 계산할 수 있는지도 테스트하여 최적의 변수를 찾을 수 있다.

  2. 트렌드가 확인된 후, 더 많은 거래 기회를 잡기 위해 공백 거래 신호를 추가하는 것을 고려할 수 있습니다.

  3. 다른 동력 지표 계산 방법을 테스트 할 수 있습니다. ROC, RSI 등이 더 나은 효과를 찾습니다.

  4. 트렌드 필터링을 결합하여 불안정한 상황에서 거래하는 것을 피할 수 있습니다.

  5. 손해를 막는 전략을 최적화하여 수익을 극대화하면서 위험을 통제할 수 있습니다.

요약하다

이 전략은 전형적인 양동량 지표 돌파 전략이다. 이 전략은 두 번의 확인을 사용하여 가짜 신호를 줄이고, 거래 빈도를 줄이기 위해 다중으로만 진입한다. 이 전략의 장점은 간단하고 실행하기 쉽고, 변수 최적화 및 위험 제어에서 많은 개선의 여지가 있다. 전체적으로, 이 전략은 동량 돌파 전략의 기본 프레임워크로서 실행 가능하지만, 특정 시장에 대한 최적화 조정이 필요하여 실전에서 수익을 안정화 할 수 있다.

전략 소스 코드
/*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"}]
*/

//@version=4
strategy("Momentum Long Strategy", overlay = false, precision = 2, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash, commission_type = strategy.commission.percent, commission_value = 0, calc_on_every_tick = true)

// There will be no short entries, only exits from long.
strategy.risk.allow_entry_in(strategy.direction.long)

// Calculate start/end date and time condition
startDate  = input(timestamp("2021-01-02T00:00:00"), title = "Start Date", type = input.time)
finishDate = input(timestamp("2021-12-31T00:00:00"), title = "End Date",type = input.time)
 
time_cond  =true

// Momentum settings

i_len           =       input(defval = 12,      title = "Length",       minval = 1)
i_src           =       input(defval = close,   title = "Source")
i_percent       =       input(defval = true,    title = "Percent?")
i_mom           =       input(defval = "MOM2",  title = "MOM Choice",   options = ["MOM1", "MOM2"])

// Messages for buy and sell
message_buy  = input("{{strategy.order.alert_message}}", title="Buy message")
message_sell = input("{{strategy.order.alert_message}}", title="Sell message")

// Momentum code

momentum(seria, length, percent) =>
	_mom        =       percent ? ( (seria / seria[length]) - 1) * 100 : seria - seria[length]
	_mom

mom0        =       momentum(i_src, i_len, i_percent)
mom1        =       momentum(mom0, 1, i_percent)
mom2        =       momentum(i_src, 1, i_percent)

momX        =       mom1

if i_mom == "MOM2"
    momX    :=     mom2
    
// Strategy Alerts    

if (mom0 > 0 and momX > 0 and time_cond)
    strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE", alert_message = message_buy)
else
	strategy.cancel("MomLE")
if (mom0 < 0 and momX < 0 and time_cond)
	strategy.entry("MomExit", strategy.short, stop = low - syminfo.mintick, comment = "MomSE", alert_message = message_sell)
else
	strategy.cancel("MomExit")
	
// Plotting

plot(0, color = #5d606b, title = "ZERO")
plot(mom0, color = #00bcd4, title = "MOM")
plot(mom1, color = #00FF00, title = "MOM1", display = display.none)
plot(mom2, color = #00FF00, title = "MOM2")