datetime

Einloggen oder registrieren, um einen Kommentar zu schreiben
amando
2878
amando  

Hallo,


mal eine kurze Frage zu datetime, versuche ja gerade, mir die Handelszeiten als Comment einzublenden, merke mir ja nicht wann welche Futures offen haben

dazu mal hier das script

#property copyright "Copyright 2018,"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   ENUM_DAY_OF_WEEK Day = DayOfWeek();
   Print("Day: ",Day);
   
   ENUM_DAY_OF_WEEK Day2 = DayOfWeek()+1;
   
   Comment(
           "Today   : ", CommentInfoForQuoteSessions(_Symbol,Day),"\n",
           "Tomorrow: ", CommentInfoForQuoteSessions(_Symbol,Day2  )
           );

     
   
  }
//+------------------------------------------------------------------+
int DayOfWeek()
  {
   MqlDateTime tm;
   TimeCurrent(tm);
   return(tm.day_of_week);
  }
  
string DayToString(ENUM_DAY_OF_WEEK day)
  {
   switch(day)
     {
      case SUNDAY:    return "Sunday";
      case MONDAY:    return "Monday";
      case TUESDAY:   return "Tuesday";
      case WEDNESDAY: return "Wednesday";
      case THURSDAY:  return "Thursday";
      case FRIDAY:    return "Friday";
      case SATURDAY:  return "Saturday";
      default:        return "Unknown day of week";
     }
   return "";
  }
  
 string CommentInfoForQuoteSessions(string symbol,ENUM_DAY_OF_WEEK day)
  {
//--- start and end of session
   datetime start=0,finish=0;
   uint session_index=0;
   bool session_exist=true;


//--- go over all sessions of this day
   while(session_exist)
     {
      //--- check if there is a quotation session with the number session_index
      session_exist=SymbolInfoSessionQuote(symbol,day,session_index,start,finish);

      //--- if there is such session
      if(session_exist)
        {
         //--- display the day of week, the session number and the time of start and end
         Print(DayToString(day),": session index=",session_index,"  start=",
               TimeToString(start,TIME_MINUTES),"    finish=",TimeToString(finish-1,TIME_MINUTES|TIME_SECONDS));
        }
      //--- increase the counter of sessions
      session_index++;
     }
   return( DayToString(day)+": session index="+DoubleToString(session_index,0)+"  start="+ TimeToString(start,TIME_MINUTES)+"    finish="+TimeToString(finish-1,TIME_MINUTES|TIME_SECONDS)); 
     
  } 

funktioniert fast, weil

beim kompelieren kommt folgender Fehler


und in der Anzeige ignoriert er das morgen

für ihn ist jeder Tag Montag.


ich bin mir sicher, das kann man besser lösen ;-)

hat wer eine Idee?


irgendwann werd ich das Datetime auch noch verstehen, es wird ja immer besser mit eurer hilfe ;-)

danke

amando

Chris70
543
Chris70  

Die Warnmeldung sollte theoretisch irrelevant sein, stört aber natürlich das ästhetische Empfinden. Ich für meinen Teil bin zumindest immer erst zufrieden, wenn keine Warnmeldungen mehr auftauchen.

Die Funktion "DayOfWeek()" gibt Dir ja eine integer Variable zurück. Wenn Du hiermit deklarierst ENUM_DAY_OF_WEEK Day = DayOfWeek(); dann machst Du eine Enumeration zur Integer, was zwar funktionieren sollte, da die Enumerationselemente ja mit ganzzahligen Werten hinterlegt sind, doch es stört den Compiler. Wenn Du schreibst  ENUM_DAY_OF_WEEK Day = (ENUM_DAY_OF_WEEK) DayOfWeek();    dann sieht das als Code zwar doof aus, erledigt damit aber die Warnung, weil die integer dann nicht mehr als Wert der Enumeration impliziert wird, sondern explizit zugeordnet. Macht Sinn?

Warum immer Montag ist, weiß ich nicht. Den Grund entdecke ich in Deinen Code jedenfalls nicht.

Andere Frage: was ist die Intention, für die Du den Code brauchst? Der wahrscheinliche Anwendungsfall wäre ja, das Sessionende zu kennen, damit man nicht versehentlich über das Wochenende oder ggf. über Nacht Positionen  hält wenn das nicht will. Ist das der Grund? Session-Anfang ist ja irrelevant, weil dann ja eh keine Ticks kommen.

