Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 713

 
7Konstantin7:

Gracias, no puedo hacerlo, sólo pensé que tal vez alguien podría garabatear algunas líneas en esa función o podría dejar caer un búho, la versión final. No creo que sea difícil, pero no creo que nadie ayude.

Hay 4 créditos en el sitio mql5 podría dar) si es posible transferir entre los participantes.

1. Busca la posición abierta más temprana que puedas en el bucle y devuelve su ticket?

 
artmedia70:

1. ¿Puede encontrar la posición abierta más temprana en el bucle y devolverla al billete?

No puedo imaginar cómo sería en el código), pero de alguna manera pude añadir al EA la eliminación de las órdenes pendientes, no soy bueno en el código, sólo un poco.
 
7Konstantin7:
No me imagino como será en el código) pero por algún milagro he podido añadir la eliminación de órdenes pendientes al EA, no soy bueno con los códigos, solo un poco.

Sólo tómalo y verás cómo se cierra en un bucle

1:

int i, total = OrdersTotal(); bool rez;

for(i = total-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && другие нужные условия)
{
if(OrderType() < 2)
rez = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 40);
if(OrderType() > 1)
rez = OrderDelete(OrderTicket());
}
}

2:

//Всё тоже самое только поменяй направление цикла
for(i = 0; i < total; i++)
Entonces entenderá en qué orden se cierran las órdenes. No puedo asegurarlo porque no lo he comprobado. No lo necesito. Pero este es otro tema, se ha discutido aquí más de una vez y no quiero repetirlo todo de nuevo.
 
AlexeyVik:

Sólo tómalo y verás cómo se cierra en un bucle

1:

2:

entonces sabrá en qué orden se cierran las órdenes. No puedo decirlo, porque no lo he comprobado. No lo necesito. Pero este es otro tema, se ha discutido aquí muchas veces y no quiero repetirlo todo.
El problema ya se ha resuelto en privado...
 
artmedia70:
Ya lo hemos solucionado en privado...
Bueno, no leo tus privados... No sé qué está pasando.
 
AlexeyVik:
Bueno, no leo tus mensajes privados... y no sé qué está pasando.
Sí, no lee... ¿Qué pasó con mis zapatillas? ;)
 
artmedia70:
Sí, no lee... ¡¿Dónde han ido mis zapatillas?! ;)

Recuerde que Ioann Vassilievich enumeró lo que tomó y no tomó Shpak... Así que soy tus zapatillas.


Adiós. Me voy a la cama.

 
AlexeyVik:

Recuerde lo que Ioann Vassilievich enumeró que tomó, y Shpak no tomó... Así que soy tus zapatillas.


Adiós. Me voy a la cama.

Iré a preguntar a los demás sobre las zapatillas... Buenas noches...
 
AlexeyVik:

Sólo tómalo y verás cómo se cierra en un bucle

1:

2:

Así sabrá en qué orden se cierran las órdenes. No puedo decirlo porque no lo he comprobado. No lo he comprobado porque no lo necesito. Pero hay una razón para organizar el bucle como en la primera variante. Pero este es otro tema, se ha discutido aquí muchas veces y no tengo ganas de repetirlo todo.

Gracias, ya se ha solucionado el problema.

artmedia70:

Pensé que me enviarían al baño) Gracias por la ayuda.

 

Hola a todos! Ya hice una pregunta similar en la página 711, lamentablemente nadie ha respondido, tal vez ahora alguien...

Me encuentro con un problema de cierre de órdenes de contador en una orden de cinco dígitos. El caso es que necesito cerrar, por ejemplo, 20 órdenes en compra y 33 en venta cuando se alcance el beneficio total. Y quiero cerrar 20 órdenes de compra y 20 órdenes de venta usando la función OrderCloseBy(), y cerrar las 13 órdenes de venta restantes usando la función OrderClose().

Si tenemos un spread fijo a 4 dígitos, no tendremos ningún problema con el cierre del spread y además guardamos el spread al utilizar la función OrderCloseBy(). Si tenemos un spread de 5 dígitos, el spread es flotante y por eso, creo, las órdenes no se cierran cuando se alcanza el beneficio total, y la función OrderCloseBy() argumenta en el registro. Al mismo tiempo, si lo ejecutamos en el probador, todo se cierra normalmente.

Las órdenes en una dirección, cuando se alcanza el beneficio total, se cierran sin problemas.

¿Quién se ha encontrado con un problema así y qué opciones hay para resolverlo?

Le daré la función de cerrar las órdenes.

Además, ¿la función OrderCloseBy() funciona siquiera en un pedido de cinco dígitos?

  //-----------------------------------------------------------------------
  // функция подсчета открытых ордеров
  //-----------------------------------------------------------------------

  void OrderOpen()
   {
     Orders_BUY=0; Orders_SELL=0;
     for(int a=0; a<=OrdersTotal(); a++)
     {
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+1;
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+1;

      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;
      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
      ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
     }
   }
  
  //-----------------------------------------------------------------------
  // функция закрытия ордеров сначала разнонаправленных
  //-----------------------------------------------------------------------
  void ClosePos()
   {
   int ticket_1=0, ticket_2=0;
    
     for (int a=0; a<=OrdersTotal(); a++)
       {
         if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true) 
            {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) // проверка по символу и магику
               {
                if(OrderType() == OP_BUY) ticket_1 = OrderTicket();
                if(OrderType() == OP_SELL) ticket_2= OrderTicket();   
               } 
            }
        }    
      if(ticket_1 != 0 && ticket_2 != 0) {          // если найдены разнонаправленные ордера
      res = OrderCloseBy(ticket_1,ticket_2,clrRed); }   // закроем их
       
      if(ticket_1 == 0 && ticket_2 != 0) {  CloseOrder_by_type(OP_SELL,Symbol());  }
      if(ticket_1 != 0 && ticket_2 == 0) {  CloseOrder_by_type(OP_BUY,Symbol());  }
    
    }

//---- Закрытие ордера по типу и комментарию ----//
void CloseOrder_by_type(int type, string sym)
{
   for(int k= OrdersTotal()-1;k>=0;k--)
   {
    
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
       {
           
      if(type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
         if(OrderType()<=1){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),350);}
         else { res = OrderDelete(OrderTicket());}
         if(!res)
               Print("Ошибка закрытия ордера. Код ошибки=",GetLastError());
            else
               Print("ордер успешно закрыт.");   
           
       }
   }
}