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)
-   -   Trade_Zone_Timer (http://www.expert-advisor.com/forum/showthread.php?t=5769)

piptrade 21.07.17 16:08

Trade_Zone_Timer
 
Hallo, Liebe Programmier-"Gemeinde",
piptrade hat da `mal `ne Frage ! :

habe einen erste kleinen EA erstellt, welcher sogar über einen frei einstellbaren Trade_Zone_Timer (intraday-Session-Zones) verfügt.
Leider läuft der Timer immer nur für einen Tag und muss am nächsten Tag neu aktiviert werden, da er die 00:00 Uhr-Grenze nicht "überwindet".

So der bisherige Code:
Code:

//+------------------------------------------------------------------------+
//| TRADE_ZONE_TIMER                                                      |
//+------------------------------------------------------------------------+
datetime Time_1_Begin, Time_1_End;
datetime Time_2_Begin, Time_2_End;
datetime Time_3_Begin, Time_3_End;
//+------------------------------------------
void init()
  {
Time_1_Begin = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeZone_1_Begin);
Time_1_End  = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeZone_1_End);
Time_2_Begin = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeZone_2_Begin);
Time_2_End  = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeZone_2_End);
Time_3_Begin = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeZone_3_Begin);
Time_3_End  = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeZone_3_End);
  }

bool TradingTime() {
  if ((Time_1_Begin < Time_1_End && (TimeCurrent() < Time_1_Begin || TimeCurrent() >= Time_1_End)) &&
      (Time_2_Begin < Time_2_End && (TimeCurrent() < Time_2_Begin || TimeCurrent() >= Time_2_End)) &&
      (Time_3_Begin < Time_3_End && (TimeCurrent() < Time_3_Begin || TimeCurrent() >= Time_3_End))) 
      return(false);

  return(true);

}

Welche Ergänzung müßte ich vornehmen, dass der EA die Trade_Zones auch am nächsten Tag wieder berücksichtigt ? Wäre für Eure Hilfestellung sehr dankbar.
LG. piptrade

Leopold 21.07.17 16:24

Das was in "void init()" steht musst du in OnTick() schreiben. Sonst wird immer das Datum verwendet an dem die Init Funktion aufgerufen wurde verwendet.

Code:

//Globale Variable
datetime TagesStartZeit = 0;

OnTick()
  {
  if (TagesStartZeit != iTime(MarketCurrent, PERIOD_D1, 0))
      {
      //Zeiten Berechnen

      TagesStartZeit = iTime(MarketCurrent, PERIOD_D1, 0);
      }
  }

Wenn du deine "Initialisierung" dort hinein schreibst werden die Funktionen immer beim 1. Tick am Tag ausgeführt.

---Leopold---

piptrade 21.07.17 22:31

Hallo Leopold,
vorab herzlichen Dank für Deine Unterstützung. Die gegebenen Hinweise sind logisch sehr gut nachvollziehbar.
Dennoch habe ich jetzt, - nach unzähligen Versuchen, Deine Hinweise umzusetzen, - erst einmal resigniert. --> 1. Versuch = error, 2. Versuch = error, 3. Vers. usw. usw.. Wat nu ???
Ich sollte ev. "void Tick()" zusätzlich deklarieren - ist das richtig ? - und wenn "Ja", wie mache ich das ?

LG. piptrade
PS.: Liebes "Helferlein", mach es mir nicht so schwer.

Leopold 21.07.17 22:48

Hallo,

Wenn du einen EA erstellst hast du am Anfang immer folgende 3 Funktionen im Code: OnInit, OnDeinit und OnTick.

ich bin davon ausgegangen, dass diese "init" Funktion in der "OnInit" Funktion steht. Diese musst du aber in die "OnTick" Funktion schreiben.

Code:

datetime TagesStartZeit = 0;
datetime Time_1_Begin, Time_1_End;
datetime Time_2_Begin, Time_2_End;
datetime Time_3_Begin, Time_3_End;

int OnInit()
  {
  return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
  }

OnTick()
  {
  if (TagesStartZeit != iTime(MarketCurrent, PERIOD_D1, 0))
      {
      init();
      TagesStartZeit = iTime(MarketCurrent, PERIOD_D1, 0);
      }
       
  if (TradingTime())
      {
      ...
      }
  }

Ich hoffe damit ist es klarer.

---Leopold---

piptrade 23.07.17 10:27

OhHa; OhHa; OhHa; - eine neue Antwort im "Kästchen" !

Lieber Leopold
recht herzlichen Dank für Deine umgehende Rückmeldung und ein ganz, ganz liebes Dankeschön für Deine ausführliche Erläuterung. Eigentlich sollte es jetzt keine Probleme mehr geben.
Werde den "Einbau" heute Abend vornehmen und - sollte sich kein weiterer error einstellen - die nächsten 2 Tage testen.

Alles in Allem bin ich sehr zuversichtlich und werde mich in Kürze nochmals melden.

Ganz LG. piptrade :)

piptrade 26.07.17 19:24

Eine kleine Zwischennachricht an alle, die das Thema verfolgen:

Ganz so einfach ist es dann leider doch nicht ! Habe mich redlich gemüht, aber allein das "OnTick()" kann so wahrscheinlich nicht ganz funktionieren. Hier müßte sicher noch ein "int" oder ein "void" davor ? - Gleichzeitig kann bei Verwendung des "void" kein "return(0)" erfolgen ... usw.

Ist das SO ?

Als nächstes werde ich meine TimeZones mit einer TimeZone_4, welche über die 00:00 Uhr-Grenze hinausgeht, ergänzen; - vielleicht bringt das schon `was ? Vielleicht habt aber auch Ihr eine "zündende" Idee ?

LG. piptrade

next user 27.07.17 05:42

Zitat:

Zitat von piptrade (Beitrag 39312)
Habe mich redlich gemüht, aber allein das "OnTick()" kann so wahrscheinlich nicht ganz funktionieren. Hier müßte sicher noch ein "int" oder ein "void" davor ? - Gleichzeitig kann bei Verwendung des "void" kein "return(0)" erfolgen ... usw.

1. Bei der Erstellung wird unter anderem die Funktion
Code:

void OnTick()
erstellt, also kein "int". Da hat Leopold den Funktionstyp in seinem Code vergessen.

2. Ja, eine Void-Funktion hat keinen Rückgabewert. Um die Funktion vorzeitig zu verlassen, schreib einfach nur
Code:

return; // Also kein (0) ===>>> Also ohne einen Wert zurückzugeben.
Zitat:

Zitat von piptrade (Beitrag 39312)
Als nächstes werde ich meine TimeZones mit einer TimeZone_4, welche über die 00:00 Uhr-Grenze hinausgeht, ergänzen; - vielleicht bringt das schon `was ? Vielleicht habt aber auch Ihr eine "zündende" Idee ?

Kannst es doch so machen, wie Leopold dir vorgeschlagen hat.

piptrade 28.07.17 11:16

Zitat:

Zitat von next user (Beitrag 39319)
Kannst es doch so machen, wie Leopold dir vorgeschlagen hat.

