Estratégia de negociação longa e curta com base em EMA e volume acumulado


Data de criação: 2023-09-20 11:48:34 última modificação: 2023-09-20 11:48:34
cópia: 0 Cliques: 793
1
focar em
1617
Seguidores

Visão geral

A estratégia combina a EMA e o indicador de volume de negócios acumulado para determinar a tendência do mercado com base no cruzamento das duas, gerando sinais de compra e venda. É uma estratégia típica de acompanhamento de tendências, seguindo a direção do mercado em níveis de linha mais longa.

Princípio da estratégia

Calcule o EMA médio de 50 dias, bem como o indicador de volume de transação acumulado de 100 dias. Quando o EMA sobe de baixo para cima, gera um sinal de compra mais; Quando o EMA desce de cima para baixo e quebra o volume de transação acumulado, gera um sinal de venda para baixo.

Durante a manutenção de uma posição, configure um stop loss fixo e um stop exiting. O stop loss é definido como 8% abaixo do preço de entrada; o stop é definido como 8% acima do preço de entrada, e a parte da posição é liquidada quando o preço atinge o ponto de parada.

Análise de vantagens

A estratégia combina o indicador de tendência EMA e o indicador de fluxo de capital para acumular volume de transação, aproveitando ao máximo as informações de preço e volume de transação, para identificar efetivamente a tendência da linha média. A estratégia de stop loss fixa é diretamente eficiente e é vantajosa para bloquear parte dos lucros e controlar o risco.

Os parâmetros do ciclo EMA podem ser ajustados livremente para diferentes variedades. Pode ser feito mais decolagem e negociação linear. Os dados de retrospectiva mostram que a estratégia funciona bem em situações de tendência.

Análise de Riscos

A estratégia depende muito do indicador de linha média, e é propensa a falsos sinais em situações de turbulência de intervalos. O stop loss fixo também pode causar uma saída prematura ou um stop loss excessivo. Considere apenas informações sobre preços e volume de transação, sem considerar outros fatores.

Pode-se expandir adequadamente o parâmetro da linha média, reduzindo os sinais errados. Também pode ser introduzido o índice de taxa de flutuação, RSI e outros indicadores auxiliares. Otimizar o mecanismo de parada de parada, como a introdução de tracking stop loss, stop dynamic e outros.

Direção de otimização

  1. Teste a combinação de parâmetros do EMA para otimizá-los.

  2. Introduzir outros indicadores técnicos para formar uma estratégia de portfólio de indicadores.

  3. Aplicação de aprendizagem de máquina para a previsão de tendências de preços e melhoria da eficácia da EMA.

  4. Optimizar a estratégia de stop loss, combinando mecanismos de rastreamento de stop loss, stop loss dinâmico e outros.

  5. Introdução de módulos de gestão de fundos e ajuste dinâmico de posições.

  6. Ajustar os parâmetros para as características da variedade, formando um portfólio de estratégias.

Resumir

A estratégia integra os EMAs e os indicadores de volume de transação para avaliar a tendência da linha média e longa. Mas também há problemas com a dependência excessiva da linha média e do stop loss fixo. Adicionar mais indicadores para avaliar e otimizar a estratégia de stop loss pode aumentar a estabilidade da estratégia e a margem de lucro.

Código-fonte da estratégia
/*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"   ) )