Стратегия отслеживания тренда

Автор:Чао Чжан, Дата: 2024-01-22 17:21:10
Тэги:

img

Обзор

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

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

Стратегия в основном опирается на два индикатора для определения сигналов входа и выхода - высшая функция, которая определяет самую высокую цену за определенный период, и самая низкая функция, которая определяет самую низкую цену за определенный период.

Когда цена закрытия превышает самую высокую цену за определенный период (параметр highPeriod), это считается прорывом тренда вверх, поэтому выпускается длинный сигнал. Когда цена закрытия ниже самой низкой цены за определенный период (параметр lowPeriod), это считается прорывом тренда вниз, поэтому выпускается короткий сигнал.

Стратегия также устанавливает движущийся стоп-лосс и фиксированный стоп-лосс. Движущийся стоп-лосс основан на индикаторе ATR, рассчитанном на значение ATR за определенный период, умноженное на фактор (параметр trailingAtrMultiplier) как уровень движущегося стоп-лосса. Фиксированный стоп-лосс рассчитывается аналогично на основе индикатора ATR.

После длинного или короткого хода фиксированный стоп-лосс вступает в силу для первого бара; затем он переключается на преимущественно движущийся стоп-лосс.

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

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

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

Основными преимуществами этой стратегии являются:

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

  2. Разумный размер позиции и стоп-лосс. Максимальная ставка потери, ассоциация с активами счета и т. д. делают размеры позиций разумными, избегая чрезмерной торговли или неэффективной торговли. Комбинированный стоп-лосс блокирует прибыль и отслеживает движения тренда.

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

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

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

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

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

  1. Риск перелома тренда. Стратегии прорыва в значительной степени зависят от суждения о тренде, если это пойдет не так, могут возникнуть огромные потери.

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

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

Основными решениями являются:

  1. Добавьте фильтры тренда, например, дополнительные индикаторы для проверки на ложные прорывы.

  2. Оптимизировать выбор параметров посредством испытаний на стабильность.

  3. Расслабьте расстояние стоп-лосса надлежащим образом, чтобы выдержать разумные ретрасейки.

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

Основными направлениями оптимизации этой стратегии являются:

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

  2. Оптимизировать параметры настройки. Испытать и найти оптимальные комбинации для параметров, таких как самые высокие / самые низкие ценовые циклы, стоп-лосс коэффициенты множителя и т.д.

  3. Корректировать алгоритм размещения позиций на основе рыночных условий. Например, уменьшить размер позиции при росте волатильности (например, VIX).

  4. Добавьте фильтр объема для подтверждения прорыва, чтобы избежать ложных прорывов.

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

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

Заключение

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

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

В целом это очень практичная стратегия. Ее основная структура уже содержит наиболее важные компоненты для квантовой стратегии. С постоянными оптимизациями и улучшениями она определенно может стать стабильной прибыльной автоматизированной стратегией. Ценна для изучения и ссылки на кванты.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(shorttitle="Trend Surfers - Breakout", title="Trend Surfers - Premium Breakout",
     overlay=true)

// Risk for position and pyramid
maxriskval = input(2, "Max % risk", type = input.float,
     tooltip="Risk % over total equity / Position", group = "Risk Management")
pairnumber = input(title = "How many pairs",type = input.integer, defval= 1,
     tooltip="How many pairs are you trading with the strategy?", group = "Risk Management")

// Emtry Exit
highPeriod = input(title="Highest High Period", type=input.integer, defval=168
     , tooltip="Highest High of X bars - This will trigger a Long Entry when close is above. (Thin Green Line)"
     , group = "Entry Condition")
lowPeriod = input(title="Lowest Low Period", type=input.integer, defval=168,
     tooltip="Lowest low of X bars - This will trigger a Short Entry when close is under. (Thin Red Line)"
     , group = "Entry Condition")
// Stoploss
trailingAtrPeriod = input(title="Trailing ATR Pediod", type=input.integer, defval=10,
     tooltip="Average True Range for the Trailing Stop. (Thick Green Line) "
     , group = "Exit Condition")
trailingAtrMultiplier = input(title="Trailing ATR Multiplier", type=input.float, defval=8
     , group = "Exit Condition")
fixAtrPeriod = input(title="Fix ATR Pediod", type=input.integer, defval=10,
     tooltip="Average True Range for the Fix Stoloss. (Thick Yellow Line)"
     , group = "Exit Condition")
fixAtrMultiplier = input(title="Fix ATR Multiplier", type=input.float, defval=2
     , group = "Exit Condition")
// Pair info 
pair = syminfo.basecurrency + syminfo.currency

// High Low Variable
highestHigh = highest(high, highPeriod)[1]
lowestLow = lowest(low, lowPeriod)[1]
trailingAtr = atr(trailingAtrPeriod) * trailingAtrMultiplier

