
Strategi ini adalah strategi pelacakan tren yang didasarkan pada 10 EMA dan 50 EMA double cross. Ini menggabungkan 10 EMA dari garis jam sebagai penilaian tambahan untuk menemukan arah tren secara dinamis di pasar yang bergantian dengan bullish dan bearish, untuk mencapai stop loss pelacakan otomatis.
Logika inti dari strategi ini adalah berdasarkan pada 10 EMA dan 50 EMA. Secara khusus, ketika 10 EMA dari bawah melewati 50 EMA untuk membentuk garpu emas, pasar masuk ke tren naik; ketika 10 EMA dari atas melewati 50 EMA untuk membentuk garpu mati, pasar masuk ke tren turun.
Strategi ini juga memperkenalkan 10 EMA di garis jam sebagai penilaian tambahan, hanya ketika 10 EMA di garis jam berada dalam tren naik, hanya ketika 10 EMA di garis jam berada dalam tren turun, hanya setelah dead fork, sehingga memfilter beberapa sinyal palsu.
Setelah membuka posisi, strategi ini menggunakan jalan keluar dari tracking stop loss + stop loss. Tracking stop loss dapat mengunci keuntungan dan memaksimalkan keuntungan perdagangan; Stop loss memastikan bahwa posisi ditutup untuk mendapatkan keuntungan ketika harga mencapai titik target.
Keuntungan terbesar dari strategi ini adalah bahwa menggunakan EMA silang untuk menentukan arah tren utama, tetapi juga memperkenalkan sinyal penyaringan indikator tambahan, yang dapat secara efektif menyaring silang palsu sehingga meningkatkan keandalan sinyal. Selain itu, EMA silang ganda dikombinasikan dengan tracking stop loss dan limit price stop, yang dapat memaksimalkan keuntungan dari tracking trend, dan dapat secara efektif mengendalikan risiko perdagangan, dan keuntungan dari risiko keseluruhan.
Strategi ini lebih akurat dalam menentukan arah dan amplitudo tren dibandingkan dengan strategi indikator tunggal. Strategi ini menggunakan teknologi tracking stop loss yang lebih canggih dibandingkan dengan stop loss tradisional, sehingga lebih baik dalam mengunci keuntungan.
Strategi ini terutama menghadapi risiko whipsaw intermiten dan pembalikan tren. Ketika muncul sinyal silang palsu berturut-turut, strategi ini dapat menyebabkan arbitrage. Selain itu, pembalikan harga setelah membuka posisi juga dapat menyebabkan kerugian.
Untuk mengurangi risiko whipsaw, strategi menambahkan indikator bantu untuk memfilter sinyal. Untuk mengendalikan risiko pembalikan tren, strategi menggunakan jangkauan stop loss yang lebih toleran, sementara pengaturan stop loss juga dapat membantu mengurangi risiko tersebut.
Strategi ini memiliki beberapa arah yang dapat dioptimalkan: pertama, Anda dapat menguji kombinasi parameter yang berbeda, seperti siklus EMA, akar keterlambatan pembukaan posisi, dan lain-lain, untuk mencari parameter optimal; kedua, Anda dapat memperkenalkan lebih banyak indikator tambahan, seperti MACD, BOLL, dan lain-lain untuk memfilter sinyal dan meningkatkan kualitas sinyal; ketiga, Anda dapat mengoptimalkan logika stop loss, seperti menggunakan stop loss waktu, stop loss osilasi, dan lain-lain; keempat, Anda dapat menggabungkan lebih banyak kondisi untuk memulai perdagangan strategi, seperti sinyal pemicu hanya pada periode waktu tertentu atau di bawah penurunan harga.
10 EMA double cross trend tracking strategi, dengan EMA golden cross dan death cross menilai arah tren saat ini, mengatur tracking stop loss dan stop limit untuk mengunci keuntungan dan mengendalikan risiko, sementara digabungkan dengan sinyal filter indikator tambahan untuk meningkatkan kualitas sinyal, adalah strategi perdagangan tren yang lebih lengkap. Dibandingkan dengan indikator tunggal dan stop loss tradisional, strategi ini memiliki keunggulan penilaian akurat, stop loss pengoptimalan, dan lain-lain.
/*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