Strategie der Indikatoren Kombination Durchbruch Trendverfolgung

Schriftsteller:ChaoZhang, Datum: 2024-02-20 11:38:22
Tags:

img

Übersicht

Die Strategie trägt den Namen Strategy of Indicators Combination Breakthrough Trend Tracking. Sie kombiniert verschiedene Indikatoren, um Markttrendrichtungen zu identifizieren und Trendverfolgungsoperationen durchzuführen. Zu den Hauptkomponenten gehören:

  1. Verwendung des Wave Trend-Indikators zur Beurteilung des Haupttrends des Marktes
  2. Filterung einiger falscher Signale durch RSI- und MFI-Indikatoren
  3. Bestimmung spezifischer Betriebsrichtungen mit dem EMA-Indikator
  4. Eintritt in den Markt mit einer bahnbrechenden Nachverfolgungsmethode, um den Trend zu überwachen

Strategieprinzip

Die Strategie beurteilt hauptsächlich die Richtung und Stärke des großen Trends und legt den bidirektionalen Handel von Long und Short fest.

Langes Signal:

  1. Der Kurs liegt über der 200-Tage-EMA, was auf einen Bullenmarkt hinweist.
  2. Der Kurs zieht sich zurück auf eine 50-tägige EMA-Unterstützung
  3. Der Wellentrend kehrt in einen Aufwärtstrend um und ein Kaufsignal erscheint
  4. Sowohl RSI als auch MFI zeigen einen Überkauf
  5. 3 aufeinanderfolgende K-Linien durchbrechen die 50-Tage-EMA nach und nach, was auf einen Durchbruch nach oben hindeutet

Kurzsignal: Gegenüber langem Signal

Gewinnaufnahme und Stop-Loss: Zwei Optionen: niedrigster Preis/höchster Preis Stop-Loss, ATR Stop-Loss

Analyse der Vorteile

Die Strategie weist folgende Vorteile auf:

  1. Integriert mehrere Indikatoren, um den wichtigsten Trend zu bestimmen und falsche Ausbrüche zu vermeiden
  2. Die EMA wird zur Festlegung der operativen Ausrichtung angewandt und ist leicht zu verfolgen.
  3. Nachfolgende Stop-Loss-Methode erzielt nachhaltige Gewinne
  4. In der Lage, sowohl lang als auch kurz zu gehen und dem Markt in beide Richtungen zu folgen

Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. Wahrscheinlichkeit falscher Signale aus den Indikatoren
  2. Zu geringer eingestellter Stop-Loss-Punkt erhöht das Stop-Loss-Risiko
  3. Hohe Handelsfrequenz führt zu versteckten Verlusten aus Handelsgebühren

Um die oben genannten Risiken zu verringern, kann die Optimierung in folgenden Aspekten erfolgen:

  1. Anpassung der Indikatorparameter, um falsche Signale zu filtern
  2. Der Stop-Loss-Punkt muss angemessen gelockert werden.
  3. Optimierung der Indikatorparameter zur Verringerung der Handelshäufigkeit

Optimierungsrichtlinien

Auf Codeebene sind die wichtigsten optimierbaren Richtungen dieser Strategie folgende:

  1. Anpassung der Parameter der Wellenentwicklung, des RSI und des MFI zur Ermittlung der besten Parameterkombination
  2. Prüfung der Leistung verschiedener EMA-Zyklusparameter
  3. Anpassung der Risiko-Rendite-Faktoren bei Gewinngewinnung und Stop-Loss zur optimalen Konfiguration

Durch die Anpassung der Parameter und die Prüfung kann die Strategie die Renditen maximieren und gleichzeitig die Abzüge und Risiken reduzieren.

Schlussfolgerung

Die Strategie integriert mehrere Indikatoren, um die Haupttrendrichtung zu bestimmen, verwendet den EMA-Indikator als spezifisches Betriebssignal und verwendet einen Trailing Stop Loss, um Gewinne zu erzielen. Durch die Optimierung der Parameter können relativ gute stetige Gewinne erzielt werden.


