추진력 전략은 가격 움직임에 따라 가격 추세를 따르는 거래 전략이다. 특정 기간 동안 가격 변화를 계산하여 거래 신호를 생성한다. 가격 상승 추세가 확인되면 구매 신호를 유발한다. 가격 하락 추세가 확인되면 판매 신호를 유발한다. 이 전략은 트레이딩 신호를 생성하기 위해 이중 추진력 지표 크로스오버를 사용합니다.
이 전략은 N 기간 전의 종료 가격과 비교하여 종료 가격의 변화를 측정하여 가격 동력을 계산합니다.
첫 번째 모멘텀 지표 MOM0는 다음과 같이 계산됩니다.
MOM0 = CLOSE - CLOSE[N]
여기서 CLOSE는 현재 기간의 종료 가격이고 CLOSE[N]는 N 기간 전의 종료 가격입니다. MOM0 > 0은 현재 종료 가격이 N 기간 전보다 높다는 것을 나타냅니다. MOM0 < 0은 현재 종료 가격이 N 기간 전보다 낮다는 것을 나타냅니다.
두 번째 모멘텀 지표 MOM1는 다음과 같이 계산됩니다.
MOM1 = MOM0 - MOM0 [1]
현재 MOM0과 이전 기간의 MOM0 사이의 차이를 계산합니다. MOM1 > 0은 MOM0이 증가하고 MOM1 < 0은 MOM0이 감소하는 것을 나타냅니다.
세 번째 모멘텀 지표 MOM2는 다음과 같이 계산됩니다.
MOM2 = CLOSE - CLOSE [1]
현재 종료 가격과 전기 종료 가격의 차이를 계산합니다. MOM2 > 0은 종료 가격이 상승하고 MOM2 < 0은 종료 가격이 감소하는 것을 나타냅니다.
MOM0 > 0과 MOM1 > 0이 되면, 이 모멘텀이 지속적으로 상승하고 있다는 것을 나타내고 구매 신호를 트리거합니다. MOM0 < 0과 MOM2 < 0이 되면, 이 모멘텀이 지속적으로 감소하고 있다는 것을 나타내고 판매 신호를 트리거합니다.
코드는 또한 시간 조건 time_cond을 포함하여 지정된 백테스팅 시간 범위 내에서 신호를 생성합니다. 신호가 사라지면 원치 않는 명령을 피하기 위해 주문을하기 전에 조건을 다시 확인합니다.
위험은 모멘텀 기간을 단축하거나 트렌드 결정을 추가하거나 스톱 로스를 구성하여 줄일 수 있습니다. 추가 필터링을 위해 볼륨 지표도 고려 될 수 있습니다.
추진력 전략은 가격 수준이 아닌 가격 변화 추세를 따르며, 상승 및 하락 가격 움직임을 잡기 위해 시장 추진력 방향을 효과적으로 파악합니다. 그러나 추진력은 지체 특성을 가지고 있으며 매개 변수 선택과 조합 최적화는 전략 성과에 중요합니다. 이 전략은 두 개의 추진력 지표 크로스오버를 기본으로 사용하여 약간의 소음을 필터합니다. 성능은 매개 변수 지속적인 최적화, 새로운 기술적 지표 통합 및 기계 학습 기술을 활용하여 더욱 향상되고 위험을 제어 할 수 있습니다.
/*backtest start: 2022-09-25 00:00:00 end: 2023-02-03 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Momentum 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) // 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 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(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 if (mom0 > 0 and momX > 0 and time_cond) strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE") else strategy.cancel("MomLE") if (mom0 < 0 and momX < 0 and time_cond) strategy.entry("MomSE", strategy.short, stop = low - syminfo.mintick, comment = "MomSE") else strategy.cancel("MomSE") plot(mom0, color = #00bcd4, title = "MOM") plot(mom1, color = #00FF00, title = "MOM1", display = display.none) plot(mom2, color = #00FF00, title = "MOM2")