mql5 - línea vertical después de un tiempo determinado desde la última operación - página 2

 
Vladimir Karputov:

Me gustaría aclarar el término "último comercio".

¿Es la última operación del día actual? ¿O durante los últimos N días?

La última oferta en 24 horas: no hace falta ir más atrás en la historia.

 
renatmt5:

la última transacción en 24 horas - no es necesario seguir con la historia.

Así es como funciona:

El indicador utiliza el código para crear, mover y eliminar una línea vertical de la ayudaOBJ_VLINE. (hasta ahora sólo funciona la creación de líneas en el indicador). El nombre de la línea se establece en el parámetro de entrada"Nombre de la línea vertical".

Último trato Mover Línea vertical

Lalínea vertical se crea en OnOnit():

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   VLineCreate(0,InpVLineName);
//---
   return(INIT_SUCCEEDED);
  }


Para minimizar la carga, interrogamos el historial una vez por minuto. Para ello, vamos a declarar la variableExtLastMove en la zona de variables globales de nuestro programa (en este caso, en el indicador)

//---
datetime ExtLastMove=0;                   // "0" -> D'1970.01.01 00:00';

- esta variable almacenará la hora de la última petición al historial de operaciones.


Luego en OnCalculate(), restamos el tiempo almacenadoExtLastMove del tiempo actual (tiempo de la última cotización usando cualquier símboloTimeCurrent) y si la diferencia es menor a 60 segundos, salimos.

//---
   datetime time_current=TimeCurrent();
   if(time_current-ExtLastMove<60) // 60 seconds
      return(rates_total);
   ExtLastMove=time_current;

si la diferencia es mayor, entonces registramos un nuevo tiempo enExtLastMove.


Se accede al historial de operaciones mediante LastProfitForPeriod().

Aquí se utilizan dos fechas: desde y hasta. La fecha "Hasta" se fija en el futuro (la hora actual más un día), lafecha "Desde" se obtiene restando 24 horas a la hora actual

   datetime from_date   = time_current-60*60*24;   // time one day ago
   datetime to_date     = time_current+60*60*24;   // time from the future :)
   double   last_profit = LastProfitForPeriod(from_date,to_date);

   Comment("Last profit: ",DoubleToString(last_profit,2));


Eso es todo por ahora, es mucho texto...

Archivos adjuntos:
 
Vladimir, ¡muchas gracias por tu código y sobre todo por los comentarios a sus fragmentos!
No entiendo sólo, ¿por qué necesitamos to_date igual al futuro? ¿Puede ser hasta el momento actual? Parece que no podemos determinar el resultado del acuerdo en el futuro :) ¿O necesitamos este día en el futuro para trazar la línea en el tiempo futuro?
Otra pregunta sobre el bucle.
Por lo que entiendo, cargamos un array con datos sobre tratos y hacemos un bucle a través del array desde el trato cero hasta el último trato, comparando el tiempo con el último escrito y sobrescribiendo la variable last_time, si el deal_time es posterior. ¿O tal vez sea al revés: la matriz puede buscarse desde el final? En realidad, el último elemento de la matriz será la última transacción cerrada de la que necesitamos datos?
Tal vez cometa algunos errores lógicos; por favor, no juzgue con demasiada dureza :)
 
significa for(uint i=0;i<total;i++) cambiar a for(uint i=total;i>=0;i--)
 
En general, tampoco es necesario un bucle: basta con acceder al elemento de la matriz con el número ordinal i=total
 
No entiendo por qué necesitamos que to_date sea igual a knock in the future?

Lo necesitamos así. Para obtener la garantía "desde" y hasta la hora actual.

¿O tal vez sea posible buscar en la matriz desde el final?

Si la tarea es encontrar el último trato, entonces la matriz debe recorrer y buscar precisamente la hora - por si acaso algo sucede o la lógica interna del núcleo se cambia y los tratos se reinician en diferentes momentos.

 
Vladimir Karputov:

Esta es la manera de hacerlo. Para tener la garantía de obtener "desde" y hasta la hora actual.

Si la tarea es encontrar el último trato, entonces es necesario recorrer la matriz y buscar la hora exacta - por si acaso sucede algo o la lógica interna del núcleo cambia y los tratos se descartan al azar.

Ok, lo tengo. En principio, dada la limitación del historial de 24 horas es evidente que no habrá carga significativa al recorrer los datos :)

 
renatmt5:

Bien, lo tengo. En principio, dado el límite de 24 horas de historial, está claro que no va a haber ninguna carga significativa al revisar los datos :)

Por lo tanto, el toque final es mover la línea en función del beneficio obtenido.

¿Recuerdas cuáles son las reglas de la mudanza allí?

 
Entiendo correctamente que last_time y result son las variables con las que estamos trabajando. El resultado determina en cuánto tiempo se desplazará (redibujará) la línea hacia el futuro. Entonces el bloque de código "Beneficio del periodo" debe ponerse antes del bloque "Mover la línea vertical" para mover la línea teniendo en cuenta los datos de la última operación.
¿Es correcto o estoy confundiendo algo?
 

Aquí se explica por qué el parámetro "antes" debe hacerse en el futuro:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Errores, fallos, preguntas

Renat Fatkhullin, 2016.11.04 12:43

Nunca haga TimeCurrent() como fecha de finalización, haga TimeCurrent()+86400 para asegurar que todas las operaciones de finalización sean capturadas.

TimeCurrent no es la última hora exacta, sino la "última hora conocida del servidor durante las actualizaciones", que no es 100% exacta. Sobre todo al principio.


Razón de la queja: