Chiến lược Super Ichi là một chiến lược giao dịch xu hướng đưa ra các quyết định giao dịch dựa trên chỉ số Super Ichi. Nó sử dụng mối quan hệ giữa đường Tenkan, đường Kijun và đám mây Ichimoku của chỉ số Super Ichi để xác định hướng xu hướng hiện tại và đi vào sự giảm giá.
Chiến lược Super Ichi chủ yếu phù hợp với giao dịch xu hướng trung bình đến dài hạn và nhằm mục đích kiếm lợi nhuận từ các xu hướng chính.
Chiến lược Super Ichi chủ yếu đánh giá các yếu tố sau đây để xác định hướng giao dịch:
Quan hệ giữa Tenkan và Kijun: Tăng khi Tenkan ở trên, giảm khi ở dưới
Màu mây: Tăng khi mây xanh, giảm khi đỏ
Giá Pullback: Cần phải rút khỏi các đường dây trước khi vào
Cụ thể, các tín hiệu giao dịch là:
Tín hiệu dài:
Tín hiệu ngắn:
Khi tín hiệu dài / ngắn được kích hoạt, một vị trí sẽ được mở dựa trên vị trí hiện tại.
Chiến lược Super Ichi có những lợi thế sau:
Sử dụng Ichimoku kết hợp để xác định xu hướng chính xác
Tenkan/Kijun cho thấy xu hướng ngắn hạn, Cloud cho thấy xu hướng dài hạn
Yêu cầu rút lại ngăn chặn sự phá vỡ sai
Quản lý rủi ro sử dụng swing high/low gần đây để dừng lỗ để hạn chế lỗ
Tỷ lệ rủi ro-lợi nhuận hợp lý cho lợi nhuận ổn định
Áp dụng cho các khung thời gian khác nhau cho giao dịch xu hướng trung bình đến dài hạn
Logic rõ ràng và không gian tối ưu hóa lớn
Hiệu suất tốt trong các điều kiện thị trường khác nhau
Chiến lược Super Ichi cũng có những rủi ro sau:
Stop loss có thể được kích hoạt thường xuyên trong các thị trường dao động, ảnh hưởng đến lợi nhuận
Việc không nhanh chóng đảo ngược các vị trí khi xu hướng thay đổi nhanh chóng có thể dẫn đến tổn thất
Tỷ lệ rủi ro-lợi nhuận mặc định có thể không phù hợp với tất cả các công cụ, cần điều chỉnh chi tiết
Khả năng tăng giá hạn chế khi Cloud breakout có sự theo dõi hạn chế
Các thông số chỉ số cần thử nghiệm và tối ưu hóa rộng rãi cho các dụng cụ hoạt động
Các rủi ro có thể được giảm bằng cách:
Tối ưu hóa các tham số cho các khung thời gian và công cụ khác nhau
Thêm bộ lọc để tránh các mục nhập đột phá sai trong thị trường dao động
Sử dụng stop loss động để giảm dừng ra
Kiểm tra các thiết lập tỷ lệ rủi ro-lợi nhuận khác nhau
Xác nhận sức mạnh tín hiệu bằng cách sử dụng các mẫu biểu đồ vv
Chiến lược Super Ichi có thể được tối ưu hóa trong các khía cạnh sau:
Tối ưu hóa các thông số Tenkan/Kijun để phù hợp hơn với các công cụ giao dịch
Tối ưu hóa các thông số Cloud để đánh giá xu hướng dài hạn tốt hơn
Cải thiện thuật toán dừng lỗ, ví dụ như ATR hoặc dừng lại.
Thêm bộ lọc sử dụng các chỉ số khác để giảm các mục nhập sai
Tỷ lệ rủi ro-lợi nhuận được điều chỉnh chi tiết cho các công cụ và khung thời gian khác nhau
Sử dụng kích thước vị trí martingale để phù hợp với sự biến động thị trường khác nhau
Sử dụng máy học để tối ưu hóa tham số và độ bền
Thiết lập các tham số riêng biệt cho các phiên ngày so với đêm
Chiến lược Super Ichi rất phù hợp với giao dịch xu hướng trung hạn đến dài hạn nói chung. Nó xuất sắc trong việc xác định hướng xu hướng bằng Ichimoku, trong khi yêu cầu rút lại tránh các mục nhập sai. Với tối ưu hóa tham số, nó có thể đạt được lợi nhuận ổn định trên nhiều công cụ và khung thời gian hơn. Dễ hiểu nhưng tối ưu hóa cao, chiến lược Super Ichi phục vụ như một chiến lược xu hướng cơ bản tuyệt vời cho nghiên cứu và học tập.
/*backtest start: 2022-11-05 00:00:00 end: 2023-11-05 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // Strategy based on the the SuperIchi indicator. // // Strategy was designed for the purpose of back testing. // See strategy documentation for info on trade entry logic. // // Credits: // - SuperIchi [LUX]: LuxAlgo (https://www.tradingview.com/script/vDGd9X9y-SuperIchi-LUX/) //@version=5 strategy("SuperIchi Strategy", overlay=true, initial_capital=1000, currency=currency.NONE, max_labels_count=500, default_qty_type=strategy.cash, commission_type=strategy.commission.percent, commission_value=0.01) // ============================================================================= // STRATEGY INPUT SETTINGS // ============================================================================= // --------------- // Risk Management // --------------- swingLength = input.int(15, "Swing High/Low Lookback Length", group='Strategy: Risk Management', tooltip='Stop Loss is calculated by the swing high or low over the previous X candles') accountRiskPercent = input.float(2, "Account percent loss per trade", step=0.1, group='Strategy: Risk Management', tooltip='Each trade will risk X% of the account balance') profitFactor = input.float(2, "Profit Factor (R:R Ratio)", step = 0.1, group='Strategy: Risk Management') useAtrOverride = input.bool(true, "Use Swing High/Low ATR Override", group='Strategy: Risk Management', tooltip='In some cases price may not have a large enough (if any) swing withing previous X candles. Turn this on to use an ATR value when swing high/low is lower than the given ATR value') atrMultiplier = input.int(1, "Swing High/Low ATR Override Multiplier", group='Strategy: Risk Management') atrLength = input.int(14, "Swing High/Low ATR Override Length", group='Strategy: Risk Management') // ----------------- // Strategy Settings // ----------------- pullbackLength = input.int(5, "Pullback Lookback Length", group='Strategy: Settings', tooltip='Number of candles to consider for a pullback into the moving averages (prerequisite for trade entry)') // ---------- // Date Range // ---------- start_year = input.int(title='Start Date', defval=2022, minval=2010, maxval=3000, group='Strategy: Date Range', inline='1') start_month = input.int(title='', defval=1, group='Strategy: Date Range', inline='1', options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) start_date = input.int(title='', defval=1, group='Strategy: Date Range', inline='1', options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]) end_year = input.int(title='End Date', defval=2023, minval=1800, maxval=3000, group='Strategy: Date Range', inline='2') end_month = input.int(title='', defval=1, group='Strategy: Date Range', inline='2', options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) end_date = input.int(title='', defval=1, group='Strategy: Date Range', inline='2', options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]) in_date_range = time >= timestamp(syminfo.timezone, start_year, start_month, start_date, 0, 0) and time < timestamp(syminfo.timezone, end_year, end_month, end_date, 0, 0) // ============================================================================= // INDICATORS // ============================================================================= // --------------- // SuperIchi [LUX] // --------------- tenkan_len = input(9,'Tenkan ',inline='SuperIchi', group='Indicator: SuperIchi Settings') tenkan_mult = input(2.,'',inline='SuperIchi', group='Indicator: SuperIchi Settings') kijun_len = input(26,'Kijun ',inline='SuperIchi', group='Indicator: SuperIchi Settings') kijun_mult = input(4.,'',inline='SuperIchi', group='Indicator: SuperIchi Settings') spanB_len = input(52,'Senkou Span B ',inline='SuperIchi', group='Indicator: SuperIchi Settings') spanB_mult = input(6.,'',inline='SuperIchi', group='Indicator: SuperIchi Settings') offset = input(26,'Displacement', inline='SuperIchi', group='Indicator: SuperIchi Settings') //------------------------------------------------------------------------------ avg(src,length,mult)=> atr = ta.atr(length)*mult up = hl2 + atr dn = hl2 - atr upper = 0.,lower = 0. upper := src[1] < upper[1] ? math.min(up,upper[1]) : up lower := src[1] > lower[1] ? math.max(dn,lower[1]) : dn os = 0,max = 0.,min = 0. os := src > upper ? 1 : src < lower ? 0 : os[1] spt = os == 1 ? lower : upper max := ta.cross(src,spt) ? math.max(src,max[1]) : os == 1 ? math.max(src,max[1]) : spt min := ta.cross(src,spt) ? math.min(src,min[1]) : os == 0 ? math.min(src,min[1]) : spt math.avg(max,min) //------------------------------------------------------------------------------ tenkan = avg(close,tenkan_len,tenkan_mult) kijun = avg(close,kijun_len,kijun_mult) senkouA = math.avg(kijun,tenkan) senkouB = avg(close,spanB_len,spanB_mult) //------------------------------------------------------------------------------ tenkan_css = #2157f3 //blue kijun_css = #ff5d00 //red cloud_a = color.new(color.teal,80) cloud_b = color.new(color.red,80) chikou_css = #7b1fa2 plot(tenkan,'Tenkan-Sen',tenkan_css) plot(kijun,'Kijun-Sen',kijun_css) plot(ta.crossover(tenkan,kijun) ? kijun : na,'Crossover',#2157f3,3,plot.style_circles) plot(ta.crossunder(tenkan,kijun) ? kijun : na,'Crossunder',#ff5d00,3,plot.style_circles) A = plot(senkouA,'Senkou Span A',na,offset=offset-1) B = plot(senkouB,'Senkou Span B',na,offset=offset-1) fill(A,B,senkouA > senkouB ? cloud_a : cloud_b) plot(close,'Chikou',chikou_css,offset=-offset+1,display=display.none) // ============================================================================= // STRATEGY LOGIC // ============================================================================= plotchar(kijun, "kijun", "", location = location.top) plotchar(senkouA[offset-1], "senkouA", "", location = location.top) plotchar(tenkan > kijun, "line above", "", location = location.top) plotchar(close > tenkan, "price above", "", location = location.top) plotchar(kijun > senkouA[offset-1], "above cloud", "", location = location.top) // blue line above red line + price above both lines + both lines above cloud longSen = tenkan > kijun and close > tenkan and kijun > senkouA[offset-1] // red line below blue line + price below both lines + both lines below cloud shortSen = tenkan < kijun and close < tenkan and kijun < senkouA[offset-1] plotchar(longSen, "longSen", "", location = location.top) plotchar(shortSen, "shortSen", "", location = location.top) // Cloud is green longSenkou = senkouA[offset-1] > senkouB[offset-1] // Cloud is red shortSenkou = senkouA[offset-1] < senkouB[offset-1] // price must have pulled back below sen lines before entry barsSinceLongPullback = ta.barssince(close < kijun and close < tenkan) longPullback = barsSinceLongPullback <= pullbackLength // price must have pulled back above sen lines before entry barsSinceShortPullback = ta.barssince(close > kijun and close > tenkan) shortPullback = barsSinceShortPullback <= pullbackLength // plotchar(lowestClose, "lowestClose", "", location = location.top) // plotchar(highestClose, "highestClose", "", location = location.top) inLong = strategy.position_size > 0 inShort = strategy.position_size < 0 longCondition = longSen and longSenkou and longPullback and in_date_range shortCondition = shortSen and shortSenkou and shortPullback and in_date_range swingLow = ta.lowest(source=low, length=swingLength) swingHigh = ta.highest(source=high, length=swingLength) atr = useAtrOverride ? ta.atr(atrLength) * atrMultiplier : 0 longSl = math.min(close - atr, swingLow) shortSl = math.max(close + atr, swingHigh) longStopPercent = math.abs((1 - (longSl / close)) * 100) shortStopPercent = math.abs((1 - (shortSl / close)) * 100) longTpPercent = longStopPercent * profitFactor shortTpPercent = shortStopPercent * profitFactor longTp = close + (close * (longTpPercent / 100)) shortTp = close - (close * (shortTpPercent / 100)) // Position sizing (default risk 2% per trade) riskAmt = strategy.equity * accountRiskPercent / 100 longQty = math.abs(riskAmt / longStopPercent * 100) / close shortQty = math.abs(riskAmt / shortStopPercent * 100) / close if (longCondition and not inLong) strategy.entry("Long", strategy.long, qty=longQty) strategy.exit("Long SL/TP", from_entry="Long", stop=longSl, limit=longTp, alert_message='Long SL Hit') buyLabel = label.new(x=bar_index, y=high[1], color=color.green, style=label.style_label_up) label.set_y(id=buyLabel, y=low) label.set_tooltip(id=buyLabel, tooltip="Risk Amt: " + str.tostring(riskAmt) + "\nQty: " + str.tostring(longQty) + "\nSwing low: " + str.tostring(swingLow) + "\nStop Percent: " + str.tostring(longStopPercent) + "\nTP Percent: " + str.tostring(longTpPercent)) if (shortCondition and not inShort) strategy.entry("Short", strategy.short, qty=shortQty) strategy.exit("Short SL/TP", from_entry="Short", stop=shortSl, limit=shortTp, alert_message='Short SL Hit') sellLabel = label.new(x=bar_index, y=high[1], color=color.red, style=label.style_label_up) label.set_y(id=sellLabel, y=low) label.set_tooltip(id=sellLabel, tooltip="Risk Amt: " + str.tostring(riskAmt) + "\nQty: " + str.tostring(shortQty) + "\nSwing high: " + str.tostring(swingHigh) + "\nStop Percent: " + str.tostring(shortStopPercent) + "\nTP Percent: " + str.tostring(shortTpPercent))