Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1724

 
EVGENII SHELIPOV #:

Bom dia senhores programadores!!!!

Vou tentar mais uma vez fazer minha pergunta, mas reformulei um pouco o texto.

Em uma grade EA, precisamos encontrar o bilhete da penúltima ordem. Eu acho que a solução -1 do ticket da ordem máxima não funciona no testador de estratégia, mas pode ser assim na demonstração e nas contas reais, é difícil ver o porquê.

Eu escrevi o código para a função que determina o próximo ao último bilhete de pedido. Esta lógica é a seguinte: se olharmos todas as ordens abertas na grade, encontraremos a máxima seguindo-a e será o ticket de ordem necessário.

Entretanto, meu nível de programação não é suficientemente alto e há algum erro no código. O resultado desta função é o bilhete mínimo. Estas duas funções são: bilhete máximo e penúltimo bilhete. A função que define o bilhete máximo funciona sem problemas.

Por favor, informe qual é o erro. Obrigado.

Esta segunda foto mostra que você não precisa de um bilhete máximo ou tempo máximo de abertura, mas precisa escolher um preço mínimo de abertura para pedidos de compra e um preço máximo de abertura para pedidos de venda.
 
Alexey Viktorov #:
Esta é a segunda foto que lhe diz que você não precisa de um bilhete máximo ou tempo máximo de abertura, mas você precisa selecionar o preço mínimo de abertura para pedidos de compra e o preço máximo de abertura para pedidos de venda.

Alexei Eu tenho as funções que determinam estes preços, você poderia explicar como chegar ao bilhete que você está procurando?

 
Alexey Viktorov #:
Esta segunda foto mostra que você não precisa de um bilhete máximo ou tempo máximo de abertura, mas precisa escolher um preço mínimo de abertura para pedidos de compra e um preço máximo de abertura para pedidos de venda.
//+----------------------------------------------------------------------------+
//| Определение цены открытия макс лота                                        |
//+----------------------------------------------------------------------------+
double PriceMaxOrder()
  {
   double max_price = 0 ;
   max_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > max_ticket)
                    {
                     max_ticket = OrderTicket();
                     max_price = OrderOpenPrice();
                    }
                 }
              }
           }
        }
     }
   return(max_price);
  }
 
EVGENII SHELIPOV #:

Alexei Eu tenho as funções que determinam estes preços, você poderia explicar como chegar ao bilhete que você está procurando?

Assim.

//+------------------------------------------------------------------+
//| Расчет тикета нижнего ордера BUY в сетке                         |
//+------------------------------------------------------------------+
int GetTicketMaxOrder(int Magic)// int Magic вставлен только для компиляции без ошибок.
 {
  int total = OrdersTotal(),
      my_ticket = 0;
  double minPrice = DBL_MAX;
  for(int cnt = total; cnt-- > 0;)
   {
    if(OrderSelect(cnt, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
     {
      if(OrderType() == OP_BUY)
       {
        if(OrderOpenPrice() < minPrice)
          my_ticket = OrderTicket();
       }
     }
   }
  return(my_ticket);
 }
/*****************************End program****************************/
 
Alexey Viktorov #:

Assim

Mas antes de entrar na essência da função eu queria esclarecer: esta função é para selecionar o bilhete da penúltima ordem?

 
EVGENII SHELIPOV #:

Mas antes de entrar na essência da função eu queria esclarecer: esta função é para selecionar o bilhete da penúltima ordem?

Não, ele encontra o bilhete de pedido de compra com o preço mais baixo. A partir daqui, cabe a mim ou à Makar deixar-me praticar.

 
Alexey Viktorov #:

Não, ele encontra o bilhete de pedido de compra com o preço mais baixo. A partir daqui, cabe a você ou a Makar praticar.

Alexey, sinto-me inadequado para o segundo dia entre vocês. Eu tenho funções para calcular o min/max, elas funcionam sem falhas como a máquina de Kalashnikov, ainda não lhes perguntei, mas no segundo dia eles me transformaram numa rotina!

//+----------------------------------------------------------------------------+
//| Расчет тикета максимального ордера в сетке                                 |
//+----------------------------------------------------------------------------+
int GetTicketMaxOrder()
  {
   max_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > max_ticket)
                     max_ticket = OrderTicket();
                 }
              }
           }
        }
     }
   return(max_ticket);
  }
//+----------------------------------------------------------------------------+
//| Расчет тикета минимального ордера в сетке                                  |
//+----------------------------------------------------------------------------+
int GetTicketMinOrder()
  {
   min_ticket=INT_MAX;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() < min_ticket)
                     min_ticket = OrderTicket();

                 }
              }
           }
        }
     }
   return(min_ticket);
  }

Bem, de qualquer forma, obrigado pela atenção

 
EVGENII SHELIPOV #:

Sim Alexey, sinto que o segundo dia entre vocês não é uma pessoa muito adequada. Funções para calcular o bilhete min/max está funcionando perfeitamente como um Kalashnikov automático Eu não pedi para eles ninguém, mas no segundo dia eu fico em um obstáculo!!!

Bem, de qualquer forma, obrigado pela dica.

Esta foto não é

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

Qualquer pergunta de novatos sobre MQL4 e MQL5, ajuda e discussão de algoritmos e códigos

EVGENII SHELIPOV, 2021.11.07 06:43

Bom dia senhores programadores!!!!

Vou tentar mais uma vez fazer minha pergunta, mas ligeiramente reformulada.

Em uma grade EA, eu preciso encontrar o bilhete da penúltima ordem. Uma solução de -1 do bilhete da ordem máxima não funciona no testador de estratégia, talvez, mas não funcionará em uma demonstração ou conta real, eu anexei uma foto, ficará claro o porquê.

Eu escrevi o código para a função que determina o próximo ao último bilhete de pedido. Esta lógica é a seguinte: se olharmos todas as ordens abertas na grade, encontraremos a máxima seguindo-a e será o ticket de ordem necessário.

Entretanto, meu nível de programação não é suficientemente alto e há algum erro no código. O resultado desta função é o bilhete mínimo. Estas duas funções são: bilhete máximo e penúltimo bilhete. A função que define o bilhete máximo funciona sem problemas.

//+----------------------------------------------------------------------------+
//| Расчет тикета предпоследнего ордера в сетке                                |
//+----------------------------------------------------------------------------+
int GetTicketPenultimateOrder()
  {
   penultimate_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > penultimate_ticket && penultimate_ticket != GetTicketMaxOrder())
                     penultimate_ticket = OrderTicket();
                 }
              }
           }
        }
     }
   return(penultimate_ticket);
  }
//+----------------------------------------------------------------------------+
//| Расчет тикета максимального ордера в сетке                                 |
//+----------------------------------------------------------------------------+
int GetTicketMaxOrder()
  {
   max_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > max_ticket)
                     max_ticket = OrderTicket();
                 }
              }
           }
        }
     }
   return(max_ticket);
  }

Por favor, informe qual é o erro. Obrigado.


as setas mostram o bilhete máximo? Vejo aqui setas que apontam para o segundo preço de pedido mais baixo. O que está errado?
 
Alexey Viktorov #:

Esta foto mostra


as setas mostram o ingresso máximo? Vejo aqui setas que apontam para o segundo preço de pedido mais baixo. O que está errado?

Alexei, você pode ampliar a foto, por favor?

 
EVGENII SHELIPOV #:

Alexei, você pode ampliar a foto, por favor?

Esta éa ordemPREDICTED

Razão: