[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 264

 
Dmido >>:

Похоже неделя у нас у новичков это предельный срок после которого мы идём к вам профи)))


Вывод делал по последним постам...

давайте разбираться:) излагайте контекст.

 

Контекст? простой...

Статья Создание обычной программы (https://book.mql4.com/ru/build/index) из учебника.

Там в программу включается файл <Inform.mqh>

""""""

Отдельное подокно для вывода информации создаётся с помощью пользовательского индикатора с соответствующей настройкой. Единственным назначением этого индикатора является создание подокна, поэтому в индикаторе не выполняются никакие вычисления, не ставится также цель построения индикаторных линий. Код индикатора Inform.mq4может выглядеть так:

//--------------------------------------------------------------------
// Inform.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
#property indicator_separate_window // Отдельное окно индикатора
//--------------------------------------------------------------------
int start() // Специальная функция start()
{
}
//--------------------------------------------------------------------

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

""""

Ну а дальше код файла Inform. И вот хоть убей не пойму как получить от него сигналы на графике??? В программе работает вроде выдаёт команды на графике же пусто... Нужно прикреплять индикатор Inform и в него что то в писывать? Или как-то по другому?


Прошу подскажите как быть(((

 
Dmido >>:

Прошу подскажите как быть(((


Для начала немного из теории. Программа на MQL - это ... программа. То есть она не может выполнять те операции, которые ей не сказали выполнять. В разделе справки "выполнение программ" можно прочитать, что при приходе нового тика в эксперте/индикаторе происходит выполнение функции start(). Если же функция Inform() из функции start() не вызывается, то она и не выполнится. Теперь читаем дальше статью из указанного Вами раздела: Вызов функции Inform() может осуществляться из любого места программы, где по смыслу необходимо вывести очередное сообщение. Т.е. в функции start() там, где надо вывести сообщение, мы пишем 

Inform(Mess_Number, Number, Value);
 
естественно, переменные Mess_Number, Number, Value должны быть заранее объявлены и им присвоены какие-то значения.
 

За объяснения, конечно, спасибо, но она вызывается из программы часто, в основном теле её нет, но в других iclude она везде включена и вызывается посылая сообщения, но они невыводятся(


как пример строчка из Close_All.mqh


if (Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      Inform(12,Ticket);                  // Сообщение о попытке закр.

 
пишите ваш код функции start(), разберем, а то мы вроде как ни о чем дискутируем
 
int start()                            // Спец. функция start
  {
        
   Terminal();                         // Функция учёта ордеров 
   Events();                           // Информация о событиях
   Trade(Criterion());                 // Торговая функция
   Inform(0);                          // Для перекрашивания объектов
   return;                             // Выход из start()
  }

Он по сути такой же как в учебнике. Все вызовы происходят из include файлов .

Вот к примеру

//--------------------------------------------------------------------
// Events.mqh
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
// Функция слежения за событиями.
// Глобальные переменные:
// Level_new            Новое значение минимальной дистанции
// Level_old            Предыдущее значение минимальной дистанции
// Mas_Ord_New[31][9]   Массив ордеров последний известный
// Mas_Ord_Old[31][9]   Массив ордеров предыдущий (старый)
//--------------------------------------------------------------- 2 --
int Events()                              // Пользовательская функция
  {
   bool Conc_Nom_Ord;                     // Совпадение ордеров в ..
   //.. старом и новом массивах
//--------------------------------------------------------------- 3 --
   Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL );// Последн.известное
   if (Level_old!=Level_new)              // Новое не равно старому..
     {                                    // значит изменились условия
      Level_old=Level_new;                // Новое "старое значение"
      Inform(10,Level_new);               // Сообщение: новая дистанц.
     }
//--------------------------------------------------------------- 4 --
   // Поиск пропавших, поменявших тип, частично закрытых и переоткрытых
   for(int old=1;old<=Mas_Ord_Old[0][0];old++)// По массиву старых
     {                                    // Исходим из того, что..
      Conc_Nom_Ord=false;                 // ..ордера не совпадают
      //--------------------------------------------------------- 5 --
      for(int new=1;new<=Mas_Ord_New[0][0];new++)//Цикл по массиву ..
        {                                 //..новых ордеров
         //------------------------------------------------------ 6 --
         if (Mas_Ord_Old[old][4]==Mas_Ord_New[new][4])// Совпал номер 
           {                              // Тип ордера стал ..
            if (Mas_Ord_New[new][6]!=Mas_Ord_Old[old][6])//.. другим
               Inform(7,Mas_Ord_New[new][4]);// Сообщение: преобраз.:)
            Conc_Nom_Ord=true;            // Ордер найден, ..
            break;                        // ..значит выходим из ..
           }                              // .. внутреннего цикла
         //------------------------------------------------------ 7 --
                                          // Не совпал номер ордера
         if (Mas_Ord_Old[old][7]>0 &&     // MagicNumber есть, совпал
            Mas_Ord_Old[old][7]==Mas_Ord_New[new][7])//.. со старым
           {               //значит он переоткрыт или частично закрыт
                                             // Если лоты совпадают,.. 
            if (Mas_Ord_Old[old][5]==Mas_Ord_New[new][5])
               Inform(8,Mas_Ord_Old[old][4]);// ..то переоткрытие
            else                             // А иначе это было.. 
               Inform(9,Mas_Ord_Old[old][4]);// ..частичное закрытие
            Conc_Nom_Ord=true;               // Ордер найден, ..
            break;                           // ..значит выходим из ..
           }                                 // .. внутреннего цикла
        }
      //--------------------------------------------------------- 8 --
      if (Conc_Nom_Ord==false)               // Если мы сюда дошли,..
        {                                    // ..то ордера нет:(
         if (Mas_Ord_Old[old][6]==0)
            Inform(1, Mas_Ord_Old[old][4]);  // Ордер Buy закрыт
         if (Mas_Ord_Old[old][6]==1)
            Inform(2, Mas_Ord_Old[old][4]);  // Ордер Sell закрыт
         if (Mas_Ord_Old[old][6]> 1)
            Inform(3, Mas_Ord_Old[old][4]);  // Отложен. ордер удалён
        }
     }
//--------------------------------------------------------------- 9 --
   // Поиск новых ордеров 
   for(new=1; new<=Mas_Ord_New[0][0]; new++)// По массиву новых орд.
     {
      if (Mas_Ord_New[new][8]>0)            //Это не новый,а переоткр
         continue;                          //..или частично закрытый
      Conc_Nom_Ord=false;                   // Пока совпадения нет
      for(old=1; old<=Mas_Ord_Old[0][0]; old++)// Поищем этот ордерок 
        {                                   // ..в массиве старых
         if (Mas_Ord_New[new][4]==Mas_Ord_Old[old][4])//Совпал номер..
           {                                          //.. ордера
            Conc_Nom_Ord=true;              // Ордер найден, ..
            break;                          // ..значит выходим из ..
           }                                // .. внутреннего цикла
        }
      if (Conc_Nom_Ord==false)              // Если совпадения нет,..
        {                                   // ..то ордер новый :)
         if (Mas_Ord_New[new][6]==0)
            Inform(4, Mas_Ord_New[new][4]); // Ордер Buy открыт
         if (Mas_Ord_New[new][6]==1)
            Inform(5, Mas_Ord_New[new][4]); // Ордер Sell открыт
         if (Mas_Ord_New[new][6]> 1)
            Inform(6, Mas_Ord_New[new][4]); // Установлен отлож.ордер
        }
     }
//-------------------------------------------------------------- 10 --
   return;
  }
//-------------------------------------------------------------- 11 --
 
Dmido >>:

Он по сути такой же как в учебнике. Все вызовы происходят из include файлов .

Вот к примеру

Тут Inform до чёрта раз вызывается,но как это выводить на экран так и не понятно....куда идут сообщения тоже(

 
я так понимаю, функция Criterion() у вас тоже из примера? Тогда ждите, пока сработают критерии открытия позиции в соответствии с изложенной в учебнике стратегией - и тут же увидите в деле работу функции Inform(). Ну или откройте вручную соответствующей кнопочкой на терминале, тоже должно сработать...
 
Да нет уж критерион я свою поставил) смысл был тогда всё это запускать, но вроде даже с изначальной не шло( Шас уже сложно всё обратно переписывать, но критерион отсылает исправно приказы на открытие, сделки открываются, события происходят а на выходе 0 сообщений...
Причина обращения: