Проблемы при отладке советников в MT4 v4.0 b 1353.

 

Доброго времени суток!

Как известно MT4 не поддерживает полноценный отладчик.

Приходится делать отладку с помощью функции Print().

Но и тут в тёмных углах кто то расставил грабли.

При выводе в логи  с помощью функции Print() массивов.

Если в массиве есть повторяющиеся данные то они просто не выводятся в лог.

Хочу спросить.Для чего всё это? И как это отключить?

При этом писать свой собственный отладчик или  код

который будет выводить всё что мне нужно в отдельный файл нехочу.

 
Northwest:


Если в массиве есть повторяющиеся данные то они просто не выводятся в лог.

Хочу спросить.Для чего всё это? И как это отключить?

Они выводятся в лог. Только смотреть надо в файле, а не в окне лога, в окно на попадают некоторые данные при частом принте.

 
Northwest:

Как известно MT4 не поддерживает полноценный отладчик.

Под полноценной отладкой что подразумевается? Тестер?

Если не тестер, то все остальное в МТ4 доступно при отладке.

 
PapaYozh #:

Они выводятся в лог. Только смотреть надо в файле, а не в окне лога, в окно на попадают некоторые данные при частом принте.

Это безобразие происходит именно при выводе в файл.В окне получается и то больше информации но она тоже не полная.

если добавить к аргументам Print("buff_",buff[i],"   i_",i); показ переменной "i" это безобразие прекращается, но эти грабли уже достали.

В таком виде Print("buff_",buff[i]); если есть повторяющиеся данные в буфере(например какая то цифра постоянно повторяется )

эти данные начинают срезаться или сокращать при выводе в файл.

 
Ihor Herasko #:

Под полноценной отладкой что подразумевается? Тестер?

Если не тестер, то все остальное в МТ4 доступно при отладке.

И изменение переменных в процессе отладки в отладчике?

 
Northwest #:

И изменение переменных в процессе отладки в отладчике?

Конечно. Иначе какой вообще смысл в отладчике?


 
Ihor Herasko #:

Конечно. Иначе какой вообще смысл в отладчике?


В таком случае извините.

 Но очень долгое время невозможно было изменять ,насколько я помню это годы,

 значения переменных на лету в цикле отладки в отладчике MQ4.

 Из за его несовершенства я и подсел на функцию Print().

 

 Но главный вопрос так и остался.

 Почему функция Print() за меня решает, 

 что надо выводить в файл а что не надо?

 
Northwest #:

 Но главный вопрос так и остался.

 Почему функция Print() за меня решает, 

 что надо выводить в файл а что не надо?

В файл лога выводятся все сообщения от Print. Не замечал сокращений.

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

 
Ihor Herasko #:

В файл лога выводятся все сообщения от Print. Не замечал сокращений.

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

Вкладкой я вообще не пользуюсь как раз по этой причине что не всё выводится.

Только файлами.

В #3 я описал как именно и в точности это происходит.

Если весь динамический  буфер будет например  заполнен исключительно цифрами 100.0 и  111.0 то он не будет выведен в файл.

И файл полностью будет выглядеть вот так:


""

0 16:10:07.519 Custom indicator TEST GBPUSD,M1: loaded successfully

0 16:10:07.536 TEST GBPUSD,M1: initialized

0 16:10:07.538 TEST GBPUSD,M1: Signal__100.0

0 16:10:07.538 TEST GBPUSD,M1: Signal__111.0

""

Не больше и не меньше.

При этом вкладка покажет намного больше данных, что доказывает то что буфер заполнен как требовалось.

Но в файл будут выведены по сути только две строки.


Если этот же самый буфер заполнить ценами закрытия например(а они же разные),то в файл  он же будет выведен как бы полностью,

можно правда догадываться полностью ли?

Уже уверености нет.

Для тех кому не лень тестовый файл прилагаю.

Файлы:
TEST.mq4  9 kb
 
Northwest #:

Если весь динамический  буфер будет например  заполнен исключительно цифрами 100.0 и  111.0 то он не будет выведен в файл.

И файл полностью будет выглядеть вот так:


""

0 16:10:07.519 Custom indicator TEST GBPUSD,M1: loaded successfully

0 16:10:07.536 TEST GBPUSD,M1: initialized

0 16:10:07.538 TEST GBPUSD,M1: Signal__100.0

0 16:10:07.538 TEST GBPUSD,M1: Signal__111.0

""

Не больше и не меньше.

Проверил. Правда, для наглядности изменил функцию Calculate:

void Calculate(int limit)
{
   int i;
  
   Print("Будет записано ", limit, " значений");               
   for (i=limit; i>=1; i--)
   {
      _1D_MA[i]=iMA(NULL,0,10,0,MODE_EMA,PRICE_CLOSE,i);     
      if(_1D_MA[i]<_1D_MA[i+1]) Signal[i]=100.0;
      if(_1D_MA[i]>_1D_MA[i+1])Signal[i]=111.0;
      
      Print("Signal__",Signal[i]);   
   }
   Print("Конец записи");               
}

В итоге получил содержимое файла журнала:

0       09:09:50.017    TEST (1) AUDJPY,H1: Будет записано 2571 значений
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__100.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__100.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__100.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__100.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__100.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__100.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__100.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__100.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__100.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.017    TEST (1) AUDJPY,H1: Signal__111.0
...
0       09:09:50.023    TEST (1) AUDJPY,H1: Signal__100.0
0       09:09:50.023    TEST (1) AUDJPY,H1: Signal__100.0
0       09:09:50.023    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.023    TEST (1) AUDJPY,H1: Signal__111.0
0       09:09:50.023    TEST (1) AUDJPY,H1: Конец записи

Между начальной и конечной записью ровно 2 571 запись. Все нормально.

Возможно, перед открытием файла, Вы не сбрасываете кэш журнала в файл? Делается это выбором пункта "Открыть" контекстного меню вкладки "Эксперты". Независимо от того, открыта уже папка logs или нет.

 

В том то и дело  что я не открываю файл журнала не иначе как 

"Ctrl+T"   ""Эксперты"   "Открыть" потом открываю файл Notepad2

он очень хорошо и быстро  открывает большие логи.

А потом я стираю файл и закрываю его и после опять по новой.

Но то что у вас это работает это хорошо.

Значит и у мня тоже должно.

Если это не какие то настройки терминала значит это какой то глючок.

Возможно в Widows.

Спасибо за помощь.