La stratégie est appelée
La stratégie évalue principalement la direction et la force de la tendance majeure, et définit des opérations bidirectionnelles de long et de court.
Le signal est long:
Signal court: Opposé du signal long
Prise de bénéfices et stop loss: Deux options sont fournies: prix le plus bas/prix le plus élevé de stop loss, ATR stop loss
La stratégie présente les avantages suivants:
La stratégie comporte également certains risques:
Pour réduire les risques susmentionnés, l'optimisation peut être effectuée dans les aspects suivants:
Au niveau du code, les principales orientations optimisables de cette stratégie sont les suivantes:
Grâce à l'ajustement des paramètres et aux tests, la stratégie peut maximiser les rendements tout en réduisant les retraits et les risques.
La stratégie intègre plusieurs indicateurs pour déterminer la direction de la tendance majeure, utilise l'indicateur EMA comme signal d'opération spécifique et utilise le stop-loss pour verrouiller les bénéfices.
/*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