Die Strategie trägt den Namen
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:
Kurzsignal: Gegenüber langem Signal
Gewinnaufnahme und Stop-Loss: Zwei Optionen: niedrigster Preis/höchster Preis Stop-Loss, ATR Stop-Loss
Die Strategie weist folgende Vorteile auf:
Die Strategie birgt auch einige Risiken:
Um die oben genannten Risiken zu verringern, kann die Optimierung in folgenden Aspekten erfolgen:
Auf Codeebene sind die wichtigsten optimierbaren Richtungen dieser Strategie folgende:
Durch die Anpassung der Parameter und die Prüfung kann die Strategie die Renditen maximieren und gleichzeitig die Abzüge und Risiken reduzieren.
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