EMA và Stochastic RSI dựa trên xu hướng nhiều khung thời gian theo chiến lược giao dịch

Tác giả:ChaoZhang, Ngày: 2024-03-08 17:32:38
Tags:

img

Tổng quan chiến lược

Chiến lược này, được đặt tên là EMA và Stochastic RSI dựa trên Chiến lược giao dịch theo xu hướng nhiều khung thời gian, sử dụng hai trung bình động theo cấp số nhân (EMA) với các giai đoạn khác nhau và chỉ số Stochastic RSI để nắm bắt xu hướng thị trường trung hạn đến dài hạn. Ý tưởng cốt lõi là xác định hướng xu hướng dựa trên các giao thoa EMA, trong khi sử dụng Stochastic RSI như một tín hiệu xác nhận sức mạnh xu hướng và khả năng đảo ngược.

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

  1. Tính toán EMA nhanh và EMA chậm. Các thông số mặc định cho EMA nhanh là 12 và 25 cho EMA chậm. Chúng có thể được điều chỉnh dựa trên đặc điểm thị trường và tần suất giao dịch.

  2. Xác định xu hướng tăng/giảm:

  • Khi EMA nhanh vượt qua EMA chậm, nó tạo ra một tín hiệu tăng
  • Khi EMA nhanh vượt qua dưới EMA chậm, nó tạo ra một tín hiệu giảm
  1. Xác nhận xu hướng: Sau khi một tín hiệu tăng / giảm xuất hiện, nó đòi hỏi 2 nến tăng / giảm liên tiếp để xác nhận xu hướng. Điều này giúp lọc các tín hiệu sai.

  2. Sử dụng chỉ số RSI Stochastic như một phán đoán phụ:

  • Khi đường Stochastic RSI %K vượt trên đường %D, và %K dưới 20, nó tạo ra một tín hiệu bán quá mức, cho thấy một sự đảo ngược tăng tiềm năng
  • Khi đường Stochastic RSI %K vượt dưới đường %D, và %K trên 80, nó tạo ra một tín hiệu mua quá mức, cho thấy một sự đảo ngược giảm tiềm năng
  1. Quy tắc giao dịch:
  • Mở một vị trí dài khi EMA tạo ra một tín hiệu tăng và chỉ số RSI Stochastic không ở vùng mua quá mức
  • Mở một vị trí ngắn khi EMA tạo ra tín hiệu giảm và chỉ số RSI Stochastic không ở vùng bán quá mức

Ưu điểm chiến lược

  1. Bằng cách sử dụng hai EMA với các giai đoạn khác nhau, chiến lược có thể cân bằng tốt hơn độ nhạy và độ tin cậy của việc nắm bắt xu hướng.

  2. Cơ chế xác nhận xu hướng có thể lọc hiệu quả hầu hết các tín hiệu sai và cải thiện tỷ lệ thắng.

  3. Stochastic RSI phục vụ như một phán đoán phụ trợ, giúp đánh giá sức mạnh xu hướng trong giai đoạn đầu và cảnh báo trước những sự đảo ngược tiềm năng trong giai đoạn cuối.

  4. Lý thuyết chiến lược đơn giản với ít tham số, giúp dễ hiểu và thực hiện.

Phân tích rủi ro

  1. Các EMA là các chỉ số chậm và có thể dẫn đến trượt đáng kể vào đầu các sự đảo ngược xu hướng.

  2. Chiến lược theo xu hướng thường hoạt động kém hơn trong thị trường hỗn loạn. Chiến lược này thiếu phán đoán cụ thể cho các điều kiện giới hạn phạm vi.

  3. Stochastic RSI có thể tạo ra các tín hiệu gây hiểu lầm trong thời gian biến động thị trường cực kỳ, ảnh hưởng đến chất lượng phán đoán.

  4. Các thông số cố định có thể không thích nghi với tất cả các điều kiện thị trường, đòi hỏi phải điều chỉnh năng động dựa trên các đặc điểm của thị trường.

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

  1. Đưa ra các chỉ số biến động như ATR để điều chỉnh động các thông số EMA và thích nghi với nhịp thị trường khác nhau.

  2. Thêm phán đoán cho các thị trường giới hạn phạm vi, chẳng hạn như kết hợp chiều rộng Bollinger Bands, để tránh giao dịch thường xuyên trong điều kiện hỗn loạn.

  3. Tích hợp nhiều tiêu chí phụ hơn trên Stochastic RSI, chẳng hạn như thay đổi khối lượng, để cải thiện độ tin cậy tín hiệu.

  4. Xem xét các mối tương quan thị trường và giới thiệu các tín hiệu liên thị trường đa tài sản để tăng khả năng chống rủi ro của hệ thống.

Tóm lại

Chiến lược này có hiệu quả tận dụng điểm mạnh của EMA và Stochastic RSI để hình thành một phương pháp giao dịch trung hạn đến dài hạn dựa trên việc theo dõi xu hướng và đảo ngược đà. Nó nắm bắt xu hướng thông qua các đường chéo EMA, xác nhận sức mạnh xu hướng và cảnh báo về sự đảo ngược với Stochastic RSI, và cải thiện chất lượng tín hiệu với các cơ chế xác nhận xu hướng. Ba thành phần kết hợp hữu cơ để tạo ra một khuôn khổ chiến lược giao dịch định lượng đơn giản và hiệu quả.


