JMA vượt qua RSI Chiến lược giao dịch

Tác giả:ChaoZhang, Ngày: 2023-09-18 21:42:50
Tags:

Tổng quan

Chiến lược này tạo ra các tín hiệu giao dịch bằng cách vượt qua Jurik Moving Average (JMA) và chỉ số RSI. Nó đi dài khi JMA vượt qua trên RSI và đi ngắn khi vượt qua dưới. Chiến lược này cố gắng lọc các tín hiệu sai bằng cách kết hợp hai chỉ số và giao dịch khi xu hướng rõ ràng hơn.

Nguyên tắc

Chiến lược chủ yếu sử dụng hai loại chỉ số:

  1. Chỉ số JMA: Một đường trung bình động trơn bằng cách sử dụng nhân công, với độ trễ thấp hơn và nhanh hơn trong việc nắm bắt các thay đổi giá.

  2. Chỉ số RSI: Một chỉ số sức mạnh phổ biến phản ánh đà mua/bán.

Khi JMA vượt trên chỉ số RSI, nó chỉ ra xu hướng tăng ngắn hạn mạnh hơn xu hướng dài hạn và tạo ra tín hiệu mua. Khi vượt dưới chỉ số RSI, nó nhắc tín hiệu bán.

Khi nhận được tín hiệu, chiến lược sẽ đi vào giao dịch theo hướng tương ứng.

Ưu điểm

  1. Các thông số JMA có thể điều chỉnh, thích nghi với các khoảng thời gian khác nhau.

  2. RSI lọc các sự đột phá giả.

  3. Sự kết hợp hai chỉ báo làm giảm tín hiệu sai.

  4. Cài đặt trong kiểm soát mất mát dừng.

  5. Tỷ lệ lợi nhuận tùy chỉnh cho mục tiêu lợi nhuận.

Rủi ro và giảm thiểu

  1. Sự kết hợp hai chỉ báo có thể tạo ra quá ít tín hiệu.

  2. JMA vẫn có sự chậm trễ, có thể bỏ lỡ các điểm chuyển hướng.

  3. Việc đặt stop loss không đúng có thể gây tổn thất lớn hơn.

  4. Sự phụ thuộc quá mức vào các chỉ số có thể tạo ra các tín hiệu sai. Có thể thêm bộ lọc khối lượng hoặc biến động.

Cơ hội gia tăng

  1. Kiểm tra các thông số JMA để tìm các thiết lập tối ưu.

  2. Hãy thử các thông số RSI khác nhau để có hiệu suất tốt hơn.

  3. Thêm cơ chế dừng kéo theo để dừng thích nghi.

  4. Tối ưu hóa kích thước vị trí đầu vào như thêm vào các giao dịch chiến thắng.

  5. Tìm kiếm các bộ lọc bổ sung như KD, MACD.

Tóm lại

Chiến lược này cho phép theo dõi xu hướng với JMA và RSI chéo và hạn chế rủi ro thông qua dừng. Nhưng tín hiệu sai vẫn có khả năng, đòi hỏi tối ưu hóa thêm các thông số và bộ lọc. Stop loss cũng cần xác thực backtest. Nó cung cấp một khuôn khổ cơ bản cho hệ thống chéo chỉ số kép với chỗ để cải thiện.


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

//@version=4
// Stratégie marche le mieux sur du 2 jours
strategy("JMA(7,50,RSI) crossing RSI(14,close)", overlay=false, currency=currency.EUR, default_qty_type=strategy.cash, default_qty_value=5000)

// Strategy Tester Start Time
sYear = input(2019, title = "Start Year")
sMonth = input(06, title = "Start Month", minval = 01, maxval = 12)
sDay = input(01, title = "Start Day", minval = 01, maxval = 31)
sHour = input(00, title = "Start Hour", minval = 00, maxval = 23)
sMinute = input(00, title = "Start Minute", minval = 00, maxval = 59)
startTime = true

// Strategy Tester End Time
eYear = input(2019, title = "End Year")
eMonth = input(12, title = "End Month", minval = 01, maxval = 12)
eDay = input(01, title = "End Day", minval = 01, maxval = 31)
eHour = input(00, title = "End Hour", minval = 00, maxval = 23)
eMinute = input(00, title = "End Minute", minval = 00, maxval = 59)
endTime = true

// === RSI ===
src = close, len = input(14, minval=1, title="Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
plot(rsi, color=color.purple)
band1 = hline(70)
band0 = hline(30)

// === JMA ===
_length = input(7, title="Length")
_phase = input(50, title="Phase")
_power = input(2, title="Power")
highlightMovements = input(true, title="Highlight Movements ?")

// srcJMA = input(rsi, title="Source")
srcJMA = rsi

phaseRatio = _phase < -100 ? 0.5 : _phase > 100 ? 2.5 : _phase / 100 + 1.5
beta = 0.45 * (_length - 1) / (0.45 * (_length - 1) + 2)
alpha = pow(beta, _power)
jma = 0.0
e0 = 0.0
e0 := (1 - alpha) * srcJMA + alpha * nz(e0[1])
e1 = 0.0
e1 := (srcJMA - e0) * (1 - beta) + beta * nz(e1[1])
e2 = 0.0
e2 := (e0 + phaseRatio * e1 - nz(jma[1])) * pow(1 - alpha, 2) + pow(alpha, 2) * nz(e2[1])
jma := e2 + nz(jma[1])
// === End of JMA def ===

jmaColor = highlightMovements ? (jma > jma[1] ? color.green : color.red) : #6d1e7f
plot(jma, title="JMA switch", linewidth=2, color=jmaColor, transp=0)

// === Inputs ===
// risk management
useStop = input(true, title = "Use Initial Stop Loss?")

goLong() => crossover(rsi, jma)
killLong() => crossunder(rsi, jma)

// ======= DEBUGGGGGGGG ============
long_price = 0.0
short_price = 0.0

if(startTime and endTime)
    if(goLong())
        long_price := close
    strategy.entry("Buy", strategy.long, when = goLong())
    strategy.close("Buy", when = killLong() and close > long_price)

// Shorting if using
goShort() => killLong()
killShort() => goLong()

if(startTime and endTime)
    if(goShort())
        short_price := close
    strategy.entry("Sell", strategy.short, when = goShort() and close < short_price)
    strategy.close("Sell", when = killShort())
// =========================

if (useStop)
    strategy.exit("XLS", from_entry ="Buy", stop = strategy.position_avg_price / 1.08)
    strategy.exit("XSS", from_entry ="Sell", stop = strategy.position_avg_price * 1.08)



Thêm nữa