
이 전략은 쌍동력 지표 돌파 전략이다. 이 전략은 두 개의 서로 다른 파라미터 세트의 동력 지표를 사용하여, 두 개의 동력 지표가 모두 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축을 밑으로 할 때, 평점으로 한다.
이중 동적량 지표가 서로 다른 변수 설정과 결합되어 거래 신호의 신뢰성을 높일 수 있으며, 이중 확인은 가짜 신호를 감소시킨다.
다중 엔트리만 하고, 빈 헤드는 평위 포지션에만 사용되므로 거래 빈도를 낮추고 거래 비용을 줄일 수 있다.
동력 지표의 매개 변수는 다른 시장 환경에 맞게 조정할 수 있다.
코드 구조는 명확하고 이해하기 쉽고 수정할 수 있습니다.
자동 거래 시스템과 연동할 수 있는 거래 메시지 설정이 추가되었다.
이진량 지표는 가짜 신호를 줄일 수 있지만, 약한 트렌드 신호를 놓칠 수도 있다.
하지만, 이 거래는 단지 다중 거래로만 이루어질 수 있고, 공허 거래의 기회를 놓칠 수도 있습니다.
동력 지표 매개 변수 설정이 잘못되면 거래가 너무 자주 또는 너무 느려질 수 있습니다.
미흡한 재검토 데이터로 인해 매개 변수가 지나치게 잘 어울릴 수 있다.
이중 확인은 가짜 신호를 감소시키기는 하지만 완전히 피할 수는 없으며, 실판 거래는 여전히 돌파구 효과에 주의를 기울여야 한다.
다양한 길이의 변수 조합을 테스트할 수 있으며, 또한 퍼센티지를 계산할 수 있는지도 테스트하여 최적의 변수를 찾을 수 있다.
트렌드가 확인된 후, 더 많은 거래 기회를 잡기 위해 공백 거래 신호를 추가하는 것을 고려할 수 있습니다.
다른 동력 지표 계산 방법을 테스트 할 수 있습니다. ROC, RSI 등이 더 나은 효과를 찾습니다.
트렌드 필터링을 결합하여 불안정한 상황에서 거래하는 것을 피할 수 있습니다.
손해를 막는 전략을 최적화하여 수익을 극대화하면서 위험을 통제할 수 있습니다.
이 전략은 전형적인 양동량 지표 돌파 전략이다. 이 전략은 두 번의 확인을 사용하여 가짜 신호를 줄이고, 거래 빈도를 줄이기 위해 다중으로만 진입한다. 이 전략의 장점은 간단하고 실행하기 쉽고, 변수 최적화 및 위험 제어에서 많은 개선의 여지가 있다. 전체적으로, 이 전략은 동량 돌파 전략의 기본 프레임워크로서 실행 가능하지만, 특정 시장에 대한 최적화 조정이 필요하여 실전에서 수익을 안정화 할 수 있다.
/*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")