Говорят, что МТ5 писался с нуля...

 

Говорят, что МТ5 писался с нуля.

Обнаружили странность в МТ4.

Решил проверить в МТ5 - давно сюда не заглядывал.

Кто из корифеев пояснит следующий лог?

2010.11.19 20:34:38    String_to_DateTime (EURUSD,H1)    19.11.2010 00:01= 2010.11.19 00:01:00 int=:1290124860 shift=60
2010.11.19 20:34:38    String_to_DateTime (EURUSD,H1)    19.11.2010 00:00= 2010.11.19 00:00:00 int=:1290124800 shift=-82800
2010.11.19 20:34:38    String_to_DateTime (EURUSD,H1)    18.11.2010 24:00= 2010.11.19 23:00:00 int=:1290207600 shift=-3540
2010.11.19 20:34:38    String_to_DateTime (EURUSD,H1)    18.11.2010 23:59= 2010.11.19 23:59:00 int=:1290211140 shift=86340
2010.11.19 20:34:38    String_to_DateTime (EURUSD,H1)    18.11.2010 00:00= 2010.11.19 00:00:00 int=:1290124800 shift=-86340
2010.11.19 20:34:38    String_to_DateTime (EURUSD,H1)    17.11.2010 23:59= 2010.11.19 23:59:00 int=:1290211140 shift=86280
2010.11.19 20:34:38    String_to_DateTime (EURUSD,H1)    17.11.2010 00:01= 2010.11.19 00:01:00 int=:1290124860 shift=1290124860

Текст проверочного скрипта -

#property copyright "2010, Avatara"
#property link      "Avatara@bigmir.net"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Convert string date&time formated DD.MM.YYYY & HH:MM             |
//+------------------------------------------------------------------+
long SringtoTimeA(string fDate, string fTime)
   {
string    sDD=StringSubstr(fDate,0,2);  // Day
string    sMM=StringSubstr(fDate,3,2);  // Month
string    sYYYY=StringSubstr(fDate,6,4);// Year
string    sConcat="";
      if  (StringLen(fTime)<5) fTime="0"+fTime;
      int    i=StringConcatenate(sConcat,sYYYY,sMM,sDD," ",fTime);
          return(StringToTime(sConcat));
    }

//+------------------------------------------------------------------+
//|                                               String_to_Time.mq4 |
//+------------------------------------------------------------------+
int OnStart()
  {
   datetime       old_datetime=D'1970.01.01 00:00';
   
   string    fDate="17.11.2010";
   string    fTime="00:01";
   datetime  DateTimes=SringtoTimeA( fDate,  fTime);
   long       i_datetime=DateTimes;
             
           Print (fDate+" "+fTime,"= ",DateTimes," int=:",i_datetime
                        ," shift=",i_datetime-old_datetime);
           old_datetime=i_datetime;
        fTime="23:59";
           DateTimes=SringtoTimeA( fDate,  fTime);
           i_datetime=DateTimes;
           Print (fDate+" "+fTime,"= ",DateTimes," int=:",i_datetime
                        ," shift=",i_datetime-old_datetime);
           old_datetime=i_datetime;
        fDate="18.11.2010";fTime="00:00";
           DateTimes=SringtoTimeA( fDate,  fTime);
           i_datetime=DateTimes;
           Print (fDate+" "+fTime,"= ",DateTimes," int=:",i_datetime
                        ," shift=",i_datetime-old_datetime);
           old_datetime=i_datetime;
         fTime="23:59";
           DateTimes=SringtoTimeA( fDate,  fTime);
           i_datetime=DateTimes;
           Print (fDate+" "+fTime,"= ",DateTimes," int=:",i_datetime
                        ," shift=",i_datetime-old_datetime);
           old_datetime=i_datetime;
          fTime="24:00";
           DateTimes=SringtoTimeA( fDate,  fTime);
           i_datetime=DateTimes;
           Print (fDate+" "+fTime,"= ",DateTimes," int=:",i_datetime
                        ," shift=",i_datetime-old_datetime);
           old_datetime=i_datetime;
       fDate="19.11.2010";fTime="00:00";
           DateTimes=SringtoTimeA( fDate,  fTime);
           i_datetime=DateTimes;
           Print (fDate+" "+fTime,"= ",DateTimes," int=:",i_datetime
                        ," shift=",i_datetime-old_datetime);
           old_datetime=i_datetime;
       
       fTime="00:01";
           DateTimes=SringtoTimeA( fDate,  fTime);
           i_datetime=DateTimes;
           Print (fDate+" "+fTime,"= ",DateTimes," int=:",i_datetime
                        ," shift=",i_datetime-old_datetime);           
//----
   return(0);
  }
//+------------------------------------------------------------------+


странно... и чудовищно. - MQL4 форум
  • www.mql5.com
странно... и чудовищно. - MQL4 форум
 

Я заметил похожую проблему с переводом времени из строки в цифру  - еще более полгода назад. но всё думал, что это только на моей машине (мало ли что с виндой может быть)

Но раз у вас похожее, то напишите в сервисдеск.

кстати, чтоб выяснить для себя более подробно - перепроверьте в режиме debug.

 
avatara:

Говорят, что МТ5 писался с нуля.

