Особенности языка mql5, тонкости и приёмы работы - страница 79

 
Alain Verleyen:

Я хотел бы получить время сервера в соответствии с GMT.

Вы это и получаете, когда запускаете скрипт. Там специально выводятся два значения: TimeGMT и TimeServerGMT, чтобы можно было проконтролировать, что они совпадают.

Если совпадают - ошибки нет, иначе - ошибка есть.

 
fxsaber :

You get this when you run the script. Two values ​​are specially output there: TimeGMT and TimeServerGMT, so that you can check that they match.

If they coincide, there is no error, otherwise there is a mistake.

Понял.
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: TypeToBytes

fxsaber, 2018.03.31 09:24

// Кроссплатформенный пример передачи произвольных данных через пользовательское событие

#include <fxsaber\HistoryTicks\Data_String.mqh> // https://www.mql5.com/ru/code/20298

// Печать произвольных данных
template <typename T>
bool MyPrint( const T &Value )
{
  T Array[1];
  
  Array[0] = Value;
  
  ArrayPrint(Array, _Digits, NULL, 0, WHOLE_ARRAY, ARRAYPRINT_HEADER | ARRAYPRINT_ALIGN);
  
  return(true);
}

void OnChartEvent( const int id, const long &lparam, const double&, const string &sparam )
{
  // Распечатали полученные данные
  if ((id == CHARTEVENT_CUSTOM) &&
      (lparam ?  MyPrint(DATA_STRING::FromString<MqlDateTime>(sparam)) // Получили MqlDateTime
              : !MyPrint(DATA_STRING::FromString<MqlTick>(sparam))))   // Получили MqlTick
    ExpertRemove(); // Вышли из примера
}

void OnInit()
{
  MqlTick Tick;  
  MqlDateTime DateTime;
  
  // Заполнили значения
  SymbolInfoTick(_Symbol, Tick);  
  TimeCurrent(DateTime);

  // Передали
  EventChartCustom(0, 0, 0, 0, DATA_STRING::ToString(Tick));     // Передали MqlTick
  EventChartCustom(0, 0, 1, 0, DATA_STRING::ToString(DateTime)); // Передали MqlDateTime
}
 
fxsaber:

У sparam есть ограничение по длине. Вы его учли?

 
Andrey Barinov:

У sparam есть ограничение по длине.

Да, 128 байтов.

const bool Init = EventChartCustom(0, 0, 0, 0, NULL);

void OnChartEvent( const int id, const long&, const double&, const string &sparam )
{
  static int PrevLength = -1;
  
  if (id == CHARTEVENT_CUSTOM)
  {
    const int Length = StringLen(sparam);

    bool Res = (Length != PrevLength);
    
    if (Res)
    {
      string Str;
            
      StringInit(Str, Length + 1, 1);
      
      Res = EventChartCustom(0, 0, 0, 0, Str);
    }
    
    if (!Res)
    {
      Print(PrevLength);
      
      ExpertRemove();
    }
      
    PrevLength = Length;      
  }
}

Вы его учли?

Нет, по нему и видно это. Пример sparam приведен, как один из вариантов применения string-хранения.

Можно усложнить код (кусками отправить), но тогда будет потеряна наглядность.

 
fxsaber:

Боюсь, без конкретного примера конструктива не выйдет.

Выдаёт вот такую картину:


  Print( "TimeServer: ",TimeGMT()-TimeServerGMTOffset() );
  Print( "TimeServerGMT: ",TimeServerGMT() );
  Print( "TimeCurrent: ",TimeCurrent() );
  Print( "TimeLocal: ",TimeLocal() );
  Print( "TimeGMT: ",TimeGMT() );
  Print( "TimeGMTOffset: ",TimeServerGMTOffset() );
  Print( "" );

И вот установщик мт4 со сдвигом работы GMT+2 

Ожидал увидеть TimeServer = 2018.04.01 05:54:26

Файлы:
tw4setup.zip  522 kb
 
Vitaly Muzichenko:

Выдаёт вот такую картину:

На всякий случай сообщите название Торгового сервера.

ЗЫ TradersWay-Demo.

Отрабатывает правильно

2018.04.01 08:36:08.858 TimeServerGMT EURUSDi,M1: TimeServerGMT() = 2018.03.30 19:59:59

Возможно, у Вас этого нет

// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
 
fxsaber:

На всякий случай сообщите название Торгового сервера.

ЗЫ TradersWay-Demo.

Отрабатывает правильно

Возможно, у Вас этого нет

Возможно и нет. У меня её скорее всего нет ни в одном терминале, Я никогда не переключаю тайм ниже М15

Хорошо, буду разбираться ещё.
 
Vitaly Muzichenko:

Возможно и нет. У меня её скорее всего нет ни в одном терминале, Я никогда не переключаю тайм ниже М15

Сделайте так

datetime GetBarTime( const datetime time, const bool NextBar = false, string Symb = NULL, const ENUM_TIMEFRAMES TimeFrame = PERIOD_M15 )
 
fxsaber:

Сделайте так

Сделал, показало не бред. Смущает то, что сдвиг скорее всего должен быть -720



P.S. Ну и опять-же, это Я знаю что сдвиг +2 часа - написано на сайте, но робот этого не знает.

Если запустить советник на графике, как это сделано, то вряд-ли получим на выходе требуемый результат: "Узнать текущее время сервера TimeServer()" Я его так и не получил правильное, может что делаю не так.

Здесь наверное без внедрения функции разработчиками в терминал не обойтись?

Причина обращения: