동력 돌파 전략은 시장 추세를 따르는 양적 거래 전략이다. 그것은 역사적 가격의 동력 지표를 계산하여 시장 가격 운동의 추세와 강도를 판단하여 시장의 중장선 추세를 포착한다. 동력이 마이너스 교정에서 더 많은 것을하고, 마이너스 교정에서 공백을 할 때, 트렌드 추적 전략에 속한다. 이 전략은 명백한 추세가있는 시장에 적용되며, 초과 수익을 얻을 수 있다.
이 전략은 주로 동력 지표에 기반한다. 동력 지표는 현재 주기 종료 가격에서 N 주기 이전 종료 가격을 것이다. 최신 K 선의 종료 가격이 N 주기 이전보다 높을 때 동력은 긍정하며 상승 동력을 나타냅니다. 최신 K 선의 종료 가격이 N 주기 이전보다 낮을 때 동력은 부정하며 하락 동력을 나타냅니다.
전략은 먼저 18주기 길이의 동력을 계산합니다. 즉, 현재 종료 가격에서 18주기 이전의 종료 가격을 빼면 mom0 을 얻습니다. 그리고는 mom0의 1주기 동력을 계산하여 mom1 을 얻습니다.
mom0>0과 mom1>0일 때 다중 신호가 발생하면, 이 때 가격 상승 동력이 강하다는 것을 나타냅니다. mom0과 mom1일 때 하위 신호가 발생하면, 이 때 가격 하락 동력이 강하다는 것을 나타냅니다.
전략은 최신의 상장과 하차 신호 시간을 기록합니다. 상장 신호 시간이 상장 신호 시간보다 크면 상장 포지션을 보유합니다. 상장 신호 시간이 상장 신호 시간보다 크면 상장 포지션을 보유합니다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
전략은 명확하고 간단하며, 이해하기 쉬운 구현으로 양자 거래 초보자에게 적합합니다.
동력 지표는 시장의 추세와 강도를 포착할 수 있으며, 중장선 추세를 추적하는 데 성공률이 높다.
이중 가동량 필터링을 사용하여 일부 가짜 돌파구로 인한 손실을 필터링 할 수 있습니다.
거래 신호가 발생하면 거래자가 트렌드 포지션을 구축하여 트렌드 행태의 초과 수익을 얻을 수 있습니다.
적당히 막는 것은 단편적 손실을 통제하고, 역전으로 인해 과도한 손실을 방지할 수 있다.
이 전략에는 몇 가지 위험도 있습니다.
다수점 거래에서 단기 조정으로 스톱 손실이 발생하여 전체 주기의 거래를 포착 할 수 없습니다. 스톱 손실 범위를 적절히 느슨하게 할 수 있습니다.
불안정한 상황에서 빈번하게 포지션을 열고 평점 포지션이 존재하여 거래 수수료와 슬라이드 포인트 손실을 증가시킬 수 있다. 필터링 조건을 적절히 완화하여 거래 빈도를 줄일 수 있다.
트렌드 반전 후에도 원래 방향의 포지션을 유지하면 손실이 확대된다. 트렌드 지표와 결합하여 트렌드 반전을 판단할 수 있다.
매개 변수 설정을 잘못하면 거래 신호가 잘못되거나 잘못된 신호가 발생할 수 있다. 다른 시장에 맞는 매개 변수를 조정해야 한다.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
동력 매개 변수를 최적화하여, 다른 주기 및 시장 조정에 따라 동력의 길이를 계산하고, 신호 품질을 개선한다.
MACD, KD 등과 같은 다른 지표 필터를 추가하여 트렌드 반전의 손실을 방지하십시오.
손실을 막는 전략을 최적화하고, 거래 추세에서 적절히 느슨한 손실을 막습니다. 비 추세 시장에서 적절히 엄격한 손실을 막습니다.
포지션 관리 전략을 늘리고, 비 트렌드 상황에서는 포지션을 줄이고, 트렌드 상황에서는 포지션을 늘리고 더 많은 수익을 얻는다.
다양한 품종에 대해 각기 최적화한 파라미터로 파라미터 적응성을 높인다.
기계 학습 알고리즘을 추가하여 정책의 동적 최적화 파라미터를 사용한다.
동력 돌파전략overall은 간단한 직관적인 트렌드 추적 전략이다. 그것은 시장의 중장선 트렌드를 효과적으로 포착할 수 있고, 트렌드 상황에서 더 나은 수익을 얻을 수 있다. 또한 위험 통제에 주의를 기울이고, 손실을 막는 전략을 최적화하고, 다른 지표로 트렌드를 판단하는 것을 보조할 필요가 있다. 지속적인 최적화를 통해, 이 전략을 안정적으로 수익을 올리는 정량 거래 시스템으로 만들 수 있다.
/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
/////////////// Time Frame ///////////////
_0 = input(false, "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close
momentum(seria, length) =>
mom = seria - seria[length]
mom
mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)
/////////////// Strategy ///////////////
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 0
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
/////////////// Stop Losses Long ///////////////
_5 = input(false, "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1l = atr(atrLkbl)
longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]
slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na
/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1s = atr(atrLkbs)
shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]
slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na
_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")
/////////////// Execution ///////////////
if testPeriod()
if useLongs
strategy.entry("L", strategy.long, when=long)
strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
if useShorts
strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
strategy.entry("S", strategy.short, when=short)
if not useShorts
strategy.close("L", when=short)
if not useLongs
strategy.close("S", when=long)
/////////////// Plotting ///////////////
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)