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

 
khorosh:
Para evaluar la corrección del código, hay que saber exactamente lo que el autor quería conseguir. Su información es insuficiente. Lo que querías conseguir no está muy claro. Si usted quisiera compensar la pérdida después del cierre de la parrilla abriendo una orden opuesta y esperando que el precio pase en la dirección de la última orden un cierto número de puntos, el proceso de compensación depende tanto del lote de esta orden como de la distancia que el precio pasará en la dirección favorable. Esto significa que cuando se calcula el lote, también se debe definir la distancia que el precio tendrá que pasar para compensar la pérdida. Pero tal vez te refieras a otra cosa.


Sí, debería haber escrito con más precisión. Es que ya he expuesto dos veces lo que se supone que hace esta función, pero nadie ha contestado. Una vez más, lo que esta función debe hacer. Supongamos que tengo una red de pedidos. Que se abran con el mismo paso o no, no importa. Una orden se abrió antes y otra después, es decir, cada posición ha pasado una cantidad diferente de puntos con un lote diferente. La red se cerrará de acuerdo a ciertas condiciones y necesito calcular el LOT necesario para cubrir la pérdida incurrida de esa red para los puntos TP. Para evitar escribir dos funciones espejo he introducido un parámetro otype en la función.

Sin embargo, he cometido un error en alguna parte. Por favor, ayude a corregirlo.

double FindRightLot (int otype) // функция поиска лота, необходимого для выхода из просадки после 
                               //закрытия сетки ордеров
{
  double Lot=0; double TotalLot=0;
  for (int i = OrdersTotal()-1; i>0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
    {
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
       {
         if (otype == OP_BUY)
         {
           Lot = NormalizeDouble (((OrderOpenPrice()-Bid)*Point)*OrderLots()/TP,2); 
           if (Lot>0)
           {
              TotalLot= TotalLot+Lot;
           }
         }
           
       
         else if (otype == OP_SELL)
         {
           Lot = NormalizeDouble (((Ask-OrderOpenPrice())*Point)*OrderLots()/TP,2);
           if (Lot>0)
           {
            TotalLot= TotalLot+Lot;
           }
           
         }
       }
     }
   }
   return (TotalLot);
   
 }
 
BeerGod:

¿Hay alguna forma de implementarlo correctamente para que se cierre partiendo de cero? Si es posible una línea de código por favor.
Recorre toda la lista (de órdenes) en la dirección deseada y coloca los valores de las entradas en un array, luego borra las órdenes forzando este array.
 
BeerGod:

¿Hay alguna forma de implementarlo correctamente para que se cierre partiendo de cero? Si es posible una línea de código por favor.


Sólo un arreglo rápido:

//+------------------------------------------------------------------+
//|                 Закрыть все ордера                               |
//+------------------------------------------------------------------+


double ClossAllOrders ()

{
  for(int i=0; i<OrdersTotal(); )
  {
    if ( !OrderSelect(i, SELECT_BY_POS) )
      break;
    
    int type   = OrderType();

    bool result = false;
    
    switch(type)
    {
      //Close opened long positions
      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage, Lime );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage, Lime );
                          break;

      //Close pending orders
      case OP_BUYLIMIT  :
      case OP_BUYSTOP   :
      case OP_SELLLIMIT :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    
    if(result == false)
    {
      Print("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      i++;
      Sleep(500);
    }  
  }
}

// End
 
Trader7777:

Sí, debería haber escrito con más precisión. Es que ya he expuesto dos veces lo que se supone que hace esta función, pero nadie ha contestado. Una vez más, lo que esta función debe hacer. Supongamos que tengo una red de pedidos. Que se abran con el mismo paso o no, no importa. Una orden se abrió antes y otra después, es decir, cada posición ha pasado una cantidad diferente de puntos con un lote diferente. La red se cerrará de acuerdo a ciertas condiciones y necesito calcular el LOT necesario para cubrir la pérdida incurrida de esa red para los puntos TP. Para no escribir dos funciones espejo he introducido un parámetro otype en la función.

Pero todavía hay un error en alguna parte. Por favor, ayúdenme a arreglarlo.



Yo tomaría una ruta diferente. En primer lugar, calcularía la pérdida por el cierre de la red. Y entonces es tan sencillo como eso. Pérdida = Beneficio del siguiente pedido. Exprese el beneficio de la orden a través del lote y el TP y encuentre el lote a partir de la ecuación.
 
Contender:


Una paja rápida:


Muchas gracias, todo funciona correctamente, ¡gracias a todos los que han respondido!


 
khorosh:
Yo tomaría una ruta diferente. En primer lugar, calcularía la pérdida por el cierre de la red. Y entonces es tan sencillo como eso. Pérdida = Beneficio del siguiente pedido. Exprese el beneficio de la orden a través del lote y el TP y encuentre el lote a partir de la ecuación.


¿La pérdida al final de la parrilla es en dinero o en pips?
 
Trader7777:

¿la pérdida por cerrar la parrilla es en dinero o en pips?
En la moneda del depósito.
 
¿Y el hecho de que cada par tenga un precio por punto diferente?
 
Trader7777:
¿Y el hecho de que cada par tenga un precio por punto diferente?
¿Por qué querrías hacer eso?
 
Trader7777:
¿Y el hecho de que cada par tenga un precio por punto diferente?

Aquí puedes ver cómo se implementa


https://www.mql5.com/ru/code/7275

https://www.mql5.com/ru/forum/113937/page2

https://docs.mql4.com/ru/constants/marketinfo