기계 학습에 기반한 스토카스틱 최적화와 함께 가격 EMA

저자:차오장, 날짜: 2024-01-26 14:57:08
태그:

img

전반적인 설명

이 전략은 트렌드에서 더 많은 기회를 잡기 위해 매끄러운 이동 평균과 스토카스틱 지표를 결합합니다. 주로 트렌드에서 더 높은 수익성을 얻기 위해 엔트리 타이밍 선택에 대한 스토카스틱 지표의 K 라인과 D 라인의 크로스오버와 함께 다른 기간을 가진 두 개의 기하급수적 이동 평균을 사용하여 거래 신호를 생성합니다.

전략 원칙

이 전략은 12주기 및 26주기 매끄러운 이동 평균을 사용합니다. 빠른 선이 밑에서 느린 선 위에 넘어가면 길게 이동합니다. 빠른 선이 위에서 느린 선 아래에 넘어가면 짧게 이동합니다. 가짜 신호를 필터하기 위해 빠른 선과 느린 선이 같은 방향으로 있어야하며, 빠른 선이 느린 선 위에 길고 빠른 선이 느린 선 아래에 짧습니다.

스토카스틱 지표의 K 라인과 D 라인의 교차는 엔트리 타이밍 선택에 사용됩니다. K 라인이 과소매 라인의 아래에서 D 라인의 위로 넘을 때 길게 이동합니다. K 라인이 과소매 라인의 위에서 D 라인의 아래에 넘을 때 짧게 이동합니다.

부드러운 이동 평균은 트렌드 방향을 결정하고, 스토카스틱 지표는 노이즈를 필터하고 입시 시기를 선택합니다. 그 조합은 트렌드에서 더 수익성있는 기회를 얻을 수 있습니다.

전략 의 장점

  • 매끄러운 이동 평균 자체는 트렌드를 따르는, 트렌드를 추적하기 쉬운 특징을 가지고 있습니다.
  • 소음을 필터링하고 수익성을 향상시키기 위해 스토카스틱을 사용하십시오.
  • 빠른 MA와 느린 MA의 조합은 빠른 MA가 느린 MA로 되돌아 갈 때 더 나은 위험-보상 효과를 얻을 수 있습니다.
  • K 라인과 D 라인의 크로스오버는 추가 타이밍 최적화를 제공합니다.

따라서 이러한 전략은 선택적으로 추세를 따라 기회를 포착하여 더 높은 수익성을 얻을 수 있습니다.

위험 분석

  • 단기적으로 조기 퇴출의 위험이 높습니다. 빠른 MA가 느린 MA로 되돌아 갈 때 신호가 거부되거나 포획 될 수 있습니다.
  • 트렌드를 따라가기 때문에 급격한 트렌드 전환에 빠르게 적응할 수 없으며 큰 손실을 초래합니다.

이러한 위험을 줄이기 위해 우리는 스톱 로스를 설정하거나 더 온건한 MA 매개 변수를 채택할 수 있습니다.

최적화 방향

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

  1. 최적의 매개 변수를 찾기 위해 MA 매개 변수의 다른 조합을 테스트합니다.
  2. 스토카스틱 매개 변수의 다른 조합을 테스트
  3. 스톱 로스 전략을 추가
  4. 변동성에 기반한 동적 스톱 로스를 추가합니다.
  5. 다른 제품과 시간 프레임에 대한 테스트 매개 변수 최적화
  6. 매개 변수를 최적화하기 위해 기계 학습 알고리즘을 활용

다른 매개 변수 조합을 테스트함으로써 더 나은 매개 변수를 찾을 수 있습니다. 또한, 중지 손실 전략은 효과적으로 위험을 줄이고 안정성을 향상시킬 수 있습니다.

결론

이 전략은 트렌드 추적을 위해 매끄러운 이동 평균과 스토카스틱의 장점을 통합하고, 동시에 더 나은 입시 시기를 선택합니다. 제어 가능한 위험과 큰 실용적 가치와 함께 작동하기가 쉽습니다. 지속적인 테스트와 최적화를 통해 성능을 더욱 향상시킬 수 있습니다. 양자 거래자에게 효율적이고 안정적인 트렌드 추적 모델을 제공합니다.