Не говорили такого. Только серверная часть. Терминал писался на базе 4ки. Так что ошибки по наследству возможны :) .
 

Сделал скрипт более понятным по выводу в лог:

//+------------------------------------------------------------------+
//|                                                 CheckConvert.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2010, Avatara"
#property link      "Avatara@bigmir.net"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Convert string date&time formated DD.MM.YYYY & HH:MM             |
//+------------------------------------------------------------------+
long SringtoTimeA(string fDate,string fTime)
  {
   string    sDD=StringSubstr(fDate,0,2);  // Day
   string    sMM=StringSubstr(fDate,3,2);  // Month
   string    sYYYY=StringSubstr(fDate,6,4);// Year
   string    sConcat="";
   if(StringLen(fTime)<5) fTime="0"+fTime;
   int    i=StringConcatenate(sConcat,sYYYY,".",sMM,".",sDD," ",fTime);
   PrintFormat("\r\n%s конвертируем строку: %s",__FUNCTION__,sConcat);
   PrintFormat("StringToTime(\"%s\")=%s",sConcat,TimeToString(StringToTime(sConcat)));
   return(StringToTime(sConcat));
  }
//+------------------------------------------------------------------+
//|                                               String_to_Time.mq4 |
//+------------------------------------------------------------------+
int OnStart()
  {
   datetime       old_datetime=D'1970.01.01 00:00';
   uint start=GetTickCount();

   string    fDate="17.11.2010";
   string    fTime="00:01";
   datetime  DateTimes=SringtoTimeA(fDate,fTime);
   long       i_datetime=DateTimes;


   old_datetime=i_datetime;
   fTime="23:59";
   DateTimes=SringtoTimeA(fDate,fTime);
   i_datetime=DateTimes;

   old_datetime=i_datetime;
   fDate="18.11.2010";fTime="00:00";
   DateTimes=SringtoTimeA(fDate,fTime);
   i_datetime=DateTimes;

   old_datetime=i_datetime;
   fTime="23:59";
   DateTimes=SringtoTimeA(fDate,fTime);
   i_datetime=DateTimes;


   fTime="24:00";
   DateTimes=SringtoTimeA(fDate,fTime);
   i_datetime=DateTimes;

   old_datetime=i_datetime;
   fDate="19.11.2010";fTime="00:00";
   DateTimes=SringtoTimeA(fDate,fTime);
   i_datetime=DateTimes;

   old_datetime=i_datetime;

   fTime="00:01";
   DateTimes=SringtoTimeA(fDate,fTime);
   i_datetime=DateTimes;
//----
   return(0);
  }
//+------------------------------------------------------------------+


Результат

2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        SringtoTimeA конвертируем строку: 2010.11.17 00:01
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        StringToTime("2010.11.17 00:01")=2010.11.17 00:01
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        SringtoTimeA конвертируем строку: 2010.11.17 23:59
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        StringToTime("2010.11.17 23:59")=2010.11.17 23:59
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        SringtoTimeA конвертируем строку: 2010.11.18 00:00
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        StringToTime("2010.11.18 00:00")=2010.11.18 00:00
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        SringtoTimeA конвертируем строку: 2010.11.18 23:59
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        StringToTime("2010.11.18 23:59")=2010.11.18 23:59
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        SringtoTimeA конвертируем строку: 2010.11.18 24:00
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        StringToTime("2010.11.18 24:00")=2010.11.18 23:00
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        SringtoTimeA конвертируем строку: 2010.11.19 00:00
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        StringToTime("2010.11.19 00:00")=2010.11.19 00:00
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        SringtoTimeA конвертируем строку: 2010.11.19 00:01
2010.11.20 18:56:55     CheckConvert (EURUSD,H1)        StringToTime("2010.11.19 00:01")=2010.11.19 00:01

Действительно, в одном случае есть ошибка. Спасибо за сообщение, разберемся.


 

А в чём проблема? 24:00 - зто неправильное значение. Например, используется проверка if(hour>23) hour=23; Исследуйте дальше

 
stringo:

А в чём проблема? 24:00 - зто неправильное значение. Например, используется проверка if(hour>23) hour=23; Исследуйте дальше

Может тогда какую-нибудь ошибку кидать в лог в рантайме?
 
marketeer:
Может тогда какую-нибудь ошибку кидать в лог в рантайме?
GetLastError Вам в помощь
 
stringo:
GetLastError Вам в помощь
После каждой строки GetLastError не наставишься (а эксепшены вы задвинули).
 

Свою ошибку увидел. Спасибо за помощь!

//+------------------------------------------------------------------+
//| Convert string date&time formated DD.MM.YYYY & HH:MM             |
//+------------------------------------------------------------------+
long SringtoTimeA(string fDate, string fTime)
   {
string    sDD=StringSubstr(fDate,0,2);  // Day
string    sMM=StringSubstr(fDate,3,2);  // Month
string    sYYYY=StringSubstr(fDate,6,4);// Year
string    sConcat="";
      if  (StringLen(fTime)<5) fTime="0"+fTime;
      int    i=StringConcatenate(sConcat,sYYYY,".",sMM,".",sDD," ",fTime);
          return(StringToTime(sConcat));
    } 

Будет правильным.