Chiến lược siêu Ichi

Tác giả:ChaoZhang, Ngày: 2023-11-06 16:32:11
Tags:

img

Tổng quan

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 logic

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:

  1. Quan hệ giữa Tenkan và Kijun: Tăng khi Tenkan ở trên, giảm khi ở dưới

  2. Màu mây: Tăng khi mây xanh, giảm khi đỏ

  3. 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:

  • Tenkan trên Kijun
  • Giá trên Tenkan và Kijun
  • Tenkan và Kijun trên mây
  • Giá giảm xuống dưới Tenkan và Kijun.

Tín hiệu ngắn:

  • Tenkan dưới Kijun
  • Giá thấp hơn Tenkan và Kijun
  • Tenkan và Kijun dưới mây
  • Giá giảm xuống trên Tenkan và Kijun.

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.

Phân tích lợi thế

Chiến lược Super Ichi có những lợi thế sau:

  1. Sử dụng Ichimoku kết hợp để xác định xu hướng chính xác

  2. Tenkan/Kijun cho thấy xu hướng ngắn hạn, Cloud cho thấy xu hướng dài hạn

  3. Yêu cầu rút lại ngăn chặn sự phá vỡ sai

  4. Quản lý rủi ro sử dụng swing high/low gần đây để dừng lỗ để hạn chế lỗ

  5. Tỷ lệ rủi ro-lợi nhuận hợp lý cho lợi nhuận ổn định

  6. Á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

  7. Logic rõ ràng và không gian tối ưu hóa lớn

  8. Hiệu suất tốt trong các điều kiện thị trường khác nhau

Phân tích rủi ro

Chiến lược Super Ichi cũng có những rủi ro sau:

  1. 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

  2. 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

  3. 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

  4. Khả năng tăng giá hạn chế khi Cloud breakout có sự theo dõi hạn chế

  5. 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:

  1. Tối ưu hóa các tham số cho các khung thời gian và công cụ khác nhau

  2. Thêm bộ lọc để tránh các mục nhập đột phá sai trong thị trường dao động

  3. Sử dụng stop loss động để giảm dừng ra

  4. Kiểm tra các thiết lập tỷ lệ rủi ro-lợi nhuận khác nhau

  5. 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

Hướng dẫn tối ưu hóa

Chiến lược Super Ichi có thể được tối ưu hóa trong các khía cạnh sau:

  1. 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

  2. Tối ưu hóa các thông số Cloud để đánh giá xu hướng dài hạn tốt hơn

  3. Cải thiện thuật toán dừng lỗ, ví dụ như ATR hoặc dừng lại.

  4. Thêm bộ lọc sử dụng các chỉ số khác để giảm các mục nhập sai

  5. 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

  6. 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

  7. Sử dụng máy học để tối ưu hóa tham số và độ bền

  8. Thiết lập các tham số riêng biệt cho các phiên ngày so với đêm

Tóm lại

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))


Thêm nữa