Objekte im Chart zeichnen

 

Hallo zusammen,

ich würde gerne auf der Basis eines Indikators Objekte im chart zeichnen. In diesem Falle sind es rote oder Grüne Rechtecke, jenachdem, ob der Indikator ein long oder Short signal gibt.

Leider scheint mir mein EA etwas schmutzig programmiert zu sein, sodass er manchmal manche Kerzen auslässt. (Siehe Bild).



Könnt ihr mir villeicht sagen, woran das genau liegt? Der Code, möglichst gut beschrieben findet sich weiter unten:

double mamaUp[], mamaDn[]; // Indikator Buffer, jeweils die obere und untere Linie von mama.mql5
int mamaHandle;
int ObjUpInt[];//Integer wert für Long Signal
int ObjDnInt[];//Integer wert für Short signal
int e = 0;
string ObjUpString; //string für Long signal
string ObjDnString;//string für short signal
int f = 1;
int a;

int OnInit()
   
  {
   ArrayResize(ObjUpInt,1000000); 
   ArrayResize(ObjDnInt,1000000);
     {
      mamaHandle=iCustom(_Symbol,PERIOD_CURRENT,"AAA_EA_Indicators\\mama");
     }
    return(INIT_SUCCEEDED);
  }
  
  
void OnTick()

  {
   CopyBuffer(mamaHandle,0,0,3,mamaUp);
   CopyBuffer(mamaHandle,1,0,3,mamaDn);
   
   ArraySetAsSeries(mamaUp,true);
   ArraySetAsSeries(mamaDn,true);
   
   checkNewH1Candle();
   ObjUpString = IntegerToString(ObjUpInt[a],1); // wandelt die Integer Zahlen in Strings um
   ObjDnString = IntegerToString(ObjDnInt[a],1);

   if( mamaUp[1] > mamaDn[1])
   {
    
    ObjectCreate(0,ObjUpString,OBJ_RECTANGLE,0,TimeCurrent(),0,TimeCurrent()+3600,3); //kreiert das Grüne Rechteck
    ObjectSetInteger(0,ObjUpString,OBJPROP_COLOR,clrGreen);
    ObjectSetInteger(0,ObjUpString,OBJPROP_FILL,true);
    ObjectSetInteger(0,ObjUpString,OBJPROP_BACK,true);
   }
   
   if( mamaUp[1] < mamaDn[1])
   {
    
    ObjectCreate(0,ObjDnString,OBJ_RECTANGLE,0,TimeCurrent(),0,TimeCurrent()+3600,3);//kreiert das Rote Rechteck
    ObjectSetInteger(0,ObjDnString,OBJPROP_COLOR,clrRed);
    ObjectSetInteger(0,ObjDnString,OBJPROP_FILL,true);
    ObjectSetInteger(0,ObjDnString,OBJPROP_BACK,true);
   }

   Comment("mamaDn: ", mamaDn[1],
          "\nmamaUp: ", mamaUp[1],
          "\ne :", e,
          "\nf : ", f,
          "\nObjUpInt[a] :",ObjUpInt[a],
          "\nObjDnInt[a] :",ObjDnInt[a]

        
);
   }
   
   
bool   checkNewH1Candle ()
{ 
                                                                          
 static datetime timeH1Last = NULL; 
        datetime timeH1This = iTime (_Symbol , PERIOD_H1 , 0 ); 
        
 if(timeH1Last < timeH1This)                                      
   {                                                                    
     timeH1Last = timeH1This; 
     e = e + 2 ; // zählt mit e-start = 0 nur die geraden werte hoch
     f= f + 2; // zählt mit f=1 nur die ungeraden werte hoch
     a++;
     ObjUpInt[a]=e; //weißt den wert dem up array zu, welches später zu einem String umgewandelt wird, um dann dem rechteck als namen weiter zu geben
     ObjDnInt[a]=f;
     return true; 
   }                                                                   
 return false;
}
//+----

Vielen Dank für eure Hilfe!:)

 

Du kannst das ganz einfach selbst herausfinden. :)

Setz ein if (TimeCurrent() > D'2021.01.19 22:00:00') DebugBreak();

und dann verfolge, wie und warum sich die Farb-Puffer (nicht) füllen.

 

Danke Carl!

Ich habe schonmal irgendwoe gelesen, dass du das als letztes Mittel empfiehlst, leider ist mir diese Funktion völlig fremd.

Ich schätze, dass mich dieser Link weiter bringt:

https://www.mql5.com/de/articles/654


Jedoch glaube ich den Fehler entdeckt zu haben. Er tritt immer um mitternacht auf, was daran liegen könnte, dass ich in der Funktion:

  ObjectCreate(0,ObjDnString,OBJ_RECTANGLE,0,TimeCurrent(),0,TimeCurrent()+3600,3);//kreiert das Rote Rechteck


für den zweiten zeitstempel einfach TimeCurrent() + 1h ansetze. Ich schätze, dass dieser nicht den Tageswechsel miteinbezieht

Zur Fehlerbehebung von MQL5-Programmen (Debugging)
Zur Fehlerbehebung von MQL5-Programmen (Debugging)
  • www.mql5.com
Dieser Artikel richtet sich primär an Programmierer, die die Sprache zwar bereits gelernt haben, die allerdings noch keine Meister ihres Fachs sind. Er wird auf verschiedene Debugging-Techniken eingehen, die der gebündelten Erfahrung des Autors sowie vieler anderer Programmierer entspringen.
 

Der Debugger ist für mich ein ganz wesentliches Element.

Der Kompiler zeigt mir die formale Richtigkeit, aber mit dem Debugger prüfe ich, ob mein Programm tatsächlich tut, was ich glaube, dass es tut und tun soll.