Стратегия ADX Smart Trend Follow


Дата создания: 2023-11-28 14:04:00 Последнее изменение: 2023-11-28 14:04:00
Копировать: 0 Количество просмотров: 884
1
Подписаться
1617
Подписчики

Стратегия ADX Smart Trend Follow

Обзор

Интеллектуальная стратегия отслеживания трендов ADX использует средний индекс трендов ((ADX) для определения силы тренда, для захвата тренда в слабые времена и для отслеживания прибыли в сильных тенденциях. Эта стратегия определяет силу тренда и одновременно объединяет ценовые прорывы для получения торговых сигналов.

Стратегический принцип

Эта стратегия основана на среднем трендовом индексе (ADX) для определения силы текущего тренда. ADX представляет собой среднее значение DIRECTIONAL INDICATOR для колебаний цены в течение определенного периода.

В частности, стратегия сначала рассчитывает значение ADX на 14 циклов, а ниже 18 считается слабым трендом. Затем рассчитывается диапазон, в котором формируются диапазоны наивысшей и наименьшей цены на последних 20 K-линий. Когда цена прорывает эту диапазон, создаются сигналы покупки и продажи. Стоп-расстояние составляет 50% от размера диапазона, стоп-расстояние составляет 100% от размера диапазона.

Эта стратегия одновременно сочетает в себе суждение о силе тренда и сигналы обрыва, позволяя ловить при слабом тренде и входить в сортировку, избегая частых торгов в неорганизованной ситуации. А при сильной тенденции, остановка имеет больший диапазон, что позволяет получить больше прибыли.

Стратегические преимущества

  1. В сочетании с рассуждением о силе тренда, можно избежать частых сделок в беспорядочной обстановке.
  2. Прорыв в рамке добавляет определенную фильтрацию, чтобы избежать попадания в колебания.
  3. Например, в случае, если у вас есть более высокий уровень дохода, вы можете получить больше возможностей для сдерживания в тренде.
  4. Можно настроить параметры ADX, параметры квадратов, коэффициент остановки ущерба и т. Д., Приспосабливаясь к различным видам.

Стратегический риск

  1. Неправильная настройка параметров ADX может привести к пропуску тенденции или ошибочному суждению.
  2. Слишком большие и слишком маленькие рамки могут повлиять на эффективность.
  3. Неправильный коэффициент остановки ущерба может привести к слишком малому ущербу или слишком раннему остановке.

Оптимизация может быть достигнута путем корректировки параметров ADX, параметров квадратов, коэффициента остановки убытков и т. Д., Чтобы сделать его более подходящим для различных видов и рыночных условий. При этом важно строгое управление средствами, контролируя соотношение одиночных убытков, чтобы избежать больших одиночных убытков.

Направление оптимизации стратегии

  1. Параметры ADX могут быть использованы для тестирования различных эффектов цикла.
  2. Параметры квадрата позволяют тестировать различные длины, чтобы определить оптимальный размер диапазона.
  3. Коэффициент сдерживания убытков может быть изменен, оптимизируя риск-прибыль соотношение.
  4. Можно проверить эффективность односторонних сделок только с лишним и только с пустым оборотом.
  5. Можно комбинировать с другими показателями, например, с показателями повышенной мощности.

Подвести итог

Интеллектуальная стратегия отслеживания трендов ADX в целом является более стабильной стратегией отслеживания трендов. Она одновременно сочетает в себе суждение о силе тренда и сигналы об обрыве цены, в какой-то степени избегая проблемы отслеживания высоких и низких колебаний в обычной стратегии отслеживания трендов.

Исходный код стратегии
/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Developer: Andrew Palladino. 
//Creator: Rob Booker.
//Date: 9/29/2017
//@version=5
//Date: 08/10/2022
//Updated to V5 from V1, default cash settings added and indicators made more easily visible by:
// @ Powerscooter

strategy("Rob Booker - ADX Breakout", shorttitle="ADX Breakout V5", overlay=true, default_qty_type = strategy.cash, default_qty_value = 100000, initial_capital = 100000)

adxSmoothPeriod = input(14, title="ADX Smoothing Period", group = "ADX Settings")
adxPeriod = input(14, title="ADX Period", group = "ADX Settings")
adxLowerLevel = input(18, title="ADX Lower Level", group = "ADX Settings")
boxLookBack = input(20, title="BreakoutBox Lookback Period", group = "BreakoutBox")
profitTargetMultiple = input(1.0, title="Profit Target Box Width Multiple", group = "Take Profit and Stop Loss")
stopLossMultiple = input(0.5, title="Stop Loss Box Width Multiple", group = "Take Profit and Stop Loss")
enableDirection = input(0, title="Both(0), Long(1), Short(-1)", group = "Trade Direction")


// When the ADX drops below threshold limit, then we consider the pair in consolidation. 
// Set Box around highs and lows of the last 20 candles. with upper and lower boundaries. 
// When price breaks outside of box, a trade is taken. (on close or on touch?)
// Stop is placed, default 50%, of the size of the box. So if box is 200 pips, stop is at 100 pips. 
// Profit target is 100% of the size of the box. Default. User can set a profit target of 0.5, 1 full size, 2 or 3. 


dirmov(len) =>
	up = ta.change(high)
	down = -ta.change(low)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

adxHigh(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	plus
	
adxLow(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	minus
	
sig = adx(adxSmoothPeriod, adxPeriod)
//sigHigh = adxHigh(dilen, adxlen)
//sigLow = adxLow(dilen, adxlen)

isADXLow = sig < adxLowerLevel

//boxUpperLevel = ta.highest(high, boxLookBack)[1]
//boxLowerLevel = ta.lowest(low, boxLookBack)[1]

var float boxUpperLevelCarry = 0
var float boxLowerLevelCarry = 0

boxUpperLevel = strategy.position_size == 0 ? ta.highest(high, boxLookBack)[1] : boxUpperLevelCarry
boxUpperLevelCarry := boxUpperLevel
boxLowerLevel = strategy.position_size == 0 ? ta.lowest(low, boxLookBack)[1] : boxLowerLevelCarry
boxLowerLevelCarry := boxLowerLevel

boxWidth = boxUpperLevel - boxLowerLevel

profitTarget = strategy.position_size > 0  ? strategy.position_avg_price + profitTargetMultiple*boxWidth : strategy.position_size < 0 ?  strategy.position_avg_price - profitTargetMultiple*boxWidth : na
stopLoss = strategy.position_size > 0 ? strategy.position_avg_price - stopLossMultiple*boxWidth : strategy.position_size < 0 ? strategy.position_avg_price + stopLossMultiple*boxWidth : na

plot(strategy.position_size == 0 ? boxUpperLevel : na, color=color.white, style = plot.style_linebr)
plot(strategy.position_size == 0 ? boxLowerLevel : na, color=color.white, style = plot.style_linebr)


bgcolor(isADXLow ? color.purple : na, transp=72, title = "ADX limit")
plot(stopLoss, color=color.red, linewidth=2, style = plot.style_linebr, title="StopLossLine")
plot(profitTarget, color=color.blue, linewidth=2, style = plot.style_linebr, title="ProfitTargetLine")

isBuyValid = strategy.position_size == 0 and ta.cross(close, boxUpperLevel) and isADXLow

//Long Entry Condition
strategy.exit("close_long", from_entry="open_long", limit = profitTarget, stop = stopLoss)
if isBuyValid and strategy.opentrades == 0 and (enableDirection == -1 or enableDirection == 0)
    strategy.entry("open_long", strategy.long)

isSellValid = strategy.position_size == 0 and ta.cross(close, boxLowerLevel) and isADXLow

//Short Entry condition
strategy.exit(id="close_short", from_entry="open_short", limit = profitTarget, stop = stopLoss)
if isSellValid and strategy.opentrades == 0 and (enableDirection == 1 or enableDirection == 0)
    strategy.entry("open_short", strategy.short)