확률적 지표와 CCI 지표를 기반으로 한 추세 추종 전략


생성 날짜: 2023-11-22 16:23:31 마지막으로 수정됨: 2023-11-22 16:23:31
복사: 1 클릭수: 844
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

확률적 지표와 CCI 지표를 기반으로 한 추세 추종 전략

개요

이 전략은 Stochastic 지표와 CCI 지표를 결합하여 트렌드 방향을 식별하고, Rate of Change 지표를 사용하여 흔들림 트렌드를 필터링하여 트렌드에 대한 추적을 구현한다. 이 전략은 돌파구 입장을 채택하고, 손실 출구를 중지하는 거래 방식을 사용합니다.

전략 원칙

  1. Stochastic 지표는 공백을 판단합니다.
    스토카스틱 지표의 상단에서 마지막 바를 넘으면 구매 신호이고, 하단에서 마지막 바를 넘으면 판매 신호입니다.
  2. CCI 지표는 트렌드 방향을 판단합니다.
    CCI 0보다 크면 다목적 시장, 0보다 작면 공수 시장
  3. Rate of Change 지표의 필터링은 흔들림 경향을 나타냅니다.
    Rate of Change의 파라미터를 설정하여 가격의 활성 트렌드를 판단합니다.
  4. 출전 및 출전 규칙
    구매 신호: Stochastic 상의 최근 바를 넘어서서 CCI가 0보다 크며 가격 트렌드가 활발하다
    팔기 신호: Stochastic 아래에서 가장 최근의 바를 통과하고 CCI가 0보다 작고 가격 추세가 활발하다
    손실 종료: 긴 선 3% 손실, 짧은 선 3% 손실

우위 분석

  1. 스토카스틱 지표와 CCI 지표의 결합으로 트렌드 방향을 판단하는 정확도가 높습니다.
  2. Rate of Change 지표는 파동 동향을 효과적으로 제거하여 무효 거래를 방지합니다.
  3. 다양한 종류의 트렌드를 포착할 수 있는 다중 공간 쌍방향 거래
  4. 트렌드를 따라잡고, 트렌드 기회를 잡기
  5. 심각한 손실을 방지하고 위험을 효과적으로 통제하기 위한 엄격한 손해 차단

위험 분석

  1. 정책 변수 설정이 잘못되면 너무 보수적이거나 급진적이 될 수 있습니다.
  2. 지표의 효과는 제한적이며, 극단적인 상황에서는 실패할 수 있습니다.
  3. 이 트렌드 초기에는 브레이크 엔트리가 트렌드를 건너뛰고, 수익의 일부가 삭감됩니다.
  4. 너무 작은 스톱 손실은 쉽게 깨질 수 있고, 너무 큰 스톱 손실은 위험 통제가 잘 되지 않습니다.

최적화 방향

  1. 변수 최적화: 변수 설정을 개선하여 최적의 변수 조합을 찾습니다.
  2. 다중 지표 협조 더 많은 판단 경향 지표를 추가하여 의사결정 효과를 높인다.
  3. 적극적인 스톱. 추적 스톱 또는 시간 스텝 스톱을 설정하여 스톱이 뚫릴 확률을 감소시킵니다.
  4. 위험 평가. 최대 회수와 같은 위험 지표 제약에 가입, 위험 구멍을 전면 제어

요약하다

이 전략은 Stochastic, CCI 및 Rate of Change의 세 가지 지표를 통합하여 트렌드 방향을 판단하여 트렌드 기회를 포착합니다. 전략의 장점은 지표와 함께 정확한 판단과 효율적인 변동 상황을 필터링하고 엄격한 손실 통제 위험을 통해 제어하는 것입니다. 다음 단계는 변수 최적화, 다중 지표 조합, 손실 중지 전략 등의 측면에서 개선 할 수 있으며, 전략을 더 안정적이고 유연하게 만듭니다.

전략 소스 코드
/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Stochastic CCI 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

///////////// CCI ///////////// 
src = close
ccilength = input(13, minval=1, title="CCI Length")
c=cci(src, ccilength)

///////////// Stochastic ///////////// 
len = input(19, minval=1, title="RSI Length")
lenema = input(12, minval=1, title="RSI-EMA Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
out = ema(rsi, lenema)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, 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 = out > out[1] and isMoving() and c > 0
short = out < out[1] and isMoving() and c < 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])

sl_inp = input(3.0, title='Stop Loss %') / 100 

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("L",  strategy.long, when=long_signal)
    strategy.entry("S", strategy.short, when=short_signal)
    strategy.exit("L Ex", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S Ex", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(not isMoving() ? color.white : long ? color.lime : short ? color.red : na, transp=80)
plot(out, color = out > out[1] ? color.lime:color.red, linewidth = 2, title="Stoch")
plot(c, color = c > 0 ? color.lime:color.red, linewidth = 2, title="CCI")