
A estratégia de reversão do intervalo de hibernação utiliza períodos de baixa volatilidade dos preços como sinais de construção de posições e ganha posições de compensação quando a volatilidade dos preços aumenta novamente. Identifica situações em que os preços estão confinados a um intervalo de hibernação de estreita oscilação para capturar a tendência de preços que está prestes a estourar.
A estratégia identifica primeiro o intervalo de hibernação, ou seja, quando o preço está confinado dentro do intervalo de preços do dia anterior. Isso indica que a flutuação atual diminuiu nos dias anteriores. Comparamos os preços mais altos do dia de negociação atual com os preços mais altos de n dias atrás (geralmente 4 dias) e os preços mais baixos do dia de negociação atual com os preços mais baixos de n dias atrás para determinar se os preços estão dentro do intervalo de hibernação.
Uma vez que o intervalo de hibernação é confirmado, a estratégia abre duas ofertas de suspensão ao mesmo tempo: uma de compra suspensa perto do ponto alto do intervalo e uma de venda suspensa perto do ponto baixo do intervalo. Em seguida, espera que o preço quebre o intervalo de hibernação para continuar a operar para cima ou para baixo.
Após a criação de uma posição, a estratégia configura um stop loss e um stop loss. O stop loss limita o risco de queda e o stop loss é usado para fechar uma posição após o lucro. O stop loss está a uma distância proporcional do preço de entrada, que é definida pelos parâmetros de gerenciamento de risco.
Por fim, a estratégia também inclui um módulo de gestão de fundos. Ajustar o volume de capital de negociação de pedidos por meio de um método de multiplicador fixo, aumentando a utilização de fundos em caso de lucro e reduzindo o risco em caso de perda.
A estratégia tem as seguintes vantagens:
O uso de um momento de baixa volatilidade como sinal de posição pode ser usado para capturar oportunidades antes de uma tendência de preço.
Ao mesmo tempo, coloque uma ordem de negociação bidirecional multi-vocal para capturar a tendência ascendente ou descendente.
O uso de estratégias de stop loss e stop-loss pode ser eficaz para controlar o risco de uma única transação.
A aplicação de métodos de gerenciamento de fundos de taxa fixa pode melhorar a eficiência do uso de fundos.
A lógica da estratégia é simples, clara e fácil de implementar.
A estratégia também apresenta alguns riscos que devem ser lembrados:
Risco de erro de julgamento na direção da ruptura do intervalo de hibernação. Os preços podem subir ou descer sem que a ruptura seja visível, resultando em erro de direção de entrada.
Risco de não poder continuar a operar direcionalmente após a ruptura. A ruptura é apenas uma reversão de curto prazo.
Risco de ruptura do stop loss. Em situações extremas, o stop loss pode ser ultrapassado.
O risco de expansão dos prejuízos por multiplicação fixa pode ser reduzido para minimizar o risco.
A definição de parâmetros errada pode levar a um mau desempenho da política.
A estratégia também pode ser melhorada em alguns aspectos:
Aumentar o sinal de filtragem de distanciamento de brecha para evitar brechas erradas.
Melhorar as estratégias de stop loss, como stop loss móvel, stop loss pendente, etc.
Aumentar os indicadores de tendência e evitar a reversão de entrada.
Otimizar o valor da multiplicidade fixa e equilibrar o lucro-perda.
Combinação de análises de vários períodos de tempo para aumentar a probabilidade de lucro.
Parâmetros de otimização automática usando métodos de aprendizagem de máquina.
A estratégia de reversão de tendência em repouso tem uma visão geral clara e tem um certo potencial de lucro. A estabilidade da estratégia pode ser melhorada através de meios como otimização de parâmetros, gerenciamento de risco e filtragem de sinais. No entanto, qualquer estratégia de reversão de tendência apresenta um certo risco.
/*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)