Ошибки, баги, вопросы - страница 3416

 

Вопрос банальный, поведение неожиданное (от мт4 такого явно не ожидал).

Подскажите, пожалуйста, вызываю iTime уже 09.11.23 в 3:00 по времени ПК, это 2:00 по времени сервера дилера. Получаю время открытия свечи предыдущего дня, а не текущего. Как такое возможно? В тестере все замечательно. Тики нового дня уже были, т.к. смог открыть позицию.



Но в 11:14 по времени пк и 10:14 по времени сервера получаю корректное время


 
Nikita Chernyshov #:

Вопрос банальный, поведение неожиданное (от мт4 такого явно не ожидал).

Подскажите, пожалуйста, вызываю iTime уже 09.11.23 в 3:00 по времени ПК, это 2:00 по времени сервера дилера. Получаю время открытия свечи предыдущего дня, а не текущего. Как такое возможно? В тестере все замечательно. Тики нового дня уже были, т.к. смог открыть позицию.

Если график Д1 не открыт, первый запрос вернет устаревшие данные.

Можно дергать все ТФ каждую минуту, чтобы поддерживать все данные в актуальном состоянии. В МТ4 так было всегда.

 
Andrey Khatimlianskii #:

Если график Д1 не открыт, первый запрос вернет устаревшие данные.

Можно дергать все ТФ каждую минуту, чтобы поддерживать все данные в актуальном состоянии. В МТ4 так было всегда.

Понял, спасибо вам

 
Nikita Chernyshov #:

Вопрос банальный, поведение неожиданное (от мт4 такого явно не ожидал).

Подскажите, пожалуйста, вызываю iTime уже 09.11.23 в 3:00 по времени ПК, это 2:00 по времени сервера дилера. Получаю время открытия свечи предыдущего дня, а не текущего. Как такое возможно? В тестере все замечательно. Тики нового дня уже были, т.к. смог открыть позицию.

Если вы вызываете функцию  iTime()  в своем роботе или скрипте на платформе MetaTrader 4 (MT4), то получение времени может зависеть от настроек временной зоны вашего сервера дилера и вашей локальной временной зоны на компьютере.

Функция  iTime()  возвращает время открытия свечи для заданного индекса бара. Индекс бара 0 соответствует самому последнему закрытому бару. Предположим, что вы вызываете  iTime(0)  для получения времени открытия последнего бара дня. Если ваш сервер дилера использует временную зону, отличную от вашей локальной временной зоны, то могут возникнуть несоответствия.

Например, если ваш сервер дилера работает в часовой зоне GMT+2, а ваша локальная временная зона GMT+3, то при вызове  iTime(0)  в 3:00 по вашему локальному времени (GMT+3) вы получите время открытия свечи, соответствующей 2:00 по времени сервера дилера (GMT+2). Это происходит из-за разницы во временных зонах между вашим компьютером и сервером дилера.

Если вы хотите получить время открытия текущего бара, установите индекс бара в значение 1:  iTime(1) . Это вернет время открытия текущего бара на вашем сервере дилера в соответствии с его временной зоной.

Проверьте также настройки временных зон на платформе MT4 и убедитесь, что они соответствуют временным зонам вашего сервера дилера и локального компьютера. Если проблема сохраняется, обратитесь к поставщику услуг или технической поддержке платформы MT4 для получения более подробной информации и помощи.

 
Mikhail Dovbakh #:

Думаю, что это ошибка в Стандартном классе.

Справка также недостаточно информативна, имхо.

Код, который вы предоставили, выполняет вставку нового элемента в двусвязный список на заданной позиции. Однако вы правильно заметили, что есть несколько проблем с текущей реализацией.

  1. if(index>m_data_total || index<0) return(-1); : Эта строка проверяет, что индекс находится в правильных границах. Если индекс меньше нуля или больше общего количества элементов в списке, возвращается -1. Вполне верно, что на практике часто используют возможность вставки элемента в конец списка по индексу -1, но в вашей реализации так делать нельзя из-за этой проверки.

  2. if(index==-1) ... : Этот блок кода должен позволить вставить элемент в конец списка, если указан индекс -1. Но, как вы правильно заметили, до этого места кода выполнение не дойдет из-за предыдущей проверки.

  3. В остальных строках обрабатываются остающиеся случаи: вставка элемента перед текущим узлом ( m_curr_node ) или добавление элемента в конец списка, если указанного индекса не существует.

Хорошо подмечено, что в этом коде есть противоречия/баги, которые не позволяют ему работать должным образом. Это могут быть ошибки, сделанные программистом. Если вы хотите изменить этот код, чтобы он позволил вставлять элемент в конец списка по индексу -1, вы можете изменить проверку индекса следующим образом:

if(index > m_data_total || index < -1) return(-1);

Такой код позволит пропускать индекс -1.

 

Под Wine файлы в UTF-8 не пишутся. Файл нулевой длины, и ошибки тоже нет.

void OnStart()
  {
   int file = FileOpen("1_testfile_rus.txt", FILE_WRITE|FILE_ANSI|FILE_TXT, "", CP_UTF8);

   if(file!=INVALID_HANDLE)
     {
      ResetLastError();
      Print(FileWriteString(file, "Русский текст!")," ",GetLastError());  //  0 0
      FileClose(file);
     }
  }

Если сделать так

void OnStart()
  {
   int file = FileOpen("1_testfile_rus.txt", FILE_WRITE|FILE_UNICODE|FILE_TXT, "", CP_UTF8);

   if(file!=INVALID_HANDLE)
     {
      ResetLastError();
      Print(FileWriteString(file, "Русский текст!")," ",GetLastError());  // 28 0
      FileClose(file);
     }
  }

пишется в UTF-16

 
JRandomTrader #:

Под Wine файлы в UTF-8 не пишутся. Файл нулевой длины, и ошибки тоже нет.

Если сделать так

пишется в UTF-16


Проблема может быть связана с тем, что в MetaEditor (который, вероятно, используется для написания торговых советников на платформе MetaTrader) функция FileWriteString с параметром FILE_WRITE|FILE_UNICODE|FILE_TXT использует UTF-16 кодировку, как вы правильно заметили.

Если вы хотите записать файл в формате UTF-8, вам следует использовать параметры FILE_WRITE|FILE_ANSI|FILE_TXT и просто убедиться, что ваш текст предварительно преобразован в UTF-8. В вашем первом примере кода, убедитесь, что ваш текст сохранен в кодировке UTF-8. Вот исправленный фрагмент кода:

c Copy code
void OnStart() { int file = FileOpen("1_testfile_rus.txt", FILE_WRITE|FILE_ANSI|FILE_TXT, "", CP_UTF8); if(file != INVALID_HANDLE) { ResetLastError(); Print(FileWriteString(file, "Русский текст!")," ", GetLastError()); // 0 0 FileClose(file); } }

Убедитесь, что ваш редактор текста сохраняет файл в UTF-8 перед его запуском.

 
Yuriy Vasilyev #:


Проблема может быть связана с тем, что в MetaEditor (который, вероятно, используется для написания торговых советников на платформе MetaTrader) функция FileWriteString с параметром FILE_WRITE|FILE_UNICODE|FILE_TXT использует UTF-16 кодировку, как вы правильно заметили.

Если вы хотите записать файл в формате UTF-8, вам следует использовать параметры FILE_WRITE|FILE_ANSI|FILE_TXT и просто убедиться, что ваш текст предварительно преобразован в UTF-8. В вашем первом примере кода, убедитесь, что ваш текст сохранен в кодировке UTF-8. Вот исправленный фрагмент кода:

c Copy code
void OnStart() { int file = FileOpen("1_testfile_rus.txt", FILE_WRITE|FILE_ANSI|FILE_TXT, "", CP_UTF8); if(file != INVALID_HANDLE) { ResetLastError(); Print(FileWriteString(file, "Русский текст!")," ", GetLastError()); // 0 0 FileClose(file); } }

Убедитесь, что ваш редактор текста сохраняет файл в UTF-8 перед его запуском.

Файл сохранён в UTF-8.

Независимо от того, запускаю я ME5 и MT5 в локали ru_RU.CP1251 или ru_RU.UTF-8,

Print(IntegerToString(TerminalInfoInteger(TERMINAL_CODEPAGE)));

пишет 1251 и в файл пишет в CP1251, если указать только FILE_ANSI и не указывать CP_UTF8.

Если указать и FILE_ANSI, и CP_UTF8, получаем файл нулевой длины и не получаем кода ошибки.

2023.11.13 15:28:57.707 Terminal        MetaTrader 5 x64 build 4052 started for MetaQuotes Software Corp.
2023.11.13 15:28:57.707 Terminal        Windows 11 build 22000 on Wine 8.19 Linux 6.1.0-13-amd64, 1 x Intel Xeon E312xx (Sandy Bridge), AVX, 1 / 1 Gb memory, 34 / 39 Gb disk, GMT+3

и для

2023.11.07 13:26:45.103 Terminal        Открытие Брокер x64 build 3802 started for АО ''Открытие Брокер''
2023.11.07 13:26:45.104 Terminal        Windows 10 build 18362 on Wine 8.5 Linux 5.4.0-109-generic, 3 x Intel Xeon E312xx (Sandy Bridge), AVX, 4 / 5 Gb memory, 0 / 29 Gb disk, GMT+3

поведение такое же.

 
JRandomTrader #:

Под Wine файлы в UTF-8 не пишутся. Файл нулевой длины, и ошибки тоже нет.

Если сделать так

пишется в UTF-16

это copy-paste исходника или вы по памяти перепечатали ?

просто там ошибки

 
Maxim Kuznetsov #:

это copy-paste исходника или вы по памяти перепечатали ?

просто там ошибки

Это демонстрационный пример, только закомментированные строки выкинул.

Какие ошибки?