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

 
fxsaber #:

Действительно, исправили движок. Спасибо.

Иногда на этом сайте тут так же и у меня было с поиском- временно не работал.

 
fxsaber #:
На одиночных прогонах считается автоматически все. Во время оптимизации автоматически - какая-то часть. Смотрите шапки tst/opt-файов.

Подскажите, что значит смотреть шапки?

Шапки -то есть верх содержимого этих файлов? Или название файла?

Жалко через блокнот не открываются эти  tst/opt, я так понял через библиотеку TesterCache доставать инфу.

 
Aleksei Skrypnev #:

Подскажите, что значит смотреть шапки?

mqh соответствующих библиотек читалок tst/opt-форматов.

 

Вопрос банальный, поведение неожиданное (от мт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 перед его запуском.