Strategi Super Ichi

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

img

Gambaran umum

Strategi Super Ichi adalah strategi perdagangan tren yang membuat keputusan perdagangan berdasarkan indikator Super Ichi. Strategi ini menggunakan hubungan antara garis Tenkan, garis Kijun dan Awan Ichimoku dari indikator Super Ichi untuk menentukan arah tren saat ini, dan memasuki penurunan harga.

Strategi Super Ichi terutama cocok untuk perdagangan tren jangka menengah hingga panjang dan bertujuan untuk mendapatkan keuntungan dari tren utama.

Logika Strategi

Strategi Super Ichi terutama menilai elemen berikut untuk menentukan arah perdagangan:

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

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

  3. Harga Pullback: Membutuhkan mundur dari garis sebelum masuk

Secara khusus, sinyal perdagangan adalah:

Sinyal panjang:

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

Sinyal singkat:

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

Ketika sinyal panjang/pendek dipicu, posisi akan dibuka berdasarkan posisi saat ini.

Analisis Keuntungan

Strategi Super Ichi memiliki keuntungan berikut:

  1. Menggunakan kombinasi Ichimoku untuk menentukan tren secara akurat

  2. Tenkan/Kijun menunjukkan jangka pendek, Cloud menunjukkan tren jangka panjang

  3. Persyaratan penarikan kembali menghindari kegagalan palsu

  4. Manajemen risiko menggunakan swing high/low terbaru untuk stop loss untuk membatasi kerugian

  5. Rasio risiko-manfaat yang wajar untuk keuntungan konstan

  6. Berlaku pada kerangka waktu yang berbeda untuk perdagangan tren jangka menengah hingga panjang

  7. Logika yang jelas dan ruang pengoptimalan yang besar

  8. Berkinerja baik di berbagai kondisi pasar

Analisis Risiko

Strategi Super Ichi juga memiliki risiko berikut:

  1. Stop loss dapat dipicu secara sering selama pasar range, mempengaruhi profitabilitas

  2. Kegagalan untuk segera membalikkan posisi ketika perubahan tren dengan cepat dapat menyebabkan kerugian

  3. Rasio risiko-manfaat default mungkin tidak cocok untuk semua instrumen, perlu penyesuaian halus

  4. Potensi kenaikan terbatas ketika Cloud breakout memiliki tindak lanjut terbatas

  5. Parameter indikator membutuhkan pengujian dan optimasi yang luas untuk instrumen aktif

Risiko dapat dikurangi dengan:

  1. Mengoptimalkan parameter untuk jangka waktu dan instrumen yang berbeda

  2. Menambahkan filter untuk menghindari entri pecah palsu selama pasar berkisar

  3. Menggunakan stop loss dinamis untuk mengurangi berhenti keluar

  4. Pengujian pengaturan rasio risiko-manfaat yang berbeda

  5. Mengkonfirmasi kekuatan sinyal menggunakan pola grafik dll.

Arahan Optimasi

Strategi Super Ichi dapat dioptimalkan dalam aspek berikut:

  1. Mengoptimalkan parameter Tenkan/Kijun agar lebih sesuai dengan instrumen yang diperdagangkan

  2. Mengoptimalkan parameter Cloud untuk penilaian tren jangka panjang yang lebih baik

  3. Memperbaiki algoritma stop loss, misalnya stop stop berbasis ATR atau trailing

  4. Tambahkan filter menggunakan indikator lain untuk mengurangi entri palsu

  5. Rasio risiko-manfaat yang disesuaikan untuk instrumen dan jangka waktu yang berbeda

  6. Menggunakan ukuran posisi martingale untuk mengakomodasi volatilitas pasar yang bervariasi

  7. Menggunakan pembelajaran mesin untuk optimasi parameter dan ketahanan

  8. Atur parameter terpisah untuk sesi siang vs malam

Ringkasan

Strategi Super Ichi sangat cocok untuk perdagangan tren jangka menengah hingga panjang secara keseluruhan. Ini unggul dalam menentukan arah tren menggunakan Ichimoku, sementara persyaratan pullback menghindari entri palsu. Dengan optimasi parameter, itu dapat mencapai keuntungan yang stabil di lebih banyak instrumen dan kerangka waktu. Mudah dipahami namun sangat dioptimalkan, strategi Super Ichi berfungsi sebagai strategi tren dasar yang sangat baik untuk penelitian 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 banyak