[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 346

 
hoz Vadim, ¿por qué recrear el objeto cuando puedes usar ObjectSet()?

¿Por qué pedir consejo y luego cuestionarlo? ¿Es esta la corriente principal?
 
FAQ:

Creo que no tiene sentido seguir discutiendo, lo he explicado todo detalladamente paso a paso, sigue haciendo lo que has estado haciendo.

¿Qué tipo de discusión puede haber? Debemos cerrar la orden con la máxima desviación en el precio. Lo que significa que nos interesa el precio... Es decir, debemos encontrar una orden pendiente extrema (con el precio máximo o mínimo abierto). Si no estás de acuerdo, puedes discutir. Si no, ¡tengo razón después de todo! Sé exactamente lo que estoy diciendo.
 

El código borra ST y TP. Agrego una condición para el borrado selectivo

¿Qué no está escrito correctamente? Sigue borrando todo :(

 #property show_inputs
extern bool   StopLoss     = True;    // Удалить только StopLoss
extern bool   TakeProfit   = True;    // Удалить только TakeProfit
extern bool   ALL          = True;    // Удалить все
void start()
   {
   bool   fm;
   int     i;
   double SL=OrderStopLoss();
   double TP=OrderTakeProfit();

      if (StopLoss)   SL=0;
      if (TakeProfit) TP=0;
      if (ALL)       {SL=0; TP=0;}
     
      for (i=0; i<OrdersTotal(); i++)
         {
           if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
               {
                  if (OrderType()==OP_BUY)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
                  if (OrderType()==OP_SELL)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
               }
         }
   }

¿O no hay otra solución y hay que escribir el código de borrado para cada condición?

#property show_inputs
#include <WinUser32.mqh>
extern bool   StopLoss     = False;    // Удалить только StopLoss
extern bool   TakeProfit   = False;    // Удалить только TakeProfit
extern bool   ALL          = False;    // Удалить все
void start()
   {
   bool   fm;
   int     i;

    if (StopLoss)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (TakeProfit)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (ALL)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
   }             

 
hoz:


Vadim, ¿por qué crear el objeto de nuevo cuando puedes usar ObjectSet()?

En ese caso, había una función en la que se creaba y configuraba completamente el objeto gráfico. En ella se optimiza la función de creación. Si el objeto ya existe, no se crea. Compruébelo usted mismo. Mida el tiempo para crear objetos y luego para cambiar las propiedades. La segunda llamada será mucho más corta. Es decir, no se recrea nada.

Como resultado, tenemos una función universal que no sólo crea un objeto, sino que también puede personalizarlo cambiando las propiedades del objeto sin mucho tiempo.

 
¿Puede sugerir un script a un EA para determinar la tendencia del mercado?
 

Escribí una función que borrarálas órdenes de venta con los precios más bajos.El número de órdenes cortas a cerrar es igualal número de órdenes de compra que se activaron, es decir, pasaron a ser órdenes de mercado.

Así que si una orden de compra se dispara, entonces cerramos una orden de venta, si 2 órdenes de compra se disparan, entonces cerramos 2 órdenes de venta.

Aquí está el código:

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,
       s_ticket;
   amountOfCurrPendingBuys = 0;
   amountOfCurrPendingSells = 0;
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);
   int n = 0;
   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (n < ordersToDelete)
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();
             s_ticket = OrderTicket();
             ordersToDelete--;
         }
      }
   }
}

amountOfCurrPending - cantidad de órdenes de compra pendientes.

Nivel- número de órdenes pendientes enviadas inicialmente a cada lado.

OOP- precio abierto de la orden pendiente, he tomado cualquier valor inalcanzable.

Nuestra condición es la siguiente: si el contador es más bajo que elordersToDelete, eliminamos la orden pendiente con el precio más bajo. Pero todas las posiciones cortas se borran. ¿Qué me pasa?

 
hoz:

Escribí una función que borrarálas órdenes de venta con los precios más bajos.El número de órdenes cortas a cerrar es igualal número de órdenes de compra que se activaron, es decir, pasaron a ser órdenes de mercado.

