Chiến lược này, được đặt tên là
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.
Xác định xu hướng tăng/giảm:
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.
Sử dụng chỉ số RSI Stochastic như một phán đoán phụ:
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.
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.
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.
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.
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.
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.
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.
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.
Đư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.
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.
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.
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.
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')