Отладка кода в MQ4

hoz

Активный участник
Я написал первый советник, и сразу столкнулся в какими-то непонятками. Код компилится, НО в тестере даже не открывает ордера.
Просьба профессионалов, помог понять логику отладки кода.
Поскольку стандартного отладчика в терминале MT4 нет, нужно как-то же решать эти вопросы..
 

Ugar

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

hoz

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

ale002

::: __,,,^._.^,,,__ :::
Тока одно - программа в ту строку, куда вписан Print, на попала. Вы же в курсе в котор строках вашего алгоритма программа делает выбор, вот перед ними и ставьте Print. Не после проверки условия, а ПЕРЕД и выводите в него переменные, котор участвуют в проверке. Напр:

Print("dRange=", dRange, " adLevels[0]=", adLevels[0], " gdStep=", gdStep);

А после оператора сравнения фтыкайте ещё один Print с отмашкой типа Print("Прокатило!");
 

Ugar

Гуру форума
Я так и делаю, но некоторые принты не выводятся т.е. принты в некоторых функциях вообще не выводятся в журнал. Это что может означать?
Это то же помогает. Если принт не печатается значит не выполнилось условие что бы программа зашла в то место куда принт засунут. Или наоборот, выполняется какое то условие что бы программа не заходила в это место.
 

hoz

Активный участник
Вот, например у меня ф-ция в эксперте, я туда навставлял принтов:

PHP:
//+-------------------------------------------------------------------------------------+
//| Генерация сигнала закрытия, покупки или продажи                                     |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
  double firstBarClosed = iClose(Symbol(),1440,2);
  double secondBarClosed = iClose(Symbol(),1440,1);
  
  if(firstBarClosed > secondBarClosed)                                       // закрытие вчерашнего дня ниже закрытия предыдущего, то..
  Print("firstBarClosed > secondBarClosed ", firstBarClosed, " > ", secondBarClosed);
  Print("firstBarClosed > secondBarClosed ", firstBarClosed > secondBarClosed);
  return(SIGNAL_BUY);                                                        // Покупаем

  if(firstBarClosed < secondBarClosed)                                      // Если закрытие вчерашнего дня выше закрытия предыдущего, то..
  Print("firstBarClosed < secondBarClosed ", firstBarClosed, " < ", secondBarClosed);
  Print("firstBarClosed < secondBarClosed ", firstBarClosed < secondBarClosed);
  return(SIGNAL_SELL);                                                      // Продаём

  return(SIGNAL_NO);                                                        // Нет сигнала
}


В журнале выводит:

PHP:
2012.11.26 20:34:27	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 20:34:27	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 20:34:27	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 20:34:27	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 20:34:27	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 20:34:27	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 20:34:27	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 20:34:27	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 20:34:27	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 20:34:27	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 20:34:27	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 20:34:27	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 20:34:27	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 20:34:27	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 20:34:27	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 20:34:27	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 20:34:27	2012.11.02 20:19  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 20:34:27	2012.11.02 20:19  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 20:34:27	2012.11.02 20:19  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 20:34:27	2012.11.02 20:19  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946


Всё же верно, почему тогда выводиться тоже самое? И кроме 1 больше ничего не возвращается..
 
Последнее редактирование модератором:

ale002

::: __,,,^._.^,,,__ :::
В таком виде функция может вернуть тока значение, присвоенное SIGNAL_BUY и ничего другого. И напечатать тока либо один первый Print, либо 1й и 2й. А после этого неизбежен Return(SIGNAL_BUY), какие бы не были результаты проверки. Бо вы в фигурные скобки не взяли блоки Print..Print..Return
 

hoz

Активный участник
По суди да, я упустил этот момент. Вот исправил:
PHP:
int GetSignal()
{
  double firstBarClosed = iClose(Symbol(),1440,2);
  double secondBarClosed = iClose(Symbol(),1440,1);
  
  if(firstBarClosed > secondBarClosed)                                       // закрытие вчерашнего дня ниже закрытия предыдущего, то..
    {  Print("firstBarClosed > secondBarClosed ", firstBarClosed, " > ", secondBarClosed);
       Print("firstBarClosed > secondBarClosed ", firstBarClosed > secondBarClosed);
       return(SIGNAL_BUY);                                                        // Покупаем
    }
  if(firstBarClosed < secondBarClosed)                                      // Если закрытие вчерашнего дня выше закрытия предыдущего, то..
    {  Print("firstBarClosed < secondBarClosed ", firstBarClosed, " < ", secondBarClosed);
       Print("firstBarClosed < secondBarClosed ", firstBarClosed < secondBarClosed);
       return(SIGNAL_SELL);                                                      // Продаём
    }
  return(SIGNAL_NO);                                                        // Нет сигнала
}


