
Эта стратегия является адаптивной ценовой канализационной стратегией, основанной на среднем истинном диапазоне (ATR) и среднем индексе направления (ADX). Она предназначена для идентификации рынка и тенденций в ценовом движении и торговли соответственно.
Вычислить самые высокие цены ((HH) и самые низкие цены ((LL) на линии K. При этом вычислить ATR на линии K.
+DI и -DI в зависимости от роста и падения цены, затем ADX.
Если ADX<25, то считается, что рынок консолидирован. В этом случае, если цена закрытия превышает верхнюю границу ценового канала ((HH - ATR)*ATR), сделать больше; если цена закрытия ниже нижнего предела ценового канала ((LL + ATR кратное*ATR), свободное место.
Если ADX>=25 и +DI>-DI, то считается, что это бычий рынок. В этом случае, если цена закрытия выше верхнего предела ценового канала, то делается больше.
Если ADX>=25 и +DI<-DI, то рассматривается как рынок с пустой точкой. В этом случае, если цена закрытия ниже нижнего предела ценового канала, делается пустота.
После вхождения в позицию, если выходит за пределы корневой линии K без остановки, вынужденно остановите убыток.
Стратегия может автоматически адаптироваться к рыночным условиям. При использовании стратегии ценового канала в консолидированном рынке, в трендовом рынке следует трендовым направлениям торговли.
Использование индикаторов ATR и ADX обеспечивает самостоятельную адаптацию стратегии. ATR используется для корректировки ширины ценового канала, а ADX - для оценки рыночных тенденций.
Обязательные механизмы хранения убытков способствуют стабильности стратегии.
ADX имеет большую вероятность создания ошибочного сигнала.
Неправильная настройка ATR и ADX может привести к неэффективности стратегии.
Риск того, что мы не сможем эффективно избежать изменений.
Оптимизация параметров ATR и ADX, чтобы улучшить эффективность адаптации.
Увеличение линий стоп-лосса для снижения риска потери.
Добавление фильтров для фильтрации ошибочных сигналов.
Стратегия самоприспособленного ценового канала включает в себя применение нескольких показателей и механизмов, используя различные стратегии в различных ситуациях, обладает определенной самоприспособленностью и стабильностью. Однако из-за ограничений в установке показателей и выборе параметров эта стратегия также подвержена определенному риску ошибочного суждения.
/*backtest
start: 2023-11-03 00:00:00
end: 2023-12-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Adaptive Price Channel Strategy", overlay=true)
length = input(20, title="Length")
exit_length = input(10, title="Exit After X Periods")
atr_multiplier = input(3.2, title="ATR Multiplier")
startDate = input(defval = timestamp("2019-01-15T08:15:15+00:00"), title = "Start Date")
endDate = input(defval = timestamp("2033-04-01T08:15:00+00:00"), title = "End Date")
hh = ta.highest(high, length)
ll = ta.lowest(low, length)
atr = ta.atr(length)
// calculate +DI and -DI
upMove = high - high[1]
downMove = low[1] - low
plusDM = na(upMove[1]) ? na : (upMove > downMove and upMove > 0 ? upMove : 0)
minusDM = na(downMove[1]) ? na : (downMove > upMove and downMove > 0 ? downMove : 0)
plusDI = ta.rma(plusDM, length) / atr * 100
minusDI = ta.rma(minusDM, length) / atr * 100
// calculate ADX
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100
adx = ta.rma(dx, length)
var int barSinceEntry = na
if (not na(close[length]) )
if (adx < 25) // Sideways market
if (close > hh - atr_multiplier * atr)
strategy.entry("PChLE", strategy.long, comment="PChLE")
barSinceEntry := 0
else if (close < ll + atr_multiplier * atr)
strategy.entry("PChSE", strategy.short, comment="PChSE")
barSinceEntry := 0
else if (adx >= 25 and plusDI > minusDI) // Bullish market
if (close > hh - atr_multiplier * atr)
strategy.entry("PChLE", strategy.long, comment="PChLE")
barSinceEntry := 0
else if (adx >= 25 and plusDI < minusDI) // Bearish market
if (close < ll + atr_multiplier * atr)
strategy.entry("PChSE", strategy.short, comment="PChSE")
barSinceEntry := 0
if (na(barSinceEntry))
barSinceEntry := barSinceEntry[1] + 1
else if (barSinceEntry >= exit_length)
strategy.close("PChLE")
strategy.close("PChSE")
barSinceEntry := na
plot(hh, title="Highest High", color=color.green, linewidth=2)
plot(ll, title="Lowest Low", color=color.red, linewidth=2)