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.
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.
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.
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.
As potenciais otimizações desta estratégia incluem:
Testando mais períodos de EMA para encontrar a combinação ideal.
Otimizar os parâmetros ADX, incluindo o período ADX e os valores limiares.
Melhoria dos algoritmos de captação de lucros e stop loss, por exemplo através da introdução de stops dinâmicos.
Combinação de indicadores adicionais como KDJ e MACD para criar um sistema de confirmação de múltiplos indicadores.
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()