Estratégia de negociação de futuros intradiários com média móvel dupla

Autora:ChaoZhang, Data: 2023-11-15 16:48:02
Tags:

img

Resumo

Esta estratégia utiliza o princípio do cruzamento de média móvel dupla, incorpora o indicador ATR para stop loss e take profit, e adiciona controle de hora de negociação para projetar uma estratégia de negociação intradiária adequada para contratos futuros.

Estratégia lógica

A estratégia usa linhas de cruzamento de WMA de 5 períodos e 20 períodos como sinais de entrada. Ele vai longo quando a linha de 5 períodos quebra acima da linha de 20 períodos e fica curto quando a linha de 5 períodos quebra abaixo da linha de 20 períodos. Ele também usa a linha de WMA de 50 períodos para determinar a direção da tendência. Os sinais de negociação só são acionados quando a direção da quebra do preço é consistente com a tendência principal.

Além disso, a estratégia utiliza o indicador ATR para definir níveis dinâmicos de stop loss e take profit.

Por fim, a estratégia só desencadeia negociações durante as horas de negociação dos EUA (9:00-14:30 CST) para evitar alta volatilidade em torno do mercado aberto e fechado, onde se formam facilmente falsos sinais.

Análise das vantagens

A estratégia apresenta as seguintes vantagens:

  1. O cruzamento de médias móveis duplas capta efetivamente os pontos de virada da tendência para a entrada oportuna.

  2. O filtro de tendência evita a negociação contra a tendência principal e reduz os falsos sinais.

  3. Os controlos de stop loss baseados em ATR dinâmicos por perda de transação.

  4. A limitação dos horários de negociação evita períodos de abertura e fechamento voláteis.

  5. Regras simples e claras, fáceis de compreender e implementar para iniciantes.

  6. Parâmetros personalizáveis como períodos de MA, multiplicador ATR, horas de negociação, etc. para otimização.

Análise de riscos

A estratégia apresenta igualmente os seguintes riscos:

  1. Mais gatilhos de stop loss durante os mercados de gama.

  2. O cruzamento de MA dupla tem atraso e pode perder breakouts de curto prazo.

  3. A configuração incorreta dos parâmetros ATR leva a grandes ou pequenas perdas de parada.

  4. Basear-se apenas em indicadores técnicos sem análise fundamental.

  5. A eficácia depende do símbolo e do prazo adequados.

  6. O sistema mecânico corre o risco de ser arbitrado.

  7. Os parâmetros precisam de ser ajustados para diferentes sessões de negociação.

Estes podem ser melhorados através de ajustes de parâmetros, combinações de indicadores, intervenção manual selectiva, etc.

Orientações de otimização

A estratégia pode ser reforçada nos seguintes aspectos:

  1. Teste diferentes sistemas de MA, como EMA, DMA, etc.

  2. Adicione outros filtros técnicos como MACD, RSI etc.

  3. Otimizar os parâmetros do ATR para obter melhores valores de stop loss/profit.

  4. Incorporar indicadores de volume para encontrar sinais de entrada de alta qualidade.

  5. Ajustar os parâmetros com base nas especificações do símbolo.

  6. Integrar fatores fundamentais para evitar a negociação contra o mercado.

  7. Introduzir aprendizagem de máquina como redes neurais para modelagem de mercado.

  8. Explore combinações de vários prazos para mais oportunidades.

  9. Construir um conjunto estratégico para melhorar a robustez.

Conclusão

Em resumo, esta é uma estratégia simples e intuitiva adequada para iniciantes em prática de negociação ao vivo. Ao mesmo tempo, há muito espaço para otimização por meio de indicadores mais técnicos ou aprendizado de máquina. A afinação de parâmetros baseada em símbolos e dinâmica de mercado também é fundamental. A estratégia fornece uma estrutura de referência para iniciantes em negociação quantitativa, mas requer testes e aprimoramento incansáveis para lucros estáveis.


/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 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/
// © james4392010

//@version=4

strategy(title="DayTradingFutures Cross-Strategy", overlay=true)




// === GENERAL INPUTS ===
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
//highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn



wmaFastSource   = input(defval = close, title = "Fast WMA Source")
wmaFastLength   = input(defval = 5, title = "Fast WMA Period")
wmaSlowSource   = input(defval = close, title = "Slow WMA Source")
wmaSlowLength   = input(defval = 20, title = "Slow WMA Period")
wmaDirectionSource  = input(defval = close, title = "Trend 50 Period Source")
wmaDirectionLength  = input(defval = 50, title = "Trend 50 Period")
timeinrange(res, sess) => time(res, sess) != 0



// === SERIES SETUP ===
/// a couple of ma's..
wmaFast = wma(close, 5)
wmaSlow = wma(close, 20)
wmaDirection = wma(close, 50)





// === PLOTTING ===
fast = plot(series=wmaFast, color=color.white, linewidth=2)
slow = plot(series=wmaSlow, color=color.yellow, linewidth=2)
direction = plot(series=wmaDirection, color=color.red, linewidth=2)


// === INPUT BACKTEST RANGE ===

//fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
//fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
//fromYear = input(defval = 2022, title = "From Year", minval = 2022)
 
// To Date Inputs
//toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
//toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
//toYear = input(defval = 2022, title = "To Year", minval = 2022)
//startDate = timestamp(fromYear, fromMonth, fromDay)
//finishDate = timestamp(toYear, toMonth, toDay)
//inDateRange= (time >= fromDay, fromMonth, fromYear and time <= toDay, toMonth, toYear) 



// === FUNCTION EXAMPLE ===
//inDateRange = (time >= fromDay, fromMonth, fromYear) and (time <= toDay, toMonth, toYear)


// === LOGIC ===

enterLong = crossover(wmaFast, wmaSlow) and close > wmaDirection and timeinrange(timeframe.period, "0900-1430")
enterShort = crossunder(wmaFast, wmaSlow) and close < wmaDirection and timeinrange(timeframe.period, "0900-1430")

//trend := nz(trend[1], trend)
//trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
//upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)

buySignal = enterLong 
//plotshape(enterLong ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green)
plotshape(enterLong and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white)
//dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)

sellSignal = enterShort
//plotshape(enterShort ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red)
plotshape(enterShort and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white)
//mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
//longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
//shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
//fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
//fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="Buy", message="Buy!")
alertcondition(sellSignal, title="Sell", message="Sell!")
//changeCond = trend != trend[1]
//alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")



// Entry for strategy //

//tp=input(25,title="TakeProfit")
//sl=input(40,title="StopLoss")

strategy.entry("Long",1, when=buySignal)
//strategy.exit("Exit",profit=tp,loss=sl)
//strategy.exit("TakeProfit",profit=tp)
//strategy.exit("StopLoss",loss=sl)

strategy.entry("Short",1, when=sellSignal)
//strategy.exit("Exit",profit=tp,loss=sl)
//strategy.exit("TakeProfit",profit=tp)
//strategy.exit("StopLoss",loss=sl)
//strategy.exit("Exit", wmaFastwmaSlow)

//Buy and Sell Signals

//strategy.close_all(when =not timeinrange(timeframe.period, "1000-1430"))   


// === FILL ====

fill (fast, slow, color = wmaSlow > wmaDirection ? color.green : color.red)
//fill(when=enterLong, tp, color = color.new(color.green, 90), title = "Profit area")
//fill(when=enterLong, sl, color = color.new(color.red, 90), title = "Loss area")
//fill(when=enterShort, tp, color = color.new(color.green, 90), title = "Profit area")
//fill(when=enterShort, sl, color = color.new(color.red, 90), title = "Loss area")






Mais.