동력 전략은 가격 변화의 추세에 따라 거래하는 전략이다. 이 전략은 일정 주기 동안의 가격 변화 상황을 계산하여 가격 운동 추세를 판단하고 거래 신호를 생성한다. 가격이 상승 추세에있을 때 구매 신호를 생성하고 가격이 하락 추세에있을 때 판매 신호를 생성한다. 이 전략은 쌍동력 지표의 교차를 사용하여 거래 신호를 생성한다.
이 전략은 특정 주기 내의 종결 가격 변화를 계산하여 가격의 동력을 판단한다. 구체적으로, N주기 전의 종결 가격에 대한 종결 가격의 변화를 계산한다.
먼저 첫 번째 동력 지수 MOM0을 계산하고, 공식은 다음과 같다:
MOM0 = CLOSE - CLOSE[N]
그 중 CLOSE는 현재 주기 종료 가격을 나타냅니다.[N]은 N주기 전의 종결 가격을 나타냅니다. 따라서 MOM0>0은 N주기 전의 종결 가격 상승을 나타냅니다. MOM0은 N주기 전의 종결 가격 하락을 나타냅니다.
다음으로 두 번째 운동 지표 MOM1을 계산하여 다음과 같은 공식으로 계산한다:
MOM1 = MOM0 - MOM0[1]
즉, MOM0의 현재 주기의 값을 지난 주기의 값을 빼면 계산한다. MOM1>0은 MOM0의 상승을 의미하며, MOM1은 MOM0의 하락을 의미한다.
동시에 세 번째 동력 지표 MOM2를 계산하여 다음과 같은 수식을 사용한다:
MOM2 = CLOSE - CLOSE[1]
즉, 현재 주기 종료 가격을 지난 주기 종료 가격을 빼서 계산한다. MOM2>0은 종료 가격이 상승한 것을 나타내고, MOM2은 종료 가격이 떨어졌음을 나타낸다.
MOM0>0과 MOM1>0일 때, 동력이 계속 상승하는 것을 나타내며, 구매 신호를 생성한다. MOM0과 MOM2일 때, 동력이 계속 떨어지는 것을 나타내며, 판매 신호를 생성한다.
코드에는 시간 조건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")