Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Ein Zwei meines EA wird anscheinend nie erreicht (http://www.expert-advisor.com/forum/showthread.php?t=6692)

LQK 17.06.20 18:54

Ein Zwei meines EA wird anscheinend nie erreicht
 
Hallo,

Ich habe den unten geposteten EA geschrieben. Es handelt sich um einen kleinen EA, den ich lediglich zu Übungszwecken geschrieben habe. Ein Zweig des EA wird dabei anscheinend nie erreicht.

Was der EA machen soll:
Zitat:

Beim ersten Tick ab 9 Uhr soll der EA einen Trade öffnen. Durch eine Flag-Variable soll sichergestellt werden, dass nur ein Trade pro Tage geöffnet wird. Die Flag-Variable soll ab 10 Uhr wieder zurückgesetzt werden, dass am nächsten Tag wieder ein neuer Trade beim ersten Tick ab 9 Uhr geöffnet werden kann.

Die Zeit zwischen 09:00:00 und 09:59:59 Uhr nenne ich somit die "heiße Stunde".

Das Debugging habe ich vorgenommen, indem ich an interessierenden Stellen des Programms mit Print() diverse Konsolenausgaben erzeugt habe. Somit konnte ich nachvollziehen, wo es ggf. hängt und somit die Stelle des Fehlers eingrenzen.

Im Großen und Ganzen funktioniert der EA, z.B. erhalte ich die Bildschirmausgaben:

"Es wurde ein Trade eröffnet!" und "OnInit() Methodenrumpf wurde durchlaufen!"

Getestet habe ich das, indem ich die Systemzeit auf 9:xx Uhr eingestellt habe.


---


Lediglich das Rücksetzen der Flag-Variablen ab 10 Uhr klappt noch nicht. Das Rücksetzen habe ich getestet, indem ich die Systemzeit auf 09:58 Uhr eingestellt, dann den EA gestartet und bis 10:01 gewartet habe. Es wird dann zunächst, wie erwartet, ein Trade eröffnet. Jedoch funktioniert das Rücksetzen der Flag-Variable offenbar nicht.

Konsolenausgaben die bislang nämlich nicht auf der Konsole ausgegeben werden, sind diese:

"Zweite IF-Anweisung Ausführungsteil wurde erreiche!"

und

Flag-Variable wurde wieder zurückgesetzt auf: 0


Der Zweig der offenbar nicht funktioniert oder nicht erreicht wird, ist in dem geposteten Code rot markiert.

Daher habe ich den vermeintlich nicht funktionierenden oder nie erreichten Code in einen extra EA ausgelagert um ihn dort zu testen (das ist der zweite von mir gepostete Code).

Der Code funktioniert dort bedingt. Ich habe zwei Sachen ausprobiert:

Die Systemzeit auf 10 Uhr gestellt, den neuen EA gestartet. DER EA hat dann funktioniert, es kam die folgende Ausgabe:

"Stelle 1 wurde erreicht!"
"Stelle 2 wurde erreicht!"
"Flag-Variable zurückgestellt auf: 0"

Dann habe ich noch was probiert: Die Systemzeit auf 9:58 gestellt, den EA erneut gestartet und bis 10:02 gewartet.

Ergebnis dann:


Sofort nach dem Starten des EA (also um 9:58 Uhr) kam die Ausgabe "Stelle 1 wurde erreicht!" nach bzw. ab 10 Uhr kamen allerdings keine weiteren Ausgaben mehr. Insbesondere wurde offenbar die Flag-Variable nicht zurückgesetzt.


Demnach wird womöglich vom EA, aus welchen Gründen auch immer, die Uhrzeit nicht richtig erkannt?


Wie könnte ich das Problem lösen? (Worin besteht das Problem?)


Die Uhrzeit zum Debuggen in einer globalen Konstante halten, wie in einem anderen Zusammenhang vorgeschlagen, möchte ich nur sehr ungern. Weil ich nach dem Debuggen den EA dann noch mal umstricken müsste (ebenjene Konstante durch TimeLocal() ersetzen.
So wie ich mich kenne, würde ich dabei nur witere/neue Fehler einbauen. ;)

---

Es folgt noch der angekündige Quellcode.

Zunächst der ursprünglich zu debuggende EA, der Zwei der offenbar nie erreicht wird, ist in roter Schrift:

Code:


//+------------------------------------------------------------------+
//|                            Hausaufgabe v17 ab jetzt debuggen.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                            https://www.mql5.com |
//+------------------------------------------------------------------+




// Deklaration und Initialisierung globale Konstanten

input int global_BeginnDerHeissenStunde = 9;
input double global_SL = 0.95 ;
input double global_TP = 1.033;
input int global_PositionGroesse = 1;
input int global_Slippage = 5;



// Deklaration globale Variablen

int order_id;
bool Flag_Variable;



// OnInit() macht hier nichts außer Flag_Variable zu initialisieren und onTick() zu starten.

void OnInit()
        {
       
        // Initialisierung Flag_Variable. Die Flaf_Variable signalisiert, ob an dem Tag ab 9 Uhr
        // bereits ein Trade geöffnet wurde.
       
        Flag_Variable = false;
        OnTick();
       
        Print("OnInit() Methodenrumpf wurde durchlaufen");

        }




int OnTick()         
 
  // Der erste Tick ab neun Uhr führt zum öffnen eines Trades, sofern an diesem Tag noch
  // kein Trade ab neun Uhr geöffnet wurde.
 
     
        {
       
        Print("OnTick() Methodenaufruf hat funktioniert und Kopf des Methodenrumpfs wurde erreicht!");
       
        if ((TimeHour(TimeLocal()) == global_BeginnDerHeissenStunde)&& Flag_Variable == false)
       
          {
         
          Print("Erste IF-Anweisung Ausführunsteil wurde erreicht!");
         
                          order_id = OrderSend(
                              Symbol(),
                              OP_BUY,
                              global_PositionGroesse,
                              Bid,
                              global_Slippage,
                              global_SL,
                              global_TP,
                              NULL,
                              0,
                              0,
                              clrNONE);
                                               
             
                Print("Soeben wurde ein Trade geöffnet!");
             
                // Nachdem ein Trade eröffnet wurde, wird die Flag_Variable auf true gesetzt.
                      Flag_Variable = true;
                     
                      Print("Flag-Variable wurde ein neuer Wert zugewiesen: " + Flag_Variable); 
                     
                      Print("Ausführungsteil der ersten IF-Anweisung wurde jetzt vollständig durchlaufen!");
          }
         
         
         
        // Nachdem die "heiße" Stunde vorüber ist, wird die Flag_Varaibel wieder auf false gesetzt.                 
    if ((TimeHour(TimeLocal()) > global_BeginnDerHeissenStunde) && Flag_Variable == true)
     
   
     
      {
          Print("Zweite IF-Anweisung Ausführunsteil wurde erreicht!");
                  Flag_Variable = false;
                 
                  Print("Flag-Variable wieder zurückgesetzt auf:" + Flag_Variable);
                 
          }

  }


Und hier noch der Code eines weitern EA. Der oben rot gehaltene Code wurde in diesen EA zu Testzwecken überführt:

Code:



int global_BeginnDerHeissenStunde = 9;
bool Flag_Variable = true;


void OnInit()
  {
 

 
    Print("Stelle 1 wurde erreicht");
  OnTick();


  }




int OnTick()
  {
//---


  if ((TimeHour(TimeLocal()) > global_BeginnDerHeissenStunde) && Flag_Variable == true)
      {
                  Flag_Variable = false;
                 
                  Print("Flag-Variable wieder zurückgesetzt auf:" + Flag_Variable);
                 
         
 
  Print("Stelle 2 wurde erreicht");
 
  }
}



Ich freue mich über jeden konstruktiven Hinweis! :)

