모멘텀 지표 결정 거래 전략


생성 날짜: 2023-12-15 15:31:52 마지막으로 수정됨: 2023-12-15 15:31:52
복사: 0 클릭수: 594
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

모멘텀 지표 결정 거래 전략

개요

동적 지표 의사 결정 거래 전략은 트렌드 추적 전략이다. 이 전략은 쌍 지표 이동 평균을 사용하여 동적 지표를 구성하고, 가격 변화 비율 지표와 결합하여 거래 신호를 생성한다. 동적 지표가 상승하면, 여러 신호를 생성하고, 동적 지표가 떨어지면, 빈 신호를 생성한다. 이 전략은 시장의 중기 경향을 추적하는 거래자에게 적합하다.

전략 원칙

이 전략은 쌍 지수 이동 평균 지표인 Decision Point oscillator를 사용하여 움직임을 측정한다. 우선 가격의 일일 변동률을 계산하고, 31일과 20일 길이의 쌍 지수 이동 평균을 사용하여 가격 변동률을 평형화하고, 마지막으로 9일간의 평형 이동 평균을 사용하여 거래 신호를 발송한다. 빠른 선이 느린 선보다 높으면 다단 시장이며, 빠른 선이 느린 선보다 낮으면 공백 시장이다.

이 전략은 또한 가격 변화 비율 지표를 도입하여 시장에서 잘못된 신호를 발생하지 않도록합니다. 구체적으로, 시장이 활성 상태인지 판단하기 위해 30 일 가까운 가격의 퍼센트 변화를 계산하여 이동 평균을 사용합니다. 시장이 활성화 될 때만 거래 신호를 발송합니다.

우위 분석

이 전략은 운동량 지표와 가격 변화 비율 지표를 결합하여 중기 트렌드를 효과적으로 식별하고 불안정한 상황에서 자주 거래하는 것을 피할 수 있습니다. 단순한 이동 평균을 추적하는 것과 같은 트렌드 전략에 비해 잘못된 거래의 확률을 크게 줄일 수 있습니다. 또한 위험 관리 측면에서는 중지 손실을 설정하여 단독 손실을 제 시간에 효과적으로 제어 할 수 있습니다.

위험 분석

이 전략은 주로 BASE 중장선 트렌드 트레이딩에서 거래되며, 단기간의 가격 변동을 포착할 수 없다. 급격한 상황이 발생하면, 스톱로스 포인트가 뚫려 큰 손실을 초래할 수 있다. 또한, 매개 변수 설정이 적절하지 않으면 전략에 영향을 줄 수 있다. 예를 들어, 쌍 지수 이동 평균 매개 변수가 너무 짧게 설정되어 잘못된 거래의 가능성을 증가시킨다.

위험을 예방하기 위해, 적절하게 중지 지점을 조정하고 중지 범위를 확장 할 수 있습니다. 또한 급격한 상황이 발생했을 때, 일시적으로 전략을 종료하여 중단이 깨지는 확률을 피 할 수 있습니다. 매개 변수 조정 측면에서, 세부적인 재검토를 수행하여 최적의 매개 변수를 선택해야합니다.

최적화 방향

이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.

  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)