Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4483
Beiträge: 40714
Benutzer: 6.866
Aktive Benutzer: 251
Links: 80
Wir begrüßen unseren neuesten Benutzer: hk0163
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- hk0163
vor 2 Tagen
- magnr1
vor 2 Tagen
- boypac007
vor 3 Tagen
- Anja
vor 5 Tagen
- ThaScorp

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 77
Gesamt: 78
Team: 0
Team:  
Benutzer:  traderdoc
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor 3 Wochen
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 54
LQK befindet sich auf einem aufstrebenden Ast
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt vor 3 Wochen
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 950
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

int OnTick() ?

Warum ist der bool, ob an dem Tag schon ne Order geöffnet wurde, bei init?
Mit Zitat antworten
  #3 (permalink)  
Alt vor 3 Wochen
Neues Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 28
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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?
Mit Zitat antworten
  #4 (permalink)  
Alt vor 2 Wochen
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 54
LQK befindet sich auf einem aufstrebenden Ast
Standard

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

Warum ist der bool, ob an dem Tag schon ne Order geöffnet wurde, bei init?
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!
Mit Zitat antworten
  #5 (permalink)  
Alt vor 2 Wochen
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 54
LQK befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Indikator-Trading Beitrag anzeigen
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.
Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 10:50 Uhr.





Die Suchmaschine - Der Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2020 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2020 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------