[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 264

 
Dmido >> :

Parece que una semana para nosotros los novatos es la fecha límite después de la cual vamos a usted pros))))


Concluido de los últimos posts....

vamos a llegar al fondo de esto:) exponer el contexto.

 

¿Contexto? simple...

Artículo Creación de un programa ordinario(https://book.mql4.com/ru/build/index) a partir del libro de texto.

Allí se incluye un archivo <Inform.mqh> en el programa.

""""""

Se crea una subventana de salida independiente utilizando un indicador personalizado con la configuración adecuada. El único propósito de este indicador es crear una subventana, por lo tanto, no se realizan cálculos en el indicador, tampoco hay propósito de crear líneas del indicador. El código del indicador Inform.mq4 puede tener el siguiente aspecto:

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

En general, el programador puede añadir el código necesario al indicador, dotándolo así de propiedades adicionales. Por ejemplo, en alguna parte de la subventana del indicador, puede mostrar las líneas del indicador. Este ejemplo muestra un código simple de un indicador, cuya ventana mostrará los objetos gráficos.

""""

Este es el código del archivo Inform. No entiendo cómo obtener señales de ella en el gráfico. En el programa funciona, parece que da órdenes en el gráfico, pero nada... ¿Tengo que adjuntar un indicador Inform y escribir algo en él? ¿O de otra manera?


Por favor, dígame cómo hacerlo ((...)

 
Dmido >> :

Por favor, díganos qué hacer ((.


Primero, un poco de teoría. Un programa MQL es... programa. Es decir, no puede realizar operaciones que no se le indiquen. En la sección de ayuda "ejecución del programa" se puede leer que cuando llega un nuevo tick en el Asesor Experto/indicador, se ejecuta la función start(). Si la función Inform() no se llama desde la función start(), no se ejecutará. Ahora sigue leyendo el artículo desde la sección que has mencionado: La función Inform() puede ser llamada desde cualquier lugar del programa donde sea necesario mostrar el siguiente mensaje. Es decir, en la función start(), donde necesitamos imprimir el mensaje, escribimos

Inform(Mess_Number, Number, Value);
 
Por supuesto, las variables Mess_Number, Number, Value deben ser declaradas de antemano y asignarles algunos valores.
 

Gracias por la explicación, claro, pero se llama desde el programa a menudo, no está en el cuerpo principal, pero en otros iclude está en todas partes y se llama enviando mensajes, pero no salen(


como ejemplo una línea de Close_All.mqh


if (Tip==1) Price_Cls=Ask; // Para órdenes de venta
Inform(12,Ticket); // Mensaje sobre el intento de cierre.

 
Escriba su código start() y echemos un vistazo, porque no estamos discutiendo nada
 
int start()                            // Спец. функция start
  {
        
   Terminal();                         // Функция учёта ордеров 
   Events();                           // Информация о событиях
   Trade(Criterion());                 // Торговая функция
   Inform(0);                          // Для перекрашивания объектов
   return;                             // Выход из start()
  }

Es esencialmente lo mismo que en el tutorial. Todas las llamadas provienen de archivos de inclusión .

He aquí un ejemplo

//--------------------------------------------------------------------
// 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 >> :

Es esencialmente lo mismo que en el tutorial. Todas las llamadas provienen de archivos de inclusión .

He aquí un ejemplo

El informe se llama un montón de veces, pero es difícil ver cómo se muestra.... donde los mensajes van también(

 
¿Entiendo que también tiene la función Criterion() del ejemplo? A continuación, espere a que se activen los criterios de apertura de una posición de acuerdo con la estrategia descrita en el tutorial, y entonces verá cómo funciona la función Inform(). O abrirlo manualmente usando el botón correspondiente en el terminal - también debería funcionar...
 
No, puse mi Criterio) tenía sentido ejecutarlo todo, pero no funcionó ni siquiera con el inicial (ahora es difícil volver a escribir todo, pero el Criterio envía órdenes de apertura, los tratos se abren, los eventos ocurren, pero hay 0 mensajes en la salida...