이중 추진력 분출 전략

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

img

전반적인 설명

이 전략은 이중 모멘텀 브레이크아웃 전략이다. 이 전략은 서로 다른 매개 변수 설정을 가진 두 개의 모멘텀 지표를 사용하여 두 개의 모멘텀 지표가 제로선을 통과할 때 거래 신호를 생성한다. 이 전략은 단지 긴 엔트리를 취하고 쇼트는 단지 출구 포지션을 위해만 사용됩니다.

전략 논리

코드는 먼저 주문 유형, 수수료 계획 등 전략 속성을 설정합니다. 다음 두 개의 추진률 지표를 계산합니다.

// 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")

더 많은