
Chiến lược này được gọi là “Chiến lược giao dịch theo dõi xu hướng đa chu kỳ dựa trên EMA và RSI ngẫu nhiên”, sử dụng chỉ số di chuyển trung bình (EMA) và chỉ số RSI ngẫu nhiên của hai chu kỳ khác nhau để nắm bắt xu hướng trung và dài hạn của thị trường. Ý tưởng cốt lõi của chiến lược là đánh giá xu hướng theo hướng giao dịch của EMA, đồng thời kết hợp RSI ngẫu nhiên làm tín hiệu cảnh báo xác nhận xu hướng và đảo ngược để tạo vị thế khi xu hướng hình thành và đóng cửa xu hướng cuối cùng.
Tính toán EMA nhanh và EMA chậm. Các tham số mặc định của EMA nhanh là 12, tham số mặc định của EMA chậm là 25, trong ứng dụng thực tế có thể được điều chỉnh theo đặc điểm thị trường và tần suất giao dịch.
Đánh giá xu hướng không gian:
Xác nhận xu hướng: Sau khi có tín hiệu xem quá / nhìn xuống, cần 2 đường K liên tiếp xuất hiện để xác nhận xu hướng hình thành. Điều này giúp lọc các tín hiệu giả.
Sử dụng RSI ngẫu nhiên như một phán đoán hỗ trợ:
Sử dụng hai chu kỳ EMA khác nhau cùng một 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. Phân tích cho thấy sự kết hợp của EMA chu kỳ 12⁄25 tốt hơn trong việc nắm bắt xu hướng trung hạn và dài hạn.
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 giả và tăng tỷ lệ chiến lược.
RSI ngẫu nhiên được sử dụng như một phán đoán phụ trợ, giúp xác định cường độ của xu hướng trong giai đoạn đầu của xu hướng và cảnh báo trước khả năng đảo ngược xu hướng trong giai đoạn sau của xu hướng.
Chiến lược logic đơn giản, ít tham số, dễ hiểu và thực hiện, và phù hợp với nhiều thị trường và giống.
EMA là chỉ số chậm trễ, có thể có điểm trượt lớn trong giai đoạn đầu của xu hướng đảo ngược.
Chiến lược theo xu hướng thường được sử dụng trong các thị trường chấn động. Chiến lược này không có sự phán đoán cụ thể đối với các thị trường chấn động.
RSI ngẫu nhiên có thể bị lệch khi thị trường biến động mạnh, ảnh hưởng đến chất lượng phán đoán.
Các tham số cố định có thể không phù hợp với tất cả các điều kiện thị trường và cần được điều chỉnh theo các đặc điểm của thị trường.
Tham gia các chỉ số biến động như ATR, điều chỉnh các tham số EMA theo biến động của tỷ lệ biến động để phù hợp với nhịp độ thị trường khác nhau.
Tăng khả năng đánh giá thị trường chấn động, ví dụ như kết hợp với hướng mở cửa của vòng Brin, để tránh giao dịch thường xuyên trong thị trường chấn động.
Việc tích hợp nhiều yếu tố phụ trợ hơn trên cơ sở RSI ngẫu nhiên, chẳng hạn như sự thay đổi khối lượng giao dịch, làm tăng độ tin cậy của tín hiệu.
Xem xét sự liên quan của thị trường, giới thiệu nhiều loại tín hiệu liên kết, tăng cường khả năng chống rủi ro của hệ thống.
Chiến lược này tận dụng tối đa lợi thế của EMA và RSI ngẫu nhiên để tạo thành một chiến lược giao dịch trung hạn dài hạn dựa trên theo dõi xu hướng và đảo ngược động lực. Bằng cách bắt xu hướng ngang nhau, xác nhận cường độ xu hướng và đảo ngược cảnh báo ngẫu nhiên, cơ chế xác nhận xu hướng nâng cao chất lượng tín hiệu, ba điều này kết hợp hữu cơ để tạo thành một khung 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')