/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Lowest Low/ Highest High & ATR Stop Loss/ Take Profit
//Optimized for the 30 minutes chart

strategy(title="TradePro's Trading Idea Cipher B+ Divergence EMA Pullback Strategy", shorttitle="WT MFI RSI EMA PB STRAT", overlay = true, pyramiding = 0, max_bars_back=5000, calc_on_order_fills = false, commission_type =  strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD)

// { Time Range
FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12)
FromDay=input(defval=1,title="FromDay",minval=1,maxval=31)
FromYear=input(defval=2020,title="FromYear",minval=2016)
ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12)
ToDay=input(defval=1,title="ToDay",minval=1,maxval=31)
ToYear=input(defval=9999,title="ToYear",minval=2017)
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>true

// See if this bar's time happened on/after start date
afterStartDate = time >= start and time<=finish?true:false

zeroline = 0

// } Time Range

// { Wavetrend, RSI, MFI

// WaveTrend
cl = input(12, "Channel Length")
al = input(12, "Average Length")
overbought = input(53, title = 'WT Overbought Level 1', type = input.integer)
oversold = input(-53, title = 'WT Oversold Level 1', type = input.integer)
ap = hlc3 
esa = ema(ap, cl)
d = ema(abs(ap - esa), cl)
ci = (ap - esa) / (0.015 * d)
tci = ema(ci, al)
 
wt1 = tci
wt2 = sma(wt1,4)

wtOs = wt2 <= oversold
wtOb = wt2 >= overbought
wtX = cross(wt1, wt2)
wtUp = wt2 - wt1 <= 0
wtDown = wt2 - wt1 >= 0
buySignal = wtX and wtOs and wtUp
sellSignal = wtX and wtOb and wtDown

// RSI & MFI

rsiMFIPosY = input(2, title = 'MFI Area Y Pos', type = input.float)
rsiMFIperiod = input(80,title = 'MFI Period', type = input.integer)
rsiMFIMultiplier = input(200, title = 'MFI Area multiplier', type = input.float)
f_rsimfi(_period, _multiplier, _tf) => security(syminfo.tickerid, _tf, sma(((close - open) / (high - low)) * _multiplier, _period) - rsiMFIPosY)
rsiMFI = f_rsimfi(rsiMFIperiod, rsiMFIMultiplier, timeframe.period)

// } Wavetrend, RSI, MFI

// { EMA
emasrc = close
res = input(title="EMA Timeframe", type=input.resolution, defval="30")
len1 = input(title="EMA1 Length", type=input.integer, defval=200)
col1 = color.yellow

len2 = input(title="EMA2 Length", type=input.integer, defval=50)
col2 = color.blue

// Calculate EMA
ema1 = ema(emasrc, len1)
emaSmooth1 = security(syminfo.tickerid, res, ema1, barmerge.gaps_off, barmerge.lookahead_off)

ema2 = ema(emasrc, len2)
emaSmooth2 = security(syminfo.tickerid, res, ema2, barmerge.gaps_off, barmerge.lookahead_off)

// Draw EMA
plot(emaSmooth1, title="EMA1", linewidth=1, color=col1)
plot(emaSmooth2, title="EMA2", linewidth=1, color=col2)

// } EMA

// { Long Entry

enablelong = input(true, title="Enable long?")

//Long Signal
upcondition = close > emaSmooth1
wavetrendlong = wt1 and wt2 < zeroline
mfilong = rsiMFI > 0
emapblong1 = (close > emaSmooth2) and (close[1] < emaSmooth2[1])
emapblong2 = ((close[2] > emaSmooth2[2]) and (close[3] > emaSmooth2[3]) and (close[4] > emaSmooth2[4])) or ((close[5] > emaSmooth2[5]) and (close[6] > emaSmooth2[6]) and (close[7] > emaSmooth2[7])) or ((close[8] > emaSmooth2[8]) and (close[9] > emaSmooth2[9]) and (close[10] > emaSmooth2[10]))

longcondition = upcondition and wavetrendlong and buySignal and mfilong and emapblong1 and emapblong2

//strategy buy long
if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true)
    strategy.entry("long", strategy.long)

