Это стратегия прорыва, основанная на отслеживании тренда. она покупает силу, когда происходит прорыв и продает слабость, чтобы отслеживать тренд.
Стратегия в основном опирается на два индикатора для определения сигналов входа и выхода - высшая функция, которая определяет самую высокую цену за определенный период, и самая низкая функция, которая определяет самую низкую цену за определенный период.
Когда цена закрытия превышает самую высокую цену за определенный период (параметр highPeriod), это считается прорывом тренда вверх, поэтому выпускается длинный сигнал. Когда цена закрытия ниже самой низкой цены за определенный период (параметр lowPeriod), это считается прорывом тренда вниз, поэтому выпускается короткий сигнал.
Стратегия также устанавливает движущийся стоп-лосс и фиксированный стоп-лосс. Движущийся стоп-лосс основан на индикаторе ATR, рассчитанном на значение ATR за определенный период, умноженное на фактор (параметр trailingAtrMultiplier) как уровень движущегося стоп-лосса. Фиксированный стоп-лосс рассчитывается аналогично на основе индикатора ATR.
После длинного или короткого хода фиксированный стоп-лосс вступает в силу для первого бара; затем он переключается на преимущественно движущийся стоп-лосс.
Стратегия также устанавливает правила расчета размеров позиций. Основываясь на максимально допустимом проценте потерь, собственном капитале счета и т. д., она рассчитывает соответствующий размер позиции. Она также учитывает количество торговых инструментов, должным образом уменьшая размер позиции для каждого инструмента.
В общем, это типичная стратегия отслеживания тренда. Она вступает, когда она считает, что произошел прорыв, блокирует прибыль и отслеживает тенденции через стоп-лосс, и выходит, когда тенденция меняется.
Основными преимуществами этой стратегии являются:
Использование самых высоких и самых низких цен, чтобы определить, если тенденции перевернулись, точность очень высока и ложные сигналы маловероятны.
Разумный размер позиции и стоп-лосс. Максимальная ставка потери, ассоциация с активами счета и т. д. делают размеры позиций разумными, избегая чрезмерной торговли или неэффективной торговли. Комбинированный стоп-лосс блокирует прибыль и отслеживает движения тренда.
Простая и практичная, понятная и удобная в использовании, основанная только на базовых показателях, а логика проста и понятна.
Индикаторные параметры, правила размещения позиций и т. д. предоставляют пользователям возможности для корректировки по мере необходимости.
В общем, это очень практичная стратегия выхода, безопасная и надежная в суждении, в то время как дизайн учитывает контроль рисков и отслеживание.
Основными рисками этой стратегии являются:
Риск перелома тренда. Стратегии прорыва в значительной степени зависят от суждения о тренде, если это пойдет не так, могут возникнуть огромные потери.
Неправильный параметр риска. Если наивысшие/низшие параметры ценового цикла выбраны неправильно, тенденции могут быть упущены. Неправильные параметры размещения позиций могут привести к чрезмерным потерям.
Слишком агрессивный риск стоп-лосса. Если расстояние движения стоп-лосса слишком мало, рыночный шум может выбить позицию преждевременно.
Основными решениями являются:
Добавьте фильтры тренда, например, дополнительные индикаторы для проверки на ложные прорывы.
Оптимизировать выбор параметров посредством испытаний на стабильность.
Расслабьте расстояние стоп-лосса надлежащим образом, чтобы выдержать разумные ретрасейки.
Основными направлениями оптимизации этой стратегии являются:
Помимо высочайших/низких цен, также можно добавлять такие показатели, как скользящие средние, чтобы сделать определение тренда более точным.
Оптимизировать параметры настройки. Испытать и найти оптимальные комбинации для параметров, таких как самые высокие / самые низкие ценовые циклы, стоп-лосс коэффициенты множителя и т.д.
Корректировать алгоритм размещения позиций на основе рыночных условий. Например, уменьшить размер позиции при росте волатильности (например, VIX).
Добавьте фильтр объема для подтверждения прорыва, чтобы избежать ложных прорывов.
При выборе торговых инструментов следует учитывать спреды и корреляции.
Оптимизировать механизм остановки потери. Испытать различные композиции движущихся и фиксированных остановки потери, чтобы сделать остановки потери менее агрессивными.
Как стратегия отслеживания тренда, эта стратегия хорошо работает в отношении точности суждения, размещения позиций и контроля рисков, простоты работы и т. Д. Она зафиксирует тенденции на ранней стадии и балансирует получение прибыли и отслеживание через движение стоп-потерь.
Разумеется, как стратегия прорыва, она в значительной степени зависит от суждения о тренде и подвержена помехам шума рынка. Плохая настройка параметров также может подорвать производительность. Для решения этих проблем необходимы дальнейшие оптимизации.
В целом это очень практичная стратегия. Ее основная структура уже содержит наиболее важные компоненты для квантовой стратегии. С постоянными оптимизациями и улучшениями она определенно может стать стабильной прибыльной автоматизированной стратегией. Ценна для изучения и ссылки на кванты.
/*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')