Strategi ini menggabungkan MACD, RSI, ADX dan penunjuk teknikal momentum lain untuk mengenal pasti isyarat pembalikan harga dan mengamalkan strategi terbalik untuk memasuki apabila trend yang kuat berbalik. Strategi ini juga menetapkan stop loss dan mengambil keuntungan untuk mengunci keuntungan dan mengawal risiko.
Strategi ini mula-mula menggabungkan penunjuk MACD
Khususnya, apabila garis cepat MACD melintasi di atas garis perlahan, RSI lebih tinggi daripada 50 dan meningkat, ADX lebih besar daripada 20, ia adalah isyarat beli; apabila garis cepat MACD melintasi di bawah garis perlahan, RSI lebih rendah daripada 50 dan jatuh, ADX lebih besar daripada 20, ia adalah isyarat jual.
Kelebihan terbesar strategi ini ialah ia menggabungkan pelbagai penunjuk untuk menapis dengan berkesan whipsaws dan isyarat yang salah, benar-benar mengunci titik perubahan pembalikan trend, dengan itu mendapatkan kadar kemenangan yang lebih tinggi.
Risiko terbesar strategi ini adalah salah menilai pembalikan trend, seperti harga membuat retracement yang mendalam yang mengakibatkan penilaian yang salah.
Penyelesaian adalah untuk mengoptimumkan parameter, menyesuaikan margin kehilangan berhenti, atau menggabungkan lebih banyak penunjuk tambahan untuk penapisan isyarat.
Strategi ini boleh dioptimumkan lagi dalam arah berikut:
Mengoptimumkan gabungan parameter MACD dan RSI untuk meningkatkan ketepatan penilaian pembalikan harga;
Meningkatkan penapisan penunjuk, seperti KD, BOLL dan lain-lain untuk membentuk kesan penunjuk yang merangkumi satu sama lain;
Sesuaikan margin stop loss secara dinamik mengikut keadaan pasaran yang berbeza;
Mengubah kedudukan mengambil keuntungan dalam masa nyata mengikut trend sebenar selepas pembalikan.
Strategi ini menggabungkan beberapa penunjuk momentum untuk mengenal pasti peluang pembalikan harga yang berpotensi. Melalui pengoptimuman parameter, menggabungkan lebih banyak penunjuk tambahan, menyesuaikan strategi stop loss dan mengambil keuntungan secara dinamik, kestabilan dan kebolehpercayaan strategi dapat ditingkatkan lagi untuk mengunci pelbagai peluang perdagangan yang disediakan oleh pasaran.
/*backtest start: 2023-11-28 00:00:00 end: 2023-12-28 00:00:00 period: 1h 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/ // © AHMEDABDELAZIZZIZO //@version=5 strategy("Ta Strategy", overlay=true ) // inputs inversestrategy = input.bool(false, title = "Inverse Strategy",tooltip = "This option makes you reverse the strategy so that long signals become where to short ") direction = input.string(defval = "Both" , options = ["Both" , "Short" , "Long"] ) leftbars= input(6,title = " Left Bars" , group = "Support and resistance") rightbars = input(6, title = " Right Bars", group = "Support and resistance") macdfast = input(12, title = "MACD Fast", group = "MACD") macdslow = input(26, title = "MACD Slow",group = "MACD") macdsignal = input(7, "MACD Signal",group = "MACD") sellqty = input(50, title = "QTY to sell at TP 1") len = input(14, title="ADX Length" , group = "ADX") // sup and res res = fixnan(ta.pivothigh(high,leftbars,rightbars)) sup = fixnan(ta.pivotlow(low , leftbars,rightbars)) // macd macd =ta.ema(close,macdfast) - ta.ema(close,macdslow) signal=ta.ema(macd,macdsignal) //adx up = ta.change(high) down = -ta.change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = ta.rma(ta.tr,len) plusDI = 100 * ta.rma(plusDM, len) / truerange minusDI = 100 * ta.rma(minusDM, len) / truerange dx = 100 * ta.rma(math.abs(plusDI - minusDI) / (plusDI + minusDI), len) adx = ta.sma(dx, len) // start deal condition longcondition = ta.crossover(macd,signal) and close > res and ta.rsi(close,14) > 50 and plusDI > minusDI and adx > 20 shortcondition = ta.crossunder(macd,signal) and close < sup and ta.rsi(close,14) < 50 and plusDI < minusDI and adx > 20 //tp longtp1 = input.float(6, "Long TP 1", minval = 0.0, step = 0.25, group = "Exit LONG Orders") /100 longtp2 = input.float(12, "Long TP 2", minval = 0.0, step = 0.25, group = "Exit LONG Orders") /100 longsl1 = input.float(3.0, "Long SL", minval = 0.0, step = 0.25, group = "Exit LONG Orders") /100 longtakeprofit1 = (strategy.position_avg_price * (1 + longtp1)) longstoploss1 = (strategy.position_avg_price * (1 - longsl1)) longtakeprofit2 = (strategy.position_avg_price * (1 + longtp2)) //sl shorttp1 = input.float(6.0, "Short TP 1 ", minval = 0.0, step = 0.25, group = "Exit SHORT Orders")/100 shorttp2 = input.float(12.0, "Short TP 2", minval = 0.0, step = 0.25, group = "Exit SHORT Orders")/100 shortsl1 = input.float(3.0, "Short SL", minval = 0.0, step = 0.25, group = "Exit SHORT Orders")/100 shorttakeprofit1 = (strategy.position_avg_price * (1- shorttp1)) shortstoploss1 = (strategy.position_avg_price * (1 + shortsl1)) shorttakeprofit2 = (strategy.position_avg_price * (1- shorttp2)) //placeorders if inversestrategy == false if direction == "Both" if longcondition and strategy.opentrades == 0 strategy.entry("long" , strategy.long ) strategy.exit("exit long 1","long",qty_percent = sellqty ,limit = longtakeprofit1,stop = longstoploss1) strategy.exit("exit long 2","long",qty_percent = 100 ,limit = longtakeprofit2,stop = longstoploss1) if high >= longtakeprofit1 strategy.cancel("exit long 2") strategy.exit("exit long 3","long",qty_percent = 100 ,limit = longtakeprofit2,stop = strategy.position_avg_price) if shortcondition and strategy.opentrades == 0 strategy.entry("short",strategy.short) strategy.exit("exit short 1","short",qty_percent = sellqty ,limit = shorttakeprofit1,stop = shortstoploss1) strategy.exit("exit short 2","short",qty_percent = 100 ,limit = shorttakeprofit2,stop = shortstoploss1) if low <= shorttakeprofit1 strategy.cancel("exit short 2") strategy.exit("exit short 3","short",qty_percent = 100 ,limit = shorttakeprofit2,stop = strategy.position_avg_price) else if direction == "Long" if longcondition and strategy.opentrades == 0 strategy.entry("long" , strategy.long ) strategy.exit("exit long 1","long",qty_percent = sellqty ,limit = longtakeprofit1,stop = longstoploss1) strategy.exit("exit long 2","long",qty_percent = 100 ,limit = longtakeprofit2,stop = longstoploss1) if high >= longtakeprofit1 strategy.cancel("exit long 2") strategy.exit("exit long 3","long",qty_percent = 100 ,limit = longtakeprofit2,stop = strategy.position_avg_price) else if direction == "Short" if shortcondition and strategy.opentrades == 0 strategy.entry("short",strategy.short) strategy.exit("exit short 1","short",qty_percent = sellqty ,limit = shorttakeprofit1,stop = shortstoploss1) strategy.exit("exit short 2","short",qty_percent = 100 ,limit = shorttakeprofit2,stop = shortstoploss1) if low <= shorttakeprofit1 strategy.cancel("exit short 2") strategy.exit("exit short 3","short",qty_percent = 100 ,limit = shorttakeprofit2,stop = strategy.position_avg_price) else if direction == "Both" if shortcondition and strategy.opentrades == 0 strategy.entry("long" , strategy.long ) strategy.exit("exit long 1","long",qty_percent = sellqty ,limit = longtakeprofit1,stop = longstoploss1) strategy.exit("exit long 2","long",qty_percent = 100 ,limit = longtakeprofit2,stop = longstoploss1) if high >= longtakeprofit1 strategy.cancel("exit long 2") strategy.exit("exit long 3","long",qty_percent = 100 ,limit = longtakeprofit2,stop = strategy.position_avg_price) if longcondition and strategy.opentrades == 0 strategy.entry("short",strategy.short) strategy.exit("exit short 1","short",qty_percent = sellqty ,limit = shorttakeprofit1,stop = shortstoploss1) strategy.exit("exit short 2","short",qty_percent = 100 ,limit = shorttakeprofit2,stop = shortstoploss1) if low <= shorttakeprofit1 strategy.cancel("exit short 2") strategy.exit("exit short 3","short",qty_percent = 100 ,limit = shorttakeprofit2,stop = strategy.position_avg_price) else if direction == "Long" if shortcondition and strategy.opentrades == 0 strategy.entry("long" , strategy.long ) strategy.exit("exit long 1","long",qty_percent = sellqty ,limit = longtakeprofit1,stop = longstoploss1) strategy.exit("exit long 2","long",qty_percent = 100 ,limit = longtakeprofit2,stop = longstoploss1) if high >= longtakeprofit1 strategy.cancel("exit long 2") strategy.exit("exit long 3","long",qty_percent = 100 ,limit = longtakeprofit2,stop = strategy.position_avg_price) else if direction == "Short" if longcondition and strategy.opentrades == 0 strategy.entry("short",strategy.short) strategy.exit("exit short 1","short",qty_percent = sellqty ,limit = shorttakeprofit1,stop = shortstoploss1) strategy.exit("exit short 2","short",qty_percent = 100 ,limit = shorttakeprofit2,stop = shortstoploss1) if low <= shorttakeprofit1 strategy.cancel("exit short 2") strategy.exit("exit short 3","short",qty_percent = 100 ,limit = shorttakeprofit2,stop = strategy.position_avg_price) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// lsl1 = plot(strategy.position_size <= 0 ? na : longstoploss1, color=color.rgb(124, 11, 11), style=plot.style_linebr, linewidth=1) ltp1 = plot(strategy.position_size <= 0 ? na : longtakeprofit1, color=color.rgb(15, 116, 18), style=plot.style_linebr, linewidth=1) ltp2 = plot(strategy.position_size <= 0 ? na : longtakeprofit2, color=color.rgb(15, 116, 18), style=plot.style_linebr, linewidth=1) avg = plot(strategy.position_avg_price, color=color.rgb(255, 153, 0, 47), style=plot.style_linebr, linewidth=1) fill(ltp1,avg , color =strategy.position_size <= 0 ? na : color.rgb(82, 255, 97, 90)) fill(ltp2,ltp1 , color =strategy.position_size <= 0 ? na : color.rgb(82, 255, 97, 90)) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ssl1 = plot(strategy.position_size >= 0 ? na : shortstoploss1, color=color.red, style=plot.style_linebr, linewidth=1) stp1 = plot(strategy.position_size >= 0 ? na : shorttakeprofit2, color=color.green, style=plot.style_linebr, linewidth=1) stp2 = plot(strategy.position_size >= 0 ? na : shorttakeprofit1, color=color.green, style=plot.style_linebr, linewidth=1) fill(stp1,avg , color =strategy.position_size >= 0 ? na : color.rgb(30, 92, 35, 90)) fill(stp2,stp1 , color =strategy.position_size >= 0 ? na : color.rgb(30, 92, 35, 90)) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// resplot = plot(res, color=ta.change(res) ? na : #bf141446, linewidth=3, offset=-(rightbars+1), title="res") supplot = plot(sup, color=ta.change(sup) ? na : #118f113a, linewidth=3, offset=-(rightbars+1), title="sup")