Стратегия стоп-лосса с несколькими временными рамками

Автор:Чао Чжан, Дата: 2024-01-08 11:24:24
Тэги:

img

Обзор

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

В этой стратегии вы можете использовать только остановки ATR и выбрать 3 другие более высокие временные рамки в дополнение к вашему текущему временному рамку. Последующая потеря остановки от всех этих временных рамок будет показана на графике. Введите длинную позицию, если все 4 временных рамок согласны на длинный сигнал. Закройте длинные позиции, когда по крайней мере 2 временных рамок не согласны на длинный сигнал. Логика для коротких позиций такая же.

Логика стратегии

Основой этой стратегии является отслеживание стоп-лосса и следование тренду. Отслеживание стоп-лосса используется для установки уровня стоп-лосса на основе значения ATR, который может эффективно предотвратить попадание стоп-лосса. Следование тренду определяет вход на основе наблюдения за направлением тренда в разные временные рамки.

В частности, стратегия сначала рассчитывает значение ATR на разных временных рамках и устанавливает расстояние стоп-лосса. Затем она генерирует длинные / короткие сигналы, когда цена проходит через уровень стоп-лосса. Если сигналы из нескольких временных рамок согласны, позиция будет занята. После этого продолжайте отслеживать уровень стоп-лосса по направлению тренда. Если сигналы из определенного процента временных рамок обратны, закрыть позицию.

Объединяя суждение о тренде в разные периоды, можно эффективно отфильтровать поддельные прорывы.

Преимущества

  1. Использование нескольких временных рамок помогает отфильтровать шум и определить направление тренда
  2. ATR отстаивает дистанцию остановки динамически, снижая вероятность остановки
  3. Комбинируя тренд следуя и стоп-потеря управления, вы можете следовать тренду и остановиться вовремя
  4. Немногие параметры, легко понять и оптимизировать

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

  1. Остановка ATR может быть слишком близко или слишком далеко, если параметры не установлены правильно, склонны к тому, чтобы быть сбит или остановить расстояние слишком большой
  2. Комбинация нескольких временных рамок может не работать эффективно или ошибочно судить, если параметры не установлены правильно
  3. Необходимо правильно настроить параметры стоп-лосса и временных рамок, в противном случае не может быть достигнуто наилучших результатов

Решения:

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

Руководство по оптимизации

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

  1. Добавление/уменьшение количества временных рамок для поиска наилучших комбинаций для оценки тренда
  2. Испытать различные ATR-множители для определения оптимального расстояния остановки
  3. Добавить механизм повторного входа для создания новых позиций по мере продолжения тренда
  4. Включить другие фильтры на входные сигналы, например, индикаторы объема и т.д.
  5. Настройка параметров для различных продуктов

Заключение

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


/*backtest
start: 2023-01-01 00:00:00
end: 2024-01-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="MTF Trailing SL Strategy [QuantNomad]", shorttitle = "MTF TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

////////////
// Inputs //

atr_length = input(14,    title = "ATR Length")
atr_mult   = input(2,     title = "ATR Mult",    type = input.float)

tf2 = input('120', title = "TF2", type = input.string)
tf3 = input('180', title = "TF3", type = input.string)
tf4 = input('240', title = "TF4", type = input.string)

// BACKTESTING RANGE
// From Date Inputs
fromDay   = input(defval = 1,    title = "From Day",   minval = 1, maxval = 31)
fromMonth = input(defval = 1,    title = "From Month", minval = 1, maxval = 12)
fromYear  = input(defval = 2016, title = "From Year",  minval = 1970)
 
// To Date Inputs
toDay   = input(defval = 1,    title = "To Day",   minval = 1, maxval = 31)
toMonth = input(defval = 1,    title = "To Month", minval = 1, maxval = 12)
toYear  = input(defval = 2100, title = "To Year",  minval = 1970)
 
// Calculate start/end date and time condition
startDate  = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear,   toMonth,   toDay,   00, 00)

time_cond = time >= startDate and time <= finishDate

//////////////////
// CALCULATIONS //


tsl() => 
    // SL values
    sl_val = atr_mult * atr(atr_length)
     
    // Init Variables
    pos         = 0
    trailing_sl = 0.0
    
    // Signals
    long_signal  = nz(pos[1]) !=  1 and high > nz(trailing_sl[1])
    short_signal = nz(pos[1]) != -1 and low  < nz(trailing_sl[1]) 
    
    // Calculate SL
    trailing_sl := short_signal     ? high + sl_val : 
                   long_signal      ? low  - sl_val : 
                   nz(pos[1]) ==  1 ? max(low  - sl_val, nz(trailing_sl[1])) :  
                   nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) : 
                   nz(trailing_sl[1])
                   
    // Position var               
    pos := long_signal  ? 1 : short_signal ? -1 : nz(pos[1]) 
    trailing_sl
    
    
trailing_sl1 = tsl()
trailing_sl2 = security(syminfo.tickerid, tf2, tsl())
trailing_sl3 = security(syminfo.tickerid, tf3, tsl())
trailing_sl4 = security(syminfo.tickerid, tf4, tsl())

pos1 = 0
pos1 := low <= trailing_sl1 ? -1 : high >= trailing_sl1 ? 1 : nz(pos1[1])

pos2 = 0
pos2 := low <= trailing_sl2 ? -1 : high >= trailing_sl2 ? 1 : nz(pos2[1])

pos3 = 0
pos3 := low <= trailing_sl3 ? -1 : high >= trailing_sl3 ? 1 : nz(pos3[1])

pos4 = 0
pos4 := low <= trailing_sl4 ? -1 : high >= trailing_sl4 ? 1 : nz(pos4[1])

total_pos = pos1 + pos2 + pos3 + pos4

//////////////
// PLOTINGS //

plot(trailing_sl1, linewidth = 2 , color = pos1 == 1 ? color.green : color.red, title = "TSL TF1")
plot(trailing_sl2, linewidth = 2 , color = pos2 == 1 ? color.green : color.red, title = "TSL TF2", transp = 25)
plot(trailing_sl3, linewidth = 2 , color = pos3 == 1 ? color.green : color.red, title = "TSL TF3", transp = 50)
plot(trailing_sl4, linewidth = 2 , color = pos4 == 1 ? color.green : color.red, title = "TSL TF4", transp = 75)

//////////////
// STRATEGY //

//strategy.entry("long",  true,  stop = trailing_sl1)
//strategy.entry("short", false, stop = trailing_sl1)

strategy.entry("long",    true, when = total_pos ==  4)
strategy.entry("short",  false, when = total_pos == -4)

strategy.close("long",  when = total_pos <= 0)
strategy.close("short", when = total_pos >= 0)


Больше