[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 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程序是...方案。也就是说,它不能执行没有人告诉它要执行的操作。在 "程序执行 "的帮助部分,你可以看到,当专家顾问/指标中出现一个新的tick时,start()函数被执行。如果Inform()函数没有被start()函数调用,它将不会被执行。现在从你提到的部分继续阅读文章:Inform()函数可以从程序中任何需要显示下一条信息的地方调用。例如,在函数start()中,在我们需要打印信息的地方,我们写道

Inform(Mess_Number, Number, Value);
 
当然, 必须事先声明 Mess_Number、Number、Value这些变量 ,并给它们分配一些值
 

谢谢你的解释,当然,但它经常从程序中被调用,在主体中它不存在,但在其他iclude中它无处不在,通过发送消息被调用,但它们不被输出(


以Close_All.mqh中的一行为例


if (Tip==1) Price_Cls=Ask; // 用于卖出订单
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文件。

下面是一个例子

告知书》被叫了很多遍,但很难看出它是如何显示的....,信息也去了哪里(

 
我理解,你也有例子中的Criterion()函数?然后等待,直到按照教程中描述的策略触发开仓 标准--然后你会看到Inform()函数是如何工作的。或者使用终端上的相应按钮手动打开它--它也应该工作...
 
不,我把我的Criterion)运行它是有意义的,但它没有工作,甚至与最初的一个(现在很难重写一切回来,但Criterion发送开仓订单,交易打开,事件发生,但有0消息在输出...
原因: