Diskussion zum Artikel "Wie man mit MQL5 Trends und Chartmuster erkennt" - Seite 2

 

Bitte schreiben Sie in diesem Forum nur auf Englisch.

Bei Bedarf können Sie ein automatisches Übersetzungsprogramm verwenden.

Danke.
 
J M double bottom ), gibt es keine Möglichkeit, einen Code vorzuschlagen, der eher in der Lage ist, 4 verschiedene und definitive Linien zu zeichnen (die mehr oder weniger deutlich auf dem Diagramm ein M zeichnen)? Anstelle von Linien, die sich bei Preisveränderungen neu einzeichnen, was für die Erkennung von Mustern überhaupt nicht gut ist .

Was zum Beispiel das Doppeltop betrifft:

1. Eine erste Linie, die den ersten Aufwärtstrend einzeichnen wird. Und die Linie bleibt endgültig, ohne sich bei den nächsten Kursänderungen weiter zu bewegen...

2. Eine zweite, die die erste Abwärtskorrektur nachzeichnet, zeigt gleichzeitig eine mögliche Bildung eines ersten Tops eines möglichen M-Musters an.

3. Ein dritter, der die Aufwärtserholung nachzeichnet (ein zweiter Aufwärtsimpuls) und den Händler auf eine bevorstehende Rückkehr aufmerksam macht...

4. Und schließlich eine hintere Linie, die gezogen wird, sobald sich die Figur wirklich gebildet hat...

Nun, ich denke, Sie haben mein Anliegen verstanden.

Gibt es einen Code, der diese verschiedenen Tracings durchführen kann, ist das nicht möglich? DANKE

Vielen Dank für Ihren Kommentar.

Ich weiß, dass die Erkennung von Mustern auf der Grundlage der Musterform schwierig sein kann, da es viele akzeptierte Abweichungen gibt, und Sie werden feststellen, dass Sie Ihren Code entsprechend den Zielen und den von Ihnen genannten Punkten entwickeln müssen.

Ich denke, dass man alles, was man auf logische Weise beschreiben kann, auch codieren kann.

Vielen Dank

 
Mohamed Abdelmaaboud #:

Vielen Dank für Ihren Kommentar.

Ich weiß, dass die Erkennung von Mustern auf der Grundlage der Musterform schwierig sein kann, da es viele akzeptierte Abweichungen gibt, und Sie werden feststellen, dass Sie Ihren Code gemäß den Zielen und den von Ihnen genannten Punkten entwickeln müssen.

Ich denke, dass man alles, was man auf logische Weise beschreiben kann, auch codieren kann.

Vielen Dank

Ok. Danke

Übersetzt ins Englische durch den Moderator.

Dies ist das englische Forum. Bitte schreiben Sie nur auf Englisch.

 
Ich freue mich, dass ich Ihren Artikel gelesen habe, Mohamed.
Ich habe mir die Freiheit genommen (ich hoffe, Sie nehmen mir das nicht übel), die Codes zu vereinheitlichen, um die Ergebnisse in einer Gruppe zu sehen: Das ist das, was mir einfällt, um weitere Schritte zur Schaffung eines möglichen EA zu unternehmen.
Wer wird ermutigt, Befehle für die verschiedenen grafischen Zustände zu implementieren?

Mit freundlichen Grüßen.

//+------------------------------------------------------------------+
//|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);}

// TREND FINDER
   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,"-");        
}
 
Es ist keine gute Idee, bei jedem Tick grafische Objekte zu erstellen.
 
Sehr guter Beitrag, herzlichen Glückwunsch, vielen Dank!
 
Ziemlich klar und sichtbar sowie interessant.
 

Hallo Mohamed, ich habe Ihren Artikel und Ihren Code gelesen. Er hat mir sehr geholfen.


Es gibt nur eine Sache, die ich nicht verstehe. Woher haben Sie die "getmove"-Funktion? Ich habe versucht, auf MTQL danach zu suchen.

Ich fange gerade erst an, also sorry für die Frage, wenn die Antwort einfach ist.

Eugene