Стратегия динамического бэктестинга с несколькими таймфреймами


Дата создания: 2023-11-21 17:07:17 Последнее изменение: 2023-11-21 17:07:17
Копировать: 1 Количество просмотров: 698
1
Подписаться
1617
Подписчики

Стратегия динамического бэктестинга с несколькими таймфреймами

Обзор

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

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

Эта стратегия получает наивысшую цену nhigh и наименьшую цену nlow для разных временных циклов путем вызова настраиваемой функции f_get_htfHighLow. В частности, в зависимости от настроенных пользователем временных циклов resolution, кратность временных циклов HTFMultiplier, обратный параметр lookahead и gaps, а также компенсация смещения, вызов функции security получает наивысшую и наименьшую цену для разных временных циклов.

Например, когда офсет равен 0, получается наивысшая и наименьшая цены текущей линии K; когда офсет равен 1, получается наивысшая и наименьшая цены предыдущей линии K. Для определения направления тренда сравнивайте изменения цены между двумя линиями K.

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

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

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

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

  1. Риск ошибочного понимания многократных временных рамок
  2. Неправильная настройка регрессионных параметров может привести к репаитингу
  3. Слишком высокая частота сделок может привести к увеличению стоимости сделок и риску проскальзывания.

Решение проблемы:

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

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

  1. Добавление модулей машинного обучения для определения тенденций с помощью ИИ
  2. Динамическая корректировка позиции в сочетании с волатильностью цен на акции
  3. Присоединение к механизму погашения убытков для эффективного контроля риска потерь

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

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

Исходный код стратегии
/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("HTF High/Low Repaint Strategy", overlay=true, initial_capital = 20000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01)

i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "End Time", type = input.time)
inDateRange = true

resolution = input("3M", type=input.resolution)
HTFMultiplier = input(22, minval=1, step=1)
offset = input(0, minval=0, step=1)
lookahead = input(true)
gaps = false

f_secureSecurity_on_on(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_on)
f_secureSecurity_on_off(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_off)
f_secureSecurity_off_on(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_off, gaps=barmerge.gaps_on)
f_secureSecurity_off_off(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_off, gaps=barmerge.gaps_off)

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"

f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset)=>
    derivedResolution = resolution == ""?f_multiple_resolution(HTFMultiplier):resolution
    nhigh_on_on = f_secureSecurity_on_on(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_on_on = f_secureSecurity_on_on(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_on_off = f_secureSecurity_on_off(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_on_off = f_secureSecurity_on_off(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_off_on = f_secureSecurity_off_on(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_off_on = f_secureSecurity_off_on(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_off_off = f_secureSecurity_off_off(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_off_off = f_secureSecurity_off_off(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh = lookahead and gaps ? nhigh_on_on :
             lookahead and not gaps ? nhigh_on_off :
             not lookahead and gaps ? nhigh_off_on :
             not lookahead and not gaps ? nhigh_off_off : na
    nlow = lookahead and gaps ? nlow_on_on :
             lookahead and not gaps ? nlow_on_off :
             not lookahead and gaps ? nlow_off_on :
             not lookahead and not gaps ? nlow_off_off : na
    [nhigh, nlow]
    
[nhigh, nlow] = f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset)
[nhighlast, nlowlast] = f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset+1)
plot(nhigh , title="HTF High",style=plot.style_circles, color=color.green, linewidth=1) 
plot(nlow , title="HTF Low",style=plot.style_circles, color=color.red, linewidth=1)

buyCondition = nhigh > nhighlast and nlow > nlowlast
sellCondition = nhigh < nhighlast and nlow < nlowlast

strategy.entry("Buy", strategy.long, when= buyCondition and inDateRange, oca_name="oca_buy")
strategy.entry("Sell", strategy.short, when= sellCondition and inDateRange, oca_name="oca_sell")