/*backtest
start: 2024-01-18 00:00:00
end: 2024-01-25 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// author SoftKill

strategy(title="Price EMA with stock", shorttitle="EMA STOCH", overlay=true)
src = input(title="Source", type=input.source, defval=close)

src_0 = src[0]
src_1 = src[1]
src_2 = src[2]
src_3 = src[3]
src_4 = src[4]

len50 = input(50, minval=1, title="Length")
src50 = input(close, title="Source")
out50 = ema(src50, len50)
len100 = input(100)
src100 = input(close, title="Source")
out100 = ema(src100, len100)

len1 = input(1, minval=1, title="Length")
src1 = input(close, title="Source")
out1 = sma(src1, len1)

length = input(5, minval=1)
OverBought = input(80)
OverSold = input(20)
smoothK = 3
smoothD = 3

k = sma(stoch(close, high, low, length), smoothK)
d = sma(k, smoothD)
cu = crossover(k,OverSold)
co = crossunder(k,OverBought)

sma_down = crossunder(out1, out50)
sma_up = crossover(out1,out50)

//if (not na(k) and not na(d))
  //  if (co and k < OverSold)
    //    strategy.entry("StochLE", strategy.long, comment="StochLE")
    //if (cu and k > OverBought)
     //   strategy.entry("StochSE", strategy.short, comment="StochSE")

crossCandle_4 = crossover(src[4],out50)
crossCandleUnder_4= cross(src[4],out50)
crossCandle_3 = crossover(src[3],out50)
crossCandleUnder_3= crossunder(src[3],out50)
crossCandle_2 = crossover(src[2],out50)
crossCandleUnder_2= crossunder(src[2],out50)
crossCandle_1 = crossover(src[1],out50)
crossCandleUnder_1= crossunder(src[1],out50)
crossCandle_0 = crossover(src[0],out50)
crossCandleUnder_0= crossunder(src[0],out50)

conditionOver = (crossCandle_4 or crossCandle_3 or crossCandle_2 or crossCandle_1 or crossCandle_0)
conditionUnder =(crossCandleUnder_4 or crossCandleUnder_3 or crossCandleUnder_2 or crossCandleUnder_1 or crossCandleUnder_0)

touch4 = (cross(low[4],out50) or cross(high[4],out50))
touch3 = (cross(low[3],out50) or cross(high[3],out50))
touch2 = (cross(low[2],out50) or cross(high[2],out50))
touch1 = (cross(low[1],out50) or cross(high[1],out50))

touch = touch1 or touch2 or touch3 or touch4

//and sma_up
//and sma_down

// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src_macd = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src_macd, fast_length) : ema(src_macd, fast_length)
slow_ma = sma_source ? sma(src_macd, slow_length) : ema(src_macd, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)


// plot((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close >= out50 and  (cu) and out50 > out100 and hist>=0 , title="Buy", style=plot.style_columns, color=color.lime)
// plot((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close <= out50 and  (co) and out50< out100 and hist<=0 , title="sell", style=plot.style_columns, color=color.red)


long_cond = ((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close > out50 and  (cu) and out50 > out100 and hist>=0)
short_cond = ((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close < out50 and  (co) and out50< out100 and hist<=0)

tp=input(0.1)
sl=input(0.1)

strategy.entry("long",strategy.long, when=long_cond)
strategy.entry("short",strategy.short, when=short_cond)

strategy.exit("X_long", "long", profit=close * tp / syminfo.mintick,  loss=close * sl / syminfo.mintick, when=touch  )
strategy.exit("x_short", "short",profit=close * tp / syminfo.mintick,loss=close * sl / syminfo.mintick,when = touch )

// //tp = input(0.0003, title="tp")
// tp = 0.0003
// //sl = input(1.0 , title="sl")
// sl = 1.0
// strategy.exit("closelong", "long" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closelong")
// strategy.exit("closeshort", "short" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closeshort")

더 많은