Estratégia de Crossover de Média Móvel Exponencial de Períodos Múltiplos

EMA SL TP TF
Data de criação: 2024-07-30 12:02:23 última modificação: 2024-07-30 12:02:23
cópia: 3 Cliques: 618
1
focar em
1617
Seguidores

Estratégia de Crossover de Média Móvel Exponencial de Períodos Múltiplos

Visão geral

Esta estratégia de crossover de médias móveis de índices de múltiplos períodos de tempo é um sistema de negociação automatizado baseado em sinais de cruzamento de EMAs. Utiliza EMAs de diferentes períodos de tempo para gerar sinais de negociação e combina mecanismos de stop loss e profit close para gerenciar o risco. A estratégia depende principalmente de identificar potenciais oportunidades de negociação entre EMAs rápidas e lentas e EMAs de períodos de tempo mais elevados.

Princípio da estratégia

O princípio central da estratégia é o uso de médias móveis indexadas (EMA) de vários períodos de tempo para identificar tendências de mercado e gerar sinais de negociação.

  1. Usando o EMA de 9 ciclos como linha rápida, o EMA de 50 ciclos como linha lenta e o EMA de 100 ciclos em ciclos de 15 minutos como linha de referência de ciclos mais altos.

  2. Condições de compra:

    • O EMA rápido atravessa o EMA lento, e o EMA rápido está acima do EMA de um período de tempo mais alto; ou
    • A EMA rápida usa um período de tempo mais elevado.
  3. Condições de venda:

    • O EMA rápido está abaixo do EMA lento e o EMA rápido está abaixo do EMA de um período de tempo mais alto; ou
    • Rapido EMA sob um período de tempo mais alto EMA.
  4. Gestão de transações:

    • Estabeleça um objetivo fixo de stop loss (SL) e de profit (TP)
    • Quando o preço atinge o primeiro objetivo de lucro (TP1), a posição é liquidada em 25% e o stop loss é movido para a posição de garantia.
    • As posições restantes continuam a ser executadas até o segundo alvo de ganho ((TP2)) ou parada de perda (stop loss)).
  5. Controle de tempo de transação:

    • Pode-se definir um período de tempo específico e um dia de negociação.

Vantagens estratégicas

  1. Análise de múltiplos períodos de tempo: A combinação de EMAs de diferentes períodos de tempo ajuda a reduzir os falsos sinais e a melhorar a qualidade das negociações.

  2. Seguimento de tendências: Captura eficaz de tendências de mercado por meio de EMAs cruzadas e correlações de posição.

  3. Gerenciamento de riscos: a estratégia de stop loss fixo e de lucro intermitente limita os riscos de perda e permite que os lucros continuem a crescer.

  4. Flexibilidade: Parâmetros de EMA, níveis de stop loss e profit podem ser ajustados de acordo com diferentes mercados e estilos de negociação.

  5. Automatização: A estratégia permite a negociação totalmente automatizada através da plataforma TradingView e PineConnector.

  6. Gerenciamento do tempo: pode-se definir horários e dias de negociação específicos para evitar negociações em condições de mercado desfavoráveis.