Así que si una orden de compra se dispara, entonces cerramos una orden de venta, si 2 órdenes de compra se disparan, entonces cerramos 2 órdenes de venta.

Aquí está el código:

amountOfCurrPending - cantidad de órdenes de compra pendientes.

Nivel- número de órdenes pendientes enviadas inicialmente a cada lado.

OOP- precio abierto de la orden pendiente, he tomado cualquier valor inalcanzable.

Nuestra condición es la siguiente: si el contador es más bajo que elordersToDelete, eliminamos la orden pendiente con el precio más bajo. Pero todas las posiciones cortas se borran. ¿Qué me pasa?

No entiendo su lógica. Por qué no: la orden se transformó en una posición de mercado - la orden pendiente más opuesta fue eliminada.
Eso es todo. ¿O tiene un montón de pedidos a un solo precio?
 
artmedia70:

Eso es todo. ¿O tiene un paquete de pedidos a un solo precio?


No, los pedidos en incrementos...
artmedia70:
No entiendo su lógica... Por qué no: La orden se convirtió en una posición de mercado - se eliminó la orden pendiente más opuesta.

Así es como borro la posición más opuesta, es decir, como es una posición corta, significa la posición con el precio de apertura más bajo. Aquí he reescrito la función, todo debería estar claro aquí. He quitado las huellas y he eliminado una variable extra.

La variableamountOfCurrPending transfiere el número de operaciones restantes en compra. Es decir, si la cantidad inicial es el nivel yamountOfCurrPending es la cantidad actual de órdenes, entonces restando la cantidad inicial de órdenes de la actual, obtendremos la diferencia y esta es la cantidad necesaria para eliminar los cortos. ¿Lo ves?

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket;
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);

   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
             s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия

             Print("DeletePendingSells: s_ticket = ", s_ticket);
             Print("DeletePendingSells: OOP = ", OOP);
             OrderDelete(s_ticket,Black); // Тут нужно закрыть найденный ордер, и видимо проверить, что он закрыт. И счётчик уменьшить!
             ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления
         }
      }
   }
   Print("DeletePendingSells: ordersToDelete = ", ordersToDelete);
}
¿Hay un error donde marqué en rojo? ¿Cómo solucionarlo?
 
hoz:

No, los pedidos en incrementos.

De este modo, elimino la posición más lejana, es decir, como es una posición corta, significa la posición con el precio de apertura más bajo. Aquí he reescrito la función, debe quedar claro. He eliminado las huellas y he quitado una variable extra.

La variableamountOfCurrPending transfiere el número de operaciones restantes en compra. Es decir, si la cantidad inicial es el nivel yamountOfCurrPending es la cantidad actual de órdenes, entonces restando la cantidad inicial de órdenes de la actual, obtendremos la diferencia y esta es la cantidad necesaria para eliminar los cortos. ¿Lo ves?

¿Hay un error donde marqué en rojo? ¿Cómo resolverlo correctamente?
 Ищется ордер, с минимальной ценой открытия

Yo especificaría en el comentario de una orden pendiente su número de orden en la parrilla y escribiría el mismo número en la correspondiente orden pendiente opuesta. Entonces, cuando se encuentra una posición de mercado, después de leer el número en su comentario, se puede encontrar la posición opuesta correspondiente con un número idéntico en su comentario. Ya que los magos se utilizan para otra cosa.

ZS. Todavía no tengo tiempo de leer/parsear tu código

 
artmedia70:

Escribiría en el comentario de la posición pendiente su número de secuencia en la parrilla y escribiría el mismo número en la posición pendiente opuesta correspondiente. Entonces, cuando se encuentra una posición de mercado, después de leer el número en su comentario, se encontrará sin problemas la correspondiente orden pendiente opuesta por un número idéntico en su comentario. Ya que usas a los magos para otra cosa.

ZS. Todavía no tengo tiempo de leer/parsear tu código



Sí, no hay problema en encontrar la orden pendiente correspondiente de esa manera, si el número de órdenes pendientes en cada dirección es el mismo. Y si es diferente, entonces esto no funcionará como yo lo entiendo.