Tendência média móvel cruzada aberta fechada Seguindo estratégia

Autora:ChaoZhang, Data: 2024-01-15 14:24:27
Tags:

img

Resumo

A estratégia de seguimento de tendência de média móvel de fechamento aberto é uma estratégia de seguimento de tendência baseada em médias móveis dos preços abertos e fechados. Determina a tendência atual do mercado calculando as médias móveis dos preços abertos e fechados; ele vai longo quando a média móvel do preço de fechamento cruza acima da média móvel do preço de abertura e vai curto quando a média móvel do preço de fechamento cruza abaixo da média móvel do preço de abertura. A estratégia também define trailing stops para bloquear lucros e controlar riscos efetivamente.

Princípios

A lógica central desta estratégia é baseada na relação entre os preços de abertura e fechamento para determinar a tendência atual. O preço de abertura reflete a relação atual de oferta e demanda do mercado e a psicologia de negociação, enquanto o preço de fechamento reflete o resultado final negociado do dia. Em geral, se o preço de fechamento for maior que o preço de abertura, ele indica que a tendência do mercado para o dia é ascendente e o sentimento é mais otimista. Se o preço de fechamento for menor que o preço de abertura, sugere que a tendência do mercado para o dia é descendente e o sentimento é mais baixa.

Esta estratégia utiliza esta lógica, calculando as médias móveis dos preços de abertura e fechamento para julgar a direção da tendência atual.

  1. Faça um longo quando a média móvel do preço de fechamento cruzar acima da média móvel do preço de abertura.

  2. O preço de venda de uma posição curta é o preço de venda de uma posição curta, quando a média móvel do preço de fechamento cruza abaixo da média móvel do preço de abertura.

  3. Fechar posições existentes com um stop loss quando ocorrerem sinais de reversa.

A estratégia também define trailing stops para bloquear os lucros. Após entrar em uma posição, calcula dinamicamente a diferença de ponto entre o preço de entrada e o preço atual. Quando o movimento do preço excede o limite do ponto de stop loss definido, a linha de stop loss se moverá para cima para bloquear lucros parciais.

Em resumo, a estratégia julga as tendências ao longo do período de duração da média móvel; mantém apenas uma posição direcional de cada vez; sai das posições existentes diretamente com sinais reversos sem paradas ATR; e possui configurações de paragem traseira para bloquear os lucros.

Análise das vantagens

Esta estratégia tem as seguintes vantagens principais:

  1. Regras simples e clarasA avaliação da tendência baseada na relação aberta-cerrada é fácil de compreender e de otimizar os parâmetros.

  2. Opções de MA flexíveisHá dezenas de tipos de MA para escolher e otimizar.

  3. Resolução ajustávelA resolução pode ser definida em 3-4x do gráfico para maior sensibilidade e pontualidade dos sinais.

  4. Mecanismo de suspensão da perdaO trailing stop controla efetivamente as perdas e os drawdowns por trade.

  5. Período de detenção personalizávelO período de detenção e a volatilidade podem ser controlados ajustando os parâmetros do MA.

  6. Reembolso de risco flexívelPontos de stop loss e compensação de preferências de risco-recompensa.

Análise de riscos

Os principais riscos desta estratégia são os seguintes:

  1. Falta de inversões de tendênciaOs sinais de saída podem atrasar a reversão dos preços, resultando em perdas observáveis.

  2. Não adequado para condições de alta volatilidadeA redução da taxa de juros de uma empresa pode, por sua vez, resultar em uma redução da taxa de juros de uma outra empresa.

  3. Confiança no indicador únicoBasear as decisões em apenas um conjunto de indicadores expõe-o ao risco de falha.

  4. Risco de otimização excessivaOs parâmetros MA e as configurações de stop loss podem ser facilmente sobreajustados. O desempenho fora da amostra pode deteriorar-se. Deve ser tomada precaução na seleção de parâmetros.

Orientações de otimização

A estratégia pode ser otimizada e reforçada a partir de áreas como:

  1. Indicadores complementaresOs indicadores de volatilidade e dinâmica podem aumentar a robustez e a estabilidade.

  2. Parâmetros dinâmicos condicionaisOs períodos de MA podem ser ajustados com base na tendência ou na detecção lateral do regime de mercado para uma melhor adaptabilidade.

  3. Controlo dinâmico dos riscosPontos de stop loss e offsets podem ser calibrados em níveis de volatilidade realizados recentemente.

  4. Lógica de Stop Loss melhoradaMecanismos de stop loss mais avançados, como os ATR, podem substituir o simples trailing stop.

Conclusão

A Open Close Cross Moving Average Trend Following Strategy é uma estratégia típica de negociação de tendências baseada em relações abertas e fechadas e médias móveis. Suas vantagens como regras simples, flexibilidade e riscos controláveis também vêm com desvantagens de reversões e whipshaw ausentes. As áreas de melhoria incluem mais indicadores, parâmetros dinâmicos e gerenciamento avançado de riscos para melhor captura de tendências e adaptabilidade a condições variadas de mercado.


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

//@version=4

strategy(title = "Open Close Cross Strategy (PineScript=v4)", shorttitle = "OCC Strategy", overlay = true )

