Strategi ini adalah strategi pengesanan trend berdasarkan silang ganda 10EMA dan 50EMA. Ia menggabungkan 10EMA pada carta jam sebagai penilaian tambahan untuk mencari arah trend secara dinamik dalam pasaran banteng dan beruang yang bergantian, dan mencapai pemantauan stop loss automatik.
Logik teras strategi ini adalah berdasarkan salib emas dan salib kematian 10EMA dan 50EMA. Khususnya, apabila 10EMA melintasi di atas 50EMA untuk membentuk salib emas, ia dinilai bahawa pasaran telah memasuki trend menaik; apabila 10EMA melintasi di bawah 50EMA untuk membentuk salib kematian, ia dinilai bahawa pasaran telah memasuki trend menurun.
Buka kedudukan panjang atau pendek dalam 1-5 bar selepas salib emas atau salib maut. Di samping itu, strategi ini juga memperkenalkan 10EMA pada carta jam sebagai penghakiman tambahan. Posisi panjang dibuka hanya apabila 10EMA pada carta jam berada dalam trend menaik selepas salib emas, dan kedudukan pendek dibuka hanya apabila 10EMA pada carta jam berada dalam trend menurun selepas salib maut, dengan itu menapis beberapa isyarat palsu.
Selepas membuka kedudukan, strategi ini menggunakan kaedah mengambil keuntungan dan menghentikan kerugian untuk mengesan stop loss + pesanan had. Mengesan stop loss boleh mengunci keuntungan dan memaksimumkan keuntungan urus niaga; pesanan had memastikan bahawa kedudukan ditutup apabila harga mencapai sasaran untuk mendapatkan keuntungan.
Kelebihan terbesar strategi ini adalah bahawa semasa menggunakan persilangan EMA untuk menilai arah trend utama, ia juga memperkenalkan penunjuk tambahan untuk menapis isyarat, yang secara berkesan dapat menapis persilangan palsu untuk meningkatkan kebolehpercayaan isyarat.
Berbanding dengan strategi penunjuk tunggal, strategi ini dapat menilai arah trend dan amplitud dengan lebih tepat. Berbanding dengan stop loss tradisional, strategi ini menggunakan teknologi stop loss yang lebih maju untuk mengunci keuntungan dengan lebih baik.
Risiko utama yang dihadapi oleh strategi ini adalah whipsaws yang berkala dan pembalikan trend. Apabila isyarat persilangan palsu berturut-turut berlaku, strategi boleh dibuang. Di samping itu, pembalikan harga selepas membuka kedudukan juga boleh menyebabkan kerugian.
Untuk mengurangkan risiko whipsaws, penunjuk tambahan ditambahkan untuk menapis isyarat. Untuk mengawal risiko pembalikan trend, julat stop loss yang agak toleran diterima pakai, dan tetapan keuntungan terhad juga membantu mengurangkan risiko ini. Apabila stop loss dicetuskan, juga mungkin untuk mempertimbangkan untuk memasuki semula arah trend.
Terdapat beberapa arah pengoptimuman untuk strategi ini: pertama, kombinasi parameter yang berbeza seperti tempoh EMA dan bar kelewatan kedudukan boleh diuji untuk mencari parameter yang optimum; kedua, lebih banyak penunjuk tambahan seperti MACD dan BOLL boleh diperkenalkan untuk penapisan isyarat untuk meningkatkan kualiti isyarat; ketiga, logik stop loss dan mengambil keuntungan boleh dioptimumkan, seperti mengamalkan kaedah stop loss lain seperti stop loss masa dan stop loss berayun; keempat, lebih banyak keadaan pasaran boleh digabungkan untuk mencetuskan isyarat perdagangan strategi, seperti hanya mencetuskan isyarat semasa tempoh masa tertentu atau julat fluktuasi.
Strategi pengesanan trend silang ganda 10EMA ini menilai arah trend semasa melalui salib emas dan salib kematian EMA, menetapkan pengesanan stop loss dan mengambil keuntungan terhad untuk mengunci keuntungan dan mengawal risiko, sambil menggabungkan penunjuk tambahan untuk menapis isyarat dan meningkatkan kualiti isyarat. Berbanding dengan penunjuk tunggal dan strategi stop loss tradisional, strategi ini mempunyai kelebihan seperti penilaian yang tepat, mekanisme stop profit yang dioptimumkan, dll. Ia dapat menangkap keuntungan trend dengan berkesan sambil mengawal risiko, menjadikannya sesuai untuk akaun dagangan konvensional. Sudah tentu masih ada ruang untuk peningkatan untuk strategi ini, seperti meningkatkan lagi prestasi strategi melalui pengoptimuman parameter dan memperkenalkan lebih banyak penunjuk tambahan.
/*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