Screenshot in einer FOR funzt nicht

 

Moin Moin,

ich schildere kurz was ich machen möchte und was eben nicht klappt:

Was ich möchte:

Ich sammle mit einer Liste CandlePattern (Dojis und Hammer) von denen ich dann einen Screentshot machen möchte, den ich mir dann per Email zusenden lassen möchte. Bevor die Screenshots gemacht werden, soll erst mal der Chart den TimeFrame und das Symbol des Signales laden/selektieren.

Was nicht klappt:

Obwohl ich die Abfolge Loope, werden sie anscheinend nicht prozedual abgearbeitet. So werden die Charts nicht sauber selektiert und die Screenshots passen nicht zu den Signalen. Beim Debuggen ist mir aufgefallen das bei aktuell 4 Signalen, die ersten 2 nacheinander abgearbeitet werden und die restlichen 2 nicht. Auch wenn ich am Haltepunkt stehen bleibe, läuft die Ausgabe weiter. Bedeutet bevor ich überhaupt die Charts selektieren kann, werden die restlichen Signale bereits weiterverarbeitet, was ich an der Print-Ausgabe im Terminal erkennen konnte, die bereits erfolgt obwohl ich erst beim 2ten Signal bin und dort am Haltepunkt beim Debuggen warte. Die Emailfunktion ist abgekoppelt, die kann da nicht in die quere kommen.

Soweit ich es in Erinnerung habe, unterstützt MQL5 keine Multithreathing oder asnyc funktionen. Hat sich das geändert? So up to date bin ich da nicht.

for(int i=0;i<signalList.Total();i++)
     {
         CandlePattern *o=signalList.GetNodeAtIndex(i);  
         MakeSH(o.wert,GetPeriodEnum(o.signalTF));  

         Print("Symbol:--  > "+o.patternName+"     Wert:--  > "+o.wert+"   TF:--  > "+o.signalTF+"    Time:--  > "+o.signalTime);
         delete o;
         
     }
      signalList.Clear();
      delete signalList;



     //+------------------------------------------------------------------+
      //| Macht einen Screenshot des aktuellen Charts und speichert diesen |
      //+------------------------------------------------------------------+
         bool MakeSH(string wert, ENUM_TIMEFRAMES tf )
         {
         
            PrepareChartForScreenshot(wert,tf);   
            string chartSymbol = ChartSymbol(0);
            ENUM_TIMEFRAMES period = ChartPeriod(0);
            if(chartSymbol != wert && period != tf)
              {
                PrepareChartForScreenshot(wert,tf);   
              }

            
            ENUM_ALIGN_MODE  align_mode = ALIGN_RIGHT;
            long width = ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);
            long height = ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);
            string fileName=wert+GetPeriodString(tf)+".gif";
            //--- Show the name on the chart as a comment
            //  Comment(name);
            if(!ChartScreenShot(0,fileName,(int)width,(int)height,align_mode))
              {
                  Print("ScreenShot failed: "+IntegerToString(GetLastError()));
                  return false;
              }      
            return true;
         }  
     
     //+------------------------------------------------------------------+
     //|  Wählt den Chart + TF  aus mit speziellen Settings               |
     //+------------------------------------------------------------------+     
     void PrepareChartForScreenshot(string wert, ENUM_TIMEFRAMES tf )
     {
         
         ChartSetSymbolPeriod(0,wert,tf);
         ChartSetInteger(0,CHART_SHOW_GRID,false);
         ChartSetInteger(0,CHART_MODE,CHART_CANDLES);         
         ChartSetInteger(0,CHART_SCALE,3);         
         ChartSetInteger(0,CHART_AUTOSCROLL,true);         
         ChartSetInteger(0,CHART_SHIFT,true);
         ChartSetInteger(0,CHART_COLOR_BACKGROUND,clrBlack);       
         ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,clrLimeGreen);
         ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,clrRed);      
         ChartSetInteger(0,CHART_COLOR_CHART_UP,clrLimeGreen);
         ChartSetInteger(0,CHART_COLOR_CHART_DOWN,clrRed);                     
         ChartSetInteger(0,CHART_COLOR_BID,clrWhite);           
     }

     //+------------------------------------------------------------------+
     //| Gibt den TF als ENUM zurück                                      |
     //+------------------------------------------------------------------+     
     ENUM_TIMEFRAMES GetPeriodEnum(string val)
     {
                        
         if(val == "M1")
           {
               return PERIOD_M1;
           }
         if(val == "M5")
           {
               return PERIOD_M5;
           }
         if(val == "M15")
           {
               return PERIOD_M15;
           }
         if(val == "H1")
           {
               return PERIOD_H1;
           }
         if(val == "H4")
           {
               return PERIOD_H4;
           }
         if(val == "D1")
           {
               return PERIOD_D1;
           }               
         return -1;
     }
   //+------------------------------------------------------------------+
   //| Klasse um ein ChartPattern Signal abzubilden                     |
   //+------------------------------------------------------------------+

   class CandlePattern : public CObject
     {
   public:
         string patternName;
         string wert;
         datetime signalTime;
         string   signalTF;
         
                        CandlePattern(void){};
                       ~CandlePattern(void){};
     };
Sleep() Funktionen werden auch komplett ignoriert. In der Loop hab ich nen 5sec Sleep gesetzt aber der is komplett durchgerauscht.

Weiß ehrlich gesagt nicht mehr was ich probieren soll.
Was überseh ich??
 
Mica Vasic:

Moin Moin,

ich schildere kurz was ich machen möchte und was eben nicht klappt:

