EMA giá với tối ưu hóa ngẫu nhiên dựa trên học máy

Tác giả:ChaoZhang, Ngày: 2024-01-26 14:57:08
Tags:

img

Tổng quan

Chiến lược này kết hợp Đường trung bình di chuyển trơn tru với chỉ số Stochastic để nắm bắt nhiều cơ hội hơn trong xu hướng. Nó chủ yếu sử dụng hai đường trung bình di chuyển theo cấp số nhân với các giai đoạn khác nhau để tạo ra tín hiệu giao dịch, cùng với sự chéo chéo của đường K và đường D trong chỉ số Stochastic để lựa chọn thời gian nhập cảnh, để có được lợi nhuận cao hơn trong xu hướng.

Nguyên tắc chiến lược

Chiến lược này sử dụng trung bình di chuyển trơn tru 12 giai đoạn và 26 giai đoạn. Khi đường nhanh vượt qua trên đường chậm từ dưới, đi dài. Khi đường nhanh vượt qua dưới đường chậm từ trên, đi ngắn. Để lọc tín hiệu giả, nó đòi hỏi các đường nhanh và chậm phải ở cùng một hướng, với đường nhanh trên đường chậm cho dài, và đường nhanh dưới đường chậm cho ngắn.

Sự chéo chéo giữa đường K và đường D trong chỉ số Stochastic được sử dụng để lựa chọn thời gian vào. Khi đường K vượt qua đường D từ dưới đường mua quá mức, đi dài. Khi đường K vượt qua đường D từ trên đường bán quá mức, đi ngắn.

Đường trung bình di chuyển trơn tru xác định hướng xu hướng, trong khi chỉ số Stochastic lọc tiếng ồn và chọn thời gian nhập cảnh.

Ưu điểm của Chiến lược

  • Đường trung bình di chuyển trơn tru tự nó có đặc điểm theo xu hướng, dễ dàng theo dõi xu hướng
  • Sử dụng Stochastic để lọc tiếng ồn và cải thiện lợi nhuận
  • Sự kết hợp của MA nhanh và chậm cho phép nhập khi MA nhanh rút lại để MA chậm, nhận được rủi ro-lợi nhuận tốt hơn
  • Sự chéo chéo của đường K và đường D cung cấp tối ưu hóa thời gian hơn nữa

Do đó, chiến lược này có thể theo xu hướng chọn lọc để nắm bắt các cơ hội, đạt được lợi nhuận cao hơn.

Phân tích rủi ro

  • Nguy cơ thoát sớm cao trong ngắn hạn. Các tín hiệu có thể bị từ chối hoặc bị mắc kẹt khi MA nhanh kéo trở lại MA chậm
  • Vì nó theo xu hướng, nó không thể thích nghi nhanh chóng với sự đảo ngược xu hướng mạnh mẽ, dẫn đến tổn thất lớn.

Để giảm những rủi ro đó, chúng ta có thể thiết lập stop loss, hoặc áp dụng các thông số MA vừa phải hơn.

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa thêm từ các khía cạnh sau:

  1. Kiểm tra các kết hợp khác nhau của các thông số MA để tìm ra tối ưu
  2. Kiểm tra các kết hợp khác nhau của các thông số Stochastic
  3. Thêm chiến lược dừng lỗ
  4. Thêm stop loss động dựa trên biến động
  5. Tối ưu hóa tham số thử nghiệm trên các sản phẩm và khung thời gian khác nhau
  6. Sử dụng các thuật toán học máy để tối ưu hóa các thông số

Bằng cách thử nghiệm các kết hợp tham số khác nhau, các tham số tốt hơn có thể được tìm thấy.

Kết luận

Chiến lược này tích hợp các điểm mạnh của Smooth Moving Average và Stochastic để theo dõi xu hướng, trong khi chọn thời gian đầu vào tốt hơn. Nó dễ dàng hoạt động, có rủi ro có thể kiểm soát và giá trị thực tế lớn. Hiệu suất của nó có thể được cải thiện hơn nữa thông qua kiểm tra và tối ưu hóa liên tục. Nó cung cấp cho các nhà giao dịch lượng một mô hình theo dõi xu hướng hiệu quả và ổn định.


/*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")

Thêm nữa