Estratégia de rastreamento de oscilação Golden Cross Double EMA


Data de criação: 2024-01-03 11:38:51 última modificação: 2024-01-03 11:38:51
cópia: 0 Cliques: 591
1
focar em
1621
Seguidores

Estratégia de rastreamento de oscilação Golden Cross Double EMA

Visão geral

A dupla estratégia de acompanhamento de choques de EMA Gold Cross é uma estratégia que utiliza o indicador EMA para identificar tendências e acompanhá-las em situações de choque. A estratégia combina o pensamento de acompanhamento de tendências e captura de choques, acompanhando a linha longa em situações de força e negociando a linha curta em situações de choque, com a expectativa de obter melhores resultados.

Princípio da estratégia

A estratégia usa o EMA de 20 ciclos como um indicador de tendência. Quando o preço passa pela EMA acima, o mercado começa a subir; Quando o preço passa pela EMA abaixo, o mercado começa a cair.

Quando o preço está em EMA, o preço mais alto de 20 periodhighest é o ponto de parada, o preço mais baixo de EMA após o preço é o ponto de parada, fazendo mais entrada; quando o preço está em EMA, o preço mais baixo de 20 periodlowest é o ponto de parada, o preço mais alto de EMA após o preço é o ponto de parada, fazendo a entrada em branco.

Além disso, a estratégia também determina se o ADX é maior que 30. Só é possível negociar quando a tendência é suficientemente clara, ou seja, quando o ADX é superior a 30. Isso evita que o stop loss ocorra em situações de turbulência.

Durante a detenção de posições, o trail stop é ajustado de acordo com a situação do mercado em tempo real para bloquear mais lucros.

Análise de vantagens

A estratégia combina os benefícios de um acompanhamento de tendências e de uma negociação de choques, permitindo obter lucros mais lucrativos em situações de tendências, mas também mais estáveis em situações de choques, com maior capacidade de adaptação.

A aplicação da EMA também reduz os parâmetros da estratégia, reduzindo o risco de otimização excessiva, garantindo a estabilidade da estratégia.

Análise de Riscos

O principal risco desta estratégia é que pode ocorrer um maior stop loss quando a oscilação se intensifica. Neste caso, o papel do ADX é destacado. Quando o valor do ADX é baixo, o negócio é fechado, evitando perdas quando não há uma tendência clara.

Além disso, é fundamental definir um ponto de parada razoável. Se o ponto de parada for muito grande, pode aumentar a perda individual; Se o ponto de parada for muito pequeno, pode ser muito sensível, aumentando a probabilidade de parada.

Direção de otimização

A estratégia pode ser melhorada em vários aspectos:

  1. A escolha do ciclo EMA. Pode testar mais parâmetros do ciclo EMA para encontrar a melhor combinação de parâmetros.

  2. Os parâmetros do ADX podem ser otimizados. O ciclo ADX e o limiar do ADX podem experimentar diferentes configurações.

  3. Os algoritmos de stop-loss podem ser melhorados, como a introdução de stop-loss dinâmico.

  4. Pode-se considerar a inclusão de outros indicadores em combinação, como KDJ, MACD, etc., para formar uma estratégia de verificação de vários indicadores.

Resumir

A estratégia de acompanhamento de choque de duplo cruzamento de ouro EMA é, em geral, uma estratégia muito prática. Combina as características da estratégia de tendência e da estratégia de choque, podendo ser usada tanto para acompanhamento de linha longa quanto para negociação de linha curta. A eficácia da estratégia pode ser ainda melhorada com otimização de parâmetros e verificação de indicadores de combinação.

Código-fonte da estratégia
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Linda Raschke's Holy Grail", shorttitle="RHG", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true)
adxlen = input(14, title="ADX period")
adxMin = input(30)
dilen = adxlen
f_highest(_src, _length)=>
    _adjusted_length = _length < 1 ? 1 : _length
    _value = _src
    for _i = 0 to (_adjusted_length-1)
        _value := _src[_i] >= _value ? _src[_i] : _value
    _return = _value

f_lowest(_src, _length)=>
    _adjusted_length = _length < 1 ? 1 : _length
    _value = _src
    for _i = 0 to (_adjusted_length-1)
        _value := _src[_i] <= _value ? _src[_i] : _value
    _return = _value

dirmov(len) =>
	up = change(high)
	down = -change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

emaLength = input(20)
curEma = ema(close, emaLength)
highPeriod = input(20)
d = na

takeProfitLong = highest(high, highPeriod) 
stopLossLong = f_lowest(low, barssince(low >= curEma))

if strategy.position_size == 0
    if adx(dilen, adxlen) <= adxMin or high < curEma 
        strategy.cancel("Long")
    if adx(dilen, adxlen) > adxMin and low < curEma and high > curEma and curEma > curEma[highPeriod / 2] and curEma > curEma[highPeriod] and takeProfitLong > high
        strategy.order("Long", strategy.long, stop = high)
        strategy.exit("Exit", "Long", limit = takeProfitLong, stop = stopLossLong)
        d := high

takeProfitShort = lowest(low, highPeriod) 
stopLossShort = f_highest(high, barssince(high <= curEma))

if strategy.position_size == 0
    if adx(dilen, adxlen) <= adxMin or low > curEma 
        strategy.cancel("Short")
    if adx(dilen, adxlen) > adxMin and high > curEma and low < curEma and curEma < curEma[highPeriod / 2] and curEma < curEma[highPeriod] and takeProfitShort < low
        strategy.order("Short", strategy.short, stop = low)
        strategy.exit("Exit", "Short", limit = takeProfitShort, stop = stopLossShort)
        d := low


strategy.close("Exit")

plot(d == high ? stopLossLong : d == low ? stopLossShort : na, style = circles, linewidth = 4, color = red)
plot(d == high ? takeProfitLong : d == low ? takeProfitShort : na, style = circles, linewidth = 4, color = green)
plot(d, style = circles, linewidth = 4, color = yellow)
plot(curEma, color = black, linewidth = 2)  

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()