/*backtest
start: 2023-03-02 00:00:00
end: 2024-03-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('[Jacky] Trader XO Macro Trend Scanner', overlay=true)

// Variables
var ok = 0
var countBuy = 0
var countSell = 0
src = input(close, title='OHLC Type')
i_fastEMA = input(12, title='Fast EMA')
i_slowEMA = input(25, title='Slow EMA')
i_defEMA = input(25, title='Consolidated EMA')

// Allow the option to show single or double EMA
i_bothEMAs = input(title='Show Both EMAs', defval=true)

// Define EMAs
v_fastEMA = ta.ema(src, i_fastEMA)
v_slowEMA = ta.ema(src, i_slowEMA)
v_biasEMA = ta.ema(src, i_defEMA)

// Color the EMAs
emaColor = v_fastEMA > v_slowEMA ? color.green : v_fastEMA < v_slowEMA ? color.red : #FF530D

// Plot EMAs
plot(i_bothEMAs ? na : v_biasEMA, color=emaColor, linewidth=3, title='Consolidated EMA')
plot(i_bothEMAs ? v_fastEMA : na, title='Fast EMA', color=emaColor)
plot(i_bothEMAs ? v_slowEMA : na, title='Slow EMA', color=emaColor)

// Colour the bars
buy = v_fastEMA > v_slowEMA
sell = v_fastEMA < v_slowEMA

if buy
    countBuy += 1
    countBuy

if buy
    countSell := 0
    countSell

if sell
    countSell += 1
    countSell

if sell
    countBuy := 0
    countBuy

buysignal = countBuy < 2 and countBuy > 0 and countSell < 1 and buy and not buy[1]
sellsignal = countSell > 0 and countSell < 2 and countBuy < 1 and sell and not sell[1]

barcolor(buysignal ? color.green : na)
barcolor(sellsignal ? color.red : na)

// Strategy backtest
if (buysignal)
    strategy.entry("Buy", strategy.long)

if (sellsignal)
    strategy.entry("Sell", strategy.short)

// Plot Bull/Bear

plotshape(buysignal, title='Bull', text='Bull', style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.black, 0), size=size.tiny)
plotshape(sellsignal, title='Bear', text='Bear', style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.black, 0), size=size.tiny)

bull = countBuy > 1
bear = countSell > 1

barcolor(bull ? color.green : na)
barcolor(bear ? color.red : na)

// Set Alerts

alertcondition(ta.crossover(v_fastEMA, v_slowEMA), title='Bullish EMA Cross', message='Bullish EMA crossover')
alertcondition(ta.crossunder(v_fastEMA, v_slowEMA), title='Bearish EMA Cross', message='Bearish EMA Crossover')

// Stoch RSI code

smoothK = input.int(3, 'K', minval=1)
smoothD = input.int(3, 'D', minval=1)
lengthRSI = input.int(14, 'RSI Length', minval=1)
lengthStoch = input.int(14, 'Stochastic Length', minval=1)

rsi1 = ta.rsi(src, lengthRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(k, smoothD)

bandno0 = input.int(80, minval=1, title='Upper Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)')
bandno2 = input.int(50, minval=1, title='Middle Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)')
bandno1 = input.int(20, minval=1, title='Lower Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)')

// Alerts

crossoverAlertBgColourMidOnOff = input.bool(title='Crossover Alert Background Colour (Middle Level) [ON/OFF]', group='Crossover Alerts', defval=false)
crossoverAlertBgColourOBOSOnOff = input.bool(title='Crossover Alert Background Colour (OB/OS Level) [ON/OFF]', group='Crossover Alerts', defval=false)

crossoverAlertBgColourGreaterThanOnOff = input.bool(title='Crossover Alert >input [ON/OFF]', group='Crossover Alerts', defval=false)
crossoverAlertBgColourLessThanOnOff = input.bool(title='Crossover Alert <input [ON/OFF]', group='Crossover Alerts', defval=false)

maTypeChoice = input.string('EMA', title='MA Type', group='Moving Average', options=['EMA', 'WMA', 'SMA', 'None'])
maSrc = input.source(close, title='MA Source', group='Moving Average')
maLen = input.int(200, minval=1, title='MA Length', group='Moving Average')

maValue = if maTypeChoice == 'EMA'
    ta.ema(maSrc, maLen)
else if maTypeChoice == 'WMA'
    ta.wma(maSrc, maLen)
else if maTypeChoice == 'SMA'
    ta.sma(maSrc, maLen)
else
    0

crossupCHECK = maTypeChoice == 'None' or open > maValue and maTypeChoice != 'None'
crossdownCHECK = maTypeChoice == 'None' or open < maValue and maTypeChoice != 'None'

crossupalert = crossupCHECK and ta.crossover(k, d) and (k < bandno2 or d < bandno2)
crossdownalert = crossdownCHECK and ta.crossunder(k, d) and (k > bandno2 or d > bandno2)
crossupOSalert = crossupCHECK and ta.crossover(k, d) and (k < bandno1 or d < bandno1)
crossdownOBalert = crossdownCHECK and ta.crossunder(k, d) and (k > bandno0 or d > bandno0)

aboveBandalert = ta.crossunder(k, bandno0)
belowBandalert = ta.crossover(k, bandno1)

bgcolor(color=crossupalert and crossoverAlertBgColourMidOnOff ? #4CAF50 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert Background Colour (Middle Level)', transp=70)
bgcolor(color=crossupOSalert and crossoverAlertBgColourOBOSOnOff ? #fbc02d : crossdownOBalert and crossoverAlertBgColourOBOSOnOff ? #000000 : na, title='Crossover Alert Background Colour (OB/OS Level)', transp=70)

bgcolor(color=aboveBandalert and crossoverAlertBgColourGreaterThanOnOff ? #ff0014 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert - K > Upper level', transp=70)
bgcolor(color=belowBandalert and crossoverAlertBgColourLessThanOnOff ? #4CAF50 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert - K < Lower level', transp=70)

alertcondition(crossupalert or crossdownalert, title='Stoch RSI Crossover', message='STOCH RSI CROSSOVER')





Thêm nữa