
Diese Strategie ist bekannt als “Rhino Indicator Portfolio Breakthrough Trend Tracking Strategy”. Die Strategie verwendet mehrere Indikatoren, um die Richtung der Markttrends zu identifizieren und Trend-Tracking-Operationen durchzuführen. Sie umfasst hauptsächlich folgende Teile:
Die Strategie richtet sich hauptsächlich an der Richtung und Stärke der großen Trends und bietet mehrere freie, beidseitige Geschäfte. Die operativen Prinzipien sind wie folgt:
Mehrköpfige Eintrittszeichen:
Eintrittszeichen für die Luftwaffe: Im Gegensatz zu einem mehrköpfigen Eintrittssignal
Wie man einen Stop-Loss macht: Es gibt zwei Optionen: Minimum/Maximum Stop, ATR Stop
Diese Strategie hat folgende Vorteile:
Die Strategie birgt auch einige Risiken:
Um die oben genannten Risiken zu verringern, können Optimierungen in folgenden Bereichen vorgenommen werden:
Auf der Code-Ebene kann diese Strategie optimiert werden in folgenden Bereichen:
Durch die Anpassung und Prüfung von Parametern kann eine Strategie zur Maximierung der Erträge und zur Verringerung der Rücknahmen und Risiken eingesetzt werden.
Die Strategie verwendet verschiedene Indikatoren, um die Richtung der großen Trends zu bestimmen, die EMA-Indikatoren als konkrete Handlungssignale zu verwenden und die Gewinne durch die Verfolgung von Stop-Loss-Methoden zu sichern. Durch die Optimierung der Parameter können bessere stabile Erträge erzielt werden. Es sollte jedoch auch auf bestimmte Systemrisiken geachtet werden, die die Wirkung der Indikatoren und die Veränderungen der Marktumgebung ständig beobachten.
/*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