Ich habe mir dafür einfach eine Funktion gemacht, die mir für ein Symbol die restlichen Sekunden bis zum aktuellen Session-Ende ausgibt. Vielleicht hilft Dir das:

//+------------------------------------------------------------------+
//| get seconds until end of current trading session                 |
//+------------------------------------------------------------------+
int SessionEnd(string symbolstring)
  {
   // define variables
   uint session_index=0;
   datetime dt_server,dt_start,dt_end;
   MqlDateTime server_struct,start_struct,end_struct;
   int seconds_until_session_end=0;
   
   // get seconds since midnight (server time)
   dt_server=TimeTradeServer();
   TimeToStruct(dt_server,server_struct);
   ENUM_DAY_OF_WEEK day_of_week=(ENUM_DAY_OF_WEEK)server_struct.day_of_week;
   int server_seconds=server_struct.hour*3600+server_struct.min*60+server_struct.sec;
   
   // cycle through existing sessions (while-loop breaks if session_index is invalid)
   while (SymbolInfoSessionTrade(symbolstring,day_of_week,session_index,dt_start,dt_end))
     {
      // get seconds since midnight (server time) for start and end of the session
      TimeToStruct(dt_start,start_struct);int start_seconds=start_struct.hour*3600+start_struct.min*60+start_struct.sec;
      if (start_struct.day==2){start_seconds+=86400;}
      TimeToStruct(dt_end,end_struct);int end_seconds=end_struct.hour*3600+end_struct.min*60+end_struct.sec;
      if (end_struct.day==2){end_seconds+=86400;}
      
      // check if the current server time is in between start and end of the designated session
      if (server_seconds>start_seconds && server_seconds<end_seconds){seconds_until_session_end=end_seconds-server_seconds;}
      session_index++;
     }
   return seconds_until_session_end;
  }
P.S.: für die Anwendung "wann welche Futures offen haben" sollte das genauso funktionieren, da als Parameter ja jedes Symbol angegeben werden kann.
Carl Schreiber
Moderator
9799
Carl Schreiber  

amando:

und in der Anzeige ignoriert er das morgen

für ihn ist jeder Tag Montag.


Den Fehler findet man selber mit dem Debugger!

Die Enum-Konversion könntest Du so lösen:

  1. Deine Funktion DayOfWeek() gibt ein enum zurück (kein int oder
  2. Du verwendest einen cast: ENUM_DAY_OF_WEEK day = (ENUM_DAY_OF_WEEK)DayOfWeek()
(ungetestet!)
amando
2878
amando  
Carl Schreiber:

Den Fehler findet man selber mit dem Debugger!

Die Enum-Konversion könntest Du so lösen:

  1. Deine Funktion DayOfWeek() gibt ein enum zurück (kein int oder
  2. Du verwendest einen cast: ENUM_DAY_OF_WEEK day = (ENUM_DAY_OF_WEEK)DayOfWeek()
(ungetestet!)

@Carl, aber bei der ENUM bekomme ich ja zahlenwerte raus, oder wird die als Klartext zurückgegeben?

Otto Pauser
2166
Otto Pauser  
amando:

@Carl, aber bei der ENUM bekomme ich ja zahlenwerte raus, oder wird die als Klartext zurückgegeben?

EnumToString(day) bringts!
Carl Schreiber
Moderator
9799
Carl Schreiber  
Otto Pauser:
EnumToString(day) bringts!
Amando, auch diese Funktion findet man selber, ohne dass man vorher wissen muss wie sie heißt(!!) hier: https://www.mql5.com/de/docs/function_indices
in dem man ganz simple mit Ctrl+F und "enum" mit dem Browser auf dieser Seite sucht ...
Dokumentation zu MQL5: MQL5 Funktionenliste
Dokumentation zu MQL5: MQL5 Funktionenliste
  • www.mql5.com
Fügt Daten aus einem Array vom Typ MqlTick in die Preishistorie eines benutzerdefinierten Symbols hinzu. Das benutzerdefinierte Symbol muss im Fenster MarketWatch (Marktübersicht) ausgewählt werden Liest aus der Datei des Typs CSV die Zeile eines der Formate: "YYYY.MM.DD HH:MI:SS", "YYYY.MM.DD" oder "HH:MI:SS" - und wandelt sie...
Einloggen oder registrieren, um einen Kommentar zu schreiben