Strategi ini adalah strategi pelacakan tren berdasarkan silang ganda 10EMA dan 50EMA. Ini menggabungkan 10EMA pada grafik per jam sebagai penilaian tambahan untuk secara dinamis menemukan arah tren di pasar banteng dan beruang bergantian, dan mencapai stop loss pelacakan otomatis.
Logika inti dari strategi ini didasarkan pada salib emas dan salib kematian 10EMA dan 50EMA. Secara khusus, ketika 10EMA melintasi di atas 50EMA untuk membentuk salib emas, diputuskan bahwa pasar telah memasuki tren naik; ketika 10EMA melintasi di bawah 50EMA untuk membentuk salib kematian, diputuskan bahwa pasar telah memasuki tren menurun.
Buka posisi panjang atau pendek dalam 1-5 bar setelah golden cross atau death cross. Selain itu, strategi ini juga memperkenalkan 10EMA pada grafik jam sebagai penilaian tambahan. Posisi panjang dibuka hanya ketika 10EMA pada grafik jam berada dalam tren kenaikan setelah golden cross, dan posisi pendek dibuka hanya ketika 10EMA pada grafik jam berada dalam tren penurunan setelah death cross, sehingga menyaring beberapa sinyal palsu.
Setelah membuka posisi, strategi mengadopsi metode profit-taking dan stop loss untuk melacak stop loss + limit order.
Keuntungan terbesar dari strategi ini adalah bahwa sementara menggunakan persilangan EMA untuk menilai arah tren utama, ia juga memperkenalkan indikator bantu untuk menyaring sinyal, yang dapat secara efektif menyaring persilangan palsu untuk meningkatkan keandalan sinyal.
Dibandingkan dengan strategi indikator tunggal, strategi ini dapat lebih akurat menilai arah tren dan amplitudo. Dibandingkan dengan stop loss tradisional, strategi ini mengadopsi teknologi stop loss pelacakan yang lebih maju untuk lebih mengunci keuntungan.
Risiko utama yang dihadapi strategi ini adalah whipsaws intermiten dan pembalikan tren. Ketika sinyal persimpangan palsu berturut-turut terjadi, strategi dapat dihilangkan. Selain itu, pembalikan harga setelah membuka posisi juga dapat menyebabkan kerugian.
Untuk mengurangi risiko whipsaws, indikator tambahan ditambahkan untuk menyaring sinyal. Untuk mengendalikan risiko pembalikan tren, rentang stop loss yang relatif toleran diadopsi, dan pengaturan profit limit juga membantu mengurangi risiko ini. Ketika stop loss dipicu, juga mungkin untuk mempertimbangkan memasuki kembali arah tren.
Ada beberapa arah optimasi untuk strategi ini: pertama, kombinasi parameter yang berbeda seperti periode EMA dan batang keterlambatan posisi dapat diuji untuk menemukan parameter yang optimal; kedua, lebih banyak indikator tambahan seperti MACD dan BOLL dapat diperkenalkan untuk penyaringan sinyal untuk meningkatkan kualitas sinyal; ketiga, logika stop loss dan take profit dapat dioptimalkan, seperti mengadopsi metode stop loss lainnya seperti time stop loss dan oscillating stop loss; keempat, lebih banyak kondisi pasar dapat dikombinasikan untuk memicu sinyal perdagangan strategi, seperti hanya memicu sinyal selama periode waktu tertentu atau rentang fluktuasi.
Strategi pelacakan tren silang ganda 10EMA ini menilai arah tren saat ini melalui EMA golden crosses dan death crosses, mengatur pelacakan stop loss dan limit profit taking untuk mengunci keuntungan dan mengendalikan risiko, sambil menggabungkan indikator bantu untuk menyaring sinyal dan meningkatkan kualitas sinyal. Dibandingkan dengan indikator tunggal dan strategi stop loss tradisional, strategi ini memiliki keuntungan seperti penilaian yang akurat, mekanisme stop profit yang dioptimalkan, dll.
/*backtest start: 2022-12-22 00:00:00 end: 2023-12-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("10ema Strat 9", overlay=true, format=format.price) //#region // inputs for candles //time t1 = time(timeframe.period,"0930-1500") //last hour of market is not ideal for trading // candle status bullish = close > open and barstate.isconfirmed bearish = open > close and barstate.isconfirmed bullcandle = ta.valuewhen(bullish, close, 0) bearcandle = ta.valuewhen(bearish, close, 0) ema1 = input.int(10, minval=1, title="short ema") ema2 = input.int(50, minval=1, title="long ema") ema3 = input.int(200, minval=1, title="hourly 10 ema") //@variable Input for source src = input(close, title="Source") offsetema = input.int(title="Offset", defval=0, minval=-500, maxval=500) sema = ta.ema(src, ema1)//@variable Input for smaller ema1 lema = ta.ema(src, ema2)//@variable Input for longer ema2 hema = ta.ema(src, ema3)// @variable Input for hourly ema3 bullcrosscount = ta.barssince(ta.crossover(sema,lema)) //@variable Input 10/50 cross higher bearcrosscount = ta.barssince(ta.crossunder(sema,lema)) //@variable Input 10/50 cross lower ideallong = bullcrosscount <= 5 //number of candles after the cross idealshort = bearcrosscount <= 5 //number of candles after the cross emabull = (sema > lema) and bearish and close > sema and close > hema and ideallong and t1 and barstate.isconfirmed xemabull = ta.barssince(emabull) dbullema = emabull and emabull[1] and xemabull <=1 bullentry = if dbullema ta.valuewhen(emabull[1], high + 0.05, 0) else ta.valuewhen(emabull, high + 0.05, 0) bullentryh = dbullema ? bullentry[1] : bullentry bullentrylow = ta.valuewhen(emabull, low - 0.05, 0) bullstop = (bullentryh - bullentrylow) <= 1.00 ? bullentryh - 1.00 : (bullentryh - bullentrylow) <= 10.40 ? bullentrylow : na bulltarget = (bullentryh - bullstop) * 1.62 + bullentryh // bear setup emabear = (sema < lema) and bullish and close < sema and close < hema and idealshort and t1 and barstate.isconfirmed xemabear = ta.barssince(emabear) dbearema = emabear and emabear [1] and xemabear <=1 bearentry = if dbearema ta.valuewhen(emabear[1], low - 0.05, 0) else ta.valuewhen(emabear, low - 0.05, 0) bearentryh = dbearema ? bearentry[1] : bearentry bearentryhigh = ta.valuewhen(emabear, high + 0.05, 0) bearstop = (bearentryhigh - bearentryh) <= 1.00 ? bearentryh + 1.00 : (bearentryh - bearentryhigh) <= 10.40 ? bearentryhigh : na beartarget = bearentryh - (bearstop-bearentryh) * 1.62 bullclose = (xemabull <=7) and bullish and bullcrosscount >=1 and barstate.isconfirmed //number of candles for a close above bearclose = (xemabear <=7) and bearish and bearcrosscount >=1 and barstate.isconfirmed //number of candles for a close below buyzone = ta.barssince(bullclose) shortzone = ta.barssince(bearclose) idealbuy = close >= bullentryh and bullclose and (buyzone<=7) idealsell = close <= bearentryh and bearclose and (shortzone<=7) // // bull setup on chart // if sema > lema and xemabull < 50 // var line line_bullentry = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(0, 200, 0), style=line.style_solid, width=1) // if emabull // line.set_xy1(line_bullentry, x=bar_index, y=bullentryh) // line.set_xy2(line_bullentry, x=bar_index, y=bullentryh) // alert("EMA-bullish", alert.freq_once_per_bar_close) // line.set_x2(line_bullentry, x=bar_index) // var line line_bullstop = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(250, 0, 0), style=line.style_solid, width=1) // if emabull // line.set_xy1(line_bullstop, x=bar_index, y=bullstop) // line.set_xy2(line_bullstop, x=bar_index, y=bullstop) // line.set_x2(line_bullstop, x=bar_index) // var line line_bulltarget = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(200, 100, 200), style=line.style_solid, width=1) // if emabull // line.set_xy1(line_bulltarget, x=bar_index, y=bulltarget) // line.set_xy2(line_bulltarget, x=bar_index, y=bulltarget) // line.set_x2(line_bulltarget, x=bar_index) // //bear setup on chart // if sema < lema and xemabear < 50 // var line line_bearentry = line.new(bar_index, na, bar_index, na, color=color.rgb(0, 200, 0), style=line.style_solid, width=1) // if emabear // line.set_xy1(line_bearentry, x=bar_index, y=bearentryh) // line.set_xy2(line_bearentry, x=bar_index, y=bearentryh) // alert("EMA-bearish", alert.freq_once_per_bar_close) // line.set_x2(line_bearentry, x=bar_index) // var line line_bearstop = line.new(bar_index, na, bar_index, na, color=color.rgb(250, 0, 0), style=line.style_solid, width=1) // if emabear // line.set_xy1(line_bearstop, x=bar_index, y=bearstop) // line.set_xy2(line_bearstop, x=bar_index, y=bearstop) // line.set_x2(line_bearstop, x=bar_index) // var line line_beartarget = line.new(bar_index, na, bar_index, na, color=color.rgb(200, 100, 200), style=line.style_solid, width=1) // if emabear // line.set_xy1(line_beartarget, x=bar_index, y=beartarget) // line.set_xy2(line_beartarget, x=bar_index, y=beartarget) // line.set_x2(line_beartarget, x=bar_index) //#endregion //execution if idealbuy strategy.close("sell", comment=na) strategy.entry("buy", strategy.long, limit=bullentryh, stop=bullstop, comment="buy") strategy.exit("exit","buy", trail_points = low, trail_offset = 5, qty_percent=100, limit=bulltarget, stop=bullstop) if idealsell strategy.close("buy",comment=na) strategy.entry("sell", strategy.short, limit=bearentryh, stop=bearstop, comment="sell") strategy.exit("exit","sell", trail_points = low, trail_offset = 5, qty_percent=100, limit=beartarget, stop=bearstop) // strategy.close_all(time == close_day) //#region // graphical analysis //Plots plotshape(emabull, location=location.belowbar, title='emabull') plotshape(idealbuy, style=shape.circle, color=color.green, title="bull close") plotshape(emabear, title='emabear') plotshape(idealsell, location=location.belowbar, style=shape.circle, color=color.red, title="bear close") // //Dashboard // var label id = na // label.delete(id) // Delete last label // i_offsetLabel = input(15, "Data Dashboard Offset") // offset = i_offsetLabel * (time - time[1]) // dynamicText = "= Bull Setup =" // id := label.new(x=time + offset, y=open, xloc=xloc.bar_time, text=dynamicText, color=color.rgb(255, 255, 255), size=size.normal) // label.set_textcolor(id, color.rgb(0, 0, 0)) // label.set_text(id=id, text=dynamicText) // label.set_textalign(id, text.align_left) // label.set_text(id=id, text=dynamicText) // f_round( _val, _decimals) => // _p = math.pow(10, _decimals) // math.round(math.abs(_val) * _p) / _p * math.sign(_val) // dynamicText := dynamicText + "\n" + str.tostring(f_round(bulltarget,2)) + " :Target" // label.set_text(id=id, text=dynamicText) // dynamicText := dynamicText + "\n" + str.tostring(f_round(bullentryh,2)) + " :Entry" // label.set_text(id=id, text=dynamicText) // dynamicText := dynamicText + "\n" + str.tostring(f_round(bullstop,2)) + " :Stop" // label.set_text(id=id, text=dynamicText) // dynamicText := dynamicText + "\n" // label.set_text(id=id, text=dynamicText) // dynamicText := dynamicText + "\n" + "= Bear Setup =" // label.set_text(id=id, text=dynamicText) // dynamicText := dynamicText + "\n" + str.tostring(f_round(bearstop,2)) + " :Stop" // label.set_text(id=id, text=dynamicText) // dynamicText := dynamicText + "\n" + str.tostring(f_round(bearentryh,2)) + " :Entry" // label.set_text(id=id, text=dynamicText) // dynamicText := dynamicText + "\n" + str.tostring(f_round(beartarget,2)) + " :Target" // label.set_text(id=id, text=dynamicText) // //#endregion