Símbolos personalizados. Errores, fallos, preguntas, sugerencias. - página 27

 
Stanislav Korotky:

Añadir ticks uno a uno (en particular de EURUSD en MQ Demo) a un nuevo símbolo personalizado vacío da el error 5310 (no inmediatamente, sino en un bucle desde una fecha arbitraria).

¿Qué pasa? ¿Cómo puedo saber qué garrapatas específicas están siendo regañadas? Poner matrices en el registro - no hay violación cronológica allí.

Intenta insertar la comprobación de las garrapatas copiando.
Tengo un indicador en los datos de tiempo real en el procesamiento de ticks, al copiar CopyClose, a veces se desencadena el error de copia.
No entiendo cuál puede ser la razón. Puede que en tu caso haya un error de copia.

Además, en CopyTicks, copias un montón de ticks Limit, y luego en el bucle while, es decir, en cada iteración copias un gran array de ticks.
Y en CustomTicksAdd se pasa el mismo número grande de ticks al array.
Intenta copiar una garrapata y pasar una garrapata.
Se está ejecutando en un bucle while.

input int Limit = 10000;
input datetime Start = D'2020.06.01';

int fillArray(ulong &_start)
{
  MqlTick array[];
  int size = CopyTicks(_Symbol, array, COPY_TICKS_ALL, _start, Limit);

  if(size <= 0) 
  {
     Print("Ошибка копирования ценовых данных "+_Symbol+" "+(string)size+" ",GetLastError());
     return(size);
  }

  if(size > 0)
  {
    _start = array[size - 1].time_msc + 1;
    if(CustomTicksAdd(symbolName, array) == -1)
    {
      Print("Error:", GetLastError());
      return(-1);
    }
  }
  return(size);
}

...
{
  ulong startMsc = (ulong)Start * 1000;
  while(fillArray(startMsc) > 0);
}
Añadido. No está relacionado con los símbolos personalizados.
Acabo de pillar en el indicador, en el tiempo real de los ticks la causa del error de copia con el periodo M5 por la función CopyClose.
La conexión a Internet se ha cortado durante unos segundos y después de la conexión ha aparecido el error de copia 4401No se ha encontrado el historial solicitado
Es extraño, el periodo M5 no ha cambiado a una nueva barra todavía, pero el error ha aparecido.
 
Roman:

Trate de insertar la comprobación de las garrapatas de la copia.
En mi indicador sobre datos en tiempo real en el procesamiento de ticks, al copiar CopyClose, a veces se produce un error de copia.
No entiendo cuál puede ser la razón. Puede que en tu caso haya un error de copia.

Además, en CopyTicks, copias un montón de ticks Limit, y luego en el bucle while, es decir, en cada iteración copias un gran array de ticks.
Y en CustomTicksAdd se pasa el mismo número grande de ticks al array.
Intenta copiar una garrapata, y pasar una garrapata.

No hay errores de copia, el código obtiene un valor normal del número de ticks copiados (tamaño), el array se llena con datos normales todo el tiempo. El límite se puede cambiar, pero se produce un error en cualquier valor significativo de uno a varios miles. Copiar todos los ticks a la vez (como en algunos códigos) es obviamente incorrecto porque puede causar un error de asignación de memoria y bloquear el hilo durante mucho tiempo sin poder mostrar el progreso al usuario. Y copiar garrapatas en pequeñas tandas de 10 (por no hablar de 1) ralentiza todo el proceso: esto es inaceptable.

La variante sugerida es óptima. Y aunque sea discutible para alguien, formalmente el código es correcto (o citar dónde me equivoco) y el comportamiento actual es un error, es decir, hay que añadir ticks sin el código 5310.

Además, sigue habiendo un problema de larga duración con la limpieza de la base de datos de garrapatas. Llamar a CustomTicksDelete(symbolName, 0, LONG_MAX); no quiere borrar todos los ticks y deja algunos (se observa no constantemente, sino de vez en cuando). Si reinicia el Asesor Experto, el símbolo personalizado se borra por completo. Como en el caso de CopyTicks - no hay errores.

 
Si quieres escribir ticks sin generar más eventos OnTick, puede ser mejor utilizar una función diferente.
 
Stanislav Korotky:

¿Tal vez hay ticks con el mismo ms en la unión de los paquetes y esto cuenta como un error?

Sólo una suposición

 
Andrey Khatimlianskii:

¿Tal vez hay ticks con el mismo ms en la unión de los paquetes y esto cuenta como un error?

Sólo una suposición.

Puedes ver en el código que hay ticks duplicados. En este caso, las banderas de los ticks pueden no corresponderse entre sí.

 
fxsaber:
Si necesitas escribir ticks sin generar más eventos OnTick, quizás sea mejor que utilices una función diferente.

