
Strategi berbalik dormansi menggunakan periode penurunan volatilitas harga sebagai sinyal untuk membangun posisi dan mengambil posisi yang menguntungkan ketika volatilitas harga naik kembali. Ini menangkap tren harga yang akan meletus dengan mengidentifikasi situasi di mana harga dibatasi dalam dormansi yang sempit dan bergoyang. Strategi ini biasanya berlaku ketika volatilitas saat ini berada pada tingkat yang lebih rendah, tetapi mungkin terjadi ledakan di masa depan.
Strategi ini pertama-tama mengidentifikasi dormansi, yaitu ketika harga dibatasi dalam kisaran harga hari perdagangan sebelumnya. Ini menunjukkan bahwa volatilitas saat ini telah menurun beberapa hari sebelumnya. Kami menilai apakah kondisi dormansi memenuhi persyaratan dengan membandingkan harga tertinggi hari perdagangan saat ini dengan harga tertinggi n hari sebelumnya (biasanya 4 hari) dan membandingkan harga terendah hari perdagangan saat ini dengan harga terendah n hari sebelumnya.
Setelah mengkonfirmasi dormansi, strategi ini akan membuka dua putaran pada saat yang sama: satu putaran beli di dekat titik tinggi dan satu putaran beli di dekat titik rendah. Kemudian menunggu harga menerobos dormansi untuk terus berjalan ke atas atau ke bawah. Jika harga menerobos ke atas, putaran beli akan dipicu untuk membangun posisi multihead; jika menerobos ke bawah, putaran beli akan dipicu untuk membangun posisi kosong.
Setelah posisi didirikan, strategi akan mengatur stop loss dan stop loss. Stop loss dapat membatasi risiko penurunan, stop loss digunakan untuk posisi kosong setelah keuntungan. Stop loss jarak dari harga masuk adalah jarak proporsional, yang ditentukan oleh parameter manajemen risiko. Stop loss jarak dari harga masuk adalah dormansi besar, karena kita mengharapkan pergerakan harga akan sama dengan tingkat fluktuasi sebelumnya.
Akhirnya, strategi ini juga menyertakan modul manajemen uang. Mengatur jumlah uang yang diperdagangkan dengan perintah melalui metode perkalian tetap, meningkatkan pemanfaatan uang ketika menguntungkan, dan mengurangi risiko jika rugi.
Strategi ini memiliki beberapa keuntungan:
Menggunakan waktu volatilitas rendah sebagai sinyal untuk membangun posisi, untuk menangkap peluang sebelum tren harga terjadi.
Pada saat yang sama, Anda dapat mengatur pesanan perdagangan dua arah yang terbuka untuk menangkap tren naik atau turun.
Menggunakan strategi stop loss dan stop loss dapat secara efektif mengendalikan risiko transaksi tunggal.
Menggunakan metode manajemen dana dengan suku bunga tetap dapat meningkatkan efisiensi penggunaan dana.
Strategi logisnya sederhana, jelas, dan mudah diterapkan.
Strategi ini juga memiliki beberapa risiko yang perlu diperhatikan:
Risiko kesalahan penilaian arah rupture dalam dormansi. Harga mungkin tidak terlihat naik atau turun, menyebabkan kesalahan arah masuk.
Risiko tidak dapat melanjutkan operasi arah setelah terobosan. Terobosan hanya merupakan pembalikan jangka pendek.
Stop loss yang ditembus oleh resiko. Dalam situasi ekstrim mungkin langsung menerobos garis stop loss.
Risiko peningkatan kerugian dengan perkalian tetap. Nilai perkalian tetap dapat dikurangi untuk mengurangi risiko.
Parameter yang tidak tepat dapat menyebabkan kebijakan yang tidak efektif.
Strategi ini juga dapat dioptimalkan dalam beberapa hal:
Meningkatkan sinyal penyaringan untuk menghindari kesalahan penembusan.
Memperbaiki strategi stop loss, seperti stop loss bergerak, stop loss berlambang, dan lain-lain.
Meningkatkan indikator penilaian tren untuk menghindari terbaliknya entry.
Mengoptimalkan nilai perkalian tetap, keseimbangan rasio untung rugi.
Dengan analisis periode waktu yang berbeda, Anda dapat meningkatkan peluang keuntungan.
Mengoptimalkan parameter secara otomatis menggunakan metode pembelajaran mesin.
Strategi berbalik posisi dalam rentang diam memiliki ide yang jelas dan memiliki potensi keuntungan tertentu. Strategi ini dapat meningkatkan stabilitas strategi melalui pengoptimalan parameter, manajemen risiko, dan penyaringan sinyal. Namun, setiap strategi berbalik tren memiliki risiko tertentu, perlu digunakan dengan hati-hati dan menyesuaikan skala posisi dengan tepat.
/*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)