Стратегия тренда ATR с возвратом к среднему значению


Дата создания: 2023-09-21 11:42:06 Последнее изменение: 2023-09-21 11:42:06
Копировать: 1 Количество просмотров: 704
1
Подписаться
1617
Подписчики

Обзор

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

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

  1. Измерение ценовой волатильности с помощью показателя ATR. Вычислить значение ATR за последние 20 циклов и вычислить его скользящие средние и стандартное расхождение. Если текущее значение ATR превышает среднее значение плюс стандартное расхождение, считается, что цена колеблется высоко.

  2. Для определения ценового тренда используется первостепенный коэффициент изменения цены на параллельные числительные. Для определения ценового тренда используется коэффициент изменения цены на параллельные числительные за последние 20 циклов, для вычисления их скользящего среднего значения. Если текущий коэффициент изменения в течение 3 последовательных дней превышает среднее значение и является положительным, то считается, что цена находится в восходящей тенденции.

  3. При высокой волатильности цены, когда цены имеют тенденцию к росту, открывайте дополнительные позиции. Когда цены возвращаются назад, цена стоп-лосса срабатывает. Динамическая коррекция стоп-лосса всегда сохраняется между минимальной ценой минус ATR в 2 раза.

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

  1. Воспользуйтесь высокой и низкой волатильностью цен и тенденциями, чтобы избежать частых сделок на колеблющихся рынках.

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

  3. Отзывы показывают, что в период с 2015 по 2021 год годовая доходность стратегии составила 159%, что намного больше, чем 120% в случае стратегии Buy and Hold.

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

  1. Слишком радикальная настройка параметров ATR может привести к недостаточному количеству входов. Параметры могут соответственно расширяться для увеличения частоты входов.

  2. Тенденционные показатели могут привести к ошибочным суждениям, не соответствующим фактическим тенденциям, следует добавить подтверждающие факторы, чтобы избежать потенциальных убытков.

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

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

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

  1. Добавление индикаторов подтверждения тренда, таких как MACD, KDJ и т. д., позволяет более точно определить направление тренда.

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

  3. Добавление модуля для определения прорыва, настройка фактора ускорения тренда, увеличение позиции при появлении прорыва.

  4. Испытание эффективности различных методов устранения убытков, таких как устранение процентов, устранение колебаний и т. д.

  5. Оценка количества сделок, стабильности кривой прибыли, максимального вывода и т. д. обеспечивает стабильность стратегии.

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

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

Исходный код стратегии
/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 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/
// © DojiEmoji (kevinhhl)

//@version=4
strategy("Mean Reversion (ATR) Strategy [KL]",overlay=true,pyramiding=1)
ENUM_LONG = "Long"

// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2000 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }

// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
    TSL_line_color := color.black
    stop_loss_price := TSL_source - ATR_X2_TSL 
else if strategy.position_size > 0
    stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
    TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }

// Variables for confirmations of entry {
_len_volat = input(20,title="Length of ATR to determine volatility")
_ATR_volat = atr(_len_volat)
_avg_atr = sma(_ATR_volat, _len_volat)
_std_volat = stdev(_ATR_volat,_len_volat)
signal_diverted_ATR = _ATR_volat > (_avg_atr + _std_volat) or _ATR_volat < (_avg_atr - _std_volat)

_len_drift = input(20,title="Length of Drift")//default set to const: _len_vol's default value
_prcntge_chng = log(close/close[1])
_drift = sma(_prcntge_chng, _len_drift) - pow(stdev(_prcntge_chng, _len_drift),2)*0.5
_chg_drift = _drift/_drift[1]-1
signal_uptrend = (_drift > _drift[1] and _drift > _drift[2]) or _drift > 0

entry_signal_all = signal_diverted_ATR and signal_uptrend
// }

alert_per_bar(msg)=>
    prefix = "[" + syminfo.root + "] "
    suffix = "(P=" + tostring(close) + "; atr=" + tostring(_ATR_volat) + ")"
    alert(tostring(prefix) + tostring(msg) + tostring(suffix), alert.freq_once_per_bar)

// MAIN {
if within_timeframe

    if strategy.position_size > 0 and strategy.position_size[1] > 0 and (stop_loss_price/stop_loss_price[1]-1) > 0.005
        alert_per_bar("TSL raised to " + tostring(stop_loss_price))

    // EXIT:
	if strategy.position_size > 0 and TSL_source <= stop_loss_price
	    exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
        strategy.close(ENUM_LONG, comment=exit_msg)
    // ENTRY:
    else if entry_signal_all and (strategy.position_size == 0 or (strategy.position_size > 0 and close > stop_loss_price))
		entry_msg = strategy.position_size > 0 ? "adding" : "initial"
		strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)

if strategy.position_size == 0
    stop_loss_price := float(0)
// }