Strategi ini menggabungkan candlesticks Heikin Ashi dan indikator SuperTrend menjadi strategi trend following dengan trailing stop loss.
Strategi ini menggabungkan kekuatan Heikin Ashi dan SuperTrend untuk mengidentifikasi arah tren dan secara otomatis mengikuti tren dengan stop loss dinamis untuk mengunci keuntungan. Risiko utama berasal dari pembalikan tren dan penyesuaian parameter. Optimasi lebih lanjut pada kedua aspek ini dapat meningkatkan kinerja strategi. Secara keseluruhan strategi ini menunjukkan bagaimana integrasi indikator dapat meningkatkan stabilitas dan profitabilitas sistem perdagangan.
/*backtest start: 2024-01-06 00:00:00 end: 2024-02-05 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © ringashish //@version=4 strategy("sa-strategy with HTF-TSL", overlay=true) Pd = input(title="ATR Period", type=input.integer, defval=4) Factor = input(title="ATR Multiplier", type=input.float, step=0.1, defval=2) ST= supertrend(Factor, Pd) heikinashi_close = security(heikinashi(syminfo.tickerid), timeframe.period, close) heikinashi_low = security(heikinashi(syminfo.tickerid), timeframe.period, low) heikinashi_open = security(heikinashi(syminfo.tickerid), timeframe.period, open) heikinashi_high = security(heikinashi(syminfo.tickerid), timeframe.period, high) heikinashi_close30 = security(heikinashi(syminfo.tickerid), "30", close) //res1 = input("30", type=input.resolution, title="higher Timeframe") //CCI TSL res = input("240",type=input.resolution,title = "Higher Time Frame") CCI = input(20) ATR = input(5) Multiplier=input(1,title='ATR Multiplier') original=input(false,title='original coloring') thisCCI = cci(close, CCI) lastCCI = nz(thisCCI[1]) calcx()=> bufferDn= high + Multiplier * sma(tr,ATR) bufferUp= low - Multiplier * sma(tr,ATR) if (thisCCI >= 0 and lastCCI < 0) bufferUp := bufferDn[1] if (thisCCI <= 0 and lastCCI > 0) bufferDn := bufferUp[1] if (thisCCI >= 0) if (bufferUp < bufferUp[1]) bufferUp := bufferUp[1] else if (thisCCI <= 0) if (bufferDn > bufferDn[1]) bufferDn := bufferDn[1] x = 0.0 x := thisCCI >= 0 ?bufferUp:thisCCI <= 0 ?bufferDn:x[1] x tempx = calcx() calcswap() => swap = 0.0 swap := tempx>tempx[1]?1:tempx<tempx[1]?-1:swap[1] swap tempswap = calcswap() swap2=tempswap==1?color.blue:color.orange swap3=thisCCI >=0 ?color.blue:color.orange swap4=original?swap3:swap2 //display current timeframe's Trend plot(tempx,"CTF",color=swap4,transp=0,linewidth=2, style = plot.style_stepline) htfx = security(syminfo.tickerid,res,tempx[1],lookahead = barmerge.lookahead_on) htfswap4 = security(syminfo.tickerid,res,swap4[1],lookahead = barmerge.lookahead_on) plot(htfx,"HTF",color=htfswap4,transp=0,linewidth=3,style = plot.style_stepline) //supertrend Supertrend(Factor, Pd) => Up=hl2-(Factor*atr(Pd)) Dn=hl2+(Factor*atr(Pd)) TrendUp = 0.0 TrendUp := heikinashi_close[1]>TrendUp[1] ? max(Up,TrendUp[1]) : Up TrendDown = 0.0 TrendDown := heikinashi_close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn Trend = 0.0 Trend := heikinashi_close > TrendDown[1] ? 1: heikinashi_close< TrendUp[1]? -1: nz(Trend[1],1) Tsl = Trend==1? TrendUp: TrendDown S_Buy = Trend == 1 ? 1 : 0 S_Sell = Trend != 1 ? 1 : 0 [Trend, Tsl] [Trend,Tsl] = Supertrend(Factor, Pd) // Security //ST1_Trend_MTF = security(syminfo.tickerid, res1, Tsl,barmerge.lookahead_on) //plot(ST1_Trend_MTF, "higher ST") crossdn = crossunder(heikinashi_close,Tsl) or crossunder(heikinashi_close[1],Tsl) or crossunder(heikinashi_close[2],Tsl) or heikinashi_close < Tsl crossup = crossover(heikinashi_close,Tsl) or crossover(heikinashi_close[1],Tsl) or crossover(heikinashi_close[2],Tsl) or heikinashi_close > Tsl plot(Tsl,"ST",color = color.black,linewidth =2) plot(ema(heikinashi_close,20),"EMA 20",color=color.red) plot(hma(heikinashi_close,15),"HMA 15",color=color.green) plot(ema(heikinashi_close,15),"EMA 15",color=color.black) closedown = (heikinashi_close < hma(heikinashi_close,15) and heikinashi_high > hma(heikinashi_close,15)) or(heikinashi_close < ema(heikinashi_close,20) and heikinashi_high > ema(heikinashi_close,20)) closeup = (heikinashi_close > hma(heikinashi_close,15) and heikinashi_low < hma(heikinashi_close,15)) or (heikinashi_close > ema(heikinashi_close,20) and heikinashi_low < ema(heikinashi_close,20)) buy = heikinashi_open == heikinashi_low and closeup and crossup and close > htfx //buy = heikinashi_open == heikinashi_low and heikinashi_close > ema(close,20) and heikinashi_low < ema(close,20) and crossup buyexit = cross(close,tempx) //heikinashi_open == heikinashi_high //and heikinashi_close < ema(close,15) and heikinashi_high > ema(close,15) //if heikinashi_close30[1] < ST1_Trend_MTF //sell = heikinashi_open == heikinashi_high and heikinashi_close < ema(close,20) and heikinashi_high > ema(close,20) and rsi(close,14)<60 and crossdn sell = heikinashi_open == heikinashi_high and closedown and rsi(close,14)<55 and crossdn and close < htfx sellexit = cross(close,tempx) //heikinashi_open == heikinashi_low //and heikinashi_close > ema(close,15) and heikinashi_low < ema(close,15) rg = 0 rg := buy ? 1 : buyexit ? 2 : nz(rg[1]) longLogic = rg != rg[1] and rg == 1 longExit = rg != rg[1] and rg == 2 //plotshape(longExit,"exit buy",style = shape.arrowup,location = location.belowbar,color = color.red, text ="buy exit", textcolor = color.red) //plotshape(longLogic,"BUY",style = shape.arrowup,location = location.belowbar,color = color.green, text ="buy", textcolor= color.green) nm = 0 nm := sell ? 1 : sellexit ? 2 : nz(nm[1]) shortLogic = nm != nm[1] and nm == 1 shortExit = nm != nm[1] and nm == 2 //plotshape(shortExit,"exit sell",style = shape.arrowup,location = location.belowbar,color = color.red, text ="sell exit", textcolor = color.red) //plotshape(shortLogic,"SELL",style = shape.arrowup,location = location.belowbar,color = color.green, text ="sell", textcolor= color.green) //Exit at particular time ExitHour = input(title="Exit Hour Of Day", type=input.integer, defval=15, step = 5, maxval = 24, minval = 0) ExitMint = input(title="Exit Minute Of Day", type=input.integer, defval=15, step = 5, maxval = 24, minval = 0) bgc = input(title="Highlight Background Color?", type=input.bool, defval=true) mRound(num,rem) => (floor(num/rem)*rem) exitTime = (hour(time) >= ExitHour and (minute == mRound(ExitMint, timeframe.multiplier))) ? 1 : 0 exitTime := exitTime == 0 ? (hour(time) >= ExitHour and (minute + timeframe.multiplier >= ExitMint)) ? 1 : 0 : exitTime MarketClose = exitTime and not exitTime[1] alertcondition(exitTime and not exitTime[1], title="Intraday Session Close Time", message="Close All Positions") bgcolor(exitTime and not exitTime[1] and bgc ? #445566 : na, transp =40) longCondition = longLogic if (longCondition) strategy.entry("long", strategy.long) shortCondition = shortLogic if (shortCondition) strategy.entry("short", strategy.short) strategy.close("short", when =cross(close,tempx) or MarketClose) strategy.close( "long", when =cross(close,tempx) or MarketClose )