Strategi ini disebut
Strategi ini terutama menilai arah dan kekuatan tren utama, dan menetapkan perdagangan dua arah panjang dan pendek.
Sinyal panjang:
Sinyal pendek: Kebalikan dari sinyal panjang
Mengambil keuntungan dan stop loss: Dua pilihan yang disediakan: harga terendah/harga tertinggi stop loss, ATR stop loss
Strategi ini memiliki keuntungan berikut:
Strategi ini juga memiliki beberapa risiko:
Untuk mengurangi risiko di atas, optimasi dapat dilakukan dalam aspek berikut:
Dari tingkat kode, arah utama yang dapat dioptimalkan dari strategi ini meliputi:
Melalui penyesuaian parameter dan pengujian, strategi dapat memaksimalkan pengembalian sambil mengurangi penarikan dan risiko.
Strategi ini mengintegrasikan beberapa indikator untuk menentukan arah tren utama, menggunakan indikator EMA sebagai sinyal operasi tertentu, dan menggunakan stop loss trailing untuk mengunci keuntungan. Melalui optimasi parameter, keuntungan yang relatif baik dan stabil dapat diperoleh.
/*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