Preço de fechamento mensal e estratégia de cruzamento da média móvel

Autora:ChaoZhang, Data: 23 de janeiro de 2023 17:09:01
Tags:

img

Resumo

Esta estratégia gera sinais de negociação com base no cruzamento entre o preço de fechamento mensal e as linhas de média móvel.

Estratégia lógica

A lógica central desta estratégia é a seguinte:

  1. Tome o parâmetro da média móvel do período como entrada. Escolha entre SMA e EMA.
  2. Opção para exibir a linha média móvel.
  3. Opção para utilizar o preço de fechamento de outro ticker como fonte de sinal.
  4. Determinar os sinais de negociação com base na relação entre o preço de fechamento mensal e a média móvel:
    • Preço de fechamento acima da MA - longo
    • Preço de fechamento inferior ao MA - Fechar posição longa

Esta estratégia utiliza a capacidade de suavização das médias móveis para filtrar ruídos de preços e capturar inversões de tendência de médio prazo.

Vantagens

As principais vantagens desta estratégia são:

  1. Utiliza dados mensais para filtrar eficazmente os ruídos intradiários e capturar tendências de médio e longo prazo
  2. Período MA personalizável para otimização em diferentes tickers
  3. Opção para utilizar outro ticker como fonte de sinal melhora a estabilidade
  4. Implementa técnicas avançadas de anti-repintura
  5. Tempo de ensaio posterior flexível para facilitar os ensaios

Em resumo, trata-se de um quadro estratégico simples, mas prático, que pode ser adaptado à maioria das ações através de ajustes de parâmetros, especialmente adequado para investidores de médio e longo prazo.

Riscos

Há também alguns riscos a ter em conta:

  1. Atualizações dos dados mensais lentas, incapazes de refletir as alterações de preços em tempo real
  2. Atrasa e pode perder oportunidades a curto prazo
  3. Os MAs têm atrasos inerentes, o timing do sinal é imprevisível.
  4. Seleção de parâmetros subótima leva ao excesso de conservadorismo ou oportunidades perdidas

Sugestões de formas de reduzir os riscos:

  1. Incorporar indicadores técnicos de prazo mais rápido para o julgamento auxiliar
  2. Otimizar o período de MA para encontrar os melhores parâmetros
  3. Usar um parâmetro de referência mais estável como fonte de sinal
  4. Ajustar o dimensionamento da posição para limitar as perdas

Oportunidades de melhoria

Esta estratégia tem um grande potencial de melhoria:

  1. Incorporar o stop loss para bloquear os lucros e controlar os riscos
  2. Adicionar indicadores complementares como KD, MACD para melhorar a precisão do sinal
  3. Empregar técnicas de aprendizagem de máquina para otimizar dinamicamente os parâmetros de MA
  4. Introduzir dimensionamento de posições que se alinhe com as tendências
  5. Capacidades de comutação longa/curta baseadas nas condições do mercado
  6. Fusão com preços de prazo mais rápidos para reações mais rápidas

Conclusão

A estratégia de cruzamento de fechamento mensal e MA tem uma lógica simples e direta e pode ser adaptada a vários tickers através do ajuste de parâmetros. É especialmente adequado para investidores de médio e longo prazo.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 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/
// © universique

//@version=4
strategy("Monthly MA Close ", shorttitle="MMAC", overlay=true, default_qty_type =  strategy.percent_of_equity, default_qty_value = 100)
//MAY 6 2020 18:00

// No repaint function 
// Function to securely and simply call `security()` so that it never repaints and never looks ahead.
f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on)
//sec10 = f_secureSecurity(syminfo.tickerid, higherTf, data)

// ————— Converts current chart resolution into a float minutes value.
f_resInMinutes() => 
    _resInMinutes = timeframe.multiplier * (
      timeframe.isseconds ? 1. / 60             :
      timeframe.isminutes ? 1.                  :
      timeframe.isdaily   ? 60. * 24            :
      timeframe.isweekly  ? 60. * 24 * 7        :
      timeframe.ismonthly ? 60. * 24 * 30.4375  : na)
// ————— Returns the float minutes value of the string _res.
f_tfResInMinutes(_res) =>
    // _res: resolution of any TF (in "timeframe.period" string format).
    // Dependency: f_resInMinutes().
    security(syminfo.tickerid, _res, f_resInMinutes())

// —————————— Determine if current timeframe is smaller that higher timeframe selected in Inputs.
// Get higher timeframe in minutes.
//higherTfInMinutes = f_tfResInMinutes(higherTf)
// Get current timeframe in minutes.
currentTfInMinutes = f_resInMinutes()
// Compare current TF to higher TF to make sure it is smaller, otherwise our plots don't make sense.
//chartOnLowerTf = currentTfInMinutes < higherTfInMinutes

// Input
switch1=input(true, title="Show MA")
exponential = input(true, title="Exponential MA")
ticker = input(false, title="Other ticker MA")

tic_ma = input(title="Ticker MA", type=input.symbol, defval="BTC_USDT:swap")
res_ma = input(title="Time MA (W, D, [min])", type=input.string, defval="M")
len_ma = input(8, minval=1, title="Period MA")

ma_cus = exponential?f_secureSecurity(tic_ma, res_ma, ema(close,len_ma)) : f_secureSecurity(tic_ma, res_ma, sma(close,len_ma))
ma_long = exponential?f_secureSecurity(syminfo.tickerid, res_ma, ema(close,len_ma)) : f_secureSecurity(syminfo.tickerid, res_ma, sma(close,len_ma))

cl1 = f_secureSecurity(syminfo.tickerid, 'M', close)
cl2 = f_secureSecurity(tic_ma, 'M', close)

// Input Backtest Range
showDate  = input(defval = false, title = "Show Date Range", type = input.bool)
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 1995, title = "From Year",       type = input.integer, minval = 1850)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1850)

// Funcion Example
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

// Calculation
bullish_cross = ticker?cl2>ma_cus : cl1>ma_long
bearish_cross = ticker?cl2<ma_cus : cl1<ma_long

MAColor = bullish_cross ? color.green : bearish_cross ? color.red : color.orange

// Strategy
strategy.entry("long", strategy.long, when = window() and bullish_cross)
strategy.close("long", when = window() and bearish_cross)

// Output
plot(switch1?ma_long:na,color = MAColor,linewidth=4)

// Alerts
alertcondition(bullish_cross, title='Bullish', message='Bullish')
alertcondition(bearish_cross, title='Bearish', message='Bearish')

Mais.