Estratégia de Retração da Cruz Dourada EMA


Data de criação: 2023-12-21 11:48:54 última modificação: 2023-12-21 11:48:54
cópia: 2 Cliques: 877
1
focar em
1623
Seguidores

Estratégia de Retração da Cruz Dourada EMA

Visão geral

A estratégia de retorno cruzado de ouro da EMA é uma estratégia de negociação quantitativa baseada no indicador EMA. A estratégia utiliza três curvas EMA de diferentes períodos para construir um sinal de negociação e, em combinação com o mecanismo de retorno de preço, define um stop loss para automatizar a negociação.

Princípio da estratégia

A estratégia usa três curvas EMA, que são:

  • EMA1: é usado para determinar o nível de suporte/resistência de uma retracção de preço, com um ciclo mais curto e 33 ciclos por defeito.
  • EMA2: usado para filtrar parte do sinal de inversão, com um período de 5 vezes o EMA1 e 165 ciclos por defeito.
  • EMA3: é usado para determinar a direção da tendência geral, com um período de 11 vezes o EMA1, assumindo 365 ciclos.

A geração de sinais de transação segue a seguinte lógica:

Sinais múltiplos: o preço retorna após a subida das EMA1 constituídas, formando um ponto mais alto e mais baixo acima da EMA1, sem tocar a EMA2. Depois de cumprir as condições, faça mais quando subirá novamente a EMA1.

Sinal de cabeça vazia: A retracção ocorre após o preço atravessar a EMA1 abaixo, formando um ponto mais baixo abaixo da EMA1, e a amplitude da retracção não toca a EMA2. Depois de satisfazer as condições, faça um vazio ao atravessar a EMA1 novamente.

O modo de parada é a regressão do preço mínimo/máximo. O parâmetro de parada é o dobro do parâmetro.

Vantagens estratégicas

A estratégia tem as seguintes vantagens:

  1. O indicador EMA é usado para construir sinais de negociação de alta confiabilidade.
  2. O sistema de correção de preços, combinado com o mecanismo de correção de preços, pode ser eficaz para evitar a cobrança.
  3. O ponto de paragem é definido como o nível mais baixo e mais alto, para controlar o risco.
  4. O ponto de paragem é definido de acordo com a proporção de stop loss para satisfazer o requisito da relação de ganhos/perdas.
  5. Os parâmetros do EMA podem ser ajustados de acordo com o mercado e adaptados a diferentes ciclos.

Risco estratégico

A estratégia também tem riscos:

  1. Os indicadores EMA estão atrasados e podem ter perdido a reviravolta da tendência.
  2. Uma amplitude de retorno maior do que o EMA2 pode gerar sinais falsos.
  3. A tendência de queda e queda pode ser ultrapassada.
  4. A configuração inadequada dos parâmetros pode levar a negociações excessivamente frequentes ou a oportunidades perdidas.

Os parâmetros podem ser otimizados por meio de ajustes de períodos de EMA e de limites de regressão. Também podem ser combinados com outros indicadores de filtragem.

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

A estratégia também pode ser melhorada em alguns aspectos:

  1. Aumentar o julgamento de indicadores de tendência e evitar negociações contractuais. Por exemplo, aderir ao MACD.
  2. Adição de indicadores de volume de transação para evitar falsas rupturas.
  3. Otimizar os parâmetros do ciclo EMA, ou adotar EMA adaptada.
  4. Parâmetros de otimização dinâmica de métodos de aprendizado de máquina, como o modelo de saco de palavras.
  5. Adicionar previsão do modelo e ajustar o Stop Loss Adaptive Stop.

Resumir

A estratégia de retorno cruzado de ouro da EMA permite negociações automatizadas através da construção de três sistemas de negociação EMA, combinando características de retorno de preço com a configuração de stop loss. A estratégia controla efetivamente o risco de negociação e pode ser otimizada de acordo com o mercado, ajustando os parâmetros.

Código-fonte da estratégia
/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 00:00:00
period: 1h
basePeriod: 15m
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/
// created by Space Jellyfish
//@version=4

strategy("EMA pullback strategy", overlay = true, initial_capital=10000, commission_value = 0.075)

target_stop_ratio = input(title="Take Profit Stop Loss ratio", type=input.float, defval=2.06, minval=0.5, maxval=100)
riskLimit_low =  input(title="lowest risk per trade", type=input.float, defval=0.008, minval=0, maxval=100)
riskLimit_high =  input(title="highest risk per trade", type=input.float, defval=0.02, minval=0, maxval=100)
//give up the trade, if the risk is smaller than limit, adjust position size if risk is bigger than limit

