Диапазон фильтрации Сигналы стратегии покупки и продажи

Автор:Чао Чжан, Дата: 2024-03-08 17:06:50
Тэги:

img

Обзор

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

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

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

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

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

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

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

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

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

Риски

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

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

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

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

  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')





Больше