Super-Ichimoku-Trendstrategie


Erstellungsdatum: 2023-11-06 16:32:11 zuletzt geändert: 2023-11-06 16:32:11
Kopie: 0 Klicks: 1431
1
konzentrieren Sie sich auf
1621
Anhänger

Super-Ichimoku-Trendstrategie

Überblick

Eine Überschussstrategie ist eine Trendhandelsstrategie, bei der Handelsentscheidungen auf der Grundlage von Überschussindikatoren getroffen werden. Die Strategie verwendet die Wechselkurve, die Benchmark und die Beziehung zwischen den Überschussindikatoren, um die aktuelle Trendrichtung zu bestimmen, und kombiniert die Rückführung des Preises mit dem Eintritt.

Die Super-One-Strategie ist hauptsächlich für den Trendhandel mit mittleren Längen geeignet und kann in größeren Trends profitieren. Die Strategie hat auch eine starke Fähigkeit, Trends zu erkennen.

Strategieprinzip

Die Strategie der Überschreitung von 1 richtet sich vor allem nach folgenden Faktoren:

  1. Die Beziehung zwischen Umrechnung und Referenzlinie:Wenn die Umrechnung Linie hoch ist, ist sie positiv, wenn sie unten ist, ist sie negativ.

  2. Die Farbe der Wolken:Wenn die Wolken grün sind, ist der Preis hoch, wenn rot ist der Preis niedrig.

  3. Die Preise sind zurückgegangen:Die Annahme von Preisen außerhalb der Rückgewinnungslinie und der Benchmark ist erforderlich

Die Strategie beinhaltet folgende Handelssignale:

Das ist eine sehr schwierige Aufgabe.

  • Umrechnungslinie höher als die Referenzlinie
  • Preise über Umrechnung und Benchmark
  • Umstellungslinie und Referenzlinie oberhalb des Wolkenbandes
  • Preisrückgang unterhalb der Konvergenzlinie und der Benchmark

Das ist ein Signal:

  • Umstellungslinie unterhalb der Referenzlinie
  • Preise unterhalb der Umrechnungslinie und der Benchmark
  • Umstellungslinie und Referenzlinie unterhalb der Wolkenbänder
  • Preisrückgang oberhalb der Konvergenzlinie und der Benchmark

Wenn gleichzeitig ein Plus/Null-Signal erfüllt wird, wird die Position entsprechend der Position eröffnet.

Analyse der Stärken

Die Strategie hat folgende Vorteile:

  1. Trends mit einer Kombination von mehr als einem Indikator zu bestimmen, mit hoher Genauigkeit

  2. Umrechnungslinien und Benchmarks können kurzfristige Trends klar bestimmen, Wolkenbänder langfristige Trends.

  3. Bedingung, dass der Preis die Wende zurückzieht, um Verluste durch falsche Durchbrüche zu vermeiden

  4. Risikokontrolle mit dem höchsten und niedrigsten Stop-Loss-Preis der letzten Periode, um Einzelschäden wirksam zu kontrollieren

  5. Das ist eine gute Idee, aber es ist nicht so einfach.

  6. Anwendbar in unterschiedlichen Phasen, geeignet für den Handel mit mittleren und langen Trends

  7. Die Strategie ist klar und leicht zu verstehen, die Parameter können optimiert werden.

  8. In einer Vielzahl von Marktumgebungen funktioniert

Risikoanalyse

Eine Strategie, die über eins hinausgeht, birgt auch folgende Risiken:

  1. In schwankenden Märkten können Stop-Losses häufig ausgelöst werden, was die Ertragswirkung beeinträchtigt.

  2. Wenn sich Trends schnell ändern, kann es zu Verlusten kommen, wenn man seine Position nicht rechtzeitig umkehrt.

  3. Die eingestellte Gewinn- und Verlustquote ist nicht für alle Sorten geeignet und erfordert eine Anpassung der Parameter an die verschiedenen Standards

  4. Wenn Sie nach dem Durchbruch der Wolkenbänder nur begrenzt Platz haben, können Sie nur begrenzt profitieren.

  5. Die Kennzahlen müssen wiederholt getestet und optimiert werden und sind nicht für Varianten geeignet, deren Parameter häufig angepasst werden

Das Risiko kann durch folgende Maßnahmen verringert werden:

  1. Optimierung der Parameter, um sie besser an unterschiedliche Zyklen und Sortenmerkmale anzupassen

  2. In Kombination mit anderen Indikatoren filtern Sie Einstiegssignale und vermeiden Sie falsche Durchbrüche in einem wackligen Markt.

  3. Dynamische Anpassung der Stop-Position, um die Wahrscheinlichkeit zu verringern, dass der Stop-Loss ausgelöst wird

  4. Verschiedene Gewinn- und Verlust-Verhältnis-Einstellungen

  5. Trendsignalstärken werden anhand von Methoden wie Diagrammformationen ermittelt

Optimierungsrichtung

Die Strategie “Super One” kann in folgenden Bereichen optimiert werden:

  1. Optimierung der Parameter für die Umstellungslinie und die Benchmarklinie, um sie besser an die Merkmale der gehandelten Sorte anzupassen

  2. Optimierung der Cloud-Band-Parameter, um die Cloud-Band-Parameter für langfristige Trends zu optimieren

  3. Optimierte Stop-Loss-Algorithmen, wie z. B. Stop-Setting oder Dynamic Stop-Loss gemäß ATR

  4. Signalfilterung in Kombination mit anderen Kennzahlen, um mehr Filterbedingungen zu konfigurieren und die Wahrscheinlichkeit von Fehlinträgen zu verringern

  5. Optimierung des Verlust- und Verlustverhältnisses und Anpassung der Strategie an die Merkmale der verschiedenen Sorten und Perioden

  6. Positionsverwaltung nach dem Martingale-System, um sich an die unterschiedliche Frequenz von Kursschwankungen anzupassen

  7. Optimierung der Parameter mit Hilfe von maschinellen Lernmethoden für eine höhere Stabilität

  8. Setzen Sie verschiedene Handelszeiträume ein, um sich an die Merkmale des Handels in Nacht- und Zwischenplatten anzupassen

Zusammenfassen

Die Strategie ist sehr gut geeignet, um mittel- und langfristige Trends zu handeln. Die Vorteile der Verwendung von Über-1-Indikatoren sind klar, während die Eintrittskurse in Verbindung mit der Preisrückführung effektiv ist, um Fehlintritte zu vermeiden. Durch die Einstellung von Optimierungsparametern kann die Strategie einen stabilen Gewinn in mehr Varianten und mehr Zyklen erzielen.

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