// Revision:        1
// Author:          @JayRogers
//
// Description:
//  - Strategy based around Open-Close Crossovers.
// Setup:
//  - I have generally found that setting the strategy resolution to 3-4x that of the chart you are viewing
//    tends to yield the best results, regardless of which MA option you may choose (if any)
//  - Don't aim for perfection. Just aim to get a reasonably snug fit with the O-C band, with good runs of
//    green and red.
//  - Option to either use basic open and close series data, or pick your poison with a wide array of MA types.
//  - Optional trailing stop for damage mitigation if desired (can be toggled on/off)
//  - Positions get taken automagically following a crossover - which is why it's better to set the resolution
//    of the script greater than that of your chart, so that the trades get taken sooner rather than later.
//  - If you make use of the trailing stops, be sure to take your time tweaking the values. Cutting it too fine
//    will cost you profits but keep you safer, while letting them loose could lead to more drawdown than you
//    can handle.

// === INPUTS ===
useRes = input(defval=true, title="Use Alternate Resolution? ( recommended )")
stratRes = input(defval="120", title="Set Resolution ( should not be lower than chart )", type=input.resolution)
useMA = input(defval=true, title="Use MA? ( otherwise use simple Open/Close data )")
basisType = input(defval="DEMA", title="MA Type: SMA, EMA, DEMA, TEMA, WMA, VWMA, SMMA, HullMA, LSMA, ALMA ( case sensitive )", type=input.string)
basisLen = input(defval=14, title="MA Period", minval=1)
offsetSigma = input(defval=6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA = input(defval=0.85, title="Offset for ALMA", minval=0, step=0.01)
useStop = input(defval=true, title="Use Trailing Stop?")
slPoints = input(defval=200, title="Stop Loss Trail Points", minval=1)
slOffset = input(defval=400, title="Stop Loss Trail Offset", minval=1)
// === /INPUTS ===

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = sma(src, len)  // Simple
    v2 = ema(src, len)  // Exponential
    v3 = 2 * v2 - ema(v2, len)  // Double Exponential
    v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)  // Triple Exponential
    v5 = wma(src, len)  // Weighted
    v6 = vwma(src, len)  // Volume Weighted
    sma_1 = sma(src, len)  // Smoothed
    v7 = na(v5[1]) ? sma_1 : (v5[1] * (len - 1) + src) / len
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))  // Hull
    v9 = linreg(src, len, offSig)  // Least Squares
    v10 = alma(src, len, offALMA, offSig)  // Arnaud Legoux
    type == "EMA" ? v2 : type == "DEMA" ? v3 : type == "TEMA" ? v4 : 
       type == "WMA" ? v5 : type == "VWMA" ? v6 : type == "SMMA" ? v7 : 
       type == "HullMA" ? v8 : type == "LSMA" ? v9 : type == "ALMA" ? v10 : v1
// security wrapper for repeat calls
reso(exp, use, res) =>
    security_1 = security(syminfo.tickerid, res, exp)
    use ? security_1 : exp
// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
// open/close
variant__1 = variant(basisType, close, basisLen, offsetSigma, offsetALMA)
reso__1 = reso(variant__1, useRes, stratRes)
reso__2 = reso(close, useRes, stratRes)
closeSeries = useMA ? reso__1 : reso__2
variant__2 = variant(basisType, open, basisLen, offsetSigma, offsetALMA)
reso__3 = reso(variant__2, useRes, stratRes)
reso__4 = reso(open, useRes, stratRes)
openSeries = useMA ? reso__3 : reso__4
trendState = bool(na)
trendState := closeSeries > openSeries ? true : 
   closeSeries < openSeries ? false : trendState[1]
// === /SERIES ===

// === PLOTTING ===
barcolor(color=closeSeries > openSeries ? #006600 : #990000, title="Bar Colours")
// channel outline
closePlot = plot(closeSeries, title="Close Line", color=#009900, linewidth=2, style=plot.style_line, transp=90)
openPlot = plot(openSeries, title="Open Line", color=#CC0000, linewidth=2, style=plot.style_line, transp=90)
// channel fill
closePlotU = plot(trendState ? closeSeries : na, transp=100, editable=false)
openPlotU = plot(trendState ? openSeries : na, transp=100, editable=false)
closePlotD = plot(trendState ? na : closeSeries, transp=100, editable=false)
openPlotD = plot(trendState ? na : openSeries, transp=100, editable=false)
fill(openPlotU, closePlotU, title="Up Trend Fill", color=#009900, transp=40)
fill(openPlotD, closePlotD, title="Down Trend Fill", color=#CC0000, transp=40)
// === /PLOTTING ===

// === STRATEGY ===
// conditions
longCond = crossover(closeSeries, openSeries)
shortCond = crossunder(closeSeries, openSeries)
// entries and base exit
strategy.entry("long", strategy.long, when=longCond)
strategy.entry("short", strategy.short, when=shortCond)
// if we're using the trailing stop
if useStop
    strategy.exit("XL", from_entry="long", trail_points=slPoints, trail_offset=slOffset)
    strategy.exit("XS", from_entry="short", trail_points=slPoints, trail_offset=slOffset)
// not sure needed, but just incase..
strategy.exit("XL", from_entry="long", when=shortCond)
strategy.exit("XS", from_entry="short", when=longCond)
// === /STRATEGY ===


Mais.