
Стратегия обратного обращения в спящем диапазоне использует период снижения волатильности цен в качестве сигнала для создания позиции и получения прибыли при возобновлении волатильности цен. Она используется для выявления ситуации, когда цены ограничены узким диапазоном спящего колебания, чтобы захватить предстоящую ценовую тенденцию.
Сначала стратегия идентифицирует спящий диапазон, то есть ситуацию, когда цена была ограничена в пределах ценового диапазона предыдущего торгового дня. Это означает, что текущая волатильность снизилась за несколько дней до этого. Мы оцениваем, соответствует ли она условиям спящего диапазона, сравнивая самую высокую цену текущего торгового дня с самой высокой ценой n дней назад (обычно 4 дня) и сравнивая самую низкую цену текущего торгового дня с самой низкой ценой n дней назад.
После того, как диапазон покоя был подтвержден, стратегия открывает одновременно два привязки: привязку для покупки, расположенную вблизи высоких точек диапазона, и привязку для продажи, расположенную вблизи низких точек диапазона. Затем ожидание, пока цена не прорвет диапазон покоя, чтобы продолжить движение вверх или вниз.
После создания позиции, стратегия устанавливает стоп-лосс и стоп-скрит. Стоп-скрит ограничивает риск снижения, стоп-скрит используется для ликвидации позиции после получения прибыли. Стоп-скрит находится на пропорциональном расстоянии от цены входа, которое определяется параметрами управления риском; стоп-скрит находится на расстоянии от цены входа в виде отключенного диапазона, поскольку мы ожидаем, что масштаб движения цены будет соответствовать предыдущему количеству колебаний.
Наконец, стратегия также включает в себя модуль управления капиталом. С помощью фиксированного множителя регулируйте объем торгов заказа, чтобы увеличить уровень использования капитала при прибыли и снизить риск при убытке.
Эта стратегия имеет следующие преимущества:
Используйте время снижения волатильности в качестве сигнала для создания позиции, чтобы поймать возможность до того, как произойдет ценовой тренд.
При этом устанавливаются многополые двунаправленные торговые ордера, которые могут улавливать тенденции к росту или падению.
Применение стратегии “стоп-стоп” позволяет эффективно контролировать риски по одной сделке.
Использование методов управления средствами с фиксированным коэффициентом может повысить эффективность использования средств.
Логика стратегии проста, ясна и проста в реализации.
В этой стратегии также есть некоторые риски, о которых следует помнить:
Риск ошибочного суждения о направлении разрыва спящего диапазона. Цены могут не пробиваться ни вверх, ни вниз, что приводит к ошибочному направлению входа.
Риск, что после прорыва невозможно продолжить направленную работу. Прорыв - это лишь кратковременный поворот.
Опасность того, что остановка будет пробита. В экстремальных ситуациях может быть прямое прорыв линии остановки.
Риск увеличения убытков при использовании метода фиксированного множителя. Можно снизить значение фиксированного множителя, чтобы уменьшить риск.
Неправильно настроенные параметры могут привести к неэффективности стратегии.
Эта стратегия также может быть оптимизирована в следующих аспектах:
Добавление фильтрации отклонения от прорыва, чтобы избежать ошибочного прорыва.
Улучшение стратегий по прекращению убытков, например, перемещение убытков, привязка к списку убытков и т. д.
Повышение показателей по оценке трендов, чтобы избежать обратного входа в рынок.
Оптимизация фиксированного коэффициента, сбалансированная прибыльно-неприбыльная доля.
Повышение вероятности получения прибыли в сочетании с анализом нескольких временных циклов
Автоматическая оптимизация параметров с использованием методов машинного обучения.
Общая концепция стратегии обратного обращения в спящем диапазоне ясна и имеет определенный потенциал для получения прибыли. С помощью оптимизации параметров, управления рисками, фильтрации сигналов и других средств можно дополнительно повысить стабильность стратегии. Однако любая стратегия обратного обращения в тренде имеет определенный риск.
/*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)