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

 
// Функция модификации ордеров Sell при локировании
void Modif_Count_Lok_Sell()
{
double   Price;

      for(int pos=0; pos < OrdersTotal(); pos++)
      {
          if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
          {
             if(OrderSymbol()== Symbol())
             {
                if(OrderType() == OP_SELL)
                {
                   if(OrderTakeProfit() > 0)
                   {
                       if(CountBuy1() > 0) // функция для пересчёта ордеров Buy
                       {
                             Price = OrderOpenPrice();
                        double     TP3 = NormalizeDouble( 0*Point, Digits);
                          if(OrderTakeProfit() > TP3)
                          {
                         
                             if(!OrderModify( OrderTicket(), OrderOpenPrice(), 0, TP3, 0, 0))
                                        Print("Ошибка модификации  ордера на продажу");
                           }             
                        }
                    }
                }
               } 
             }   
           }     
 }      

Ayuda a la comprensión. El objetivo de esta función es que si hay órdenes de venta abiertas y órdenes de compra abiertas, modificar el TP de la orden de venta. Pero la modificación sólo se produce una primera orden, y luego da error OrderModify ERROR 1

 
Snajper007 órdenes de venta abiertas y órdenes de compra abiertas, modificar el TP de la orden de venta. Pero la modificación sólo se produce en el primer pedido, y luego da error OrderModify ERROR 1

En este caso, TakeProfit simplemente se elimina

ERROR 1 - ERR_NO_RESULT No hay error, pero el resultado es desconocido

 
MakarFX #:

En este caso, el TakeProfit se elimina simplemente

ERROR 1 - ERR_NO_RESULT No hay error, pero el resultado es desconocido

¿Por qué, de los dos órdenes, se elimina en uno y no en el otro?
 
Snajper007 #:
¿Por qué de las dos órdenes se borra en una y no en la otra?

Eliminado sólo si OrderTakeProfit() > 0

es decir, la operación es al alza

 
MakarFX #:

Eliminado sólo si OrderTakeProfit() > 0

es decir, la operación es al alza

Se ha modificado el código.

// Функция модификации ордеров Sell при локировании
void Modif_Count_Lok_Sell()
{
double   Price;

      for(int pos=0; pos < OrdersTotal(); pos++)
      {
          if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
          {
             if(OrderSymbol()== Symbol())
             {
                if(OrderType() == OP_SELL)
                {
                   
                   
                       if(CountBuy1() > 0) // функция для пересчёта ордеров Buy
                       {
                             Price = OrderOpenPrice();
                        double     TP3 = NormalizeDouble( 0*Point, Digits);
                          
                         
                             if(!OrderModify( OrderTicket(), OrderOpenPrice(), 0, TP3, 0, 0))
                                        Print("Ошибка модификации  ордера на продажу");
                                       
                        }
                    
                }
               } 
             }   
           }     
 }      
Lo mismo. Hay 2 órdenes de venta con un TP medio. Cuando abrimos una orden de compra en estas dos órdenes, el TP debe ser eliminado. Pero sólo se elimina en el primer orden, y el segundo permanece con el TP promediado.
 
MakarFX #:

Eliminado sólo si OrderTakeProfit() > 0

es decir, la operación es al alza

si el OrderTakeProfit()>0, no significa que la operación esté en la posiciónmás... Sólo significa que la posición tiene un TakeProfit...

 
Snajper007 #:

Se ha modificado el código.

Lo mismo. Hay 2 órdenes de venta con un TP medio. Cuando abrimos una orden de compra en estas dos órdenes, el TP debe ser eliminado. Pero sólo se elimina en el primer orden, y el segundo permanece con el TP promediado.

Lo tienes todo mezclado.

Primero se resalta la orden

if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))

Pero entonces se llama a una función

CountBuy1()

Lo que probablemente cambie la selección... Y eso es un desastre. Separe las moscas de las chuletas y todo funcionará...

 
Nikolay Ivanov #:

Lo tienes todo mezclado...

Primero se destaca un pedido

Pero entonces se llama a la función

Lo que probablemente cambie la selección... Y entonces te haces un lío... Separe las moscas de las chuletas y todo funcionará...

Gracias. He eliminado la función y funciona bien.
 
Nikolay Ivanov #:

Si OrderTakeProfit()>0 no significa que la operación esté en negro... Sólo significa que la posición tiene un TakeProfit...

Tienes razón, me confundí con OrderProfit()
 

Ha surgido otra cuestión. Aquí está la función de cálculo del precio medio:

//Средний тейкпрофит для ордеров Sell
double SR_CENA_SELL()
{
double     sr_cena_sell = 0;
if(CountSell() > 1)
      {
   double     lot_price_Sell = 0;
   double     sum_lot_Sell_1  = 0;
         for (int pos=0; pos < OrdersTotal(); pos++)
           if( OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderMagicNumber() == MN || OrderMagicNumber() == 0)
              {
                if(OrderSymbol() == Symbol() && OrderType() == OP_SELL)
                  {
                    lot_price_Sell += NormalizeDouble(OrderOpenPrice()* OrderLots(), Digits);
                    sum_lot_Sell_1   += OrderLots();
                    sr_cena_sell = NormalizeDouble(lot_price_Sell/sum_lot_Sell_1, Digits);
                    
                  }
              }
           }
           
      }
   return(sr_cena_sell);
 }
Por alguna razón, se recalcula cada vez. Es decir, cuando se abre la segunda orden de venta, la función calcula el precio medio. Sin embargo, cuando se abre la tercera orden, esta función muestra el valor anterior y el nuevo (lo he comprobado en el diario de impresión) pero como resultado, el valor anterior permanece. ¿Qué he hecho mal?
Razón de la queja: