Estratégia de acompanhamento das oscilações cruzadas da EMA dupla

Autora:ChaoZhang, Data: 2024-01-03 11:38:51
Tags:

img

Resumo

A estratégia de rastreamento de oscilação dupla EMA é uma estratégia que identifica tendências usando o indicador EMA e rastreia oscilações durante condições de mercado voláteis.

Estratégia lógica

Esta estratégia utiliza a EMA de 20 períodos como indicador para julgar as tendências.

Quando o preço cruza acima da EMA, uma posição longa é inserida usando o preço mais alto nos últimos 20 períodos como o take profit e o mais baixo desde o crossover como o stop loss.

Ao mesmo tempo, a estratégia também verifica se o ADX está acima de 30. As negociações só são realizadas quando a tendência é forte o suficiente, ou seja, quando o ADX está acima de 30.

Durante as negociações abertas, o trailing stop continua a ajustar-se com base nas condições do mercado para obter mais lucros.

Análise das vantagens

Esta estratégia combina as vantagens tanto do rastreamento de tendências quanto da negociação de oscilações. Pode produzir retornos mais altos durante os mercados de tendências e retornos mais consistentes durante oscilações. A adaptabilidade é forte.

A utilização da EMA mantém também os parâmetros simples, reduzindo os riscos de otimização excessiva e assegurando a estabilidade.

Análise de riscos

O principal risco desta estratégia é a possibilidade de paradas mais frequentes durante oscilações intensificadas. É aqui que entra em jogo o ADX. Ao desativar a negociação quando o ADX está baixo, as perdas na ausência de uma tendência clara podem ser evitadas.

Além disso, a colocação adequada de stop loss também é fundamental. Paradas excessivamente largas podem aumentar o valor da perda de uma única negociação. Paradas excessivamente apertadas podem ser muito sensíveis e aumentar a probabilidade de stop out. Um equilíbrio precisa ser encontrado entre metas de lucro e riscos de stop loss.

Orientações de otimização

As potenciais otimizações desta estratégia incluem:

  1. Testando mais períodos de EMA para encontrar a combinação ideal.

  2. Otimizar os parâmetros ADX, incluindo o período ADX e os valores limiares.

  3. Melhoria dos algoritmos de captação de lucros e stop loss, por exemplo através da introdução de stops dinâmicos.

  4. Combinação de indicadores adicionais como KDJ e MACD para criar um sistema de confirmação de múltiplos indicadores.

Resumo

Em resumo, a estratégia de rastreamento de oscilação dupla EMA Crossover é uma estratégia altamente prática. Combina os pontos fortes de ambas as estratégias de negociação de tendência e estratégias de oscilação. Pode ser usada tanto para rastreamento de longo prazo quanto para negociação de curto prazo. Melhorias adicionais no desempenho podem ser alcançadas através da otimização de parâmetros e adição de indicadores de confirmação.


/*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()


Mais.