Pourquoi n'y a-t-il qu'une limite de 200 bars ?
Bon indicateur... Bon travail...
L'indicateur ne fonctionne pas
Malheureusement, oui. Cela ne fonctionne pas. 4 erreurs de compilation, et des erreurs stupides en plus. Mais l'indicateur est intéressant.
ne peut pas être compilé à cause d'erreurs
//Indicateur intéressant, code corrigé
//+------------------------------------------------------------------+ //|Niveaux iGDR_Fractal_Levels.mq5 | //| Copyright © 2008-2009, GreenDog, Russie. //|krot@inbox.ru | //+------------------------------------------------------------------+ //---- indicateur paternité #property copyright "Copyright © 2008-2009, GreenDog. //---- lien vers le site de l'auteur #property link "krot@inbox.ru" //---- numéro de version de l'indicateur #property version "1.00" //---- dessiner l'indicateur dans la fenêtre principale #property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 //+----------------------------------------------+ //|| Déclaration d'une énumération | //+----------------------------------------------+ enum FRACTAL_MODE { MODE_HIGH_LOW=0, // par extrema MODE_LOW, // par sommet MODE_HIGH // par des auges }; //+----------------------------------------------+ //|| Déclaration d'une énumération | //+----------------------------------------------+ enum FRACTAL_TYPE { TYPE1=0, // strict TYPE2 // non stricte }; //+----------------------------------------------+ //|| Paramètres d'entrée de l'indicateur //+----------------------------------------------+ input uint frNum_=2; // Nombre de barres de la fractale, 2 = fractale à 5 barres, 3 = fractale à 7 barres, etc. input FRACTAL_TYPE frType= TYPE2; // Type de définition de la fractale 0=strict, 1=non-strict input FRACTAL_MODE frMode =MODE_HIGH_LOW; // Mode input double dlt_=0.24; // Erreur par rapport à la hauteur moyenne de la barre input uint sBars_=200; // Nombre de barres (max. 200) //---- input color BG1_Color = PaleGreen; // Couleur d'arrière-plan des premiers niveaux input color TL1Color = Green; // Couleur des lignes du premier niveau input color BG2_Color = Yellow; // Couleur d'arrière-plan des deuxièmes niveaux input color TL2Color = DarkOrange; // Couleur des lignes du deuxième niveau input color BG3_Color = Pink; // Couleur d'arrière-plan des troisièmes niveaux input color TL3Color = Red; // Couleur des lignes de troisième niveau //+----------------------------------------------+ uint lastBars=0; uint frNum,sBars; datetime lastTime=0; color BGColor[3],TLColor[3]; double aData[240][2],aRes[3][2]; //+------------------------------------------------------------------+ //| Fonction d'initialisation de l'indicateur personnalisé //+------------------------------------------------------------------+ void OnInit() { //---- initialisation des constantes frNum=frNum_; if(frNum_<2) frNum=2; sBars=sBars_; if(sBars_>200) sBars=200; if(sBars_<10) sBars=10; BGColor[0]=BG1_Color; BGColor[1]=BG2_Color; BGColor[2]=BG3_Color; TLColor[0]=TL1Color; TLColor[1]=TL2Color; TLColor[2]=TL3Color; //---- } //+------------------------------------------------------------------+ //| Création d'une étiquette de texte| //+------------------------------------------------------------------+ void CreateTextLabel(long chart_id, // identifiant du graphique string name, // nom de l'objet int nwin, // indice de la fenêtre datetime time1, // temps de 1 niveau de prix double price1, // 1 niveau de prix color Color, // couleur de la ligne string text, // texte string font, // police int fontsize) // taille de la police { //---- ObjectCreate(chart_id,name,OBJ_TEXT,nwin,time1,price1); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); ObjectSetInteger(chart_id,name,OBJPROP_BACK,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true); ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true); ObjectSetString(chart_id,name,OBJPROP_FONT,font); ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_id,name,OBJPROP_FONTSIZE,fontsize); //---- } //+------------------------------------------------------------------+ //|| Réinitialisation de l'étiquette de texte| //+------------------------------------------------------------------+ void SetTextLabel(long chart_id, // identifiant du graphique string name, // nom de l'objet int nwin, // indice de la fenêtre datetime time1, // temps de 1 niveau de prix double price1, // 1 niveau de prix color Color, // couleur de la ligne int style, // style de ligne int width, // épaisseur de la ligne string text, // texte string font, // police int fontsize) // taille de la police { //---- if(ObjectFind(chart_id,name)==-1) { CreateTextLabel(chart_id,name,nwin,time1,price1,Color,text,font,fontsize); } else { ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectMove(chart_id,name,0,time1,price1); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); } //---- } //+------------------------------------------------------------------+ //| Création d'un canal| //+------------------------------------------------------------------+ void CreateChannel(long chart_id, // identifiant du graphique string name, // nom de l'objet int nwin, // indice de la fenêtre datetime time1, // temps de 1 niveau de prix double price1, // 1 niveau de prix datetime time2, // moment du niveau de prix 2 double price2, // 2 niveau des prix datetime time3, // moment du niveau de prix 3 double price3, // 3 niveau des prix color Color, // couleur de la ligne int style, // style de ligne int width, // épaisseur de la ligne string text) // texte { //---- ObjectCreate(chart_id,name,OBJ_CHANNEL,nwin,time1,price1,time2,price2); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style); ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width); ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_id,name,OBJPROP_FILL,true); ObjectSetInteger(chart_id,name,OBJPROP_BACK,true); ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true); ObjectSetInteger(chart_id,name,OBJPROP_RAY,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true); ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true); //---- } //+------------------------------------------------------------------+ //|| Réinstallation de la chaîne| //+------------------------------------------------------------------+ void SetChannel(long chart_id, // identifiant du graphique string name, // nom de l'objet int nwin, // indice de la fenêtre datetime time1, // temps de 1 niveau de prix double price1, // 1 niveau de prix datetime time2, // moment du niveau de prix 2 double price2, // 2 niveau des prix datetime time3, // moment du niveau de prix 3 double price3, // 3 niveau des prix color Color, // couleur de la ligne int style, // style de ligne int width, // épaisseur de la ligne string text) // texte { //---- if(ObjectFind(chart_id,name)==-1) { CreateChannel(chart_id,name,nwin,time1,price1,time2,price2,time3,price3,Color,style,width,text); } else { ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectMove(chart_id,name,0,time1,price1); ObjectMove(chart_id,name,1,time2,price2); ObjectMove(chart_id,name,2,time3,price3); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); } //---- } //+------------------------------------------------------------------+ //| Création d'une ligne de tendance| //+------------------------------------------------------------------+ void CreateTline(long chart_id, // identifiant du graphique string name, // nom de l'objet int nwin, // indice de la fenêtre datetime time1, // temps de 1 niveau de prix double price1, // 1 niveau de prix datetime time2, // moment du niveau de prix 2 double price2, // 2 niveau des prix color Color, // couleur de la ligne int style, // style de ligne int width, // épaisseur de la ligne string text) // texte { //---- ObjectCreate(chart_id,name,OBJ_TREND,nwin,time1,price1,time2,price2); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style); ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width); ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_id,name,OBJPROP_BACK,false); ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true); ObjectSetInteger(chart_id,name,OBJPROP_RAY,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true); ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true); //---- } //+------------------------------------------------------------------+ //|| Remise à zéro de la ligne de tendance| //+------------------------------------------------------------------+ void SetTline(long chart_id, // identifiant du graphique string name, // nom de l'objet int nwin, // indice de la fenêtre datetime time1, // temps de 1 niveau de prix double price1, // 1 niveau de prix datetime time2, // moment du niveau de prix 2 double price2, // 2 niveau des prix color Color, // couleur de la ligne int style, // style de ligne int width, // épaisseur de la ligne string text) // texte { //---- if(ObjectFind(chart_id,name)==-1) { CreateTline(chart_id,name,nwin,time1,price1,time2,price2,Color,style,width,text); } else { ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectMove(chart_id,name,0,time1,price1); ObjectMove(chart_id,name,1,time2,price2); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); } //---- } //+------------------------------------------------------------------+ //| Recherche de la fractale supérieure| //+------------------------------------------------------------------+ bool upFrac(int cnt,const double &High[]) { //---- for(int i=1; i<=int(frNum); i++) { if(frType==TYPE1) { //---- si condition stricte et que les barres post ou pré sont supérieures à celles du voisin - pas de fractale if(High[cnt+i]>=High[cnt+i-1] || High[cnt-i]>=High[cnt-i+1]) return(false); } else { //---- si la condition n'est pas stricte et que les post ou pré-bars sont au-dessus du centre - pas de fractale if(High[cnt+i]>High[cnt] || High[cnt-i]>High[cnt]) return(false); } } //---- return(true); } //+------------------------------------------------------------------+ //| Trouver la fractale inférieure| //+------------------------------------------------------------------+ bool dwFrac(int cnt,const double &Low[]) { //---- for(int i=1; i<=int(frNum); i++) { if(frType==TYPE1) { //---- si condition stricte et que les barres post ou pré sont inférieures à celles du voisin - pas de fractale if(Low[cnt+i]<=Low[cnt+i-1] || Low[cnt-i]<=Low[cnt-i+1]) return(false); } else { //---- si la condition n'est pas stricte et que les post ou pré-bars sont en dessous du centre - pas de fractale if(Low[cnt+i]<Low[cnt] || Low[cnt-i]<Low[cnt]) return(false); } } //---- return(true); } //+------------------------------------------------------------------+ //| Fonction de désinitialisation de l'indicateur personnalisée | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //---- Comment(""); for(int i=0; i<3; i++) { string name="IPGDR_Lv"+string(i); ObjectDelete(0,name); ObjectDelete(0,name+"Up"); ObjectDelete(0,name+"Dw"); ObjectDelete(0,name+"Tx"); } //---- } //+------------------------------------------------------------------+ //| Fonction d'itération de l'indicateur personnalisée //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // quantité d'historique en barres sur le tic-tac actuel const int prev_calculated,// quantité d'historique en barres sur le tic-tac précédent const datetime &time[], const double &open[], const double& high[], // tableau des prix maxima pour le calcul de l'indicateur const double& low[], // tableau des prix minima pour le calcul de l'indicateur const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //---- vérifier que le nombre de barres est suffisant pour le calcul if(rates_total<int(sBars)) return(0); //---- indexation des éléments dans les tableaux, comme dans les séries chronologiques ArraySetAsSeries(time,true); ArraySetAsSeries(close,true); ArraySetAsSeries(open,true); ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); lastBars=rates_total; //---- recherche des fractales, les place dans le tableau, sans dépasser le nombre de fractales autorisé. int sh=0; ArrayInitialize(aData,0); double lastExt=0; int total=int(sBars-2*frNum); int start=int(frNum+1); for(int i=start; i<total; i++) { // if(frMode!=MODE_LOW && upFrac(i,high)) if(frMode!=FRACTAL_MODE::MODE_LOW && upFrac(i,high)) { //---- ajouter des sommets [sauf mode auge] //---- sauter les vertices voisins dupliqués dans des conditions non strictes if(!(frType!=TYPE1 && lastExt>0 && lastExt==high[i])) { aData[sh][0]=high[i]; lastExt=high[i]; sh++; } } if(sh>=240) break; // if(frMode!=MODE_HIGH && dwFrac(i,low)) if(frMode!=FRACTAL_MODE::MODE_HIGH && dwFrac(i,low)) { //---- ajouter des dépressions [sauf mode vertex] //---- sauter les auges voisines dupliquées dans des conditions non strictes if(!frType!=TYPE1 && lastExt>0 && lastExt==low[i]) { aData[sh][0]=low[i]; lastExt=low[i]; sh++; } } if(sh>=240) break; } //---- déterminer l'écart moyen entre les bougies et la tolérance correspondante double dlt,sHL=0; for(int i=1; i<=int(sBars); i++) sHL+=(high[i]-low[i]); sHL/=sBars; dlt=sHL*dlt_; //---- définir des notes pour chaque niveau for(int i=0; i<sh; i++) for(int j=i+1; j<sh; j++) if(aData[j][0]>aData[i][0]-dlt && aData[j][0]<aData[i][0]+dlt) { aData[i][1]+=1; aData[j][1]+=1; } //---- identifier les trois niveaux les plus forts double cur[2],tmp[2]; aRes[0][0]=aData[0][0]; aRes[0][1]=aData[0][1]; for(int i=1; i<sh; i++) { cur[0]=aData[i][0]; cur[1]=aData[i][1]; if(cur[1]>aRes[0][1]) { //---- si la note est supérieure au rang 1, le rang 1 devient le rang actuel tmp[0]=aRes[0][0]; tmp[1]=aRes[0][1]; aRes[0][0]=cur[0]; aRes[0][1]=cur[1]; cur[0]=tmp[0]; cur[1]=tmp[1]; } //---- si la note est plus élevée que la 2e place mais n'appartient pas à la 1re place, remplacer la 2e place if(cur[1]>aRes[1][1] && (cur[0]<aRes[0][0]-dlt || cur[0]>aRes[0][0]+dlt)) { tmp[0]=aRes[1][0]; tmp[1]=aRes[1][1]; aRes[1][0]=cur[0]; aRes[1][1]=cur[1]; cur[0]=tmp[0]; cur[1]=tmp[1]; } //---- si la note est plus élevée que la 3e place et qu'elle n'appartient pas à la 1re et à la 2e place, substituer la 3e place. if(cur[1]>aRes[2][1] && (cur[0]<aRes[0][0]-dlt || cur[0]>aRes[0][0]+dlt) && (cur[0]<aRes[1][0]-dlt || cur[0]>aRes[1][0]+dlt)) { aRes[2][0]=cur[0]; aRes[2][1]=cur[1]; } } for(int i=0; i<3; i++) { double dwL=aRes[i][0]-dlt,upL=aRes[i][0]+dlt; string name="IPGDR_Lv"+string(i); SetChannel(0,name,0,time[24],upL,time[1],upL,time[24],dwL,BGColor[i],STYLE_SOLID,1,name); SetTline(0,name+"Up",0,time[24],upL,time[1],upL,TLColor[i],STYLE_SOLID,1,name+"Up"); SetTline(0,name+"Dw",0,time[24],dwL,time[1],dwL,TLColor[i],STYLE_SOLID,1,name+"Dw"); SetTextLabel(0,name+"Tx",0,time[32],upL+2*_Point,TLColor[i],STYLE_SOLID,1,DoubleToString(aRes[i][0],_Digits),"tahoma",14); } //---- afficher les commentaires string rem1="",rem2=""; if(frType==TYPE2) rem1=rem1+"Classique"; else rem1=rem1+"Strictly"; rem1=rem1+string(frNum*2+1)+"fractales de barres".; // if(frMode==MODE_LOW) rem1=rem1+", troughs" ; if(frMode==FRACTAL_MODE::MODE_LOW) rem1=rem1+", les fonds."; //else if(frMode==MODE_HIGH) rem1=rem1+", vertex" ; else if(frMode==FRACTAL_MODE::MODE_HIGH) rem1=rem1+", tiges."; rem1=rem1+"Trouvé".+string(sh)+"fractale(s) \n Niveaux les plus forts "; StringConcatenate(rem2,aRes[0][0],"[",aRes[0][1],"], ", aRes[1][0],"[",aRes[1][1],"], ",aRes[2][0],"[",aRes[2][1], "], erreur ±",NormalizeDouble(dlt/_Point,1),"paragraphe(s)"); Comment(rem1+rem2); //---- ChartRedraw(0); //---- return(rates_total); } //+------------------------------------------------------------------+
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Niveaux iGDR_Fractal_Levels:
L'indicateur iGDR_Fractal_Levels montre les niveaux des fractales, mais pas tous, seulement leurs valeurs moyennes pour une certaine période de temps.
Author: Nikolay Kositsin