Эта стратегия использует краткосрочные и долгосрочные скользящие средние для генерации и фильтрации торговых сигналов. Краткосрочная скользящая средняя используется для генерации сигналов, а долгосрочная скользящая средняя используется для фильтрации сигналов.
Стратегия также использует индикатор ATR для динамического установления стоп-лосса и получения уровня прибыли при вхождении в сделки.
Краткосрочная скользящая средняя Хулл фиксирует краткосрочные ценовые тенденции и переломные моменты.
Долгосрочная скользящая средняя Hull определяет общую тенденцию цен. Например, когда она растет, цены имеют общую тенденцию к росту.
Торги проводятся только тогда, когда краткосрочная скользящая средняя Hull меняет направление, и ее новое направление согласуется с направлением долгосрочной скользящей средней Hull. Это фильтрует сигналы, которые идут против общей тенденции и могут быть просто краткосрочным рыночным шумом.
После входа в позиции, уровни стоп-лосса и прибыли устанавливаются на основе значения индикатора ATR. ATR отражает волатильность рынка и уровни риска. Стоп-лосс устанавливается ниже минимальных цен, в то время как цели прибыли устанавливаются ниже максимальных цен, с диапазонами, привязанными к текущему чтению ATR.
Сочетание краткосрочных сигналов и долгосрочных фильтров позволяет эффективно определить среднесрочные тенденции и переломные моменты, избегая ложных сигналов от шума рынка.
Динамические режимы остановки потерь и получения прибыли на основе ATR устанавливают разумные диапазоны, основанные на текущей волатильности, сбалансированном получении прибыли и предотвращении потерь.
Движущаяся средняя Hull имеет преимущества гибкости и точности по сравнению со стандартными скользящими средними, с лучшим отслеживанием тренда.
Стратегия основана на перекрестках между скользящими средними показателями Халла для генерации сигналов.
В диапазоне, неуравновешенные рынки с колебаниями цен в диапазоне торговли, ошибки сигналов и ненужные сделки могут накапливаться. Это можно избежать путем фильтрации сигналов с более широкими условиями на таких рынках.
Стоп-лосс и взятка прибыли зависимость от 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)