Participe de nossa página de fãs
Coloque um link para ele, e permita que outras pessoas também o avaliem
Avalie seu funcionamento no terminal MetaTrader 5
- Visualizações:
- 4898
- Avaliação:
- Publicado:
- 2014.01.15 09:06
- Atualizado:
- 2016.11.22 07:33
-
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance
Este é um ZigZag simples, mas muito rápido.
Sem picos suspensos ou errados. O tempo de recuperação de picos foi otimizado.
Vantagens:
- A função mais dispendiosa nos cálculos é a iBarShift. Substitui totalmente todos os ciclos necessários para recuperação dos picos. Por isso foi substituída pela ArrayBSearch. Isso significa que o indicador vai ser mais eficiente do que o seu equivalente em MQL4;
- Todos os dados necessários para cada barra é acessível em todos os momentos e também disponível para um EA em qualquer momento do histórico;
- Sem picos suspensos;
- Método eficiente para encontrar picos sem pesquisar os valores dos indicadores;
- Muito rápido;
- Funciona corretamente em inserções do histórico e quando são mudados os timeframes;
- Perfeito para usar em EAs.
Desvantagens:
- Memória requerida. ZigZag precisa de 2 buffers (um não é suficiente por causa de atrasos) para fazer o desenho correto, enquanto 5 buffers são usados aqui. Na minha opinião este inconveniente é completamente ofuscado pela vantagem #6. Nenhum dos ZigZags rápido pode processar corretamente inserções de história em dois buffers.
- Linhas adicionais estão disponíveis. Isso é necessário para tornar os dados visíveis num Expert Advisor. Essas linhas nunca devem ser visíveis.
Princípio:
ZigZag é desenhada pelo princípio da canalização. A largura do canal pode ser definido em pontos (IdealZZ) ou em termos percentuais (IdealZZP)
Recuperação de picos:
input int ChannelWidth=100; #property indicator_chart_window datetime LastTime; int ZZHandle; //+------------------------------------------------------------------+ //| Função de inicialização do indicador personalizado | //+------------------------------------------------------------------+ void OnInit() { LastTime = 0; ZZHandle = iCustom(_Symbol, Period(), "IdealZZ", ChannelWidth); } //+------------------------------------------------------------------+ //| Obter valor | //+------------------------------------------------------------------+ bool GetValue(double dir,int bar,int prevBar,double &peak, int &peakBar,datetime &peakTime,const datetime &T[]) { if(dir<0) { double t[1]; if(0>=CopyBuffer(ZZHandle,2,bar,1,t)) return false; int i= ArrayBsearch(T, (datetime)t[0]); if(i==prevBar) { if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); } double v[1]; if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false; if(v[0]==EMPTY_VALUE) { if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false; } peak=v[0]; peakBar=i; peakTime=(datetime)t[0]; } else if(dir>0) { double t[1]; if(0>=CopyBuffer(ZZHandle,3,bar,1,t)) return false; int i= ArrayBsearch(T, (datetime)t[0]); if(i==prevBar) { if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); } double v[1]; if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false; if(v[0]==EMPTY_VALUE) { if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false; } peak=v[0]; peakBar=i; peakTime=(datetime)t[0]; } else { return(false); } return(true); } //+------------------------------------------------------------------+ //| Obter Valor | //+------------------------------------------------------------------+ void SetPt(string name,double price,datetime time) { ObjectCreate(0,name,OBJ_ARROW,0,time,price); ObjectSetInteger(0,name,OBJPROP_ARROWCODE,108); ObjectSetDouble(0,name,OBJPROP_PRICE,price); ObjectSetInteger(0,name,OBJPROP_TIME,time); } //+------------------------------------------------------------------+ //| Função de iteração do indicador personalizado | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &T[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { if(LastTime==T[0]) return(rates_total); LastTime=T[0]; ArraySetAsSeries(T,true); double dir_[1]; if(0>=CopyBuffer(ZZHandle,4,1,1,dir_)) return rates_total; double dir=dir_[0]; double rdir=-dir; if(dir==EMPTY_VALUE) return(rates_total); double v1,v2,v3,v4,v5; int i1,i2,i3,i4,i5; datetime t1,t2,t3,t4,t5; if( GetValue(dir,1,0,v1,i1,t1,T) && GetValue(rdir,i1,0,v2,i2,t2,T) && GetValue(dir,i2,i1,v3,i3,t3,T) && GetValue(rdir,i3,i2,v4,i4,t4,T) && GetValue(dir,i4,i3,v5,i5,t5,T) ) { SetPt("1",v1,t1); SetPt("2",v2,t2); SetPt("3",v3,t3); SetPt("4",v4,t4); SetPt("5",v5,t5); Print(v1," ",v2," ",v3," ",v4," ",v5," ",i1," ",i2," ",i3," ",i4," ",i5); } else { Print("Seems to be error available..."); } return(rates_total); } //+------------------------------------------------------------------+
Este é um exemplo de indicador mostrando as linhas (uma vez por barra) dos primeiros cinco picos (incluindo a atual formando uma).
Atenção! O código pode funcionar de forma incorreta, se o modo "zero bar" for habilitado
Modo Barra Zero:
O modo pode ser ativado no código da variável DrawZeroBar. Está desabilitada por padrão. Não é recomendado habilitá-lo, especialmente se o indicador é usado em Expert Advisor.
Aproveite e use o indicador. Por favor, me informar de qualquer inconveniente que aparecer.
Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/925

Abre uma posição de cobertura virtual no MetaTrader 5.

Este indicador calcula o último preço médio de um símbolo e determina a direção de sua tendência, desse modo, é possível utilizá-lo como um sinal de negociações.

Inspirado pelo Expert Advisor Pirat no Campeonato de Negociação Automatizada 2011.

Este Expert Advisor ilustra o uso da função IndicatorParameters() para obter informações sobre o número de parâmetros de entrada, seus tipos e valores.