Strategi ini dibangunkan berdasarkan penunjuk Botvenko untuk mengenal pasti trend pasaran secara automatik dan menubuhkan kedudukan panjang / pendek. Ia mengintegrasikan penunjuk Botvenko, purata bergerak dan garis sokongan mendatar untuk mengenali isyarat pecah secara automatik dan menubuhkan kedudukan.
Penunjuk teras strategi ini adalah penunjuk Botvenko. Dengan mengira perbezaan logaritma antara harga penutupan pada hari dagangan yang berbeza, ia menilai trend pasaran dan tahap sokongan / rintangan yang penting.
Di samping itu, strategi itu mengintegrasikan
Dengan mengenal pasti isyarat perdagangan dengan penunjuk Botvenko dan menilai peringkat pasaran dengan purata bergerak, penubuhan kedudukan yang tidak sesuai dapat dielakkan apabila digunakan dalam kombinasi.
Kelebihan terbesar strategi ini ialah ia dapat mengenal pasti trend panjang/pendek pasaran secara automatik. Penunjuk Botvenko sangat sensitif terhadap perbezaan antara harga dalam dua tempoh masa dan dapat dengan cepat mencari tahap sokongan / rintangan utama. Pada masa yang sama, pemisahan purata bergerak dapat menilai dengan berkesan sama ada kini lebih baik untuk menjadi panjang atau pendek.
Idea menggabungkan penunjuk pantas dan penunjuk trend membolehkan strategi untuk dengan cepat mencari titik masuk dan keluar sambil mengelakkan pembelian dan penjualan yang tidak sesuai.
Risiko strategi ini terutamanya datang dari dua aspek. Pertama, penunjuk Botvenko itu sendiri sangat sensitif terhadap perubahan harga, yang boleh menghasilkan banyak isyarat perdagangan yang tidak perlu. Kedua, pemisahan purata bergerak boleh menjadi berantakan semasa pergerakan sampingan, yang membawa kepada penubuhan kedudukan yang berantakan.
Untuk menangani risiko pertama, parameter penunjuk Botvenko boleh diselaraskan untuk meningkatkan kitaran pengiraan dan mengurangkan perdagangan yang tidak perlu.
Arah pengoptimuman utama adalah penyesuaian parameter dan menambah keadaan penapis.
Untuk penunjuk Botvenko, parameter tempoh yang berbeza boleh dicuba untuk mencari kombinasi yang optimum. Untuk purata bergerak, lebih banyak daripada mereka boleh ditambahkan untuk membentuk sistem penghakiman trend yang lebih lengkap. Di samping itu, penunjuk turun naik, penunjuk jumlah dagangan dan lain-lain juga boleh diperkenalkan untuk menapis isyarat palsu.
Melalui penyesuaian komprehensif parameter dan keadaan penapis, kestabilan dan keuntungan strategi dapat ditingkatkan lagi.
Strategi adaptatif Botvenko panjang / pendek berjaya menggabungkan penunjuk cepat dan trend untuk mengenal pasti titik pasaran utama secara automatik dan menubuhkan kedudukan yang betul. Kelebihannya terletak pada lokasi yang cepat dan pencegahan kedudukan yang tidak sesuai. Langkah seterusnya adalah untuk meningkatkan kestabilan dan keuntungan melalui parameter dan pengoptimuman keadaan.
/*backtest start: 2023-12-27 00:00:00 end: 2024-01-03 00:00:00 period: 1m basePeriod: 1m 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/ // © boftei //@version=5 strategy("Boftei's Strategy", overlay=false, pyramiding=1, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, margin_long = 100, margin_short = 100, slippage=0, commission_type=strategy.commission.percent, commission_value = 0, initial_capital = 40, precision = 6) strat_dir_input = input.string("all", "strategy direction", options=["long", "short", "all"]) strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all strategy.risk.allow_entry_in(strat_dir_value) ////////////////////////////////////////////////////////////////////// //DATA testStartYear = input(2005, "Backtest Start Year") testStartMonth = input(7, "Backtest Start Month") testStartDay = input(16, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) //Stop date if you want to use a specific range of dates testStopYear = input(2030, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(30, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false ////////////////////////////////////////////////////////////////////// sell = input.float(0.0065, "sell level") buy = input.float(0, "buy level") long1 = input.float(-0.493, "long retry - too low") long2 = input.float(2, "long close up") long3 = input.float(-1.5, "long close down") short1 = input.float(1.26, "short retry - too high") short2 = input.float(-5, "dead - close the short") ///< botvenko script nn = input(60, "Histogram Period") float x = 0 float z = 0 float k = 0 y = math.log(close[0]) - math.log(close[nn]) if y>0 x := y else k := y //--------------------------------------------- plot(y > 0 ? x: 0, color = color.green, linewidth = 4) plot(y <= 0 ? k: 0, color = color.maroon, linewidth = 4) plot(y, color = color.yellow, linewidth = 1) co = ta.crossover(y, buy) cu = ta.crossunder(y, sell) retry_long = ta.crossunder(y, long1) deadline_long_up = ta.crossover(y, long2) deadline_long_down = ta.crossunder(y, long3) retry_short = ta.crossover(y, short1) deadline_short = ta.crossunder(y, short2) hline(buy, title='buy', color=color.green, linestyle=hline.style_dotted, linewidth=2) hline(0, title='zero', color=color.white, linestyle=hline.style_dotted, linewidth=1) hline(sell, title='sell', color=color.red, linestyle=hline.style_dotted, linewidth=2) hline(long1, title='long retry', color=color.blue, linestyle=hline.style_dotted, linewidth=2) hline(long2, title='overbought', color=color.teal, linestyle=hline.style_dotted, linewidth=2) hline(long3, title='oversold', color=color.maroon, linestyle=hline.style_dotted, linewidth=2) hline(short1, title='short retry', color=color.purple, linestyle=hline.style_dotted, linewidth=2) hline(short2, title='too low to short - an asset may die', color=color.navy, linestyle=hline.style_dotted, linewidth=2) ////////////////////////////////////////////////////////////EMAprotectionBLOCK ema_21 = ta.ema(close, 21) ema_55 = ta.ema(close, 55) ema_89 = ta.ema(close, 89) ema_144 = ta.ema(close, 144) //ema_233 = ta.ema(close, 233) // ema_377 = ta.ema(close, 377) long_st = ema_21>ema_55 and ema_55>ema_89 and ema_89>ema_144 //and ema_144>ema_233 and ema_233>ema_377 short_st = ema_21<ema_55 and ema_55<ema_89 and ema_89<ema_144 //and ema_144<ema_233 and ema_233<ema_377 g_v = long_st == true?3:0 r_v = short_st == true?-2:0 y_v = long_st != true and short_st != true?2:0 plot(math.log(ema_21), color = color.new(#ffaf5e, 50)) plot(math.log(ema_55), color = color.new(#b9ff5e, 50)) plot(math.log(ema_89), color = color.new(#5eff81, 50)) plot(math.log(ema_144), color = color.new(#5effe4, 50)) //plot(math.log(ema_233), color = color.new(#5e9fff, 50)) //plot(math.log(ema_377), color = color.new(#af5eff, 50)) plot(long_st == true?3:0, color = color.new(color.green, 65), linewidth = 5) plot(short_st == true?-2:0, color = color.new(color.red, 65), linewidth = 5) plot(long_st != true and short_st != true?2:0, color = color.new(color.yellow, 65), linewidth = 5) ////////////////////////////////////////////////////////////EMAprotectionBLOCK if (co and testPeriod() and (g_v == 3 or y_v == 2)) strategy.close("OH BRO", comment = "EXIT-SHORT") strategy.close("OH DUDE", comment = "EXIT-SHORT") strategy.entry("OH DAMN", strategy.long, comment="ENTER-LONG 'co'") if (retry_long and testPeriod() and (g_v == 3 or y_v == 2)) strategy.close("OH DAMN", comment = "EXIT-LONG") strategy.entry("OH BRUH", strategy.long, comment="ENTER-LONG 'retry_long'") if (cu and testPeriod() and (r_v == -2 or y_v == 2)) strategy.close("OH DAMN", comment = "EXIT-LONG") strategy.close("OH BRUH", comment = "EXIT-LONG") strategy.entry("OH BRO", strategy.short, comment="ENTER-SHORT 'cu'") if (retry_short and testPeriod() and (r_v == -2 or y_v == 2)) strategy.close("OH BRO", comment = "EXIT-SHORT") strategy.entry("OH DUDE", strategy.short, comment="ENTER-SHORT 'retry_short'") if (deadline_long_up and testPeriod() or r_v == -2 and testPeriod()) strategy.close("OH DAMN", comment = "EXIT-LONG 'deadline_long_up'") if (deadline_long_down and testPeriod()) strategy.close("OH DAMN", comment = "EXIT-LONG 'deadline_long_down'") if (deadline_short and testPeriod() or g_v == 3 and testPeriod()) strategy.close("OH BRO", comment = "EXIT-SHORT 'deadline_short'") // (you can use strategy.close_all(comment = "close all entries") here)