Стратегия торговли трендом на основе динамической скользящей средней

Автор:Чао Чжан, Дата: 2021-12-21 11:33:50
Тэги:

img

Обзор

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

Принцип

Стратегия в основном основана на трех вариантах HMA (Hull Moving Average) регулярный HMA, взвешенный HMA (WHMA) и экспоненциальный HMA (EHMA).

Формула для HMA:

HMA = WMA ((2*WMA ((близкий, n/2)-WMA ((близкий, n), квадратный))

По сравнению с SMA, HMA реагирует быстрее на изменения цен.

Формулы для WHMA и EHMA похожи.

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

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

По сравнению с традиционными стратегиями ОР, эта стратегия имеет следующие преимущества:

  1. Более быстрая реакция и более сильная способность отслеживать тенденции для своевременного входа и остановки
  2. Снижение ненужной частоты торговли, избежание преследования всплесков и остановок
  3. Гибкие параметры HMA для адаптации к более широкой рыночной среде
  4. Сменные варианты HMA для расширения применимости

Риски

Существуют также некоторые риски:

  1. Появление множества ложных сигналов на рынках с ограниченным диапазоном, увеличение частоты торговли и расходы на сдвиг
  2. Отсутствие точек переворота тенденции, если параметры HMA не установлены должным образом, что приводит к увеличению риска потерь
  3. Риск ликвидности и огромный сдвиг при торговле акциями с низкой ликвидностью

Решения:

  1. Оптимизировать параметры HMA для наилучших значений
  2. Добавление других показателей для определения точек переворота тренда
  3. Выбирать ликвидные запасы с большим среднедневным объемом

Улучшения

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

  1. Добавление громкости или других фильтров для обеспечения надежности сигнала
  2. Комбинируйте MACD, KDJ для лучшего синхронизации, улучшения показателя победы
  3. Корректировка периодов HMA на основе реальных обратных тестов торговли
  4. Переход на WHMA или EHMA, которые лучше всего работают для конкретных запасов
  5. Добавление механизмов остановки потери для контроля потери от одной сделки

Резюме

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


/*backtest
start: 2022-12-14 00:00:00
end: 2023-12-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Position Investing by SirSeff', overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_order_fills=false, slippage=0, commission_type=strategy.commission.percent, commission_value=0)
strat_dir_input = input.string(title='Strategy Direction', defval='long', options=['long', 'short', 'all'])
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)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2000, '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(30, 'Backtest Stop Day')
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)


testPeriod() => true
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title='Source')
modeSwitch = input.string('Hma', title='Hull Variation', options=['Hma', 'Thma', 'Ehma'])
length = input(55, title='Length(180-200 for floating S/R , 55 for swing entry)')
switchColor = input(true, 'Color Hull according to trend?')
candleCol = input(false, title='Color candles based on Hull\'s Trend?')
visualSwitch = input(true, title='Show as a Band?')
thicknesSwitch = input(1, title='Line Thickness')
transpSwitch = input.int(40, title='Band Transparency', step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>
    ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>
    ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length)))
//THMA    
THMA(_src, _length) =>
    ta.wma(ta.wma(_src, _length / 3) * 3 - ta.wma(_src, _length / 2) - ta.wma(_src, _length), _length)

//SWITCH
Mode(modeSwitch, src, len) =>
    modeSwitch == 'Hma' ? HMA(src, len) : modeSwitch == 'Ehma' ? EHMA(src, len) : modeSwitch == 'Thma' ? THMA(src, len / 2) : na

//OUT
HULL = Mode(modeSwitch, src, length)
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? HULL > HULL[2] ? #00ff00 : #ff0000 : #ff9800

//PLOT
///< Frame
Fi1 = plot(MHULL, title='MHULL', color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title='SHULL', color=hullColor, linewidth=thicknesSwitch, transp=50)
///< Ending Filler
fill(Fi1, Fi2, title='Band Filler', color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color=candleCol ? switchColor ? hullColor : na : na)


if HULL[0] > HULL[2] and testPeriod()
    strategy.entry('Invest', strategy.long)
if HULL[0] < HULL[2] and testPeriod()
    strategy.entry('Pause', strategy.short)



Больше