Super Ichi Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-06 16:32:11
Tags:

img

Übersicht

Die Super Ichi-Strategie ist eine Trend-Handelsstrategie, die Handelsentscheidungen auf der Grundlage des Super Ichi-Indikators trifft.

Die Super Ichi-Strategie ist hauptsächlich für den mittelfristigen bis langfristigen Trendhandel geeignet und zielt darauf ab, von wichtigen Trends zu profitieren.

Strategie Logik

Die Super Ichi-Strategie beurteilt hauptsächlich die folgenden Elemente zur Bestimmung der Handelsrichtung:

  1. Beziehung zwischen Tenkan und Kijun: Aufwärts, wenn Tenkan oben ist, abwärts, wenn er unten ist

  2. Farbe der Wolken: Aufwärts, wenn die Wolken grün sind, abwärts, wenn sie rot sind

  3. Preisrückschlag: Erfordert vor dem Eintritt einen Rückzug aus den Linien

Insbesondere sind die Handelssignale:

Langes Signal:

  • Tenkan über Kijun
  • Preis über Tenkan und Kijun
  • Tenkan und Kijun über Wolken
  • Der Preis fällt unter Tenkan und Kijun.

Kurzsignal:

  • Tenkan unter Kijun
  • Preis unter Tenkan und Kijun
  • Tenkan und Kijun unter der Wolke
  • Der Preis zieht sich über Tenkan und Kijun zurück.

Wenn das Long/Short-Signal ausgelöst wird, wird eine Position basierend auf der aktuellen Position eröffnet.

Analyse der Vorteile

Die Super Ichi-Strategie hat folgende Vorteile:

  1. Benutzt die Ichimoku-Kombination, um Trends genau zu bestimmen.

  2. Tenkan/Kijun zeigt kurzfristige, Cloud zeigt langfristige Trends

  3. Pullback-Anforderung verhindert falsche Ausbrüche

  4. Das Risikomanagement nutzt die jüngsten Swing-Hoch-/Niedrigwerte für Stop Loss, um Verluste zu begrenzen.

  5. angemessene Risiko-Rendite-Verhältnis für stetige Gewinne

  6. Anwendbar auf verschiedene Zeitrahmen für den mittelfristigen bis langfristigen Trendhandel

  7. Klare Logik und großer Optimierungsraum

  8. Gute Leistung unter verschiedenen Marktbedingungen

Risikoanalyse

Die Super Ichi-Strategie birgt außerdem folgende Risiken:

  1. Der Stand-Loss kann häufig während der Rangiermärkte ausgelöst werden, was sich auf die Rentabilität auswirkt

  2. Nicht schnelle Umkehrung von Positionen bei schnellen Trendänderungen könnte zu Verlusten führen

  3. Ausfallrisiko-Rendite-Verhältnisse sind möglicherweise nicht für alle Instrumente geeignet; eine Feinabstimmung ist erforderlich

  4. Beschränktes Aufwärtspotenzial, wenn der Cloud-Ausbruch eine begrenzte Nachfolge hat

  5. Indikatorparameter müssen umfassend getestet und für aktive Instrumente optimiert werden

Die Risiken können verringert werden, indem:

  1. Optimierung von Parametern für verschiedene Zeitrahmen und Instrumente

  2. Hinzufügen von Filtern zur Vermeidung von falschen Ausbruchseinträgen während des Rangierungsmarktes

  3. Verwendung dynamischer Stopp-Verluste zur Verringerung des Stopps

  4. Verschiedene Einstellungen der Risiko-Rendite-Ratio testen

  5. Bestätigung der Signalstärke anhand von Diagrammmustern usw.

Optimierungsrichtlinien

Die Super Ichi-Strategie kann in folgenden Aspekten optimiert werden:

  1. Optimierung der Tenkan/Kijun-Parameter, um sie besser an das gehandelte Instrument anzupassen

  2. Optimierung der Cloud-Parameter für eine bessere langfristige Trendbewertung

  3. Verstärkung des Stop-Loss-Algorithmus, z. B. ATR-basierte oder Trailing-Stops

  4. Hinzufügen von Filtern mit anderen Indikatoren zur Verringerung falscher Eingaben

  5. Feinabstimmung der Risikovergütungsquoten für verschiedene Instrumente und Zeitrahmen

  6. Verwenden Sie die Martingale-Positionsgröße, um der unterschiedlichen Marktvolatilität Rechnung zu tragen

  7. Nutzen Sie maschinelles Lernen für Parameteroptimierung und Robustheit

  8. Festlegen von separaten Parametern für Tag und Nacht-Sitzungen

Zusammenfassung

Die Super Ichi-Strategie eignet sich für den mittelfristigen bis langfristigen Trendhandel insgesamt. Sie zeichnet die Trendrichtung mithilfe von Ichimoku hervorragend aus, während die Pullback-Anforderung falsche Einträge vermeidet. Mit Parameteroptimierung kann sie stetige Gewinne über mehr Instrumente und Zeitrahmen hinweg erzielen.


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


Mehr