// Trade Condition
longCondition = crossover(close, highestHigh) 
shortCondition = crossunder(close, lowestLow)

// Risk Variable
fixAtr = atr(fixAtrPeriod) * fixAtrMultiplier
stopvaluelong = close[1] - fixAtr[1]
stopvalueshort = close[1] + fixAtr[1]

// Position size Long
maxpossize = strategy.equity / close 
positionsizelong = ( ( ( (maxriskval/100) * strategy.equity) / (close - stopvaluelong))) 
stopperclong = ((close - stopvaluelong) / close) * 100
leveragelong = max(1, ceil(positionsizelong / maxpossize)) * 2
posperclong =  (((positionsizelong * close) / strategy.equity) *100 / leveragelong) / pairnumber
realposlong = (((posperclong / 100) * strategy.equity) * leveragelong) / close

// Position size Short
positionsizeshort = ( ( ( (maxriskval/100) * strategy.equity) / (stopvalueshort - close))) 
stoppercshort = ((close - stopvalueshort) / close) * 100
leverageshort = max(1, ceil(positionsizeshort / maxpossize)) * 2
pospercshort =  (((positionsizeshort * close) / strategy.equity) *100 / leverageshort) / pairnumber
realposshort = (((pospercshort / 100) * strategy.equity) * leverageshort) / close

// Alert Message
entry_long_message = '\nGo Long for ' + pair + 'NOW!' +
                     '\nPosition Size % =' + tostring(posperclong) +
                     '\nLeverage' + tostring(leveragelong) +
                     '\nStoploss Price =' + tostring(stopvaluelong) +
                     '\nClose any Short position that are open for ' + pair + '!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

entry_short_message ='\nGo Short for ' + pair + 'NOW!' +
                     '\nPosition Size % =' + tostring(pospercshort) +
                     '\nLeverage' + tostring(leverageshort) +
                     '\nStoploss Price =' + tostring(stopvalueshort) +
                     '\nClose any Long position that are open for ' + pair + '!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

exit_short_message = '\nExit Short for ' + pair + 'NOW!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

exit_long_message = '\nExit Long for ' + pair + 'NOW!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'
// Order
if longCondition 
    strategy.entry("Long", strategy.long, stop=highestHigh, comment="Long", qty=realposlong
     , alert_message = entry_long_message)
if shortCondition
    strategy.entry("Short", strategy.short, stop=lowestLow, comment="Short", qty=realposshort
     , alert_message = entry_short_message)

// Stoploss Trailing
longTrailing = close - trailingAtr
shortTrailing = close + trailingAtr

var longTrailingStop = 0.0
var shortTrailingStop = 999999.9

trailingStopLine = 0.0
trailingStopLine := na
fixedStopLine = 0.0
fixedStopLine := na
var inTrade = 0
if longCondition or shortCondition
    if 0 == inTrade
        if longCondition
            inTrade := 1
        else
            inTrade := -1
if 1 == inTrade and (shortCondition or low <= max(fixedStopLine[1], longTrailingStop))
    inTrade := 0
if -1 == inTrade and (longCondition or high >= min(fixedStopLine[1], shortTrailingStop))
    inTrade := 0

longTrailingStop := if (1 == inTrade)
    stopValue = longTrailing
    max(stopValue, longTrailingStop[1])
else
    0

shortTrailingStop := if (-1 == inTrade)
    stopValue = shortTrailing
    min(stopValue, shortTrailingStop[1])
else
    999999

// Fix Stoploss
firstPrice = 0.0
firstFixAtr = 0.0
firstPrice := na
firstFixAtr := na
if 0 != inTrade
    firstPrice := valuewhen(inTrade != inTrade[1] and 0 != inTrade, close, 0)
    firstFixAtr := valuewhen(inTrade != inTrade[1] and 0 != inTrade, fixAtr, 0)
    if 1 == inTrade
        fixedStopLine := firstPrice - firstFixAtr
        trailingStopLine := longTrailingStop
    else
        fixedStopLine := firstPrice + firstFixAtr
        trailingStopLine := shortTrailingStop

if (strategy.position_size > 0)
    strategy.exit(id="L Stop", stop=max(fixedStopLine, longTrailingStop)
     , alert_message = exit_long_message)

if (strategy.position_size < 0)
    strategy.exit(id="S Stop", stop=min(fixedStopLine, shortTrailingStop)
     , alert_message = exit_long_message)
    

// Plot
plot(highestHigh, color=color.green, linewidth=1, transp=0, title='Highest High')
plot(lowestLow, color=color.red, linewidth=1, transp=0, title='Lowest Low')
plot(trailingStopLine, color=color.lime, linewidth=2, transp=0, offset=1, title='Trailing Stop')
plot(fixedStopLine, color=color.orange, linewidth=2, transp=0, offset=1, title='Fixed Stop')

Больше