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.
Chiến lược chủ yếu sử dụng hai loại chỉ số:
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á.
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.
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.
RSI lọc các sự đột phá giả.
Sự kết hợp hai chỉ báo làm giảm tín hiệu sai.
Cài đặt trong kiểm soát mất mát dừng.
Tỷ lệ lợi nhuận tùy chỉnh cho mục tiêu lợi nhuận.
Sự kết hợp hai chỉ báo có thể tạo ra quá ít tín hiệu.
JMA vẫn có sự chậm trễ, có thể bỏ lỡ các điểm chuyển hướng.
Việc đặt stop loss không đúng có thể gây tổn thất lớn hơn.
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.
Kiểm tra các thông số JMA để tìm các thiết lập tối ưu.
Hãy thử các thông số RSI khác nhau để có hiệu suất tốt hơn.
Thêm cơ chế dừng kéo theo để dừng thích nghi.
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.
Tìm kiếm các bộ lọc bổ sung như KD, MACD.
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)