ema_pullbackLevel_period = input(title="EMA1 for pullback level Period", type=input.integer, defval=33, minval=1, maxval=10000)
ema_pullbackLimiit_period = input(title="EMA2 for pullback limit Period", type=input.integer, defval=165, minval=1, maxval=10000)
ema_trend_period = input(title="EMA3 for trend Period", type=input.integer, defval=365, minval=1, maxval=10000)

startDate = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2018, minval=2008, maxval=2200)

inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

ema_pullbackLevel = ema(close, ema_pullbackLevel_period)
ema_pullbackLimit = ema(close, ema_pullbackLimiit_period)
ema_trendDirection = ema(close, ema_trend_period)

//ema pullback 
float pricePullAboveEMA_maxClose = na
float pricePullAboveEMA_maxHigh = na

float pricePullBelowEMA_minClose = na
float pricePullBelowMA_minLow = na

if(crossover(close, ema_pullbackLevel))
    pricePullAboveEMA_maxClose := close
    pricePullAboveEMA_maxHigh := high
else
    pricePullAboveEMA_maxClose := pricePullAboveEMA_maxClose[1]
    pricePullAboveEMA_maxHigh := pricePullAboveEMA_maxHigh[1]

if(close > pricePullAboveEMA_maxClose)
    pricePullAboveEMA_maxClose := close
if(high > pricePullAboveEMA_maxHigh)
    pricePullAboveEMA_maxHigh := high

if(crossunder(close, ema_pullbackLevel))
    pricePullBelowEMA_minClose := close
    pricePullBelowMA_minLow := low
else
    pricePullBelowEMA_minClose :=pricePullBelowEMA_minClose[1]
    pricePullBelowMA_minLow:=pricePullBelowMA_minLow[1]
    
if(close < pricePullBelowEMA_minClose)
    pricePullBelowEMA_minClose := close
if(low < pricePullBelowMA_minLow)
    pricePullBelowMA_minLow := low


long_strategy = crossover(close, ema_pullbackLevel) and pricePullBelowEMA_minClose < ema_pullbackLimit and ema_pullbackLevel>ema_trendDirection 
short_strategy = crossunder(close, ema_pullbackLevel) and pricePullAboveEMA_maxClose > ema_pullbackLimit and ema_pullbackLevel<ema_trendDirection


var open_long_or_short = 0// long = 10000, short = -10000, no open = 0

//check if position is closed
if(strategy.position_size == 0)
    open_long_or_short := 0
else
    open_long_or_short := open_long_or_short[1]

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

float entryContracts = 0



risk_long := risk_long[1]
risk_short := risk_short[1]
    
//open a position determine the position size
if (strategy.position_size == 0 and long_strategy and inDateRange)
    risk_long := (close - pricePullBelowMA_minLow) / close

    if(risk_long < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_long)/close
    
    if(risk_long > riskLimit_low)
        strategy.entry("long", strategy.long, qty = entryContracts, when = long_strategy)


    open_long_or_short := 10000
    
if (strategy.position_size == 0 and short_strategy and inDateRange)
    risk_short := (pricePullAboveEMA_maxHigh - close) / close
    if(risk_short < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_short)/close

    if(risk_short > riskLimit_low)
        strategy.entry("short", strategy.short, qty = entryContracts, when = short_strategy)

    
    open_long_or_short := -10000

//take profit / stop loss
if(open_long_or_short == 10000)

    stopLoss :=   strategy.position_avg_price*(1 - risk_long)
    takeProfit :=  strategy.position_avg_price*(1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("Long exit","long", limit = takeProfit , stop = stopLoss)
    
if(open_long_or_short == -10000)
    stopLoss :=  strategy.position_avg_price*(1 + risk_short)
    takeProfit :=  strategy.position_avg_price*(1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("Short exit","short", limit = takeProfit, stop = stopLoss)



plot(ema_pullbackLevel, color=color.aqua,  title="ema pullback level")
plot(ema_pullbackLimit, color=color.purple,  title="ema pullback limit")
plot(ema_trendDirection, color=color.white,  title="ema trend")

plot(entry_price, color = color.yellow, linewidth = 1, style = plot.style_linebr)
plot(stopLoss, color = color.red, linewidth = 1, style = plot.style_linebr)
plot(takeProfit, color = color.green, linewidth = 1, style = plot.style_linebr)





//