plotshape(longcondition, style=shape.arrowup,
                 location=location.abovebar, color=color.green)

// } Long Entry

// { Short Entry

enableshort = input(true, title="Enable short?")

//Short Signal
downcondition = close < emaSmooth1
wavetrendshort = wt1 and wt2 > zeroline
mfishort = rsiMFI < 0
emapbshort1 = (close < emaSmooth2) and (close[1] > emaSmooth2[1])
emapbshort2 = ((close[2] < emaSmooth2[2]) and (close[3] < emaSmooth2[3]) and (close[4] < emaSmooth2[4])) or ((close[5] < emaSmooth2[5]) and (close[6] < emaSmooth2[6]) and (close[7] < emaSmooth2[7])) or ((close[8] < emaSmooth2[8]) and (close[9] < emaSmooth2[9]) and (close[10] < emaSmooth2[10]))

shortcondition = downcondition and wavetrendshort and sellSignal and mfishort and emapbshort1 and emapbshort2

//strategy buy short
if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true)
    strategy.entry("short", strategy.short)

plotshape(shortcondition, style=shape.arrowdown,
                 location=location.belowbar, color=color.red)

// } Short Entry

// { Exit Conditions
bought = strategy.position_size[1] < strategy.position_size
sold = strategy.position_size[1] > strategy.position_size
barsbought = barssince(bought)
barssold = barssince(sold)
slbuffer = input(title="SL Buffer", type=input.float, step=0.1, defval=0)

// } Exit Conditions

// { Lowest Low/ Highes High Exit Condition
enablelowhigh = input(false, title="Enable lowest low/ highest high exit?")

//Lowest Low LONG
profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=2)
loLen = input(title="Lowest Low Lookback", type=input.integer,
  defval=50, minval=2)
stop_level_long = lowest(low, loLen)[1]

if enablelowhigh == true and strategy.position_size>0
    profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong) + slbuffer
    strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought] - slbuffer, limit=profit_level_long)

//Lowest Low SHORT
profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2)
highLen = input(title="highest high lookback", type=input.integer,
  defval=50, minval=2)
stop_level_short = highest(high, highLen)[1]

if enablelowhigh == true and strategy.position_size<0
    profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort) - slbuffer
    strategy.exit(id="TP/ SL", stop=stop_level_short[barssold] + slbuffer, limit=profit_level_short)

// } Lowest Low/ Highes High Exit Condition

// { ATR Take Profit/ Stop Loss
enableatr = input(true, title="Enable ATR exit?")
atrprofitfactorlong = input(title="ATR Profitfactor Long", type=input.float, step=0.1, defval=6)
atrstopfactorlong = input(title="ATR Stopfactor Long", type=input.float, step=0.1, defval=5)
atrprofitfactorshort = input(title="ATR Profitfactor Short", type=input.float, step=0.1, defval=3)
atrstopfactorshort = input(title="ATR Stopfactor Short", type=input.float, step=0.1, defval=5)

//ATR
lengthATR = input(title="ATR Length", defval=11, minval=1)
atr = atr(lengthATR)

//LONG EXIT
if (afterStartDate) and ((enableatr == true) and (strategy.opentrades > 0))
    barsbought1 = barssince(bought)
    profit_level = strategy.position_avg_price + (atr*atrprofitfactorlong)
    stop_level = strategy.position_avg_price - (atr*atrstopfactorlong)
    strategy.exit("Take Profit/ Stop Loss", "long", stop=stop_level[barsbought1], limit=profit_level[barsbought1])

//SHORT EXIT
if (afterStartDate) and ((enableatr == true) and (strategy.opentrades > 0))
    barssold1 = barssince(sold)
    profit_level = strategy.position_avg_price - (atr*atrprofitfactorshort)
    stop_level = strategy.position_avg_price + (atr*atrstopfactorshort)
    strategy.exit("Take Profit/ Stop Loss", "short", stop=stop_level[barssold1], limit=profit_level[barssold1])

// } ATR Take Profit/ Stop Loss

Mehr