Was ich möchte:

Ich sammle mit einer Liste CandlePattern (Dojis und Hammer) von denen ich dann einen Screentshot machen möchte, den ich mir dann per Email zusenden lassen möchte. Bevor die Screenshots gemacht werden, soll erst mal der Chart den TimeFrame und das Symbol des Signales laden/selektieren.

Was nicht klappt:

Obwohl ich die Abfolge Loope, werden sie anscheinend nicht prozedual abgearbeitet. So werden die Charts nicht sauber selektiert und die Screenshots passen nicht zu den Signalen. Beim Debuggen ist mir aufgefallen das bei aktuell 4 Signalen, die ersten 2 nacheinander abgearbeitet werden und die restlichen 2 nicht. Auch wenn ich am Haltepunkt stehen bleibe, läuft die Ausgabe weiter. Bedeutet bevor ich überhaupt die Charts selektieren kann, werden die restlichen Signale bereits weiterverarbeitet, was ich an der Print-Ausgabe im Terminal erkennen konnte, die bereits erfolgt obwohl ich erst beim 2ten Signal bin und dort am Haltepunkt beim Debuggen warte. Die Emailfunktion ist abgekoppelt, die kann da nicht in die quere kommen.

Soweit ich es in Erinnerung habe, unterstützt MQL5 keine Multithreathing oder asnyc funktionen. Hat sich das geändert? So up to date bin ich da nicht.

Sleep() Funktionen werden auch komplett ignoriert. In der Loop hab ich nen 5sec Sleep gesetzt aber der is komplett durchgerauscht.

Weiß ehrlich gesagt nicht mehr was ich probieren soll.
Was überseh ich??

Wo genau hast du das problem? Schau mal in der doku, manche funktionen werden nur in die warteschleife gelegt und beizeiten abgearbeitet

 
Wenn etwas nicht tut, was es soll, dann ist der Debugger das Mittel der Wahl...
 
amando:

Wo genau hast du das problem? Schau mal in der doku, manche funktionen werden nur in die warteschleife gelegt und beizeiten abgearbeitet


Die Abfolge läuft nicht prozedual, bedeutet dass die Charts nicht ausgewählt nach Wert und Timeframe und so werden die Screenshots nur

vom gleichen Chart gemacht. In der Doku steht nichts was andeutet das die Ausführung gesondert behandelt wird.

Die Funktion PrepareChartForScreenshot die in der Funktion MakeSH aufgerufen wird, wird komplett ignoriert.

PrepareChartForScreenshot(wert,tf); 

Selbst beim Debuggen wird die Funktion überrannt und ignoriert.

 
Carl Schreiber:
Wenn etwas nicht tut, was es soll, dann ist der Debugger das Mittel der Wahl...

hab doch geschrieben dass ich am Haltepunkt bin und er dennoch die Printausgabe macht......Haltepunkt = Breakpoint

 
Mica Vasic:


Sleep() Funktionen werden auch komplett ignoriert. In der Loop hab ich nen 5sec Sleep gesetzt aber der is komplett durchgerauscht.


Sleep Ersatz

//This section uses a while loop to simulate Sleep() during Backtest.
unsigned int viSleepUntilTick = GetTickCount() + 100; //100 milliseconds
while(GetTickCount() < viSleepUntilTick) 
 {
             //Do absolutely nothing. Just loop until the desired tick is reached.
 }
In Manchen Situationen sind Sleep() und andere gesperrt. (Tester )
 

Wenn Zeilen im Code nicht aufgerufen werden liegt das am Code, der vorher falsch oder eben nicht richtig abbiegt, das geht nur mit dem Debugger.

Wenn der das nicht fängt, liegt das wahrscheinlich daran, dass die Haltepunkte falsch gesetzt sind.

 
Christian:

Sleep Ersatz

In Manchen Situationen sind Sleep() und andere gesperrt. (Tester )

Danke Christian für das Snippet, hab den Übeltäter gefunden. 

ChartSetSymbolPeriod

ChartSetSymbolPeriod wird async ausgeführt und findet erst statt , wenn alle anderen Befehle abgearbeitet  werden. 

So wird mein komplette Logik für diesen Akt natürlich sinnlos. Nen awaiter scheints nicht zu geben, wenn diese aktion erst zum Ende ausgeführt wird. 

Mal schauen wie ich das gelöst bekomme.....

 
Mica Vasic:

Danke Christian für das Snippet, hab den Übeltäter gefunden. 

ChartSetSymbolPeriod

ChartSetSymbolPeriod wird async ausgeführt und findet erst statt , wenn alle anderen Befehle abgearbeitet  werden. 

So wird mein komplette Logik für diesen Akt natürlich sinnlos. Nen awaiter scheints nicht zu geben, wenn diese aktion erst zum Ende ausgeführt wird. 

Mal schauen wie ich das gelöst bekomme.....

dafür hab ich auch schon eine Lösung gesucht und keine gefunden

 

Hab einen Lösungsansatz gefunden, aber musste von meiner Logik abweichen. Da Build-In Funktionen schwer zu umgehen sind, musste ein anderer Ansatz her.

Einfach auf die ChartOpen Funktion ausweichen und dann über die erhaltene ChartID die restlichen Modifikationen vornehmen.

Das ganze läuft Prozedual und ohne Fehler, obwohl man mit dem blosem Auge nicht mal merkt das grad 5 Screenshots gemacht wurden schon heftig.

Danach einfach den Chart wieder schließen mit ChartClose wenn man Ihn nicht mehr benötigt und das wars. 

Grund der Beschwerde: