동력 지표 결정 거래 전략

저자:차오장, 날짜: 2023-12-15 15:31:52
태그:

img

전반적인 설명

모멘텀 인디케이터 결정 거래 전략은 트렌드를 따르는 전략이다. 이중 기하급수적인 이동 평균을 사용하여 모멘텀 인디케이터를 구축하고 가격 변화 지표와 결합하여 거래 신호를 생성합니다. 모멘텀 인디케이터가 상승하면 긴 신호를 생성합니다. 모멘텀 인디케이터가 하락하면 짧은 신호를 생성합니다. 이 전략은 시장의 중장기 트렌드를 추적하려는 거래자에게 적합합니다.

전략 원칙

이 전략은 동력을 측정하기 위해 이중 기하급수적인 이동 평균에 기반한 결정점 오시일레이터를 사용합니다. 먼저 매일 가격 변화율을 계산하고, 31일과 20일 이중 기하급수적 이동 평균을 사용하여 가격 변화율을 별도로 매끄럽게합니다. 마지막으로 9일 매끄러운 이동 평균을 사용하여 거래 신호를 발행합니다. 빠른 라인이 느린 라인의 위에있을 때 황소 시장을 나타냅니다. 빠른 라인이 느린 라인의 아래에있을 때 곰 시장을 나타냅니다.

이 전략은 또한 옆 시장에서 잘못된 신호를 피하기 위해 가격 변화 지수 지표를 도입합니다. 구체적으로 지난 30 일 동안의 비율 가격 변화를 계산하고 이동 평균을 통해 시장이 활성화되어 있는지 판단합니다. 거래 신호는 시장이 활성화 될 때만 발급됩니다.

이점 분석

이 전략은 동력 지표와 가격 변화율 지표를 결합하여 중장기 트렌드를 효과적으로 식별하고 변동적인 시장에서 빈번한 거래를 피할 수 있습니다. 이동 평균과 같은 간단한 트렌드 다음 전략에 비해 잘못된 거래의 확률을 크게 줄일 수 있습니다. 또한, 위험은 시간적으로 손실을 줄이고 거래당 손실을 효과적으로 제어하기 위해 스톱 로스 포인트를 설정함으로써 통제됩니다.

위험 분석

이 전략은 주로 중장기 트렌드 트레이딩에 의존하며, 단기 가격 변동을 파악할 수 없다. 급격한 시장 움직임이 있을 때, 스톱 로스 포인트가 깨질 수 있어 더 큰 손실이 발생할 수 있다. 또한 부적절한 매개 변수 설정도 전략에 영향을 줄 수 있다. 예를 들어, 이중 기하급수적 이동 평균 매개 변수가 너무 짧게 설정되면 잘못된 트레이드의 확률이 증가할 것이다.

위험을 방지하기 위해, 스톱 로스 포인트는 스톱 로스 범위를 확장하기 위해 적절하게 조정할 수 있다. 급격한 시장 움직임이 발생하면, 스톱 로스 붕괴 가능성을 피하기 위해 전략은 일시적으로 종료될 수 있다. 매개 변수 조정에 있어서 최적의 매개 변수를 선택하기 위해 상세한 백테스팅을 수행해야 한다.

최적화 방향

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. 급격한 시장 변동 기간 동안 거래를 피하기 위해 변동성 지표와 같은 다른 필터링 지표를 추가하십시오.

  2. 트렌드 방향과 강도를 판단하는 데 도움이 되는 머신 러닝 모델을 추가하여 신호의 정확성을 향상시킬 수 있습니다.

  3. 상대적 강도 지수, 스토카스틱 오시레이터 같은 다른 모멘텀 지표를 사용해 입출 시기를 최적화하세요.

  4. 실시간 거래에서, 최적의 매개 변수 조합을 추구하기 위해 최근 시장 조건과 결합된 매개 변수를 동적으로 조정합니다.

결론

모멘텀 인디케이터 결정 거래 전략은 일반적으로 중장기 트렌드를 따르는 전략입니다. 이중 기하급수적인 이동 평균 모멘텀 지표와 가격 변화율 지표를 결합하여 트렌드를 효과적으로 식별하고 잘못된 거래를 피합니다. 한편, 스톱 로스 포인트를 설정하여 위험을 제어합니다. 매개 변수가 적절히 조정되고 백테스트 결과가 좋다면 과도한 수익을 추구하는 중장기 투자자에게 적합합니다. 물론, 거래자는 여전히 전략에 급격한 시장 변동으로 인한 위험을 인식해야합니다.


/*backtest
start: 2022-12-08 00:00:00
end: 2023-11-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Decision BF", overlay=false, 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 ///////////////
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

/////////////// Decision ///////////////
src = input(ohlc4, title="Source")
length1 = input(31, title="First Smoothing")
length2 = input(20, title="Second Smoothing")
siglength = input(9, title="Signal Smoothing")
fr = input(true, title="Fill Region")

calc_csf(src, length) => 
	sm = 2.0 / length
	csf = 0.0
	csf := (src - nz(csf[1])) * sm + nz(csf[1])
	csf
i = (src / nz(src[1], src)) * 100
pmol2 = calc_csf(i - 100, length1)
pmol = calc_csf(10 * pmol2, length2)
pmols = ema(pmol, siglength)
d = pmol - pmols
duml = plot(fr ? (d > 0 ? pmol : pmols) : na, style=plot.style_circles, color=color.yellow, linewidth=0, title="DummyL")

hc = d > 0 ? d > d[1] ? color.lime : color.green : d < d[1] ? color.red : color.orange

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = d > 0 and isMoving() 
short = d < 0 and isMoving() 

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])

sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("L Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("S Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
sigl = plot(false ? na : pmols, title="PMO Signal", color=color.gray, linewidth=2, title="Signal")
mdl = plot(false ? na : pmol, title="PMO", color=color.black, linewidth=2, title="PMO")
fill(duml, sigl, color.green, transp=20, title="PosFill")
fill(duml, mdl, color.red, transp=20, title="NegFill")
bgcolor(isMoving() ? long ? color.lime : short ? color.red : na : color.white, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)

더 많은