Стратегия фильтрации сигналов покупки и продажи на основе диапазона колебаний цен


Дата создания: 2024-03-08 17:06:50 Последнее изменение: 2024-03-08 17:06:50
Копировать: 2 Количество просмотров: 1110
1
Подписаться
1617
Подписчики

Стратегия фильтрации сигналов покупки и продажи на основе диапазона колебаний цен

Обзор

Стратегия фильтрации сигналов покупки и продажи на основе диапазона ценовых колебаний (Range Filter Buy Sell Signals Strategy) - это очень практичная количественная торговая стратегия. Она использует диапазон колебаний цен для фильтрации сигналов покупки и продажи, уменьшает ложные сигналы в низко-волатильных рынках и повышает качество сигналов в высоко-волатильных рынках. Название стратегии точно обобщает основные функции стратегии.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Исходный код стратегии
/*backtest
start: 2023-03-02 00:00:00
end: 2024-03-07 00:00:00
period: 1d
basePeriod: 1h
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/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=5
strategy(title='Range Filter - B&S Signals', shorttitle='[Doan]_RF-B&S Signals', overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01
shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01

longTakePerc = input.float(title='Long Take(%)', minval=0.0, step=0.1, defval=1) * 0.01
shortTakePerc = input.float(title='Short Take (%)', minval=0.0, step=0.1, defval=1) * 0.01

emaLength = input.int(200, title="EMA Length")

// Determine stop loss price

//Range Size Function
rng_size(x, qty, n) =>
    wper = n * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), n)
    AC = ta.ema(avrng, wper) * qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n) =>
    r = rng_
    var rfilt = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)

    hi_band = rng_filt1 + r
    lo_band = rng_filt1 - r
    rng_filt = rng_filt1
    [hi_band, lo_band, rng_filt]

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, title='Swing Source')

//Range Period
rng_per = input.int(defval=20, minval=1, title='Swing Period')

//Range Size Inputs
rng_qty = input.float(defval=3.5, minval=0.0000001, title='Swing Multiplier')

//Bar Colors
use_barcolor = input(defval=false, title='Bar Colors On/Off')

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward = fdir == 1 ? 1 : 0
downward = fdir == -1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color = upward and rng_src > filt ? rng_src > rng_src[1] ? #05ff9b : #00b36b : downward and rng_src < filt ? rng_src < rng_src[1] ? #ff0583 : #b8005d : #cccccc


ema = ta.ema(close, emaLength)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)

longTakePrice = strategy.position_avg_price * (1 + longTakePerc)
shortTakePrice = strategy.position_avg_price * (1 - shortTakePerc)

//Filter Plot
filt_plot = plot(filt, color=filt_color, linewidth=3, title='Filter', transp=67)

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title='High Band')
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title='Low Band')

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title='High Band Fill')
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title='Low Band Fill')

//Bar Color
barcolor(use_barcolor ? bar_color : na)
// Entry
strategy.entry("Long", strategy.long, when=longCondition)
strategy.entry("Short", strategy.short, when=shortCondition)

plot(ema)

//Plot Buy and Sell Labels
plotshape(longCondition, title='Buy Signal', text='BUY', textcolor=color.white, style=shape.labelup, size=size.normal, location=location.belowbar, color=color.new(color.green, 0))
plotshape(shortCondition, title='Sell Signal', text='SELL', textcolor=color.white, style=shape.labeldown, size=size.normal, location=location.abovebar, color=color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title='Buy Alert', message='BUY')
alertcondition(shortCondition, title='Sell Alert', message='SELL')