Estratégia de backtest dinâmico de múltiplos períodos de tempo


Data de criação: 2023-11-21 17:07:17 última modificação: 2023-11-21 17:07:17
cópia: 1 Cliques: 698
1
focar em
1617
Seguidores

Estratégia de backtest dinâmico de múltiplos períodos de tempo

Visão geral

A estratégia utiliza um mecanismo de retrocesso dinâmico em múltiplos períodos de tempo para determinar a tendência dos preços, comparando os preços mais altos e mais baixos de diferentes períodos de tempo, e alcançar uma arbitragem de baixo risco.

Princípio da estratégia

A estratégia é executada através da chamada da função f_get_htfHighLow, para obter os valores nhigh e nlow de diferentes períodos de tempo. Em particular, a resolução de períodos de tempo, o multiplicador de períodos de tempo, o lookahead e os intervalos de regressão, e o offset de desvio, chamam a função security para obter os valores nhigh e low de diferentes períodos de tempo.

Por exemplo, quando o offset é 0, obtém-se o preço mais alto e o preço mais baixo da linha K atual; quando o offset é 1, obtém-se o preço mais alto e o preço mais baixo da linha K anterior. Comparando a mudança de preço entre as duas linhas K, julgue a direção da tendência.

Se o preço mais alto subir e o preço mais baixo subir, é considerado uma tendência de alta; Se o preço mais alto cair e o preço mais baixo cair, é considerado uma tendência de baixa. De acordo com a direção da tendência, faça um longo ou curto, realize uma negociação de arbitragem.

Vantagens estratégicas

  1. Utilização de análise de múltiplos quadros temporais para melhorar a precisão de julgamento
  2. Aplicação de retrocesso dinâmico para evitar o repainting
  3. Flexibilidade para definir diferentes combinações de parâmetros para adaptar-se às mudanças do mercado
  4. Só abrir uma posição quando a tendência é clara e controlar o risco

Risco estratégico

  1. O risco de erro de avaliação de múltiplos quadros de tempo
  2. Parâmetros de regressão mal definidos podem causar repainting
  3. A frequência de transações pode ser excessiva, aumentando os custos de transação e o risco de deslizamento

Solução:

  1. Optimizar os parâmetros do ciclo de tempo para melhorar a precisão do julgamento
  2. Teste rigorosamente os parâmetros de retrocesso e evite a repainting
  3. Ajustar adequadamente as condições de abertura de posições e controlar a frequência de negociação

Direção de otimização da estratégia

  1. Adição de módulos de aprendizagem de máquina para usar a IA para avaliar tendências
  2. Ajuste dinâmico de posições, combinado com a volatilidade dos preços das ações
  3. Adesão a um mecanismo de suspensão de prejuízos para controlar o risco de perdas

Resumir

A estratégia é clara em termos gerais, utiliza a retrospectiva dinâmica de múltiplos quadros de tempo para determinar a tendência do preço das ações, reduzindo ao máximo os erros de julgamento humanos, é uma estratégia de negociação programada típica. Com a otimização de parâmetros e extensão de funções, pode aumentar ainda mais a estabilidade da estratégia e a margem de lucro.

Código-fonte da estratégia
/*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")