Besten Dank und Grüße
LQK

MA-EA 17.06.20 22:13

int OnTick() ? :confused:

Warum ist der bool, ob an dem Tag schon ne Order geöffnet wurde, bei init? :confused:

Indikator-Trading 18.06.20 08:21

Du schreibst, dass du die Systemzeit auf die entsprechenden Uhrzeiten eingestellt hast. Die OnTick-Funktion wird nur bei einem Tick ausgeführt. Allerdings hast du sie auch "hart" in die OnInit() Funktion aufgerufen, d.h. beim ersten Aufruf von deinem EA wird die OnTick() Funktion auf jeden Fall aufgerufen, danach hängt es davon ab, ob du einen Tick bekommst oder eben nicht.

Kann es sein, dass du die Funktion testest, während der jeweilige Markt nicht aktiv ist oder du offline bist?

LQK 23.06.20 16:04

Zitat:

Zitat von MA-EA (Beitrag 43886)
int OnTick() ? :confused:

Warum ist der bool, ob an dem Tag schon ne Order geöffnet wurde, bei init? :confused:

Danke, damit ist mein Problem gelöst. Habe den Rückgabetyp für OnTick() von int auf void geändert, dadurch ist das Problem gelöst.

Besten Dank für Deine Hilfe. Ich wäre nie von alleine auf die Idee gekommen, dass ein falscher Rückgabewert für OnTick() ein solches Phänomen verursacht.

Ist mir im Grunde auch jetzt nicht klar, warum das so ist. Aber Hauptsache, das Problem ist gelöst. Besten Dank noch mal! :)

LQK 23.06.20 16:06

Zitat:

Zitat von Indikator-Trading (Beitrag 43887)
Du schreibst, dass du die Systemzeit auf die entsprechenden Uhrzeiten eingestellt hast. Die OnTick-Funktion wird nur bei einem Tick ausgeführt. Allerdings hast du sie auch "hart" in die OnInit() Funktion aufgerufen, d.h. beim ersten Aufruf von deinem EA wird die OnTick() Funktion auf jeden Fall aufgerufen, danach hängt es davon ab, ob du einen Tick bekommst oder eben nicht.

Kann es sein, dass du die Funktion testest, während der jeweilige Markt nicht aktiv ist oder du offline bist?

Ja, den "harten" Aufruf habe ich irgendwann mal testweise beim Debuggen eingeführt. Da dadurch erstmal einige Bugs nicht mehr auftraten, habe ich es so beibehalten.

Danke aber für den Hinweis, dass der harte Aufruf eigentlich unangemessen ist. Habe das jetzt beseitigt. Durch die Lösung des Grundproblems (siehe mein Post von gerade eben) ist der harte Aufruf auch nicht mehr erforderlich. Alle damit in Zusammenhang stehenden Bugs sind jetzt offenbar dauerhaft verschwunden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum