Strategi Super Ichi

Penulis:ChaoZhang, Tarikh: 2023-11-06 16:32:11
Tag:

img

Ringkasan

Strategi Super Ichi adalah strategi perdagangan trend yang membuat keputusan perdagangan berdasarkan penunjuk Super Ichi. Ia menggunakan hubungan antara garisan Tenkan, garisan Kijun dan Awan Ichimoku penunjuk Super Ichi untuk menentukan arah trend semasa, dan memasuki penurunan harga.

Strategi Super Ichi terutamanya sesuai untuk perdagangan trend jangka sederhana hingga panjang dan bertujuan untuk mendapat keuntungan dari trend utama.

Logika Strategi

Strategi Super Ichi terutamanya menilai unsur-unsur berikut untuk menentukan arah perdagangan:

  1. Hubungan Tenkan dan Kijun: Bullish apabila Tenkan berada di atas, bearish apabila di bawah

  2. Warna Awan: Bullish apabila awan hijau, bearish apabila merah

  3. Pullback Harga: Memerlukan penarikan balik dari garis sebelum masuk

Khususnya, isyarat perdagangan adalah:

Isyarat panjang:

  • Tenkan di atas Kijun
  • Harga di atas Tenkan dan Kijun
  • Tenkan dan Kijun di atas Awan
  • Harga menarik balik di bawah Tenkan dan Kijun

Isyarat Pendek:

  • Tenkan di bawah Kijun
  • Harga di bawah Tenkan dan Kijun
  • Tenkan dan Kijun di bawah Awan
  • Harga menarik balik di atas Tenkan dan Kijun

Apabila isyarat panjang/pendek diaktifkan, kedudukan akan dibuka berdasarkan kedudukan semasa.

Analisis Kelebihan

Strategi Super Ichi mempunyai kelebihan berikut:

  1. Menggunakan kombinasi Ichimoku untuk menentukan trend dengan tepat

  2. Tenkan/Kijun menunjukkan jangka pendek, Awan menunjukkan trend jangka panjang

  3. Keperluan Pullback mengelakkan pembebasan palsu

  4. Pengurusan risiko menggunakan swing tinggi/rendah baru-baru ini untuk menghentikan kerugian untuk mengehadkan kerugian

  5. Nisbah risiko-balasan yang munasabah untuk keuntungan tetap

  6. Berlaku untuk jangka masa yang berbeza untuk perdagangan trend jangka sederhana hingga panjang

  7. Logik yang jelas dan ruang pengoptimuman yang besar

  8. Berprestasi baik dalam pelbagai keadaan pasaran

Analisis Risiko

Strategi Super Ichi juga mempunyai risiko berikut:

  1. Stop loss boleh diaktifkan dengan kerap semasa pasaran berkisar, memberi kesan kepada keuntungan

  2. Kegagalan untuk membalikkan kedudukan dengan cepat apabila perubahan trend dengan cepat boleh menyebabkan kerugian

  3. Rasio risiko-balasan lalai mungkin tidak sesuai untuk semua instrumen, penyusunan halus diperlukan

  4. Potensi menaik terhad apabila Cloud breakout mempunyai susulan terhad

  5. Parameter penunjuk memerlukan ujian dan pengoptimuman yang luas untuk instrumen aktif

Risiko boleh dikurangkan melalui:

  1. Mengoptimumkan parameter untuk jangka masa dan instrumen yang berbeza

  2. Menambah penapis untuk mengelakkan entri pecah palsu semasa pasaran julat

  3. Menggunakan kehilangan berhenti dinamik untuk mengurangkan berhenti keluar

  4. Ujian tetapan nisbah risiko-balasan yang berbeza

  5. Memastikan kekuatan isyarat menggunakan corak carta dan sebagainya

Arahan pengoptimuman

Strategi Super Ichi boleh dioptimumkan dalam aspek berikut:

  1. Mengoptimumkan parameter Tenkan/Kijun untuk lebih sesuai dengan instrumen yang didagangkan

  2. Mengoptimumkan parameter Cloud untuk penilaian trend jangka panjang yang lebih baik

  3. Mempertingkatkan algoritma stop loss, contohnya ATR-based atau trailing stops

  4. Tambah penapis menggunakan penunjuk lain untuk mengurangkan entri palsu

  5. Rasio risiko-balasan yang disesuaikan untuk instrumen dan jangka masa yang berbeza

  6. Menggunakan saiz kedudukan martingale untuk menampung turun naik pasaran yang berbeza

  7. Menggunakan pembelajaran mesin untuk pengoptimuman parameter dan ketahanan

  8. Tetapkan parameter berasingan untuk sesi siang vs malam

Ringkasan

Strategi Super Ichi sangat sesuai untuk perdagangan trend jangka menengah hingga panjang secara keseluruhan. Ia cemerlang dalam menentukan arah trend menggunakan Ichimoku, sementara keperluan tarik balik mengelakkan entri palsu. Dengan pengoptimuman parameter, ia dapat mencapai keuntungan yang stabil di lebih banyak instrumen dan jangka masa. Mudah difahami namun sangat dioptimumkan, strategi Super Ichi berfungsi sebagai strategi trend asas yang sangat baik untuk penyelidikan dan pembelajaran.


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


Lebih lanjut