Rejoignez notre page de fans
- Vues:
- 92
- Note:
- Publié:
-
Besoin d'un robot ou d'un indicateur basé sur ce code ? Commandez-le sur Freelance Aller sur Freelance
Un zigzag ultra-rapide basé sur le principe le plus simple possible.
Pas de sommets pendants. Avec prise en charge de la recherche de sommets optimisée en termes de temps.

Avantages :
- La fonction la plus lourde dans les calculs - iBarShift, qui remplace complètement les boucles inutiles pour la recherche de sommets, a été remplacée par ArrayBSearch, ce qui signifie que l'indicateur fonctionnera encore plus efficacement que son analogue MQL4 ;
- Toutes les informations nécessaires pour chaque barre sont non seulement disponibles à tout moment de l'histoire, mais également disponibles pour le conseiller expert à tout moment de l'histoire ;
- Pas de sommets suspendus ;
- Possibilité de rechercher efficacement les sommets sans rechercher les valeurs des indicateurs ;
- Travail très rapide ;
- Traitement correct de l'insertion de l'historique et du changement de période ;
- Indispensable pour travailler avec les conseillers experts.
Inconvénients :
- Coûts de mémoire. Pour dessiner correctement un zigzag, il faut 2 tampons (1 ne suffit pas, il y aura des blocages), ici 5 tampons sont utilisés. Cet inconvénient est entièrement compensé (à mon avis) par l'avantage du numéro 6. Par définition, aucun zigzag rapide ne peut gérer correctement l'insertion d'un historique sur deux tampons.
- Dessiner des lignes supplémentaires. Il est nécessaire de les rendre visibles pour l'Expert Advisor. Valeurs de l'ordre de grandeur qui ne doivent en aucun cas être visibles.
Principe :
Un nouveau genou commence à se construire à partir d'un pullback supérieur à celui défini dans les paramètres. Il peut être fixé en points (IdealZZZ) ou en pourcentage (IdealZZZP).
Prise de sommets :
input int ChannelWidth=100; #property indicator_chart_window datetime LastTime; int ZZHandle; //+------------------------------------------------------------------+ //| Fonction d'initialisation de l'indicateur personnalisé //+------------------------------------------------------------------+ void OnInit() { LastTime = 0; ZZHandle = iCustom(_Symbol, Period(), "IdealZZ", ChannelWidth); } //+------------------------------------------------------------------+ //| GetValue| //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ //| GetValue| //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ //| Fonction d'itération de l'indicateur personnalisée //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+
Cet exemple est un indicateur que chaque barre (une fois par barre) marque les 5 derniers sommets (y compris le sommet actuel non formé).
Attention. Le code peut ne pas fonctionner correctement si le mode zéro barre est activé.
Mode barre zéro :
Activé dans le code par la variable DrawZeroBar. Il est désactivé par défaut. Il n'est pas recommandé de l'activer. Si l'indicateur est utilisé dans un Expert Advisor, il est fortement déconseillé de l'activer.
Utilisez-le :) . N'hésitez pas à nous faire part de toute lacune que vous pourriez constater.
Traduit du russe par MetaQuotes Ltd.
Code original : https://www.mql5.com/ru/code/925
Corrected Average (CA)
Indicateur de moyenne corrigée de A.Uhl (également connu sous le nom de "Moyenne mobile optimale").
Changement de période
Script simple pour changer les principales échéances. L'objectif principal est de faciliter la commutation à l'aide de touches de raccourci.
Triple performance intrajournalière
Définissez trois croisements et surveillez le pourcentage quotidien de performance à partir d'un moment donné (qui peut également être défini).
CDatetimeMsc
CDateTime Extension des millisecondes + datetime Extension des variables de supervision