Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 897

 
Parece claro, supongo que sí. Gracias de nuevo.
 
Alexey Viktorov:
Puedes hacerlo.

¿Cómo?

 
Andy:

¿Cómo?

El pequeño bicho ya me lo ha contado todo.

 
Alexey Kozitsyn:

El ID de la posición no cambiará. Utilícelo para buscar transacciones.

Gracias. Tras la compensación, la función no devuelve el precio medio de las operaciones, como se pretende, sino el precio de la posición reabierta. Dónde está el error, por favor dígame.

double Aver_Pr_sell_nett()
  {
   double total_price_multiply_volume_sell   = 0.0;
   double total_volume_sell                  = 0.0;
   double net_price_sell_=0.0;
   string symb=_Symbol;
   int    total       =0;  // 

   for(int i=0; i<PositionsTotal(); i++)
     {
      ulong pt=PositionGetTicket(i);
      long ID=PositionGetInteger(POSITION_IDENTIFIER);
      if(PositionGetString(POSITION_SYMBOL)==symb && HistorySelect(PositionGetInteger(POSITION_TIME),TimeCurrent()+60))
        {
         //--- Получим количество сделок в полученном списке
         total=HistoryDealsTotal();
         //--- Пройдем по всем сделкам в полученном списке
         for(int i=0; i<total; i++)
           {
            ulong dt = HistoryDealGetTicket(i);
            long did = HistoryDealGetInteger(dt, DEAL_POSITION_ID);
            ENUM_DEAL_ENTRY in_out=HistoryDealGetInteger(dt,DEAL_ENTRY);
            if(did==pt && in_out==DEAL_ENTRY_IN)
              {
               if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  total_price_multiply_volume_sell+=PositionGetDouble(POSITION_PRICE_OPEN)*PositionGetDouble(POSITION_VOLUME);
                  total_volume_sell+=PositionGetDouble(POSITION_VOLUME);
                  if(total_price_multiply_volume_sell!=0 && total_volume_sell!=0)
                    {
                     net_price_sell_=total_price_multiply_volume_sell/total_volume_sell;
                     
                    };
                 }
              }
           }
        }
     }
//---
   return(net_price_sell_);
  }
 
Sile Si:

Gracias. Tras la compensación, la función no devuelve el precio medio de las operaciones, como se pretende, sino el precio de la posición reabierta. Dónde está el error, por favor dígame.

Si trabaja con una posición, trabaje con la posición. Si estás trabajando en un oficio, trabaja en el oficio. El acuerdo es el precio del acuerdo, no el precio de la posición.

 
Alexey Kozitsyn:

Si trabajas con una posición, trabaja con una posición. Si estás trabajando en un oficio, trabaja en el oficio. El acuerdo muestra el precio de la operación, no el precio de la posición.

¿No seleccioné las operaciones involucradas en la apertura de la posición?

 
Sile Si:

¿No seleccioné las operaciones involucradas en la apertura de la posición?

El algoritmo es sencillo: se selecciona una posición, por el ID de la posición, todas sus operaciones. Se seleccionan para trabajar sólo las operaciones que forman el volumen de la posición, es decir, se excluyen las operaciones de compensación.

Después de elegir una posición, recibe sus ofertas y, a continuación, solicita un precio para la posición. Y necesita el precio de cada transacción específica.

 
Alexey Kozitsyn:

Y necesita el precio de cada transacción específica.

Lo siento, no entiendo cómo seleccionar un comercio en lugar de una posición, muéstrame)

 
Sile Si:

Lo siento, no entiendo cómo seleccionar un comercio en lugar de una posición, muéstrame)

ulong dt = HistoryDealGetTicket(i);
 
Alexey Kozitsyn:

Bien, eso es lo que hago.

ulong dt = HistoryDealGetTicket(i);
long did = HistoryDealGetInteger(dt, DEAL_POSITION_ID);

Luego comparo el id de la transacción con el ticker de la posición, y creo que he seleccionado la transacción,

pero devuelve el precio de la posición. ¿Por qué?

Razón de la queja: