
이 전략은 가격 동력 지표를 활용하여 실현되는 트렌드 추적 전략이다. 이는 일정 주기 동안의 종결 가격 변화를 계산하여 시장의 추세를 판단하고, 가격이 지속되는 상승 또는 하락 추세에 나타나면, 상응하는 상장 또는 상하 작업을 수행한다.
이 전략의 핵심 지표는 가격의 운동 (momentum) 이다. 운동의 계산 공식은 다음과 같다.
momentum = close - close[n]
여기서 n는 동력주기의 길이를 나타냅니다. Momentum > 0일 때, 현재주기 동안 가격이 계속 상승하고 있음을 나타냅니다.
이 전략은 먼저 confirmBars 파라미터를 설정하여 몇 개의 K 선의 트렌드 판단이 필요하다는 것을 나타냅니다. 재검토 범위 내에서, 만약 momentum > 0 지속 confirmBars 루트 K 선이라면, 더 많은 진입을 수행합니다. 만약 momentum < 0 지속 confirmBars 루트 K 선이라면, 공백 진입을 수행합니다.
이 전략의 경향을 판단하는 핵심은 bcount과 scount 변수를 통해 momentum 연속적으로 0보다 크거나 작은 K 선의 수를 통계적으로 계산하는 데 있습니다. 해당 조건이 충족되면 +1, 만족하지 않으면 0으로 돌아갑니다. 카운트가 confirmBars에 도달하면 해당 거래를 더하거나 공백으로 수행합니다.
이 전략은 매우 간단하며 다음과 같은 장점을 가지고 있습니다.
이 전략에는 몇 가지 위험도 있습니다.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
전체적으로 볼 때, 이 동적 돌파 전략은 양적 거래에 적합한 간단한 실용적인 트렌드 추적 전략 중 하나입니다. 적용 과정에서 거래 주파수를 제어하고 과도한 거래와 거래 비용을 방지하는 문제에 주의를 기울여야 합니다. 동시에, 매개 변수와 필터링 규칙은 실제 품종과 시장 환경에 따라 조정 및 최적화가 필요합니다.
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Momentum Strategy [TS Trader]", overlay=true)
confirmBars = input(1)
momentumLength = input(14, title="Momentum Length")
price = close
momentum = close - close[momentumLength]
// === INPUT BACKTEST RANGE ===
fromYear = input.int(2019, title="Backtest Start Year")
fromMonth = input.int(1, title="Backtest Start Month", minval=1, maxval=12)
fromDay = input.int(1, title="Backtest Start Day", minval=1, maxval=31)
toYear = input.int(2023, title="Backtest End Year")
toMonth = input.int(12, title="Backtest End Month", minval=1, maxval=12)
toDay = input.int(31, title="Backtest End Day", minval=1, maxval=31)
startTimestamp = timestamp(fromYear, fromMonth, fromDay, 00, 00)
endTimestamp = timestamp(toYear, toMonth, toDay, 23, 59)
inBacktestRange = true
// === STRATEGY LOGIC ===
bcond = momentum > 0
bcount = 0
bcount := bcond ? nz(bcount[1]) + 1 : 0
if (bcount == confirmBars and inBacktestRange)
strategy.entry("Buy", strategy.long, comment="Long")
scond = momentum < 0
scount = 0
scount := scond ? nz(scount[1]) + 1 : 0
if (scount == confirmBars and inBacktestRange)
strategy.entry("Sell", strategy.short, comment="Short")
// Plotting Momentum
plot(momentum, title="Momentum", color=color.purple)