Risco estratégico

  1. Atraso: A EMA é essencialmente um indicador atrasado e pode não reagir rapidamente em mercados com forte volatilidade.

  2. Falsos sinais: Em mercados horizontais, os cruzamentos de EMAs podem gerar frequentes falsos sinais, resultando em excesso de negociação.

  3. Paradas fixas: o uso de paradas com pontos fixos pode não ser adequado para todas as condições do mercado e, às vezes, pode ser muito grande ou muito pequeno.

  4. Depende de dados históricos: a eficácia da estratégia depende fortemente do comportamento do mercado durante o período de retrospectiva, e o desempenho futuro pode ser diferente.

  5. Adaptabilidade de mercado: a estratégia funciona bem em alguns pares de moedas, mas pode não funcionar bem em outros.

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

  1. Ajuste de parâmetros dinâmicos: Considere o ajuste do ciclo EMA, o nível de stop loss e o nível de ganho de acordo com a dinâmica da volatilidade do mercado.

  2. Acrescente condições de filtragem: introduza indicadores técnicos adicionais ou indicadores de sentimento de mercado para filtrar os sinais de negociação e reduzir os falsos sinais.

  3. Melhorar a estratégia de stop loss: implementar stop loss de rastreamento ou stop loss dinâmico baseado em ATR para se adaptar melhor às flutuações do mercado.

  4. Otimização de horários de negociação: Análise de horários mais detalhados para identificar os melhores horários e datas de negociação.

  5. Aumentar a gestão do volume de transação: ajustar o tamanho da posição de acordo com a volatilidade do mercado e o risco da conta.

  6. Análise da correlação entre várias moedas: considerar a correlação entre vários pares de moedas, evitando a exposição excessiva a riscos de mercado semelhantes.

  7. Integração de aprendizado de máquina: otimizar a seleção de parâmetros e o processo de geração de sinais usando algoritmos de aprendizado de máquina.

Resumir

A estratégia de cruzamento de média móvel de múltiplos períodos de tempo é um sistema de negociação automatizado que combina o acompanhamento de tendências e o gerenciamento de riscos. Através do uso de sinais de cruzamento de EMA em diferentes períodos de tempo, a estratégia visa capturar as tendências do mercado e negociar no momento apropriado. Embora a estratégia tenha desempenhado bem em certas condições de mercado, existem alguns riscos e limitações inerentes.