В журнале:

PHP:
2012.11.26 23:07:39	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 23:07:39	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 23:07:39	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 23:07:39	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 23:07:39	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 23:07:39	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 23:07:39	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 23:07:39	2012.11.02 20:23  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 23:07:39	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 23:07:39	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 23:07:39	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 23:07:39	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 23:07:39	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 23:07:39	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 23:07:39	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 23:07:39	2012.11.02 20:22  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 23:07:39	2012.11.02 20:19  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 23:07:39	2012.11.02 20:19  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 23:07:39	2012.11.02 20:19  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 23:07:39	2012.11.02 20:19  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 23:07:39	2012.11.02 20:19  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 23:07:39	2012.11.02 20:19  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 23:07:39	2012.11.02 20:19  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1
2012.11.26 23:07:39	2012.11.02 20:19  Gann_2Days EURUSD,H1: firstBarClosed > secondBarClosed 1.2964 > 1.2946
2012.11.26 23:07:38	2012.10.17 12:01  Gann_2Days EURUSD,H1: firstBarClosed < secondBarClosed 1
2012.11.26 23:07:38	2012.10.17 12:01  Gann_2Days EURUSD,H1: firstBarClosed < secondBarClosed 1.2784 < 1.3097
2012.11.26 23:07:38	2012.10.17 12:01  Gann_2Days EURUSD,H1: OrderClose error 4051
2012.11.26 23:07:38	2012.10.17 12:01  Gann_2Days EURUSD,H1: invalid ticket for OrderClose function
2012.11.26 23:07:38	2012.10.17 12:01  Gann_2Days EURUSD,H1: firstBarClosed < secondBarClosed 1
2012.11.26 23:07:38	2012.10.17 12:01  Gann_2Days EURUSD,H1: firstBarClosed < secondBarClosed 1.2784 < 1.3097
2012.11.26 23:07:38	2012.10.17 12:01  Gann_2Days EURUSD,H1: OrderClose error 4051
2012.11.26 23:07:38	2012.10.17 12:01  Gann_2Days EURUSD,H1: invalid ticket for OrderClose function
2012.11.26 23:07:36	Gann_2Days: loaded successfully


Постояно возвращается те же цены и тот же возврат в return т.е. signal_buy т.е. 1. Но должны же возвращаться другие цены и другие сигналы..
 
Последнее редактирование модератором:

Sergey Kovalyov

Элитный участник
Так правильно возращает одинаковую цену. Вы же цены от H1 свечей берете. Пока на новый час не перешли, то цены будут одинаковые.

И у Вас там, кажется, дыра в котировках. Между 17 октября и 2 ноября.
 

sochinik

Местный житель
Я только в начале изучения MQL, поэтому ищу вспомогательные программы для написания , сейчас использую кроме редактора медаэтитора ещё и Forex EA Generator 4 и Notepad++, в первом можно правильно составить шаблон эксперта с автоматическим преобразованием на 5 знаков, а также разобрать как правильно составить код.., а в Notepad++ удобно отслеживать парность скобок и начало и окончание функций, а также заменять части кода сразу автоматом во всём эксперте... а какие программы ещё полезны для програмирования советников?
 

hoz

Активный участник
Я только в начале изучения MQL, поэтому ищу вспомогательные программы для написания , сейчас использую кроме редактора медаэтитора ещё и Forex EA Generator 4 и Notepad++, в первом можно правильно составить шаблон эксперта с автоматическим преобразованием на 5 знаков, а также разобрать как правильно составить код.., а в Notepad++ удобно отслеживать парность скобок и начало и окончание функций, а также заменять части кода сразу автоматом во всём эксперте... а какие программы ещё полезны для програмирования советников?

Лично я пользуюсь для анализа любого кода только Microsoft Visual Studio 2010. Это самое удобное средство для этих целей.
 
Верх