EMA e estratégia de cruzamento de volume acumulado para curto longo

Autora:ChaoZhang, Data: 2023-09-20 11:48:34
Tags:

Resumo

Esta estratégia combina os indicadores de EMA e volume acumulado, gerando sinais de compra e venda com base em suas situações cruzadas para determinar tendências.

Estratégia lógica

O EMA de 50 dias e os indicadores de volume acumulado de 100 dias são calculados. Quando o EMA cruza acima do volume acumulado de baixo, um sinal de compra é gerado para ir longo. Quando o EMA cruza abaixo do volume acumulado de cima, um sinal de venda é gerado para ir curto.

Durante as posições, as estratégias de stop loss e take profit são implementadas. O stop loss é definido em 8% abaixo do preço de entrada. O take profit é definido em 8% acima do preço de entrada, com fechamento parcial da posição quando o preço atinge o nível de take profit.

Análise das vantagens

A estratégia combina o indicador de tendência EMA e o volume acumulado do indicador de fluxo de fundos, alavancando informações de preço e volume para identificar efetivamente tendências de médio e longo prazo.

O período EMA pode ser ajustado livremente para diferentes produtos. Tanto as negociações longas quanto as curtas são implementadas para negociação linear.

Análise de riscos

A dependência excessiva de médias móveis pode resultar em desacelerações durante as consolidações de faixa. A tomada de lucro fixo e o stop loss também podem levar a saídas prematuras ou stop outs de tamanho excessivo.

A expansão dos períodos de média móvel pode reduzir os falsos sinais. Indicadores adicionais como volatilidade, RSI também podem ajudar os julgamentos.

Orientações de otimização

  1. Teste e otimize as combinações de parâmetros EMA para encontrar configurações ideais.

  2. Incorporar outros indicadores técnicos para formar um sistema de conjunto.

  3. Aplicar o aprendizado de máquina para prever tendências e melhorar o desempenho da EMA.

  4. Otimizar as estratégias de captação de lucro e stop loss, combinando trail stops, exits dinâmicos, etc.

  5. Introduzir módulos de gestão de capital para dimensionamento dinâmico das posições.

  6. Personalizar parâmetros com base nas características do produto para formar um conjunto de estratégias.

Resumo

A ideia da estratégia de combinar EMA e volume para a identificação de tendências é clara. Mas a dependência excessiva de médias móveis e saídas fixas tem falhas. Adicionar mais indicadores de julgamento e otimizar saídas pode melhorar a robustez.


/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 2h
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/
// © mohanee

//@version=4
strategy("EMA_cumulativeVolume_crossover[Strategy]", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000)


emaLength= input(50, title="EMA Length", minval=1, maxval=200)
cumulativePeriod = input(100,  title="cumulative volume Period", minval=1, maxval=200)


riskCapital = input(title="Risk % of capital", defval=10, minval=1)
stopLoss=input(8,title="Stop Loss",minval=1)
takePartialProfits=input(false, title="take partial profits  (percentage same as stop loss)")

tradeDirection=input(title="Trade Direction", defval="LONG", options=["LONG", "SHORT"])

avgPrice = (high + low + close) / 3
avgPriceVolume = avgPrice * volume

cumulPriceVolume = sum(avgPriceVolume, cumulativePeriod)
cumulVolume = sum(volume, cumulativePeriod)

vwapValue = cumulPriceVolume / cumulVolume

emaVal=ema(close, emaLength)

plot(emaVal, title="EMA", color=color.green,  transp=25)
plot(vwapValue, title="Cumulate Volumne / VWAP", color=color.orange,  linewidth=2, transp=25)

bgcolor(emaVal>vwapValue?color.blue:color.purple)    

//Entry--
//Echeck how many units can be purchased based on risk manage ment and stop loss
qty1 = (strategy.equity  * riskCapital / 100 ) /  (close*stopLoss/100)  

//check if cash is sufficient  to buy qty1  , if capital not available use the available capital only
qty1:= (qty1 * close >= strategy.equity ) ? (strategy.equity / close) : qty1

strategy.entry(id="LE",comment="LE", long=true, qty=qty1, when=crossover(emaVal, vwapValue)  and (tradeDirection=="LONG") )    //emaVal>vwapValue and crossover(close , emaVal)

//stoploss
stopLossVal=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00

//draw initil stop loss
plot(strategy.position_size>=1 ? stopLossVal : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
takeProfit=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(stopLoss*0.01) )) : ( close[1] * 2 )
if(takePartialProfits==true)
    strategy.close(id="LE", comment="Partial"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and close>takeProfit and crossunder(close, emaVal) )    //close<close[1] and close[1]<close[2] and close[2]<close[3])
    
strategy.close(id="LE" , comment="LE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossunder(emaVal, vwapValue) and (tradeDirection=="LONG") )

strategy.close(id="LE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= close < stopLossVal   and (tradeDirection=="LONG") )


//for short  you dont have to wait crossodown of ema, falling is speed , so just check if close crossing down vwapVal
strategy.entry(id="SE",comment="SE", long=false, qty=qty1, when=(close<vwapValue and close<open  and close[1] < vwapValue  and close[1]<open[1] and close<close[1])  and emaVal>=vwapValue and (tradeDirection=="SHORT") )    //emaVal>vwapValue and crossover(close , emaVal)

//stoploss
stopLossValUpside=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1+(stopLoss*0.01) )) : 0.00

//draw initil stop loss
plot(abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ? stopLossValUpside : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
shortTakeProfit=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00
if(takePartialProfits==true)
    strategy.close(id="SE", comment="Partial" , qty=strategy.position_size/3 , when = (tradeDirection=="SHORT"   ) and  close<shortTakeProfit )  //close<takeProfit and (emaVal - close)>8 )
  
//strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossover(emaVal, vwapValue) and (tradeDirection=="SHORT") )
strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and ( (emaVal<vwapValue and close>vwapValue and open>vwapValue and close>open )   or (crossover(emaVal,vwapValue))  ) and (tradeDirection=="SHORT") )

strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  close > stopLossValUpside   and (tradeDirection=="SHORT"   ) )




Mais.