Стратегия отслеживания тенденций на основе индекса ATR и волатильности

Автор:Чао Чжан, Дата: 2024-01-04 15:31:34
Тэги:

img

Обзор

Эта стратегия использует средний истинный диапазон (ATR) и индекс CHOP в качестве основных технических индикаторов для выявления и отслеживания тенденций.

Принцип стратегии

  1. Используйте ATR для расчета размера коробки и сооружения канала Renko для определения направления ценового тренда.

  2. Применять индекс CHOP, чтобы судить, пригоден ли рынок для торговли. Этот индекс включает в себя самую высокую цену, самую низкую цену и ATR. Когда он находится между 38,2-61,8, он указывает на низкую волатильность рынка; в противном случае он сигнализирует о высокой волатильности и неуместном торговом рынке.

  3. Когда индекс CHOP прорывается через верхнюю рельсу 61.8, цена вступает в нисходящую тенденцию. Если краткосрочная быстрая EMA также показывает, что цена лидирует, перейдите на короткий. И наоборот, когда CHOP прорывается через нижнюю рельсу 38.2 и краткосрочная EMA повышается, перейдите на длинный.

  4. Используйте стратегию стоп-лосс/приобретения прибыли. Когда цена вновь входит в зону 38.2-61.8 CHOP, закрывайте позицию со стоп-лосом или приобретете прибыль.

Анализ преимуществ

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

  1. Канал Renko, построенный ATR, может эффективно отслеживать тенденции цен.

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

  3. Сочетание быстрой EMA для определения направления краткосрочного тренда позволяет избежать обратной операции.

  4. Стратегия стоп-лосс/прибыль контролирует однократные убытки.

Анализ рисков

Основные риски этой стратегии:

  1. На боковом рынке сигналы ATR и CHOP могут производить неправильные сигналы.

  2. Для определения основных тенденций требуется ручное вмешательство.

  3. Позиция стоп-лосса, установленная слишком свободно, может привести к переувеличению одиночной потери.

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

Эта стратегия может быть оптимизирована в следующих аспектах:

  1. Увеличьте другие вспомогательные индикаторы для определения сигналов, таких как модели свечей, объем и т. Д., Чтобы улучшить точность сигнала.

  2. Оптимизировать параметры ATR и CHOP, чтобы лучше улавливать колебания цен.

  3. Установите динамические позиции стоп-лосса/стоп-лосса для получения большей прибыли и более быстрого стоп-лосса.

  4. Правильно ослабить диапазон стоп-лосса после определения основного тренда, чтобы получить больше прибыли в тренде.

Заключение

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


/*backtest
start: 2022-12-28 00:00:00
end: 2024-01-03 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/
// © sharatgbhat

//@version=4
strategy("Weis Chop Strategy", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 10,max_lines_count = 500, max_labels_count = 500)
maxIdLossPcnt = input(1, "Max Intraday Loss(%)", type=input.float)
// strategy.risk.max_intraday_loss(maxIdLossPcnt, strategy.percent_of_equity)

method = input(defval="ATR", options=["ATR", "Traditional", "Part of Price"], title="Renko Assignment Method")
methodvalue = input(defval=14.0, type=input.float, minval=0, title="Value")
pricesource = input(defval="Close", options=["Close", "Open / Close", "High / Low"], title="Price Source")
useClose = pricesource == "Close"
useOpenClose = pricesource == "Open / Close" or useClose
useTrueRange = input(defval="Auto", options=["Always", "Auto", "Never"], title="Use True Range instead of Volume")
isOscillating = input(defval=false, type=input.bool, title="Oscillating")
normalize = input(defval=false, type=input.bool, title="Normalize")
vol = useTrueRange == "Always" or useTrueRange == "Auto" and na(volume) ? tr : volume
op = useClose ? close : open
hi = useOpenClose ? close >= op ? close : op : high
lo = useOpenClose ? close <= op ? close : op : low

if method == "ATR"
    methodvalue := atr(round(methodvalue))
if method == "Part of Price"
    methodvalue := close / methodvalue

currclose = float(na)
prevclose = nz(currclose[1])
prevhigh = prevclose + methodvalue
prevlow = prevclose - methodvalue
currclose := hi > prevhigh ? hi : lo < prevlow ? lo : prevclose

direction = int(na)
direction := currclose > prevclose ? 1 : currclose < prevclose ? -1 : nz(direction[1])
directionHasChanged = change(direction) != 0
directionIsUp = direction > 0
directionIsDown = direction < 0

barcount = 1
barcount := not directionHasChanged and normalize ? barcount[1] + barcount : barcount
vol := not directionHasChanged ? vol[1] + vol : vol
res = barcount > 1 ? vol / barcount : vol

plot(isOscillating and directionIsDown ? -res : res, style=plot.style_columns, color=directionIsUp ? color.green : color.red, transp=75, linewidth=3, title="Wave Volume")

length = input(14, minval=1)
ci = 100 * log10(sum(atr(1), length) / (highest(length) - lowest(length))) / log10(length)
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(ci, "CHOP", color=#2962FF, offset = offset)
band1 = hline(61.8, "Upper Band", color=#787B86, linestyle=hline.style_dashed)
band0 = hline(38.2, "Lower Band", color=#787B86, linestyle=hline.style_dashed)
fill(band1, band0, color = color.rgb(33, 150, 243, 90), title = "Background")

MomentumBull = close>ema(close,8)
MomentumBear = close<ema(close,8)
Tradecon = crossunder(ci,61.8)

if (MomentumBull and directionIsUp and Tradecon)
	strategy.entry("Buy", strategy.long)
if (MomentumBear and directionIsDown and Tradecon )
    strategy.entry("Sell", strategy.short)
    strategy.exit("exit","Buy",when=directionIsDown,qty_percent=100,profit=20,loss=10)
    strategy.exit("exit","Sell",when=directionIsUp,qty_percent=100,profit=20,loss=10)
    

Больше