Strategi pembalikan rentang latent menggunakan periode penurunan volatilitas sebagai sinyal masuk dan bertujuan untuk mendapatkan keuntungan ketika volatilitas meningkat lagi. Ini mengidentifikasi situasi di mana harga terkandung dalam rentang latent yang sempit dan menangkap tren harga yang akan datang. Strategi ini bekerja dengan baik ketika volatilitas saat ini rendah tetapi diharapkan terobosan.
Strategi pertama kali mengidentifikasi kisaran tidak aktif, yaitu ketika harga terkandung dalam kisaran harga hari perdagangan sebelumnya. Ini menunjukkan bahwa volatilitas telah berkurang dibandingkan dengan beberapa hari yang lalu. Kami memeriksa apakah hari saat ini tinggi < tinggi dari n hari yang lalu (biasanya 4 hari) dan hari saat ini rendah > rendah dari n hari yang lalu untuk memenuhi syarat sebagai kisaran tidak aktif.
Setelah rentang tidak aktif diidentifikasi, strategi menempatkan dua pesanan yang sedang menunggu - buy stop di dekat bagian atas rentang dan sell stop di dekat bagian bawah rentang. Kemudian menunggu harga untuk keluar dari rentang baik ke atas atau ke bawah.
Setelah masuk, stop loss dan take profit order ditempatkan. Stop loss mengendalikan risiko penurunan dan take profit menutup perdagangan untuk keuntungan. Stop loss ditempatkan pada jarak % dari harga masuk seperti yang didefinisikan dalam parameter risiko. Take profit ditempatkan pada jarak yang sama dengan ukuran rentang latent karena kita mengharapkan harga bergerak mirip dengan volatilitas sebelumnya.
Akhirnya, model ukuran posisi pecahan tetap mengelola ukuran perdagangan.
Keuntungan dari strategi ini adalah:
Menangkap tren mendatang dengan menggunakan penurunan volatilitas sebagai sinyal.
Perintah dua arah menangkap tren naik atau turun.
Stop loss dan mengambil keuntungan mengontrol risiko perdagangan tunggal.
Ukuran pecahan tetap meningkatkan efisiensi modal.
Logika sederhana mudah diterapkan.
Risiko yang harus dipertimbangkan adalah:
Arah kabur yang salah jika jarak kabur tidak jelas.
Breakout mungkin hanya pembalikan jangka pendek, bukan tren jangka panjang.
Stop loss risiko yang diambil oleh gerakan besar.
Ukuran fraksi tetap dapat memperkuat kerugian saat menambah perdagangan yang rugi.
Kinerja yang buruk jika parameter tidak diatur dengan benar.
Beberapa cara untuk meningkatkan strategi:
Tambahkan filter seperti divergensi untuk menghindari kebocoran palsu.
Meningkatkan stop loss dengan trailing atau order stop loss.
Tambahkan filter tren untuk menghindari entri kontra-tren.
Mengoptimalkan rasio fraksi tetap untuk keseimbangan risiko / imbalan.
Lihatlah beberapa kerangka waktu untuk meningkatkan tepi.
Menggunakan pembelajaran mesin untuk optimasi parameter otomatis.
Strategi pembalikan rentang yang tidak aktif memiliki logika dan potensi keuntungan yang jelas. fine-tuning melalui optimasi, manajemen risiko dan penyaringan sinyal dapat lebih meningkatkan konsistensi.
/*backtest start: 2023-09-29 00:00:00 end: 2023-10-29 00:00:00 period: 1d basePeriod: 1h 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/ // © gsanson66 //This code is based on the Narrow Range strategy //Interactive Broker fees are applied on this strategy //@version=5 strategy("NARROW RANGE BACKTESTING", shorttitle="NR BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, commission_type=strategy.commission.percent, commission_value=0.18) //--------------------------------FUNCTIONS------------------------------------// //@function to print label debugLabel(txt, color) => label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small) //@function which looks if the close date of the current bar falls inside the date range inBacktestPeriod(start, end) => (time >= start) and (time <= end) //--------------------------------USER INPUTS------------------------------------// //Narrow Range Length nrLength = input.int(4, minval=2, title="Narrow Range Length", group="Strategy parameters") //Risk Management stopLossInput = input.float(0.5, title="Stop Loss (in percentage of reference range)", group="Strategy parameters") //Money Management fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management") increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management") //Backtesting period startDate = input(title="Start Date", defval=timestamp("1 Janv 2020 00:00:00"), group="Backtesting Period") endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period") //--------------------------------VARIABLES INITIALISATION--------------------------// strategy.initial_capital = 50000 bool nr = na var bool long = na var bool short = na var float stopPriceLong = na var float stopLossLong = na var float takeProfitLong = na var float stopPriceShort = na var float stopLossShort = na var float takeProfitShort = na var float takeProfit = na var float stopLoss = na bool inRange = na int closedtrades = strategy.closedtrades equity = math.abs(strategy.equity - strategy.openprofit) var float capital_ref = strategy.initial_capital var float cashOrder = strategy.initial_capital * 0.95 //------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------// //Checking if the date belong to the range inRange := true //Checking performances of the strategy if equity > capital_ref + fixedRatio spread = (equity - capital_ref)/fixedRatio nb_level = int(spread) increasingOrder = nb_level * increasingOrderAmount cashOrder := cashOrder + increasingOrder capital_ref := capital_ref + nb_level*fixedRatio if equity < capital_ref - fixedRatio spread = (capital_ref - equity)/fixedRatio nb_level = int(spread) decreasingOrder = nb_level * increasingOrderAmount cashOrder := cashOrder - decreasingOrder capital_ref := capital_ref - nb_level*fixedRatio //We check if a trade has been closed to cancel all previous orders if closedtrades > closedtrades[1] strategy.cancel("Long") strategy.cancel("Short") stopPriceLong := na stopPriceShort := na //Checking if we close all trades in case where we exit the backtesting period if strategy.position_size!=0 and not inRange debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116)) strategy.close_all() long := na short := na stopPriceLong := na stopLossLong := na takeProfitLong := na stopPriceShort := na stopLossShort := na takeProfitShort := na takeProfit := na stopLoss := na //----------------------------------FINDING NARROW RANGE DAY------------------------------------------// // We find the Narrow Range Day if low > low[nrLength] and high < high[nrLength] nr := true //------------------------------------STOP ORDERS--------------------------------------------// // We handle plotting of stop orders and cancellation of other side order if one order is triggered if strategy.position_size > 0 and not na(stopPriceLong) and not na(stopPriceShort) long := true strategy.cancel("Short") stopPriceLong := na stopPriceShort := na takeProfit := takeProfitLong stopLoss := stopLossLong if strategy.position_size < 0 and not na(stopPriceLong) and not na(stopPriceShort) short := true strategy.cancel("Long") stopPriceLong := na stopPriceShort := na takeProfit := takeProfitShort stopLoss := stopLossShort //------------------------------------STOP LOSS & TAKE PROFIT--------------------------------// // If an order is triggered we plot TP and SL if not na(takeProfit) and not na(stopLoss) and long if high >= takeProfit and closedtrades == closedtrades[1] + 1 takeProfit := na stopLoss := na long := na if low <= stopLoss and closedtrades == closedtrades[1] + 1 takeProfit := na stopLoss := na long := na if not na(takeProfit) and not na(stopLoss) and short if high >= stopLoss and closedtrades == closedtrades[1] + 1 takeProfit := na stopLoss := na short := na if low <= takeProfit and closedtrades == closedtrades[1] + 1 takeProfit := na stopLoss := na short := na //-----------------------------LONG/SHORT CONDITION-------------------------// // Conditions to create two stop orders (one for Long and one for Short) and SL & TP calculation if nr and inRange and strategy.position_size == 0 stopPriceLong := high[4] takeProfitLong := high[4] + (high[4] - low[4]) stopLossLong := high[4] - (high[4] - low[4])*stopLossInput qtyLong = cashOrder/stopPriceLong strategy.entry("Long", strategy.long, qtyLong, stop=stopPriceLong) strategy.exit("Exit Long", "Long", limit=takeProfitLong ,stop=stopLossLong) stopPriceShort := low[4] takeProfitShort := low[4] - (high[4] - low[4]) stopLossShort := low[4] + (high[4] - low[4])*stopLossInput qtyShort = cashOrder/stopPriceShort strategy.entry("Short", strategy.short, qtyShort, stop=stopPriceShort) strategy.exit("Exit Short", "Short", limit=takeProfitShort ,stop=stopLossShort) //--------------------------PLOTTING ELEMENT----------------------------// plotshape(nr, "NR", shape.arrowdown, location.abovebar, color.rgb(255, 132, 0), text= "NR4", size=size.huge) plot(stopPriceLong, "Stop Order", color.blue, 3, plot.style_linebr) plot(stopPriceShort, "Stop Order", color.blue, 3, plot.style_linebr) plot(takeProfit, "Take Profit", color.green, 3, plot.style_linebr) plot(stopLoss, "Stop Loss", color.red, 3, plot.style_linebr)