Стратегия следования тренду Momentum Turtle


Дата создания: 2023-11-23 11:53:27 Последнее изменение: 2023-11-23 11:53:27
Копировать: 0 Количество просмотров: 360
1
Подписаться
1166
Подписчики

Стратегия следования тренду Momentum Turtle

Обзор

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

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

Эта стратегия использует основную систему прорывов в индексе “океан” для определения направления тренда. В частности, когда цена закрытия выше максимальной цены за последние 20 дней, это является позитивным сигналом; когда цена закрытия ниже минимальной цены за последние 20 дней, это является сигналом понижения.

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

После открытия позиции, стратегия использует значение N для прорыва exit в принципе пирса для остановки. Эта система устанавливает стоп-пойнт на основе наивысшей и наименьшей цены за последние 20 дней. Например, многократная стоп-стоп-цена составляет ATR 2N ниже минимальной цены за последние 20 дней.

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

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

В частности, эта стратегия имеет следующие преимущества:

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

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

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

  1. Невозможно решить проблему избыточной волатильности долгосрочного хранения позиций. Размер позиций в системе шейдинга не учитывает волатильность, что может привести к избыточным потерям.
  2. В случае резкого переворота цены стоп-лосса могут быть превышены, что приводит к убыткам, превышающим ожидания.
  3. Система не устанавливает целевой прибыли, что может привести к избыточному удержанию позиций. Это может привести к риску потери прибыли.

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

По данным анализа рисков, описанным выше, существуют следующие основные направления оптимизации стратегии:

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

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

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

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

//@version=4
strategy("Heiken Ashi BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2029, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// HA /////////////
haTicker = heikinashi(syminfo.tickerid)
haOpen = security(haTicker, "D", open)
haHigh = security(haTicker, "D", high)
haLow = security(haTicker, "D", low)
haClose = security(haTicker, "D", close)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = haOpen < haClose and isMoving()
short = haOpen > haClose and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
plotcandle(haOpen, haHigh, haLow, haClose, title='HA Candles', color = haOpen < haClose ? color.lime : color.red)
bgcolor(isMoving() ? long ? color.lime : short ? color.red : na : color.white, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)