
A estratégia é baseada em um cruzamento de dupla EMA e DEMA para identificar tendências e, em combinação com o ATR, para filtrar brechas de falso, para uma estratégia de negociação quantitativa com um duplo EMA e um filtro de volatilidade.
A estratégia inclui principalmente as seguintes partes:
O preço é calculado com EMA e DEMA como indicadores de dupla dinâmica. EMAs com períodos mais longos refletem tendências de longo prazo, enquanto DEMA é um indicador de dinâmica de curto prazo mais sensível.
Calcular o indicador de volatilidade do ATR. A volatilidade e a liquidez do mercado são julgadas pelo tamanho do ATR. Quando a volatilidade é excessiva, o indicador de volatilidade é filtrado para evitar falsas rupturas.
A taxa de flutuação do ATR é avaliada pela parametrização da média móvel. Quando a taxa de flutuação do ATR é inferior à média móvel, é permitido o disparo do sinal do indicador de massa móvel.
Parâmetros para controlar o período de tempo do ATR, a duração do ATR, o tipo e a duração da média móvel do ATR, etc.
Estabelecer regras de stop loss, stop-loss e stop-loss tracking para posições de vários titulares.
Esta dupla estratégia de filtragem de EMA pode reduzir significativamente os falsos sinais e a frequência de negociação da estratégia de EMA Gold Fork Dead Fork comum. Depois de adicionar o indicador de taxa de flutuação do ATR, pode efetivamente filtrar os sinais enganosos causados por pequenas flutuações e evitar ser bloqueado.
Em comparação com um único indicador de dinâmica, a estratégia usa um design de dois indicadores, o que pode melhorar a eficácia do julgamento. DEMA é um indicador de dinâmica de curto prazo mais sensível, em conjunto com um EMA de linha longa estável, formando um sinal combinado mais confiável.
Ao ajustar os parâmetros ATR, pode-se definir condições de taxa de flutuação apropriadas para objetos de diferentes padrões, aumentando a aplicabilidade da estratégia.
O maior risco da estratégia é que a configuração inadequada dos parâmetros pode levar a sinais de negociação muito escassos. A configuração de comprimentos de DEMA e EMA muito longos ou a configuração de limites de taxa de flutuação de ATR muito altos podem enfraquecer o funcionamento efetivo da estratégia. Isso precisa ser testado repetidamente para ajustar o melhor conjunto de parâmetros.
Outro risco potencial é que, em situações extremas, as flutuações de preços podem ultrapassar os limites dos parâmetros ATR, resultando em prejuízos. Isso requer a monitorização humana de anomalias no mercado e a suspensão da operação da estratégia.
Teste diferentes combinações de parâmetros de indicadores de potência para encontrar o melhor.
Tente ajustar o indicador de potência do duplo EMA para o MACD ou outro indicador.
Teste diferentes configurações de indicadores de volatilidade, como o ATR histórico global, o índice de volatilidade do mercado, etc.
Aumentar a filtragem do volume de transações, evitando o risco de que os preços não sejam reais.
Otimização do mecanismo de suspensão de prejuízos, para que o prejuízo seja superior ao lucro.
A estratégia integra indicadores de dinâmica com análise de taxa de flutuação e foi projetada com base em uma sólida base teórica. Através do ajuste de parâmetros e otimização de regras, pode ser uma estratégia de negociação quantitativa estável e confiável.
/*backtest
start: 2023-11-21 00:00:00
end: 2023-12-21 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/
// © Qorbanjf
//@version=4
strategy("ORIGIN DEMA/EMA & VOL LONG ONLY", shorttitle="ORIGIN DEMA/EMA & VOL LONG", overlay=true)
// DEMA
length = input(10, minval=1, title="DEMA LENGTH")
src = input(close, title="Source")
e1 = ema(src, length)
e2 = ema(e1, length)
dema1 = 2 * e1 - e2
plot(dema1, "DEMA", color=color.yellow)
//EMA
len = input(25, minval=1, title="EMA Length")
srb = input(close, title="Source")
offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
ema1 = ema(srb, len)
plot(ema1, title="EMA", color=color.blue, offset=offset)
// Inputs
atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution)
atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer)
useMA = input(title = "Show Moving Average?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type")
maLength = input(defval = 20, title = "Moving Average Period", minval = 1)
//longLossPerc = input(title="Long Stop Loss (%)",
// type=input.float, minval=0.0, step=0.1, defval=1) * 0.01
longTrailPerc = input(title="Trail stop loss (%)",
type=input.float, minval=0.0, step=0.1, defval=50) * 0.01
longProfitPerc = input(title="Long Take Profit (%)",
type=input.float, minval=0.0, step=0.1, defval=3000) / 100
// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2017, title = "From Year", minval = 2000)
ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear = input(defval = 9999, title = "To Year", minval = 2017)
// ATR Logic // atrValue = atr(atrLookback) // atrp = (atrValue/close)*100 // plot(atrp, color=color.white, linewidth=2, transp = 30)
atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback))
atrp = (atrValue/close)*100
// Moving Average Logic
ma(maType, src, length) =>
maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength))
// variables for enter position
enterLong = crossover(dema1, ema1) and atrp < maFilter
// variables for exit position
sale = crossunder(dema1, ema1)
// stop loss
//longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
// trail stop
// Determine trail stop loss prices
longStopTrail = 0.0
longStopTrail := if (strategy.position_size > 0)
stopValue = close * (1 - longTrailPerc)
max(stopValue, longStopTrail[1])
else
0
//Take profit Percentage
longExitPrice = strategy.position_avg_price * (1 + longProfitPerc)
//Enter trades when conditions are met
strategy.entry(id="long",
long=strategy.long,
when=enterLong,
comment="long")
//
strategy.close("long", when = sale, comment = "Sell")
//place exit orders (only executed after trades are active)
strategy.exit(id="sell",
limit = longExitPrice,
stop = longStopTrail,
comment = "SL/TP")