Estratégia ZVWAP baseada na distância Z do VWAP

Autora:ChaoZhang, Data: 2023-11-10 12:02:19
Tags:

img

Resumo

Esta estratégia é baseada no indicador Z-distance from VWAP da LazyBear. Ele usa a distância Z entre o preço e o VWAP para determinar condições de sobrecompra e sobrevenda, bem como entradas e saídas.

Estratégia lógica

  1. Calcular o valor do VWAP
  2. Calcular a distância Z entre o preço e o VWAP
  3. Linha de sobrecompra (2.5) e linha de sobrevenda (-0.5)
  4. Caso a EMA rápida > a EMA lenta, a distância Z < linha de sobrevenda e a distância Z cruzem acima de 0
  5. Posições fechadas quando a distância Z > linha de sobrecompra
  6. Incorporar a lógica de stop loss

Funções principais:

  • calc_zvwap: Calcular a distância Z entre o preço e o VWAP
  • Valor VWAP: vwap ((hlc3)
  • EMA rápida: ema (quase, fastEMA)
  • EMA lenta: ema (fechada, lenta)

Análise das vantagens

  1. A distância Z mostra intuitivamente os níveis de sobrecompra/supervenda
  2. A EMA filtra falsas rupturas
  3. Permite que a pirâmide capitalize as tendências
  4. Tem uma lógica de stop loss para controlar o risco

Análise de riscos

  1. Precisa garantir parâmetros como linhas, períodos EMA são definidos corretamente
  2. Atraso do indicador de distância Z, pode perder pontos de virada importantes
  3. A pirâmide pode aumentar as perdas se a tendência se inverter
  4. O limite de perda deve ser ajustado de forma razoável

Soluções:

  1. Otimizar parâmetros através de backtesting
  2. Adicionar outros indicadores aos sinais filtrados
  3. Criar condições adequadas para a pirâmide
  4. Utilização de stop loss dinâmico

Orientações de otimização

  1. Otimizar os períodos de EMA
  2. Teste diferentes critérios de sobrecompra/supervenda
  3. Adicionar outros indicadores para filtrar o ruído
  4. Teste diferentes técnicas de stop loss
  5. Otimizar a lógica de entrada, pirâmide e stop loss

Resumo

A estratégia usa a distância Z para determinar a relação preço-VWAP e adiciona a EMA aos sinais de filtragem, visando capturar oportunidades de tendência. Permite a pirâmide para seguir tendências e tem um stop loss para controlar o risco. A otimização e a adição de outros indicadores podem melhorar a robustez. No entanto, a questão de atraso da distância Z deve ser considerada durante a otimização.


/*backtest
start: 2022-11-03 00:00:00
end: 2023-11-09 00:00:00
period: 1d
basePeriod: 1h
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
//This is based on Z distance from VWAP by Lazybear
strategy(title="ZVWAP[LB] strategy", overlay=false,pyramiding=2, default_qty_type=strategy.fixed, default_qty_value=3,    initial_capital=10000, currency=currency.USD)
length=input(13,"length")

calc_zvwap(pds, source1) =>
	mean = sum(volume*source1,pds)/sum(volume,pds)
	vwapsd = sqrt(sma(pow(source1-mean, 2), pds) )
	(close-mean)/vwapsd


upperTop=2.5  //input(2.5)
upperBottom=2.0  //input(2.0)
lowerTop=-0.5  //input(-0.5)
lowerBottom=-2.0 //input(-2.0)

buyLine=input(-0.5, title="OverSold Line",minval=-2, maxval=3)
sellLine=input(2.0, title="OverBought Line",minval=-2, maxval=3)

fastEma=input(13, title="Fast EMA",minval=1, maxval=50)
slowEma=input(55, title="Slow EMA",minval=10, maxval=200)

stopLoss =input(5, title="Stop Loss",minval=1) 

hline(0, title="Middle Line", linestyle=hline.style_dotted, color=color.green)

ul1=plot(upperTop, "OB High")
ul2=plot(upperBottom, "OB Low")
fill(ul1,ul2, color=color.red)
ll1=plot(lowerTop, "OS High")
ll2=plot(lowerBottom, "OS Low")
fill(ll1,ll2, color=color.green)
zvwapVal=calc_zvwap(length,close)
plot(zvwapVal,title="ZVWAP",color=color.purple, linewidth=2)


longEmaVal=ema(close,slowEma)
shortEmaVal=ema(close,fastEma)  

vwapVal=vwap(hlc3)


zvwapDipped=false

for i = 1 to 10
    zvwapDipped := zvwapDipped or zvwapVal[i]<=buyLine

longCondition=  shortEmaVal > longEmaVal  and zvwapDipped and  crossover(zvwapVal,0)

barcolor(longCondition ? color.yellow: na)

strategy.entry(id="ZVWAPLE", long=true,  when= longCondition  and strategy.position_size<1) 


//Add
strategy.entry(id="ZVWAPLE", comment="Add", long=true,  when= strategy.position_size>1 and close<strategy.position_avg_price and crossover(zvwapVal,0)) 


//calculate stop Loss
stopLossVal =  strategy.position_avg_price -  (strategy.position_avg_price*stopLoss*0.01)

strategy.close(id="ZVWAPLE",comment="SL Exit",    when=close<stopLossVal)   //close all on stop loss

strategy.close(id="ZVWAPLE",comment="TPExitAll",    qty=strategy.position_size ,   when= crossunder(zvwapVal,sellLine))   //close all      zvwapVal>sellLine

Mais.