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

 

Воспроизведение бага

  1. Заходим на Metaquotes-Demo.
  2. В обзоре рынка оставляет только AUDJPY и открываем его чарт.
  3. Перезагружаем терминал и ждем полноценного подключения - котиры идут.
  4. Запускаем скрипт на чарте

void OnStart()
{  
  for (int i = 0; i < 5; i++)
    Print(SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE));
}


Результат такой

2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0


Повторный запуск

2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851


Т.е. SYMBOL_TRADE_TICK_VALUE возвращает нули при первом запуске, если не делать Sleep();


ЗЫ На тему невидимого символа в Обзоре рынка. Если до шага запуска скрипта попытаться открыть чарт USDJPY (нажать Enter и ввести "USDJPY"), то ничего не получится. А если после запуска скрипта - получится. Хотя Обзор рынка не изменился.

 
fxsaber:

Воспроизведение бага

  1. Заходим на Metaquotes-Demo.
  2. В обзоре рынка оставляет только AUDJPY и открываем его чарт.
  3. Перезагружаем терминал и ждем полноценного подключения - котиры идут.
  4. Запускаем скрипт на чарте


Результат такой


Повторный запуск


Т.е. SYMBOL_TRADE_TICK_VALUE возвращает нули при первом запуске, если не делать Sleep();


ЗЫ На тему невидимого символа в Обзоре рынка. Если до шага запуска скрипта попытаться открыть чарт USDJPY (нажать Enter и ввести "USDJPY"), то ничего не получится. А если после запуска скрипта - получится. Хотя Обзор рынка не изменился.

Добавьте в начало скрипта такой цикл

   for(int i = 0; i < SymbolsTotal(true); i++)
     Print(SymbolName(i, true));

И посмотрите сколько символов будет распечатано.

При первом запуске обращение к AUDJPY только добавляет в обзор рынка AUDUSD и USDJPY и только при втором обращении через эти пары получает свойство символа. Именно это и вызывает проблему с OrderCalcMargin в моём случае.

 
fxsaber:

Много раз об этом писали. Не правят почему-то.

Получил ответ в сервисдеске. Исправят. 
 

Всем здрасте!

Помогите, пожалуйста, начинающему.

Исполнена функция на поиск ценового максимума. Как возможно вычислить и вернуть в код НОМЕР БАРА с определенным ценовым максимумом?

 
Alexey Viktorov:

Добавьте в начало скрипта такой цикл

И посмотрите сколько символов будет распечатано.

При первом запуске обращение к AUDJPY только добавляет в обзор рынка AUDUSD и USDJPY и только при втором обращении через эти пары получает свойство символа. Именно это и вызывает проблему с OrderCalcMargin в моём случае.

Думаю, порешают, как с этим

Anatoli Kazharski:
Получил ответ в сервисдеске. Исправят. 

Спасибо.

 

По поводу бага "вокруг" OrderCalcMargin() оформил Заявку в СД

 
Kirill Belousov:

Трудно быть уверенным, когда в справке MQL4/5 прямое противоречие:

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


...Обратите внимание, что
порядок выполнения выражений x1,..., xn гарантируется.

В чём же противоречие?  Задом наперёд - и всё.  Обратного утверждения нет.
 
Alexey Navoykov:
В чём же противоречие?  Задом наперёд - и всё.  Обратного утверждения нет.

- Эти две рекомендации находятся в отдельных разделах справки.

Когда Вы читаете в разделе

"Вызов функции с аргументами x1, x2,..., xn"

 порядок выполнения выражений x1,....,xn гарантируется, то о каком порядке Вы думаете?

о порядке x1,...,xn или о порядке xn,....,x1  ?

 
Kirill Belousov:

- Эти две рекомендации находятся в отдельных разделах справки.

Когда Вы читаете в разделе

"Вызов функции с аргументами x1, x2,..., xn"

 порядок выполнения выражений x1,....,xn гарантируется, то о каком порядке Вы думаете?

о порядке x1,...,xn или о порядке xn,....,x1  ?

Да, вы правы, это сбивает с толку.

Впрочем, я считаю, что в любом случае закладывать логику своего алгоритма на конкретный порядок передачи аргументов - это плохая практика.  Тем более когда эти вычисления справа-налево, это запутывает понимание кода.  Поэтому если и применять это, то лишь в каких-то некритичных местах, типа вывода на печать.

 
Kirill Belousov:

Порядок расчета выражений в Print() справа налево. Вроде как... Пока... Тоже проверял предварительно :)

Справочник MQL5\Основы языка\Операции и выражения\Другие операции 

Вызов функции с аргументами x1, x2,..., xn

Обратите внимание, что порядок выполнения выражений x1,..., xn гарантируется.

Это лишний раз свидетельствует о пользе ключевого слова С++ inline (здесь было мнение что оно якобы устаревшее).
Помимо прочего inline фактически означает отказ программиста от использования порядка вычисления параметров функции и если компилятор решит сделать inline функцию встраиваемой, то компилятор может использовать прямой порядок вычисления как более эффективный (обратный порядок вычисления очевидно эффективен только для вызываемых функций).
В то же время если компилятор решит сделать встраиваемой не inline функцию то он должен использовать (общий) обратный порядок вычисления даже если это ведет к потере эффективности (потому что программист заложился на это порядок не объявив функцию inline)

inline был бы к месту и в MQL, где порядком вычисления нельзя управлять явно

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