[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 264

 
Dmido >> :

Parece que uma semana para nós, novatos, é o prazo após o qual nós vamos até você pros))))


Concluído a partir dos últimos posts....

vamos ao fundo da questão:) declarar o contexto.

 

Contexto? simples...

Artigo Criando um programa comum(https://book.mql4.com/ru/build/index) a partir do livro didático.

Ali, um arquivo <Inform.mqh> está incluído no programa.

""""""

Uma subjanela de saída separada é criada usando um indicador personalizado com as configurações apropriadas. O único objetivo deste indicador é criar uma subjanela, portanto, nenhum cálculo é realizado no indicador, também não há objetivo de criar linhas indicadoras. O código do indicador Inform.mq4 pode ter a seguinte aparência:

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

Em geral, o programador pode adicionar o código necessário ao indicador, fornecendo-lhe, assim, propriedades adicionais. Por exemplo, em alguma parte da subjanela indicadora, você pode exibir as linhas indicadoras. Este exemplo mostra um código simples de um indicador, cuja janela exibirá os objetos gráficos.

""""

Aqui está o código do arquivo Informar. Não entendo como obter sinais a partir dele na tabela. No programa que funciona, parece dar comandos na tabela, mas nada... Preciso anexar um indicador Informar e escrever algo nele? Ou de outra forma?


Por favor, me diga como fazer ((...)

 
Dmido >> :

Por favor, diga-nos o que fazer((.


Primeiro, um pouco de teoria. Um programa MQL é... programa. Ou seja, ele não pode realizar operações que não lhe são mandadas realizar. Na seção de ajuda "execução do programa" você pode ler que quando um novo tick vem no Expert Advisor/indicator, a função start() é executada. Se a função Inform() não for chamada desde o início(), ela não será executada. Agora leia mais adiante o artigo da seção que você mencionou: A função Inform() pode ser chamada de qualquer lugar do programa onde seja necessário imprimir a próxima mensagem. Isto é, no início da função(), onde precisamos imprimir a mensagem, nós escrevemos

Inform(Mess_Number, Number, Value);
 
Naturalmente, as variáveis Mess_Number, Number, Value devem ser declaradas com antecedência e alguns valores devem ser atribuídos a elas.
 

Obrigado pela explicação, é claro, mas é chamado do programa muitas vezes, no corpo principal não está presente, mas em outro iclude está em toda parte e é chamado através do envio de mensagens, mas elas não são emitidas(


como exemplo uma linha de Close_All.mqh


if (Tip===1) Price_Cls=Ask; // Para pedidos de Venda
Informar(12,Ticket); // Mensagem sobre a tentativa de fechamento.

 
Escreva seu código inicial() e vamos dar uma olhada nele, porque não estamos discutindo nada
 
int start()                            // Спец. функция start
  {
        
   Terminal();                         // Функция учёта ордеров 
   Events();                           // Информация о событиях
   Trade(Criterion());                 // Торговая функция
   Inform(0);                          // Для перекрашивания объектов
   return;                             // Выход из start()
  }

É essencialmente o mesmo que no tutorial. Todas as chamadas vêm de arquivos .

Aqui está um exemplo

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

É essencialmente o mesmo que no tutorial. Todas as chamadas vêm de arquivos .

Aqui está um exemplo

O Informe é chamado de uma merda de vezes, mas é difícil ver como ele exibe.... onde as mensagens vão também(

 
Eu entendo que você também tem a função Critério() do exemplo? Em seguida, aguarde até o critério de abertura de uma posição acionada de acordo com a estratégia descrita no tutorial - e então você verá como funciona a função Inform(). Ou abra-o manualmente usando o botão correspondente no terminal - ele também deve funcionar...
 
Não, eu coloquei meu Critério) fazia sentido executar tudo, mas não funcionou nem mesmo com um inicial (agora é difícil reescrever tudo de volta, mas o Critério envia ordens de abertura, negócios abertos, eventos acontecem, mas há 0 mensagens na saída...