Стратегия фильтра скользящей средней Холла


Дата создания: 2024-01-04 15:16:34 Последнее изменение: 2024-01-04 15:16:34
Копировать: 0 Количество просмотров: 623
1
Подписаться
1621
Подписчики

Стратегия фильтра скользящей средней Холла

Обзор

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

Эта стратегия одновременно использует показатели ATR для установления стоп-лосса и стоп-поста. При каждом открытии позиции динамически устанавливаются стоп-лосса и стоп-поста для текущей позиции в зависимости от значения ATR.

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

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

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

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

После открытия позиции устанавливается стоп-лосс и стоп-стоп в зависимости от величины ATR. ATR может отражать уровень волатильности и риска на рынке. Стоп-лосс размещается ниже ценовых минимумов, а стоп-стоп размещается выше ценовых максимумов, и все это связано с ATR, чтобы скорректировать диапазон стоп-лосса в зависимости от уровня волатильности на рынке.

Анализ преимуществ

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

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

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

Анализ рисков

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

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

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

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

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

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

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

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

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

Исходный код стратегии
/*backtest
start: 2023-12-04 00:00:00
end: 2024-01-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Hull Filtered Strategy", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity, default_qty_value = 10, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0)

// Parameters for Hull Moving Averages
src = input(close, title="Source")
signal_period = input(50, title="Period of signal HMA")
filter_period = input(200, title="Period of filter HMA")

strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])

// Set allowed trading directions
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)

// stop loss and take profit
sl_factor = input(2,title="Stop Loss Factor")
tp_factor = input(3,title="Take Profit Factor")
atr_period = input(14, title="ATR Period (SL/TP)")

// Testing Start dates
testStartYear = input(2010, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)


// -----------------------------------------------------------------------------
// Global variables
// -----------------------------------------------------------------------------
var float tp = na
var float sl = na
var float position = na


// -----------------------------------------------------------------------------
// Functions
// -----------------------------------------------------------------------------
testWindow() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false


// -----------------------------------------------------------------------------
// The engine
// -----------------------------------------------------------------------------
hma_signal = hma(src, signal_period)
hma_filter = hma(src, filter_period)

// Used to determine exits and stop losses
atr_e = atr(atr_period)

// if hma_filter increases hma_trend is set to 1, if it decreases hma_trend is set to -1. If no trend is available, hma_trend is set to ß0
trend = hma_filter > hma_filter[1]  ?  1 : hma_filter < hma_filter[1] ? -1 : 0
signal = hma_signal > hma_signal[1] ? 1 : hma_signal  < hma_signal[1] ? -1 : 0


// -----------------------------------------------------------------------------
// signals
// -----------------------------------------------------------------------------
if signal[0] == 1 and signal[1] != 1 and trend == 1 and testWindow()
    sl := close - sl_factor*atr_e
    tp := close + tp_factor*atr_e
    strategy.entry("HMA_LNG", strategy.long)
    strategy.exit("LE", "HMA_LNG", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e)
    
if signal[0] == -1 and signal[1] != -1 and trend == -1 and testWindow()
    sl := close + sl_factor*atr_e
    tp := close - tp_factor*atr_e
    strategy.entry("HMA_SHRT", strategy.short)
    strategy.exit("SE", "HMA_SHRT", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e)


if strategy.position_size != 0
    sl := sl[1]
    tp := tp[1]

// -----------------------------------------------------------------------------
// PLOT
// -----------------------------------------------------------------------------
hma_s = plot(hma_signal, title="SIGNAL", color = signal == 1 ? color.green : color.red)
hma_l = plot(hma_filter, title="TREND", color = trend == 1 ? color.green : color.red)

plot(tp, title="TAKE PROFIT", color= strategy.position_size != 0 ? color.blue: na, linewidth=1)  
plot(sl, title="STOP LOSS", color= strategy.position_size != 0 ? color.red: na, linewidth = 1)