Código-fonte da estratégia
/*backtest
start: 2023-07-30 00:00:00
end: 2024-07-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Miles Multi TF EMA Strategy v 1", overlay=true)

Fast = input.int(9, "Fast EMA")
Xslow = input.int(50, "Slow EMA")

var bool inTrade = false // Ensure inTrade is declared and initialized
var int tradeDirection = 0
var float buy_slPrice = na
var float buy_tp1Price = na
var float buy_tp2Price = na
var float sell_slPrice = na
var float sell_tp1Price = na
var float sell_tp2Price = na
var bool tp1Hit = false
var bool buytp1Hit = false
var bool selltp1Hit = false
var float entryPrice = na
var float lastSignalBar = na
fastEMA = ta.ema(close, Fast)
XslowEMA = ta.ema(close, Xslow)
var int step = 0

// Example SL and TP settings (adjust according to your strategy)
slPips = input.int(150, "Stop Loss")
tp1Pips = input.int(75, "Take Profit 1")
tp2Pips = input.int(150, "Take Profit 2")
beoff = input.int(25, "Breakeven Offset")

// Define the higher time frame
higherTimeFrame = input.timeframe("15", "Higher Timeframe EMA")

// Fetch the EMA from the higher time frame
higherTimeFrameEMA = request.security(syminfo.tickerid, higherTimeFrame, ta.ema(close, 100))

// Input for trading start and end times, allowing end time to extend beyond midnight
startHour = input.int(1, "Start Hour", minval=0, maxval=23)
endHour = input.int(25, "End Hour", minval=0, maxval=47) // Extend maxval to 47 to allow specifying times into the next day

// Adjust endHour to be within 24-hour format using modulo operation
adjustedEndHour = endHour % 24

// Function to determine if the current time is within the trading hours
isTradingTime(currentHour) =>
    if startHour < adjustedEndHour
        currentHour >= startHour and currentHour < adjustedEndHour
    else
        currentHour >= startHour or currentHour < adjustedEndHour

// Get the current hour in the exchange's timezone
currentHour = hour(time, "Australia/Sydney")

// Check if the current time is within the trading hours
trading = isTradingTime(currentHour)

// Plot background color if within trading hours
bgcolor(trading ? color.new(color.blue, 90) : na)

// Inputs for trading days
tradeOnMonday = input.bool(true, "Trade on Monday")
tradeOnTuesday = input.bool(true, "Trade on Tuesday")
tradeOnWednesday = input.bool(true, "Trade on Wednesday")
tradeOnThursday = input.bool(true, "Trade on Thursday")
tradeOnFriday = input.bool(true, "Trade on Friday")

// Current time checks
currentDayOfWeek = dayofweek(time, "Australia/Sydney")

// Check if current time is within trading hours
isTradingHour = (currentHour >= startHour and currentHour < endHour)

// Check if trading is enabled for the current day of the week
isTradingDay = (currentDayOfWeek == dayofweek.monday and tradeOnMonday) or 
               (currentDayOfWeek == dayofweek.tuesday and tradeOnTuesday) or 
               (currentDayOfWeek == dayofweek.wednesday and tradeOnWednesday) or 
               (currentDayOfWeek == dayofweek.thursday and tradeOnThursday) or 
               (currentDayOfWeek == dayofweek.friday and tradeOnFriday)

// Combined check for trading time and day
isTradingTime = isTradingHour and isTradingDay

buySignal = false
sellSignal = false

// Conditions
if (step == 0 or step == 4) and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 4) and ta.crossover(fastEMA, higherTimeFrameEMA)
    step := 1

if step == 3 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 3

if step == 2 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 3) and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

if (step == 0 or step == 3) and ta.crossunder(fastEMA, higherTimeFrameEMA)
    step := 2

if step == 4 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 4

if step == 1 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

// For buy signals
if step == 1 and isTradingTime and fastEMA > ta.ema(close, Xslow) and fastEMA > higherTimeFrameEMA
    buySignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := 1
    buytp1Hit := false
    lastSignalBar := bar_index
    buy_slPrice := entryPrice - slPips * syminfo.mintick
    buy_tp1Price := entryPrice + tp1Pips * syminfo.mintick // Set TP1
    buy_tp2Price := entryPrice + tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 3
    strategy.entry("Buy", strategy.long, stop=buy_slPrice, limit=buy_tp1Price)

if step == 2 and isTradingTime and fastEMA < ta.ema(close, Xslow) and fastEMA < higherTimeFrameEMA
    sellSignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := -1
    lastSignalBar := bar_index
    selltp1Hit := false
    sell_slPrice := entryPrice + slPips * syminfo.mintick
    sell_tp1Price := entryPrice - tp1Pips * syminfo.mintick // Set TP1
    sell_tp2Price := entryPrice - tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 4
    strategy.entry("Sell", strategy.short, stop=sell_slPrice, limit=sell_tp1Price)

// Move SL to breakeven once TP1 is hit and close 25% of the trade
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) > 0)
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        strategy.close("Buy", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Buy", stop=buy_slPrice, limit=buy_tp2Price)
        
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) < 0)
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        strategy.close("Sell", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Sell", stop=sell_slPrice, limit=sell_tp2Price)

// Managing the trade after it's initiated
if inTrade and tradeDirection == 1 and sellSignal
    inTrade := false
    tradeDirection := 0
    buy_slPrice := na
    buy_tp1Price := na
    buy_tp2Price := na
    tp1Hit := false
    step := 2

if inTrade and tradeDirection == -1 and buySignal
    inTrade := false
    tradeDirection := 0
    sell_slPrice := na
    sell_slPrice := na
    sell_tp2Price := na
    tp1Hit := false
    step := 1

if inTrade and tradeDirection == 1 and step == 1
    step := 0

if inTrade and tradeDirection == -1 and step == 2
    step := 0

if inTrade and tradeDirection == 1 and (bar_index - lastSignalBar) >= 1
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buytp1Hit := true
        lastSignalBar := bar_index
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        step := 3

    if low <= buy_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Buy", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == 1 and tp1Hit and (bar_index - lastSignalBar) >= 1
    if low <= buy_slPrice
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

    if high >= buy_tp2Price and (bar_index - lastSignalBar) >= 1
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and (bar_index - lastSignalBar) >= 1
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        lastSignalBar := bar_index
        selltp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        step := 4

    if high >= sell_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Sell", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and tp1Hit  and (bar_index - lastSignalBar) >= 1
    if high >= sell_slPrice
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0
    if low <= sell_tp2Price
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0