Chiến lược này kết hợp các chỉ số Ichimoku Kinko Hyo Cloud và QQE để khám phá xu hướng giá tiềm năng và xác định thời gian vào và ra tối ưu. Nó tính toán các đường Ichimoku Cloud và sử dụng chỉ số QQE để đánh giá hướng xu hướng và tạo ra các tín hiệu giao dịch, trong khi sử dụng chỉ số RSI để lọc để kiểm soát rủi ro giao dịch.
Chiến lược bao gồm ba thành phần chính:
Chỉ số đám mây Ichimoku: Ichimoku Cloud sử dụng Tenkan-sen (đường chuyển đổi) và Kijun-sen (đường cơ sở) để tạo thành hình thành
Chỉ số QQE: QQE tính toán các dải giá trị tương đối rời rạc và các giá trị tương đối làm mịn để xác định hướng xu hướng. Nó gửi tín hiệu giao dịch khi giá vượt qua các dải bên ngoài vào khu vực dải giữa.
Chỉ số RSI: Chỉ số RSI đánh giá giá liệu giá có bị mua quá mức hay bán quá mức. Nó thiết lập đường mua quá mức và vùng mua quá mức, và sử dụng các tín hiệu QQE để quyết định tín hiệu vào và ra cuối cùng.
Cụ thể, chiến lược này theo dõi xem đường chuyển đổi có đường chéo vàng (phải vượt lên) hoặc đường chéo chết (phải vượt xuống) với đường cơ sở để xác định tín hiệu giao dịch. Nó cũng sử dụng chỉ số QQE để xác nhận hướng xu hướng tổng thể. Khi cả hai chỉ số cung cấp tín hiệu phù hợp và chỉ số RSI không cho thấy tình huống mua quá mức hoặc bán quá mức, các tín hiệu giao dịch sẽ được kích hoạt.
Chiến lược này kết hợp các chỉ số khác nhau để cải thiện độ chính xác phán đoán và sử dụng các lợi thế bổ sung để tránh thiên vị từ quyết định chỉ số duy nhất.
Đường chuyển đổi và đường cơ sở của Ichimoku Cloud phản ánh cả xu hướng ngắn hạn và trung hạn để có độ chính xác tốt hơn so với chỉ số MA duy nhất.
QQE xác định một cách đáng tin cậy hướng xu hướng tổng thể và bổ sung cho Ichimoku Cloud.
Việc lọc RSI lọc hiệu quả các vụ phá vỡ sai và kiểm soát rủi ro giao dịch.
Chiến lược này có logic rõ ràng và dễ hiểu và thực hiện cho giao dịch định lượng.
Mặc dù chiến lược này sử dụng nhiều chỉ số cho các quyết định vững chắc, nhưng vẫn còn những rủi ro chính:
Rủi ro điều chỉnh tham số. Cài đặt tham số không hợp lệ của Conversion Line, Base Line vv sẽ dẫn đến tín hiệu giao dịch không phù hợp. Các tham số cần tối ưu hóa cho các sản phẩm khác nhau.
Rủi ro đảo ngược xu hướng. Các tín hiệu giả có thể xảy ra trong thị trường giới hạn phạm vi. Cần nhiều chỉ số đảo ngược xu hướng hơn.
Các thông số RSI có thể được điều chỉnh để cho phép nhiều giao dịch hơn.
Giải pháp:
Tối ưu hóa các tham số trên dữ liệu lịch sử hơn cho các sản phẩm khác nhau để đảm bảo cấu hình tham số phù hợp.
Thêm cơ chế dừng lỗ trong chiến lược. Các vị trí thoát khi giá phá vỡ đường dừng lỗ theo hướng ngược lại.
Tối ưu hóa các thông số RSI để giảm nhẹ các yêu cầu lọc và có được nhiều cơ hội giao dịch hơn dưới sự kiểm soát rủi ro.
Chiến lược này có thể được cải thiện thêm từ các khía cạnh sau:
Đưa ra các thuật toán học máy để điều chỉnh năng động các tham số chiến lược thích nghi với thị trường phát triển, cải thiện khả năng thích nghi.
Mô-đun hóa các thành phần chiến lược để dễ dàng thay thế và thử nghiệm và tối ưu hóa riêng biệt, cải thiện hiệu quả phát triển.
Xây dựng mô-đun tích hợp dữ liệu để thu thập dữ liệu thị trường từ nhiều nguồn hơn và xây dựng bộ đào tạo chất lượng cao, nâng cao hiệu suất học máy.
Phát triển các công cụ backtesting để xác nhận chiến lược toàn diện, ghi lại các số liệu khác nhau để điều chỉnh tham số.
triển khai hệ thống chiến lược trên nền tảng đám mây, sử dụng sức mạnh tính toán đàn hồi để kiểm tra ngược song song nhanh hơn, tăng tốc tối ưu hóa tham số với chi phí phát triển thấp hơn.
/*backtest start: 2023-02-13 00:00:00 end: 2024-02-19 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © KryptoNight //@version=4 // comment/uncomment Study/Strategy to easily switch modes // study("Ichimoku Kinko Hyo Cloud - no offset - no repaint - RSI filter - alerts", shorttitle="IchiCloud + RSI - alerts", overlay=true) // ============================================================================== Strategy mode - uncomment to activate strategy("Ichimoku Kinko Hyo Cloud - no offset - no repaint - RSI filter - strategy", shorttitle="IchiCloud + RSI - Strategy Tester Mode", overlay=true, pyramiding = 0, currency = currency.EUR, initial_capital = 2000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_every_tick = true, calc_on_order_fills = true, commission_type = strategy.commission.percent, commission_value = 0.15) // ============================================================================== // ------------------------------------------------------------------------------ ichiCloud_offset = input(false, title="Standard Ichimoku Cloud") // with the visual offset ichiCloud_noOffset = input(true, title="Ichimoku Cloud - no offset - no repaint") // without the visual offset conversion_prd = input(9, minval=1, title="Conversion Line Period - Tenkan-Sen") baseline_prd = input(27, minval=1, title="Base Line Period - Kijun-Sen") baselineA_prd = input(52, minval=1, title="Base Line Period - Kijun-Sen (auxiliary)") leadingSpan_2prd = input(52, minval=1, title="Lagging Span 2 Periods - Senkou Span B") displacement = input(26, minval=0, title="Displacement: (-) Chikou Span; (+) Senkou Span A") extra_bars = input(1, minval=0, title="Displacement: additional bars") laggingSpan_src = input(close, title="Lagging Span price source - Chikou-Span") donchian(len) => avg(lowest(len), highest(len)) displ = displacement-extra_bars // ------------------------------------------------------------------------------ // OFFSET: conversion = donchian(conversion_prd) // Conversion Line - Tenkan-Sen (9 Period) baseline = donchian(baseline_prd) // Base Line - Kijun-Sen (26 Period) baselineA = donchian(baselineA_prd) // Base Line Period - Kijun-Sen (auxiliary) leadingSpanA = avg(conversion, baseline) leadingSpanB = donchian(leadingSpan_2prd) laggingSpan = laggingSpan_src // Color - bullish, bearish col_cloud = leadingSpanA>=leadingSpanB ? color.green : color.red // Cloud Lines spanA = plot(ichiCloud_offset? leadingSpanA : na, offset=displ, title="Offset: Lead Line 1 - Senkou Span A cloud", color=color.green) spanB = plot(ichiCloud_offset? leadingSpanB : na, offset=displ, title="Offset: Lead Line 2 - Senkou Span B cloud", color=color.red) fill(spanA, spanB, color=col_cloud, transp=80, title="Offset: Ichimoku Cloud - Leading Span 1 & 2 based coloring") // Other Lines conversion_p = plot(ichiCloud_offset? conversion : na, title="Offset: Conversion Line - Tenkan-Sen", color=#0496ff) standard_p = plot(ichiCloud_offset? baseline : na, title="Offset: Base Line - Kijun-Sen", color=#991515) standardA_p = plot(ichiCloud_offset? baselineA : na, title="Offset: Base Line - Kijun-Sen (auxiliary)", color=color.teal) lagging_Span_p = plot(ichiCloud_offset? laggingSpan : na, offset=-displ, title="Offset: Chikou Span (Lagging Span)", color=#459915) // ------------------------------------------------------------------------------ // NO OFFSET: conversion_noOffset = conversion[displ] // Conversion Line - Tenkan-Sen (9 Period) baseline_noOffset = baseline[displ] // Base Line - Kijun-Sen (26 Period) baselineA_noOffset = baselineA[displ] // Base Line Period - Kijun-Sen (auxiliary) leadingSpanA_noOffset = leadingSpanA[displ*2] leadingSpanB_noOffset = leadingSpanB[displ*2] laggingSpan_noOffset = laggingSpan[0] // Color - bullish, bearish col_cloud_noOffset = leadingSpanA_noOffset>=leadingSpanB_noOffset ? color.green : color.red // Cloud Lines spanA_noOffset = plot(ichiCloud_noOffset? leadingSpanA_noOffset : na, title="No offset: Lead Line 1 - Senkou Span A cloud", color=color.green, transp=0) spanB_noOffset = plot(ichiCloud_noOffset? leadingSpanB_noOffset : na, title="No offset: Lead Line 2 - Senkou Span B cloud", color=color.red, transp=0) fill(spanA_noOffset, spanB_noOffset, color=col_cloud_noOffset, transp=80, title="No offset: Ichimoku Cloud - Leading Span 1 & 2 based coloring") // Other Lines conversion_p_noOffset = plot(ichiCloud_noOffset? conversion_noOffset : na, title="No offset: Conversion Line - Tenkan-Sen", color=#0496ff, transp=0) baseline_p_noOffset = plot(ichiCloud_noOffset? baseline_noOffset : na, title="No offset: Base Line - Kijun-Sen", color=#991515, transp=0) baselineA_p_noOffset = plot(ichiCloud_noOffset? baselineA_noOffset : na, title="No offset: Base Line - Kijun-Sen (auxiliary)", color=color.teal, transp=0) laggingSpan_p_noOffset = plot(ichiCloud_noOffset? laggingSpan_noOffset : na, title="No offset: Chikou Span (Lagging Span)", color=#459915, transp=0) // ============================================================================== // Conditions & Alerts (based on the lines without offset) maxC = max(leadingSpanA_noOffset,leadingSpanB_noOffset) minC = min(leadingSpanA_noOffset,leadingSpanB_noOffset) // Trend start signals: crosses between Chikou Span (Lagging Span) and the Cloud (Senkou Span A, Senkou Span B) uptrend_start = crossover(laggingSpan_noOffset,maxC) downtrend_start = crossunder(laggingSpan_noOffset,minC) // Trends uptrend = laggingSpan_noOffset>maxC // Above Cloud downtrend = laggingSpan_noOffset<minC // Below Cloud // No trend: choppy trading - the price is in transition notrend = maxC>=laggingSpan_noOffset and laggingSpan_noOffset>=minC // Confirmations uptrend_confirm = crossover(leadingSpanA_noOffset,leadingSpanB_noOffset) downtrend_confirm = crossunder(leadingSpanA_noOffset,leadingSpanB_noOffset) // Signals - crosses between Conversion Line (Tenkan-Sen) and Base Line (Kijun-Sen) bullish_signal = crossover(conversion_noOffset,baseline_noOffset) bearish_signal = crossunder(conversion_noOffset,baseline_noOffset) // Various alerts alertcondition(uptrend_start, title="Uptrend Started", message="Uptrend Started") alertcondition(downtrend_start, title="Downtrend Started", message="Downtrend Started") alertcondition(uptrend_confirm, title="Uptrend Confirmed", message="Uptrend Confirmed") alertcondition(downtrend_confirm, title="Downtrend Confirmed", message="Downtrend Confirmed") alertcondition(bullish_signal, title="Buy Signal", message="Buy Signal") alertcondition(bearish_signal, title="Sell Signal", message="Sell Signal") rsi_OBlevel = input(50, title="RSI Filter: Overbought level (0 = off)") rsi_OSlevel = input(100,title="RSI Filter: Oversold level (100 = off)") rsi_len = input(14,title="RSI Length") rsi_src = input(close,title="RSI Price source") rsi = rsi(rsi_src,rsi_len) // Strategy ------------------------------- long_signal = bullish_signal and uptrend and rsi<=rsi_OSlevel // breakout filtered by the rsi exit_long = bearish_signal and uptrend short_signal = bearish_signal and downtrend and rsi>=rsi_OBlevel // breakout filtered by the rsi exit_short = bullish_signal and downtrend // Strategy alerts alertcondition(long_signal, title="Long Signal - Uptrend", message="Long Signal - Uptrend") alertcondition(exit_long, title="Long Exit Signal - Uptrend", message="Long Exit Signal - Uptrend") alertcondition(short_signal, title="Long Signal - Downtrend", message="Long Signal - Downtrend") alertcondition(exit_short, title="Short Exit Signal - Downtrend", message="Short Exit Signal - Downtrend") // Plot areas for trend and transition color_trend = uptrend? #00FF00 : downtrend? #FF0000 : notrend? color.new(#FFFFFF, 50) : na fill(spanA_noOffset, spanB_noOffset, color=color_trend, transp=90, title="No offset: Ichimoku Cloud - Lagging Span & Cloud based coloring") plotshape(ichiCloud_noOffset?uptrend_start:na, title="No offset: Uptrend Started", color=color.green, style=shape.circle, location=location.belowbar, size=size.tiny, text="Up") plotshape(ichiCloud_noOffset?downtrend_start:na, title="No offset: Downtrend Started", color=color.red, style=shape.circle,location=location.abovebar, size=size.tiny, text="Down") plotshape(ichiCloud_noOffset?uptrend_confirm:na, title="No offset: Uptrend Confirmed", color=color.green, style=shape.circle, location=location.belowbar, size=size.small, text="Confirm Up") plotshape(ichiCloud_noOffset?downtrend_confirm:na, title="No offset: Downtrend Confirmed", color=color.red, style=shape.circle, location=location.abovebar, size=size.small, text="Confirm Down") plotshape(ichiCloud_noOffset?long_signal:na, title="No offset: Long Signal", color=#00FF00, style=shape.triangleup, location=location.belowbar, size=size.small, text="Long") plotshape(ichiCloud_noOffset?exit_long:na, title="No offset: Exit Long Signal", color=color.fuchsia, style=shape.triangledown, location=location.abovebar, size=size.small, text="Exit long") plotshape(ichiCloud_noOffset?short_signal:na, title="No offset: Short Signal", color=#FF0000, style=shape.triangledown, location=location.abovebar, size=size.small, text="Short") plotshape(ichiCloud_noOffset?exit_short:na, title="No offset: Exit Short Signal", color=color.fuchsia, style=shape.triangleup, location=location.belowbar, size=size.small, text="Exit short") // ============================================================================== Strategy Component - uncomment to activate if (long_signal) strategy.entry("Long",strategy.long) if (exit_long) strategy.close("Long") // if (short_signal) // strategy.entry("Short",strategy.short) // if (exit_short) // strategy.close("Short") // ============================================================================== //@version=4 // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © colinmck RSI_Period = input(10, title='RSI Length') SF = input(5, title='RSI Smoothing') QQE = input(2.438, title='Fast QQE Factor') ThreshHold = input(10, title="Thresh-hold") src = close Wilders_Period = RSI_Period * 3 - 1 Rsi = rsi(src, RSI_Period) RsiMa = ema(Rsi, SF) AtrRsi = abs(RsiMa[1] - RsiMa) MaAtrRsi = ema(AtrRsi, Wilders_Period) dar = ema(MaAtrRsi, Wilders_Period) * QQE longband = 0.0 shortband = 0.0 trend = 0 DeltaFastAtrRsi = dar RSIndex = RsiMa newshortband = RSIndex + DeltaFastAtrRsi newlongband = RSIndex - DeltaFastAtrRsi longband := RSIndex[1] > longband[1] and RSIndex > longband[1] ? max(longband[1], newlongband) : newlongband shortband := RSIndex[1] < shortband[1] and RSIndex < shortband[1] ? min(shortband[1], newshortband) : newshortband cross_1 = cross(longband[1], RSIndex) trend := cross(RSIndex, shortband[1]) ? 1 : cross_1 ? -1 : nz(trend[1], 1) FastAtrRsiTL = trend == 1 ? longband : shortband // Find all the QQE Crosses QQExlong = 0 QQExlong := nz(QQExlong[1]) QQExshort = 0 QQExshort := nz(QQExshort[1]) QQExlong := FastAtrRsiTL < RSIndex ? QQExlong + 1 : 0 QQExshort := FastAtrRsiTL > RSIndex ? QQExshort + 1 : 0 //Conditions qqeLong = QQExlong == 1 ? FastAtrRsiTL[1] - 50 : na qqeShort = QQExshort == 1 ? FastAtrRsiTL[1] - 50 : na // Plotting plotshape(qqeLong, title="QQE long", text="Long", textcolor=color.white, style=shape.labelup, location=location.belowbar, color=color.green, transp=0, size=size.tiny) plotshape(qqeShort, title="QQE short", text="Short", textcolor=color.white, style=shape.labeldown, location=location.abovebar, color=color.red, transp=0, size=size.tiny) // Alerts alertcondition(qqeLong, title="Long", message="Long") alertcondition(qqeShort, title="Short", message="Short")