Estoy de acuerdo. Lo intentaré. Pero no veo ninguna razón para que el método actual no funcione.

 
Stanislav Korotky:

No hay errores de copia, el código obtiene un valor normal del número de ticks copiados (tamaño), el array se llena con datos normales todo el tiempo. El límite se puede cambiar, pero se produce un error en cualquier valor significativo de uno a varios miles. Copiar todos los ticks a la vez (como en algunos códigos) es obviamente incorrecto porque puede causar un error de asignación de memoria y bloquear el hilo durante mucho tiempo sin poder mostrar el progreso al usuario. Y copiar garrapatas en pequeñas tandas de 10 (por no hablar de 1) ralentiza todo el proceso.

La variante sugerida es óptima. E incluso si es cuestionable para alguien, formalmente el código es correcto (o citar donde me equivoco) y el comportamiento actual es un error, es decir, las garrapatas se deben agregar sin el código 5310.

Además, sigue habiendo un problema de larga duración con la limpieza de la base de datos de garrapatas. Llamar a CustomTicksDelete(symbolName, 0, LONG_MAX); no quiere borrar todos los ticks y deja algunos (se observa no constantemente, sino de vez en cuando). Si reinicia el Asesor Experto, el símbolo personalizado se borra por completo. Como en el caso de CopyTicks - no hay errores.

ERR_CUSTOM_TICKS_WRONG_ORDER

5310

Conjuntode ticksno ordenados por tiempo


Es posible que no tenga tiempo de borrar los ticks en grandes lotes, porque está sobrescribiendo los ya existentes en la siguiente iteración.
Es decir, se superponen unas a otras en forma de matriz, mientras vuela sin demora, por lo que la memoria no tiene tiempo de despejarse cuando llega otro paquete.
Por eso sugerí añadir una garrapata a la vez, copié una garrapata a la vez, sin problemas.

En cuanto a la limpieza de la base de datos de ticks, no me gusta la constante LONG_MAX en este caso.
La ayuda de la función CustomTicksDelete dice, Tiempo del último tick en el historial de precios del rango especificado a ser borrado. El tiempo en milisegundos desde el 01.01.1970.
Y LONG_MAX es mucho mayor que este valor. Es decir, se pasa un valor mayor, para el que este parámetro no está diseñado.
Intente utilizar el número correspondiente al dígito de los milisegundos, es decir, 13 valores.

 
fxsaber:

Puedes ver en el código que hay ticks duplicados. En este caso, las banderas elementales de los ticks pueden no corresponder.

¿Los ticks duplicados en la matriz receptora son CopyTicks? ¿Cómo está claro que se trata de garrapatas duplicadas y no de las mismas garrapatas (las garrapatas no tienen identificadores únicos, después de todo)? Aunque haya duplicados, en teoría, los ticks con cortes iguales no rompen la secuencia. Por último, surge la pregunta: ¿cómo se forman los duplicados?

 
Roman:

ERR_CUSTOM_TICKS_WRONG_ORDER

5310

Conjuntode ticksno ordenados por tiempo


Es posible que los paquetes grandes de ticks no tengan tiempo de ser borrados, ya que se están sobrescribiendo los que ya se tienen en la siguiente iteración.
Es decir, se superponen unas a otras en forma de matriz, mientras vuela sin demora, aparentemente, la memoria no tiene tiempo de despejarse cuando llega otro paquete.
Por eso sugerí añadir un tick a la vez, copié un tick a la vez, no hubo problemas.

Ni una palabra sobre el borrado, nada se sobrescribe. Las iteraciones se cronometran sin solaparse. Siempre en un carácter personalizado vacío - ya sea uno nuevo, o después de la eliminación exitosa de todas las garrapatas.

 
Stanislav Korotky:

¿Ticks duplicados en la matriz receptora CopyTicks? ¿Cómo está claro que se trata de garrapatas duplicadas y no de garrapatas idénticas (las garrapatas no tienen identificadores únicos, después de todo)? Aunque haya duplicados, en teoría, los ticks con cortes iguales no rompen la secuencia. Por último, surge una pregunta: ¿cómo se forman los duplicados?

He mirado el código más de cerca. Se está saltando las garrapatas al recibir en porciones. Puede haber una situación cuando Ticks[Limit - 1].time_msc == Ticks[Limit + k], k >= 0.

En consecuencia, cuando se añade con un salto, las banderas pueden no coincidir.


Asegúrese de que todas las marcas históricas con la misma hora estén al final de la porción. Es decir, el comienzo del siguiente trozo debe tener una hora diferente. De lo contrario, habrá pérdidas incluso cuando se escriba a la medida.

Si quiere utilizar CopyTicks, lo más fácil es descartar los ticks más extremos con el tiempo más largo del paquete recibido. Y haz que _inicio sea igual a este tiempo.
Razón de la queja: