Торговая стратегия фильтра двойной волны вибрации


Дата создания: 2023-11-13 10:38:20 Последнее изменение: 2023-11-13 10:38:20
Копировать: 1 Количество просмотров: 2569
1
Подписаться
1617
Подписчики

Торговая стратегия фильтра двойной волны вибрации

Обзор

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

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

Эта стратегия использует два индикатора плавных колебаний диапазона с разными длинами циклов: индикатор быстрого колебания диапазона ((дифолтный цикл 27) и индикатор медленного колебания диапазона ((дифолтный цикл 55)). Формула расчета индикатора колебаний диапазона такова: показательная средняя колебания величины колебаний цены в текущем цикле умножена на множество ((например, 1.6)).

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

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

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

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

Стратегические преимущества

При помощи двойной волны фильтрации возникают следующие эффекты:

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

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

  3. Добавление условий фильтрации направления цены позволяет уменьшить ошибочные сигналы, вызванные краткосрочными колебаниями.

  4. Торговая логика проста, понятна, легко понятна и подходит для количественных сделок.

Стратегический риск

При использовании двойных волн фильтрации возникают некоторые риски:

  1. В зависимости от показателя волатильности, в низко волатильных рынках это может быть неэффективно.

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

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

  4. В условиях высокой волатильности может потребоваться корректировка настройки точки остановки. Слишком радикальные точки остановки часто остановляются.

Оптимизация стратегии

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

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

  2. Присоединение к механизму корректировки стоп-позиций в соответствии с последними динамическими колебаниями ставки, оптимизация стратегии стоп-убытков.

  3. Добавление фильтров, основанных на отклонении цен от колебаний, чтобы избежать ошибочных сигналов.

  4. В сочетании с другими показателями, такими как изменение объема торгов, повышается определенность входа.

  5. Испытание и включение механизмов выхода из сдерживания, подходящих для стратегии.

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

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

Исходный код стратегии
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 30m
basePeriod: 15m
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/
// © colinmck, greenmask9

//@version=4

strategy(title="Twin Range Filter Algo", overlay=true)

source = input(defval=close, title="Source")

// Smooth Average Range

per1 = input(defval=27, minval=1, title="Fast period")
mult1 = input(defval=1.6, minval=0.1, title="Fast range")

per2 = input(defval=55, minval=1, title="Slow period")
mult2 = input(defval=2, minval=0.1, title="Slow range")

smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper) * m
    smoothrng
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2

// Range Filter

rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : 
       x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(source, smrng)

upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

hband = filt + smrng
lband = filt - smrng

longCond = bool(na)
shortCond = bool(na)
longCond := source > filt and source > source[1] and upward > 0 or source > filt and source < source[1] and upward > 0
shortCond := source < filt and source < source[1] and downward > 0 or source < filt and source > source[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]

long = longCond and CondIni[1] == -1
short = shortCond and CondIni[1] == 1

// Plotting

// Strategy
// From this part on, programmer is greenmaks9
//
Separator = input(title="Following conditions and backtest algorithm are added by @greenmask9 🎯, original script is written by @colinmck 👍. Read both of their's release notes for more info on how this script works.", type=input.bool, defval=false)
disabler = input(title="Disable greenmask9's ATR conditions", type=input.bool, defval=false)

//second
l2 = input(title="ATR1", defval=32, minval=1)
s2 = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"])
atr2(source, l2) => 
    if s2 == "SMA"
        sma(source, l2)
    else
        if s2 == "RMA"
            rma(source, l2)
        else
            if s2 == "EMA"
                ema(source, l2)
            else
                wma(source, l2)

//third
l3 = input(title="ATR2", defval=64, minval=1)
s3 = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
atr3(source, l3) => 
    if s3 == "RMA"
        rma(source, l3)
    else
        if s3 == "SMA"
            sma(source, l3)
        else
            if s3 == "EMA"
                ema(source, l3)
            else
                wma(source, l3)

atr20=atr2(tr(true), l2)
atr30=atr3(tr(true), l3)
strategy.initial_capital = 50000
ordersize=floor(strategy.initial_capital/close)
profit = input(title="Ticks profit", type=input.integer, defval=900)
stop = input(title="Ticks stoploss", type=input.integer, defval=300)
maxcandles_till_close = input(title="Time stoploss", type=input.integer, defval=17)


bull = long and (atr20<atr30 or disabler)
bear = short and (atr20<atr30 or disabler)

bullclock = barssince(bull)
bearclock = barssince(bear)

if (bull)
    strategy.entry("Twin Long", strategy.long, ordersize)
    strategy.exit("Exit", from_entry =  "Twin Long", profit = profit, loss = stop)

if (bear)
    strategy.entry("Twin Short", strategy.short, ordersize)
    strategy.exit("Exit", from_entry = "Twin Short", profit = profit, loss = stop)

//time stoploss
strategy.close("Twin Long", when = bullclock == maxcandles_till_close, comment = "Timed out")
strategy.close("Twin Short", when = bearclock == maxcandles_till_close, comment = "Timed out")