In der Hoffnung, dass dies alles so einfach ist, bin ich natürlich Euren Hinweisen nachgekommen. Vorab schon `mal ein herzliches "Dankeschön" dafür.

Dennoch ergaben sich ( - wie ich "das Ding" auch "gedreht" habe - ) errors und warnings. Nunmehr hat der Timer nur noch 1 error und sieht wie folgt aus:

Code:

bool TradingTime();    //  <============ error: function must have a body

datetime TagesStartZeit = 0;
datetime Time_1_Begin, Time_1_End;
datetime Time_2_Begin, Time_2_End;
datetime Time_3_Begin, Time_3_End;
//+---

int OnInit()
  {
Time_1_Begin = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeZone_1_Begin);
Time_1_End  = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeZone_1_End);
Time_2_Begin = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeZone_2_Begin);
Time_2_End  = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeZone_2_End);
Time_3_Begin = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeZone_3_Begin);
Time_3_End  = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeZone_3_End);

  return(INIT_SUCCEEDED);
  }
//+---
 
void OnDeinit(const int reason)
  {
  }
//+---

void OnTick()
 {
  if (TagesStartZeit != iTime(NULL, PERIOD_D1, 0))  //  Änderg.: MarketCurrent ---> NULL = ok.
      {
//    init();                                        //  mußte deaktiviert werden !      = ok.
      TagesStartZeit = iTime(NULL, PERIOD_D1, 0);    //  Änderg.: MarketCurrent ---> NULL = ok.
     
if (TradingTime())
      {
  if ((Time_1_Begin < Time_1_End && (TimeCurrent() < Time_1_Begin || TimeCurrent() >= Time_1_End)) &&
      (Time_2_Begin < Time_2_End && (TimeCurrent() < Time_2_Begin || TimeCurrent() >= Time_2_End)) &&
      (Time_3_Begin < Time_3_End && (TimeCurrent() < Time_3_Begin || TimeCurrent() >= Time_3_End)))

      return;  //  Änderg.: (false) gestrichen  ----->  wird diese Aussage denn nicht gebraucht ?
  return;      //  Änderg.: (true)  gestrichen  ----->  wird diese Aussage denn nicht gebraucht ?
      }
 }
//+---

int start()
  {
//+--------------------------------- 
//    get market parameter
//+---------------------------------
//--- Überprüfen, ob TradingZones geöffnet sind
  if (TradingTime() == false)
    {
//+----------------------------------
//    EntryConditions
//+----------------------------------
//--- usw.

Wie kann ich den error beheben ? - dem Ausdruck einen Körper geben ?
Oder liegt der Fehler ev. ganz wo anders ?
Ich würde mich riesig freuen, wenn Ihr Euch den Code nochmals genauer anseht und mir mit Eurer Hilfe zur Seite steht.

Ganz LG. piptrade

Leopold 28.07.17 11:51

Hallo,

wenn ich mir deinen Code so ansehe würde ich dir vorschlagen einmal die Grundlagen zu lernen um solche Programme erstellen zu können.
Ich habe mit folgenden Tutorial begonnen:Expert Advisor erstellen ,Tutorials in Deutsch
Dieses Tutorial hat mir sehr geholfen.

---Leopold---

piptrade 28.07.17 12:47

Hallo Leopold,

herzlichen Dank für Deinen Link; - hab´ ihn mir angesehen ! Scheint alles recht gut und sehr fundiert zu sein. Allerdings sind 299,- Euro auch kein Pappenstiel !
- Und bis ich mir dies leisten kann, bin ich vorerst auf Deine oder die Hilfe anderer user angewiesen.

Nebenbei bemerkt: Tatsache ist, dass mir unumstritten wirklich wichtige Grundlagen fehlen, die ich schnellst möglich erlernen muss.
Tatsache ist aber auch, dass ich bereits aus Forenbeiträgen oder YouTube-Reihen wichtige Erkenntnisse ziehen und einen ersten "kleinen EA" schreiben konnte. Und zwar mit einem flexiblen MoneyManagement, modularen EntryConditions, den unterschiedlichsten SL- TP- und sonstigen EXIT-Szenarien und einem Timer, der auf die Minute genau, - aber eben nicht über die 00:00 Uhr-Grenze hinweg -, funktioniert !

Und gerade zum Überwinden dieses kleinen Mankos, - das automatische Überwinden der 00:00 Uhr-Grenze -, brauchte ich Eure Hilfe.
Eine Hilfestellung, aus der ich letztendlich auch wieder etwas lernen könnte; - eine wirkliche Unterstützung, die mich wieder ein Stück weiter bringt.

In diesem Sinne wäre ich sehr dankbar, solltet Ihr mir weiterhin zur Seite stehen.

LG. piptrade


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:28 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