Discussion de l'article "Comment détecter les tendances et les modèles graphiques à l'aide de MQL5" - page 2

 

Les messages doivent être rédigés en anglais uniquement sur ce forum.

Vous pouvez utiliser l'outil de traduction automatique si nécessaire.

Merci de votre compréhension.
 
J M double bottom ), n'y a-t-il pas possibilité de proposer un code qui soit capable de tracer plutôt 4 lignes différentes et définitives (dessinant plus ou moins clairement sur le graphique un M) ? Plutôt que des lignes qui se redessinent au fur et à mesure que les cours évoluent, ce qui n'est pas du tout une bonne chose lorsqu'il s'agit de repérer des configurations .

Comme pour le double top, par exemple :

1. Une première ligne, qui dessinera la première jambe haussière. Et la ligne reste définitive sans bouger davantage lors des prochains changements de cours...

2. Une seconde, qui tracera la première correction baissière, indiquera en même temps la formation potentielle d'un premier sommet d'une figure en M potentielle.

3. Une troisième, qui trace la reprise haussière (une deuxième impulsion haussière), et alerte le trader sur l'imminence d'un retour...

4. Et, enfin, une ligne arrière qui sera tracée lorsque la figure sera réellement formée...

Voilà, je pense que vous avez compris mon souci.

Est-ce qu'il y a un code capable de faire ces différents tracés, est-ce que ce n'est pas possible ? MERCI

Je vous remercie pour votre commentaire.

Je sais qu'il peut être difficile de détecter des modèles sur la base de la forme du modèle, car il existe de nombreuses variantes acceptées, et il se peut que vous deviez développer votre code en fonction des objectifs et de ce que vous avez mentionné.

Ce que je pense, c'est que tout ce que vous pouvez décrire de manière logique, vous pouvez le coder.

Je vous remercie.

 
Mohamed Abdelmaaboud #:

Merci pour votre commentaire.

Je sais qu'il peut être difficile de détecter des modèles en se basant sur la forme du modèle, car il existe de nombreuses variantes acceptées, et il se peut que vous deviez développer votre code en fonction des objectifs et de ce que vous avez mentionné.

Ce que je pense, c'est que tout ce que vous pouvez décrire de manière logique, vous pouvez le coder.

Je vous remercie.

Ok, merci

Traduit en anglais par un modérateur.

Ceci est le forum anglais. Merci de n'écrire qu'en anglais.

 
Je suis ravi d'avoir lu votre article, Mohamed.
Je me suis permis (j'espère que vous n'en prendrez pas ombrage) d'unifier les codes pour voir les résultats regroupés : C'est ce à quoi je pense pour continuer à faire des pas vers la création d'un éventuel EA.
Qui est encouragé à mettre en place des commandes aux différents états graphiques ?

Je vous prie d'agréer, Madame, Monsieur, l'expression de mes salutations distinguées.

//+------------------------------------------------------------------+
//|TrendDTDB.mq5 |
//+------------------------------------------------------------------+

input int checkBars= 20;
   int high1, high2, low1, low2;
   double highVal1, highVal2, lowVal1, lowVal2;

void OnInit()
{
   PonEtiquetas();
}


void OnTick()
{
   high1=getmove(MODE_HIGH,checkBars,0);
   high2=getmove(MODE_HIGH,checkBars,high1+1);
   highVal1=NormalizeDouble(iHigh(_Symbol,_Period,high1),5);
   highVal2=NormalizeDouble(iHigh(_Symbol,_Period,high2),5);
   
   low1=getmove(MODE_LOW,checkBars,0);
   low2=getmove(MODE_LOW,checkBars,low1+1);
   lowVal1=NormalizeDouble(iLow(_Symbol,_Period,low1),5);
   lowVal2=NormalizeDouble(iLow(_Symbol,_Period,low2),5);

// DOBLE TECHO
   if(highVal1<=highVal2&&lowVal1>lowVal2){ObjectSetString((int)_Symbol,"LS0",OBJPROP_TEXT,0,"Potencial DT-DOBLE TECHO"); DibujaArriba("DTP",clrGreen);}
   else if(highVal1<=highVal2&&lowVal1<lowVal2){ObjectSetString((int)_Symbol,"LS0",OBJPROP_TEXT,0,"DT-DOBLE TECHO");DibujaArriba("DT",clrGreen);}
        else{ObjectSetString((int)_Symbol,"LS0",OBJPROP_TEXT,0,"."); ObjectsDeleteAll(0,"DT",0,-1);}

//DOBLE SUELO
   if(lowVal1>=lowVal2&&highVal1<highVal2){ObjectSetString((int)_Symbol,"LS1",OBJPROP_TEXT,0,"Potencial DS-DOBLE SUELO"); DibujaAbajo("DSP",clrRed);}
   else if(lowVal1>=lowVal2&&highVal1>highVal2){ObjectSetString((int)_Symbol,"LS1",OBJPROP_TEXT,0,"DT-DOBLE TECHO");DibujaArriba("DS",clrGreen);}
        else{ObjectSetString((int)_Symbol,"LS1",OBJPROP_TEXT,0,"."); ObjectsDeleteAll(0,"DS",0,-1);}

// CHASSEUR DE TENDANCES
   if(lowVal1>lowVal2&&highVal1>highVal2){ObjectSetString((int)_Symbol,"LS2",OBJPROP_TEXT,0,"UP-Tendencia ALCISTA");DibujaArriba("T",clrGreen);}
   else if(highVal1<highVal2&&lowVal1<lowVal2){ObjectSetString((int)_Symbol,"LS2",OBJPROP_TEXT,0,"DOWN-Tendencia BAJISTA");DibujaAbajo("T",clrRed);}
        else{ObjectSetString((int)_Symbol,"LS2",OBJPROP_TEXT,0,"SW-Tendencia LATERAL");  ObjectsDeleteAll(0,"T",0,-1);}
      
}


int getmove(int move, int count, int startPos)
{
   if(move!=MODE_HIGH && move!=MODE_LOW)
      return (-1);
   int currentBar=startPos;
   int moveReturned=getNextMove(move,count*2+1,currentBar-count);
   while(moveReturned!=currentBar)
     {
      currentBar=getNextMove(move,count,currentBar+1);
      moveReturned=getNextMove(move,count*2+1,currentBar-count);
     }
   return(currentBar);
}
  
int getNextMove(int move, int count, int startPos)
{
   if(startPos<0)
     {
      count +=startPos;
      startPos =0;
     }
   return((move==MODE_HIGH)?
          iHighest(Symbol(),Period(),(ENUM_SERIESMODE)move,count,startPos):
          iLowest(Symbol(),Period(),(ENUM_SERIESMODE)move,count,startPos));
}
  
void DibujaArriba(string Nombre, int mColor)
{ 
   ObjectDelete(0,Nombre);
   ObjectCreate(0,Nombre,OBJ_TREND,0,iTime(Symbol(),Period(),high2),iHigh(Symbol(),Period(),high2),iTime(Symbol(),Period(),high1),iHigh(Symbol(),Period(),high1));
   ObjectSetInteger(0,Nombre,OBJPROP_COLOR,mColor);
   ObjectSetInteger(0,Nombre,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,Nombre,OBJPROP_RAY_RIGHT,true);

}

void DibujaAbajo(string Nombre, int mColor)
{ 
   ObjectDelete(0,Nombre);
   ObjectCreate(0,Nombre,OBJ_TREND,0,iTime(Symbol(),Period(),low2),iLow(Symbol(),Period(),low2),iTime(Symbol(),Period(),low1),iLow(Symbol(),Period(),low1));
   ObjectSetInteger(0,Nombre,OBJPROP_COLOR,mColor);
   ObjectSetInteger(0,Nombre,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,Nombre,OBJPROP_RAY_RIGHT,true);
}

void PonEtiquetas()
{ 
   ObjectCreate((int)_Symbol,"LS0", OBJ_LABEL, 0, 0, 0);
   ObjectSetString(0,"LS0",OBJPROP_FONT,"Arial");
   ObjectSetInteger(0,"LS0",OBJPROP_FONTSIZE,25); 
   ObjectSetInteger(0,"LS0",OBJPROP_COLOR,clrGreen);    
   ObjectSetInteger(0,"LS0", OBJPROP_CORNER, 4);   
   ObjectSetInteger(0,"LS0", OBJPROP_XDISTANCE, 800);
   ObjectSetInteger(0,"LS0", OBJPROP_YDISTANCE, 50);
   ObjectSetString((int)_Symbol,"LS0",OBJPROP_TEXT,0,"-");  
   
   ObjectCreate((int)_Symbol,"LS1", OBJ_LABEL, 0, 0, 0);
   ObjectSetString(0,"LS1",OBJPROP_FONT,"Arial");
   ObjectSetInteger(0,"LS1",OBJPROP_FONTSIZE,25); 
   ObjectSetInteger(0,"LS1",OBJPROP_COLOR,clrRed);    
   ObjectSetInteger(0,"LS1", OBJPROP_CORNER, 4);   
   ObjectSetInteger(0,"LS1", OBJPROP_XDISTANCE, 800);
   ObjectSetInteger(0,"LS1", OBJPROP_YDISTANCE, 90);
   ObjectSetString((int)_Symbol,"LS1",OBJPROP_TEXT,0,"-");  
   
   ObjectCreate((int)_Symbol,"LS2", OBJ_LABEL, 0, 0, 0);
   ObjectSetString(0,"LS2",OBJPROP_FONT,"Arial");
   ObjectSetInteger(0,"LS2",OBJPROP_FONTSIZE,25); 
   ObjectSetInteger(0,"LS2",OBJPROP_COLOR,clrWhiteSmoke);    
   ObjectSetInteger(0,"LS2", OBJPROP_CORNER, 4);   
   ObjectSetInteger(0,"LS2", OBJPROP_XDISTANCE, 800);
   ObjectSetInteger(0,"LS2", OBJPROP_YDISTANCE, 130);
   ObjectSetString((int)_Symbol,"LS2",OBJPROP_TEXT,0,"-");        
}
 
La création d'objets graphiques à chaque tic n'est pas une bonne idée.
 
Très bonne contribution, félicitations, merci beaucoup !
 
Assez clair et visible .et intéressant
 

Bonjour Mohamed, j'ai lu votre article et votre code. Il m'a beaucoup aidé.


Il y a une seule chose que je ne comprends pas. Où trouvez-vous la fonction "getmove" ? J'ai essayé de la chercher sur MTQL.

Je débute, donc désolé pour la question si la réponse est facile.

Eugène