Duración de una operación

 

Buenas tardes. Me gustaría saber como puedo obtener la duración de una posición(en msg,segundos, o minutos....) justo cuando la cierro. Sé obtener los milisegundos desde 1/1/1970 de cuando se abre la posición, pero no de cuando se cierra. Además, la existencia de años bisiestos y meses con distinto numero de días lo complica. Estoy seguro de que debe haber alguna función o forma muy sencilla de conseguir esto, pero no la encuentro.¿Alguien puede ayudarme por favor?

Un saludo

 

Tal vez puedas usar las funciones

datetime ini = OrderOpenTime();

datetime fin = OrderCloseTime();
 
Edwin Artunduaga:

Tal vez puedas usar las funciones

Eso funciona para órdenes(por cierto me refiero a mql5, eso es de mql4) yo lo necesito para posiciones. Gracias de todas formas:)

 
Yo no comparto tu seguridad pero bueno. Si no te gusta la solución del compañero, que es trivial cambiar a posiciones, puedes contar la cantidad de barras que ha estado abierta la posición y multiplicar por su duración. Voilà!
 

Amigo  investwithalejandro, lo primero que debes entender es que una posicion es el resultado de una o mas operaciones.

entonces, para solucionar tu necesidad puedes hacer algo asi:

1. primero saber cual es el numero de posición que quieres consultar,
2. después hacer un "for" pasando por todas las operaciones cerradas ("HistoryDealsTotal()");
3. después debes identificar si esa operación es una operación de cierre o de apertura (la propiedad "DEAL_ENTRY" te ayuda con eso),
4. En  caso de que sea una operación de cierre,  extraes el "DEAL_POSITION_ID", con el que sabrás a que numero de   posición pertenece esa  operación,

5.entonces confirmas si esta posición es la misma que estas queriendo consultar(punto 1)
6. en caso de que 5 sea correcto, deberías extraer el tiempo (la hora) de ejecución de esa operación
7. debes entender que puede haber mas de una  operación de cierre, con distinta hora para la misma posición, así que lo mas lógico, es extraer el tiempo de la mas nueva, por lo que debes confirmar si esa  hora de ejecución es mas nueva que alguna que cumpliese las mismas condiciones anteriores.

y listo,  ya tienes la hora de cierre de la POSICIÓN

espero te sirva, saludos!

 
Miguel Antonio Rojas Martinez:

Amigo  investwithalejandro, lo primero que debes entender es que una posicion es el resultado de una o mas operaciones.

entonces, para solucionar tu necesidad puedes hacer algo asi:

1. primero saber cual es el numero de posición que quieres consultar,
2. después hacer un "for" pasando por todas las operaciones cerradas ("HistoryDealsTotal()");
3. después debes identificar si esa operación es una operación de cierre o de apertura (la propiedad "DEAL_ENTRY" te ayuda con eso),
4. En  caso de que sea una operación de cierre,  extraes el "DEAL_POSITION_ID", con el que sabrás a que numero de   posición pertenece esa  operación,

5.entonces confirmas si esta posición es la misma que estas queriendo consultar(punto 1)
6. en caso de que 5 sea correcto, deberías extraer el tiempo (la hora) de ejecución de esa operación
7. debes entender que puede haber mas de una  operación de cierre, con distinta hora para la misma posición, así que lo mas lógico, es extraer el tiempo de la mas nueva, por lo que debes confirmar si esa  hora de ejecución es mas nueva que alguna que cumpliese las mismas condiciones anteriores.

y listo,  ya tienes la hora de cierre de la POSICIÓN

espero te sirva, saludos!

Perfecto, gracias:)

 

Tengo un problema similar al compañero del hilo pero la solución expuesta me funciona en ocasiones, cuando la ejecuto en Deinit(), seguro estoy cometiendo algún error. 


Quiero Obtener precio de Apertura, Tiempo de Apertura y Comentario

datetime to_date = TimeCurrent();

      HistorySelect(0,to_date);


      int deals = HistoryDealsTotal();
      ulong Position = 0;


      if(deals != 0) {
         for(int i = 0; i < deals; i++) {

            DealTicket = HistoryDealGetTicket(i);
            if(DealTicket == 0) {
               continue;
            }

            if((HistoryDealGetInteger(DealTicket,DEAL_ENTRY) != DEAL_ENTRY_OUT)) {
               continue;
            }

            if(StringFind(IntegerToString(HistoryDealGetInteger(DealTicket,DEAL_MAGIC)),IntegerToString(Obj_Inst[PS].MagicNumber_Estra),0) == -1) {
               continue;
            }


            Position        = HistoryDealGetInteger(DealTicket,DEAL_POSITION_ID);
            Magic           = HistoryDealGetInteger(DealTicket,DEAL_MAGIC);
            Profit          = HistoryDealGetDouble(DealTicket,DEAL_PROFIT) + HistoryDealGetDouble(DealTicket,DEAL_SWAP) + HistoryDealGetDouble(DealTicket,DEAL_COMMISSION);
            Var_Lotes       = HistoryDealGetDouble(DealTicket,DEAL_VOLUME);
            DealTipy        = HistoryDealGetInteger(DealTicket,DEAL_TYPE);
            TiempoCierre    = HistoryDealGetInteger(DealTicket,DEAL_TIME);
            Precio_Cierre   = HistoryDealGetDouble(DealTicket,DEAL_PRICE);


            TiempoApertura  = HistoryDealGetInteger(Position,DEAL_TIME);
            Precio_Apertura = HistoryDealGetDouble(Position,DEAL_PRICE);
            Comentario      = HistoryDealGetString(Position,DEAL_COMMENT);



         }

      }
Razón de la queja: