Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1724

 
EVGENII SHELIPOV #:

¡¡¡¡Buenos días señores programadores!!!!

Intentaré una vez más formular mi pregunta, pero la he reformulado un poco.

En un EA de rejilla, tenemos que encontrar el billete del penúltimo orden. Creo que, la solución -1 de la entrada de la orden máxima no funciona en el probador de la estrategia, pero puede ser así en la demo y las cuentas reales, es difícil ver por qué.

He escrito el código de la función que determina el penúltimo ticket de pedido. La lógica es la siguiente: si buscamos entre todas las órdenes abiertas en la parrilla, encontraremos la máxima que le sigue y será la entrada de la orden necesaria.

Sin embargo, mi nivel de programación no es lo suficientemente alto y hay algún error en el código. El resultado de esta función es el billete mínimo. Estas dos funciones billete máximo y billete penúltimo. La función que define el ticket máximo funciona sin problemas.

Por favor, indique cuál es el error. Gracias.

Esta segunda imagen muestra que no es necesario un ticket máximo o un tiempo máximo de apertura, pero sí es necesario elegir un precio mínimo de apertura para las órdenes de compra y un precio máximo de apertura para las órdenes de venta.
 
Alexey Viktorov #:
Esta es la segunda imagen que le indica que no necesita un ticket máximo o un tiempo máximo de apertura, pero que debe seleccionar el precio mínimo de apertura para las órdenes de compra y el precio máximo de apertura para las órdenes de venta.

Alexei tengo las funciones que determinan estos precios ¿podrías explicar cómo llegar al billete que buscas?

 
Alexey Viktorov #:
Esta segunda instantánea muestra que no es necesario un ticket máximo o un tiempo máximo de apertura, sino un precio mínimo de apertura para las órdenes de compra y un precio máximo de apertura para las órdenes de venta.
//+----------------------------------------------------------------------------+
//| Определение цены открытия макс лота                                        |
//+----------------------------------------------------------------------------+
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 tengo las funciones que determinan estos precios ¿podrías explicar cómo llegar al billete que buscas?

Así.

//+------------------------------------------------------------------+
//| Расчет тикета нижнего ордера 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 #:

Así

Alexey gracias!!! Pero antes de entrar en la esencia de la función quería aclarar: ¿esta función es para seleccionar el billete del penúltimo pedido?

 
EVGENII SHELIPOV #:

Alexey gracias!!! Pero antes de entrar en la esencia de la función quería aclarar: ¿esta función es para seleccionar el ticket del penúltimo pedido?

No, encuentra el ticket de compra con el precio más bajo. A partir de aquí depende de mí o de Makar que me deje practicar.

 
Alexey Viktorov #:

No, encuentra el ticket de compra con el precio más bajo. A partir de aquí, depende de ti o de Makar para practicar.

Alexey, me siento inadecuado por segundo día entre ustedes. Tengo funciones para calcular el billete mínimo/máximo, funcionan sin problemas como la máquina de Kalashnikov, aún no les he preguntado, ¡pero el segundo día me pusieron en un brete!

//+----------------------------------------------------------------------------+
//| Расчет тикета максимального ордера в сетке                                 |
//+----------------------------------------------------------------------------+
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);
  }

Bueno, de todos modos, gracias por el aviso

 
EVGENII SHELIPOV #:

Sí Alexey me siento el segundo día entre ustedes no del todo adecuada persona. ¡¡¡Las funciones para calcular el billete mínimo/máximo están funcionando sin problemas como la máquina de Kalashnikov no pregunté a nadie por ellas, pero al segundo día se me enciende una pega!!!

Bueno, de todos modos, gracias por el consejo.

¿No es esta foto

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

Cualquier pregunta de los novatos en MQL4 y MQL5, ayuda y discusión de algoritmos y códigos

EVGENII SHELIPOV, 2021.11.07 06:43

¡¡¡¡Buenos días señores programadores!!!!

Intentaré una vez más formular mi pregunta, pero ligeramente reformulada.

En un EA de rejilla, necesito encontrar la entrada del penúltimo pedido. Una solución de -1 de la entrada de la orden máxima no funciona en el probador de la estrategia, tal vez, pero no va a funcionar en una cuenta demo o real, por lo que adjunto una imagen, será claro por qué.

He escrito el código de la función que determina el penúltimo ticket de pedido. La lógica es la siguiente: si buscamos entre todas las órdenes abiertas en la parrilla, encontraremos la máxima que le sigue y será la entrada de la orden necesaria.

Sin embargo, mi nivel de programación no es lo suficientemente alto y hay algún error en el código. El resultado de esta función es el billete mínimo. Estas dos funciones billete máximo y billete penúltimo. La función que define el ticket máximo funciona sin 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, indique cuál es el error. Gracias.


¿las flechas muestran el billete máximo? Aquí veo flechas que apuntan al segundo precio más bajo del pedido. ¿Qué ocurre?
 
Alexey Viktorov #:

¿Es esta imagen


¿las flechas muestran el billete máximo? Aquí veo flechas que apuntan al segundo precio más bajo del pedido. ¿Qué ocurre?

Alexei, ¿puedes ampliar la imagen, por favor?

 
EVGENII SHELIPOV #:

Alexei, ¿puedes ampliar la imagen, por favor?

Este esel ordenPREVISTO

Razón de la queja: