Стратегия торговли с выходом из диапазона волатильности

Автор:Чао Чжан, Дата: 2023-09-21 20:38:29
Тэги:

Обзор

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

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

Основным показателем является историческая волатильность цены.

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

  2. Вычислить среднее значение наивысшей и наименьшей цены по N штрих, avg ((H, L)

  3. Волатильность = HL/avg ((H, L)

где N - параметр Должина волатильности.

После получения волатильности диапазоны рассчитываются как:

Верхняя полоса = текущее закрытие + текущее закрытие * Волатильность

Нижняя полоса = текущее закрытие - текущее закрытие * Волатильность

Затем полосы сглаживаются WMA с периодом, установленным как средняя длина.

Когда цена проходит выше верхней полосы, делайте длинный ход. Когда цена проходит ниже нижней полосы, делайте короткий.

Сигналы выхода определяются Тип выхода:

  1. Если тип выхода - Volatility MA, выйти, когда цена снова пересекает WMA.

  2. Если тип выхода - это пересечение диапазона, выйти, когда цена пересекает обратно ниже диапазонов.

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

  • Волатильность отслеживает тенденции
  • WMA делает полосы более стабильными и надежными
  • Сигналы прорыва ловят тенденцию своевременного изменения
  • Выходы, основанные на WMA/диапазонах, быстро сокращают убытки
  • Большое пространство для настройки параметров для разных рынков

Риски

  • Прорывы могут привести к изменению цены
  • Риск больших потерь при изменении тренда
  • WMA иногда отстает в обнаружении поворотов тренда
  • Оптимизация параметров не проста, требует много проб и ошибок
  • Более крупные вычеты, необходимо хорошее управление рисками

Риски могут быть уменьшены:

  • Оптимизация параметров для более надежных полос
  • Добавление других показателей для избежания сбоев
  • Меньшие размеры и лучшее управление рисками
  • Рассмотрение повторного въезда

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

Стратегия может быть улучшена путем:

  1. Настройка параметров

Проверьте различные значения длины, чтобы найти оптимальные комбинации.

  1. Добавление других показателей

Например, когда цена превышает верхнюю полосу, проверьте, не пересекается ли и MACD.

  1. Лучше остановить потерю

Оптимизирую для остановок на задней стороне вместо простых остановок на перерыве диапазона.

  1. Повторные входы

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

  1. Размеры позиций

Динамически корректировать размеры на основе волатильности рынка.

Резюме

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


/*backtest
start: 2023-09-13 00:00:00
end: 2023-09-20 00:00:00
period: 5m
basePeriod: 1m
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/
// © wbburgin

//@version=5
strategy("Volatility Range Breakout Strategy [wbburgin]", shorttitle = "VRB Strategy [wbburgin]", overlay=true,
 pyramiding=20,max_bars_back=2000,initial_capital=10000)

wma(float priceType,int length,float weight) =>
    norm = 0.0
    sum = 0.0
    for i = 0 to length - 1
        norm := norm + weight
        sum := sum + priceType[i] * weight
    sum / norm

// This definition of volatility uses the high-low range divided by the average of that range.
volatility(source,length) =>
    h = ta.highest(source,length)
    l = ta.lowest(source,length)
    vx = 2 * (h - l) / (h + l)
    vx

vm1 = input.int(100,"Average Length")
volLen = input.int(100,"Volatility Length")
vsrc = input.source(close,"Volatility Source")
cross_type = input.source(close,"Exit Source")
exit_type = input.string("Volatility MA",options=["Volatility MA","Range Crossover"],title="Exit Type")

volatility = volatility(vsrc,volLen)

highband1 = close + (close * volatility)
lowband1 = close - (close * volatility)
hb1 = wma(highband1,vm1,volatility)
lb1 = wma(lowband1,vm1,volatility)
hlavg = math.avg(hb1,lb1)

upcross = ta.crossover(high,hb1)    //Crossing over the high band of historical volatility signifies a bullish breakout
dncross = ta.crossunder(low,lb1)    //Crossing under the low band of historical volatility signifies a bearish breakout

vlong = upcross
vshort = dncross
vlong_exit = switch
    exit_type == "Volatility MA" => ta.crossunder(cross_type,hlavg)
    exit_type == "Range Crossover" => ta.crossunder(cross_type,hb1)
vshort_exit = switch
    exit_type == "Volatility MA" => ta.crossover(cross_type,hlavg)
    exit_type == "Range Crossover" => ta.crossover(cross_type,lb1)

if vlong
    strategy.entry("Long",strategy.long)
if vlong_exit
    strategy.close("Long")
if vshort
    strategy.entry("Short",strategy.short)
if vshort_exit
    strategy.close("Short")

plot(hlavg,color=color.white,title="Weighted Volatility Moving Average")
t = plot(hb1,color=color.new(color.red,50),title="Volatility Reversal Band - Top")
b = plot(lb1,color=color.new(color.green,50),title="Volatility Reversal Band - Bottom")

alertcondition(vlong,"Volatility Long Entry Signal")
alertcondition(vlong_exit,"Volatility Long Exit Signal")
alertcondition(vshort,"Volatility Short Entry Signal")
alertcondition(vshort_exit,"Volatility Short Exit Signal")

fill(t,b,color=color.new(color.aqua,90))

Больше