Probando 'CopyTicks' - página 43

 
fxsaber:
Enfrentado a un error cuando CopyTicksRange devuelve todos los ticks solicitados correctamente, pero con LastError == ERR_HISTORY_TIMEOUT(4403).


No es un error, es una característica. A veces pasa lo mismo con CopyTicks. Todavía no he descubierto cómo usar esta "cosa".

en la descripción de la función CopyTicksRange:

ERR_HISTORY_TIMEOUT – время ожидание синхронизации тиков вышло, функция отдала всё что было.

Por supuesto, me gustaría que los desarrolladores explicaran qué significa este error cuando se recibe un tick con la función CopyTicks. Cómo manejar este error. ps: Lo llamo en un indicador

 

Por favor, indique qué datos hay que proporcionar para resolver este problema lo antes posible.

void OnStart()
{
  MqlTick Ticks[];

  Print(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, (ulong)D'2020.04.09 10:40:29' * 1000, (ulong)D'2020.04.11' * 1000)); // 8192
  Print(_LastError); // 4407

  ResetLastError();

  MqlTick Ticks2[];

  Print(CopyTicksRange(_Symbol, Ticks2, COPY_TICKS_INFO, (ulong)D'2020.04.09 10:40:30' * 1000)); // 131066
  Print(_LastError); // 0
}


Tiki no está copiando, dando un error.

Constante

Valor

Descripción

ERR_HISTORY_SMALL_BUFFER

4407

La matriz receptora es demasiado pequeña para contener todos los datos solicitados


Es imposible trabajar bien con semejantes sorpresas.


A través de la GUI (CTRL+U) los ticks se toman sin problemas.

Cadena de búsqueda: Oshibka 007.
 
fxsaber:

Por favor, indique qué datos hay que proporcionar para resolver este problema lo antes posible.

Tiki no está copiando, dando un error.

Constante

Valor

Descripción

ERR_HISTORY_SMALL_BUFFER

4407

La matriz receptora es demasiado pequeña para contener todos los datos solicitados

Probado localmente de varias maneras - hasta ahora no hay reproducción. Necesito más detalles:

1. ¿Qué versión del terminal?

2. ¿Con qué servidor está trabajando?

3. ¿En qué carácter se llama el guión?

4. ¿Si no se llama con COPY_TICKS_INFO sino con COPY_TICKS_ALL también se produce el error ERR_HISTORY_SMALL_BUFFER?

Gracias.

 
Anton:

Probado localmente de varias maneras - hasta ahora no hay reproducción. Necesita detalles:

1. ¿Qué versión del terminal?

2. ¿Con qué servidor está trabajando?

3. ¿En qué carácter se llama el guión?

4. Si no se llama con COPY_TICKS_INFO sino con COPY_TICKS_ALL ¿se producirá también el error ERR_HISTORY_SMALL_BUFFER?

Gracias.

  1. 2380.
  2. Cualquier servidor - véase el punto 3.
  3. Símbolo personalizado.
  4. La bandera no cambia el comportamiento.

ZS En el remolque es costumbre. Crear un símbolo a partir de json, importar ticks, ejecutar el script en el gráfico de este símbolo. Por favor, escriba si se ha reproducido o no.

Archivos adjuntos:
EURUSD.zip  896 kb
 
fxsaber:

Por favor, escriba si ha tocado o no.

Sí, se reprodujo en 2380.

¡Muchas gracias! Ordenar la situación.

 
fxsaber:

  1. 2380.
  2. Cualquier servidor - véase el punto 3.
  3. Símbolo personalizado.
  4. La bandera no cambia el comportamiento.

ZY El remolque es personalizado. Crear símbolo desde json, importar ticks, ejecutar el script en este gráfico de símbolos. Por favor, escriba si se reproduce o no.


Gracias de nuevo.

Sí, en el año 2380 se introdujo accidentalmente el problema y luego se solucionó rápidamente. Pero logró entrar en la compilación 2380.

Lamentablemente desde entonces las nuevas construcciones donde todos los fijos en MetaQuotes-Demo no era todavía.

Puedes volver a cualquier versión anterior o esperar a la siguiente versión en MetaQuotes-Demo.
 
Anton:
Puedes volver a cualquier versión anterior o esperar a la siguiente versión en MetaQuotes-Demo.

Gracias, por ahora la construcción anterior es de verdad. El 2380 ha hecho mucho...

 

MT5 última versión build 2361. Se adjunta un símbolo personalizado. Crear un símbolo desde json, importar ticks, ejecutar el EA en un gráfico de este símbolo.

EA

void OnTick()
{
  MqlTick Tick={0};
  if(SymbolInfoTick(_Symbol,Tick))
  {
    MqlTick OldTicks[];
    Print(CopyTicks(_Symbol,OldTicks,COPY_TICKS_ALL));
    Print(GetLastError());
    Print(CopyTicks(_Symbol,OldTicks,COPY_TICKS_ALL,(ulong)D'2020.04.06 00:00:00' * 1000));
    Print(GetLastError());
  }
  ExpertRemove();
}

Parámetros

[Tester]
Expert=test.ex5
Symbol=AUDNZD.RannForex
Period=M1
Optimization=0
Model=4
FromDate=2020.04.08
ToDate=2020.04.09
ForwardMode=0
Deposit=10000000
Currency=USD
ProfitInPips=1
Leverage=100
ExecutionMode=0
OptimizationCriterion=6
Visual=0

1. Cuenta de compensación.

1.1. Con las fechas dadas la salida es similar a la verdadera: 2000 0 2000 0.

1.2. Cuando se cambian las fechas a 07.04.2020-08.04.2020 la salida se vuelve extraña: -1 4004 1 0.

En primer lugar, ¿por qué aparece el error en el primer caso? En segundo lugar, ¿por qué en el segundo caso sólo se necesita 1 tick? La fecha de la solicitud de la garrapata no ha cambiado.

2. Cuenta de cobertura.

2.1. Con las fechas dadas la salida se vuelve extraña: 2000 0 1 0.

¿Por qué en el segundo caso sólo se necesita 1 tick? La fecha de la solicitud de la garrapata no ha cambiado.

2.2. Cuando las fechas cambian a 07.04.2020-08.04.2020 la salida dejará de ser extraña, pero igual: 2000 0 1 0.


De ahí las preguntas: ¿por qué CopyTicks con parámetros fijos depende no sólo de las fechas de prueba, sino también del tipo de cuenta? ¿O no entiendo algo y estoy haciendo algo mal?

Esto dificulta mucho el trabajo, por favor corrija si es posible. ¿Has conseguido reproducirlo? ¿Necesitas algo más para reproducirlo? Gracias.

Archivos adjuntos:
AUDNZD.zip  2448 kb
 
traveller00:

De ahí las preguntas: ¿por qué CopyTicks con parámetros fijos depende no sólo de las fechas de prueba, sino también del tipo de cuenta? ¿O es que he entendido algo mal y estoy haciendo algo mal?

Dependencia del tipo de cuenta: a grandes rasgos, puede imaginarse las razones. Yo no diría que es correcto. Símbolos de intercambio con la última historia - los desarrolladores tienen que pensar bien una vez allí, qué hacer con ellos en la cobertura, etc.

Yo mismo no utilizo CopyTicks en Tester. Las primeras 24 horas no son importantes. Si realmente necesita señales de trading claras, entonces no opere el primer día.

 
traveller00:

MT5 última versión build 2361. Se adjunta un símbolo personalizado. Crear un símbolo desde json, importar ticks, ejecutar el EA en un gráfico de este símbolo.

EA

Parámetros

1. Cuenta de compensación.

1.1. Con las fechas dadas la salida es similar a la verdadera: 2000 0 2000 0.

1.2. Cuando se cambian las fechas a 07.04.2020-08.04.2020 la salida se vuelve extraña: -1 4004 1 0.

En primer lugar, ¿por qué aparece el error en el primer caso? En segundo lugar, ¿por qué en el segundo caso sólo se necesita 1 tick? La fecha de la solicitud de la garrapata no ha cambiado.

2. Cuenta de cobertura.

2.1. Con las fechas dadas la salida se vuelve extraña: 2000 0 1 0.

¿Por qué en el segundo caso sólo se necesita 1 tick? La fecha de la solicitud de la garrapata no ha cambiado.

2.2. Cuando las fechas cambian a 07.04.2020-08.04.2020 la salida dejará de ser extraña, pero igual: 2000 0 1 0.


De ahí las preguntas: ¿por qué CopyTicks con parámetros fijos depende no sólo de las fechas de prueba, sino también del tipo de cuenta? ¿O no entiendo algo y estoy haciendo algo mal?

Esto dificulta mucho el trabajo, por favor corrija si es posible. ¿Has conseguido reproducirlo? ¿Necesitas algo más para reproducirlo? Gracias.

La primera carrera. Mirando los registros de los probadores.

2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: symbol to be synchronized
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: symbol synchronized, 3720 bytes of symbol info received
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: load 23 Kb of history data to synchronize in 0:00:00.009
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: history synchronized from 2020.04.06 to 2020.04.08
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: ticks synchronization started
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: load 567 Kb of tick data to synchronize in 0:00:00.031
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex: history ticks synchronized from 2020.04.08 to 2020.04.08
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex,M1: history cache allocated for 3897 bars and contains 2868 bars from 2020.04.06 00:05 to 2020.04.07 23:59
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex,M1: history begins from 2020.04.06 00:05
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex,M1 (MetaQuotes-Demo): generating based on real ticks
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex,M1: testing of Experts\test.ex5 from 2020.04.08 00:00 to 2020.04.09 00:00 started
2020.04.21 10:53:10.573 Core 01 AUDNZD.RannForex : real ticks begin from 2020.04.08 00:00:00
2020.04.21 10:53:10.573 Core 01 2020.04.08 00:01:11   -1
2020.04.21 10:53:10.573 Core 01 2020.04.08 00:01:11   4004
2020.04.21 10:53:10.573 Core 01 2020.04.08 00:01:11   1
2020.04.21 10:53:10.573 Core 01 2020.04.08 00:01:11   0
2020.04.21 10:53:10.573 Core 01 2020.04.08 00:01:11   ExpertRemove() function called
2020.04.21 10:53:10.573 Core 01 removed itself within OnTick

El probador sincronizó las garrapatas durante un solo día, el 8 de abril. Es decir, no hay garrapatas antes del 8 de abril.

Al principio nos encontramos con el error 4004 (no hay suficiente memoria para los ticks solicitados). Este es un mensaje inválido, lo investigaremos. Parece ser porque la solicitud con parámetros por defecto está en el límite de los ticks existentes

La siguiente consulta le dio, con toda razón, 1 punto. Porque desde el 2020.04.06 00:00:00 hasta el probador actual, cuando llegó el primer tick, sólo existe un tick.

Vamos a ajustar el EA un poco

void OnTick()
  {
   MqlTick Tick= {0};
   if(SymbolInfoTick(_Symbol,Tick))
     {
      MqlTick OldTicks[];
      Print(CopyTicks(_Symbol,OldTicks,COPY_TICKS_ALL));
      if(GetLastError()!=0)
         return;
      Print(GetLastError());
      Print(CopyTicks(_Symbol,OldTicks,COPY_TICKS_ALL,(ulong)D'2020.04.06 00:00:00' * 1000));
      Print(GetLastError());
     }
   ExpertRemove();
  }

y vemos, que a partir de la segunda garrapata, las garrapatas han comenzado a ser recogidas. En ambos casos son 2 ticks.

2020.04.21 11:14:13.256 Core 01 AUDNZD.RannForex : real ticks begin from 2020.04.08 00:00:00
2020.04.21 11:14:13.256 Core 01 2020.04.08 00:01:11   -1
2020.04.21 11:14:13.256 Core 01 2020.04.08 00:01:19   2
2020.04.21 11:14:13.256 Core 01 2020.04.08 00:01:19   0
2020.04.21 11:14:13.256 Core 01 2020.04.08 00:01:19   2
2020.04.21 11:14:13.256 Core 01 2020.04.08 00:01:19   0
2020.04.21 11:14:13.256 Core 01 2020.04.08 00:01:19   ExpertRemove() function called

Es decir, la suposición del error de solicitud en el límite de la garrapata ha resultado ser correcta.

Cambiemos la fecha de inicio al 7 de abril.

2020.04.21 11:18:17.775 Core 01 AUDNZD.RannForex: history ticks synchronized from 2020.04.07 to 2020.04.08
2020.04.21 11:18:17.775 Core 01 AUDNZD.RannForex,M1: history cache allocated for 3486 bars and contains 1429 bars from 2020.04.06 00:05 to 2020.04.06 23:59
2020.04.21 11:18:17.775 Core 01 AUDNZD.RannForex,M1: history begins from 2020.04.06 00:05
2020.04.21 11:18:17.775 Core 01 AUDNZD.RannForex,M1 (MetaQuotes-Demo): generating based on real ticks
2020.04.21 11:18:17.775 Core 01 AUDNZD.RannForex,M1: testing of Experts\test.ex5 from 2020.04.07 00:00 to 2020.04.09 00:00 started
2020.04.21 11:18:17.775 Core 01 AUDNZD.RannForex : real ticks begin from 2020.04.07 00:00:00
2020.04.21 11:18:17.775 Core 01 2020.04.07 00:01:28   -1
2020.04.21 11:18:17.775 Core 01 2020.04.07 00:01:28   4004
2020.04.21 11:18:17.775 Core 01 2020.04.07 00:01:28   1
2020.04.21 11:18:17.775 Core 01 2020.04.07 00:01:28   0
2020.04.21 11:18:17.775 Core 01 2020.04.07 00:01:28   ExpertRemove() function called
2020.04.21 11:18:17.775 Core 01 removed itself within OnTick

Todo es igual, excepto por el hecho de que los ticks están sincronizados para 2 días ya - la base de datos del probador contiene ticks para el 7 y el 8 de abril.

Hemos retrasado la fecha de inicio al 8 de abril. Y vemos el resultado esperado

2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex: load 47 bytes of history data to synchronize in 0:00:00.000
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex: history synchronized from 2020.04.06 to 2020.04.08
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex: ticks synchronization started
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex: load 54 bytes of tick data to synchronize in 0:00:00.000
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex: history ticks synchronized from 2020.04.07 to 2020.04.08
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex,M1: history cache allocated for 3897 bars and contains 2868 bars from 2020.04.06 00:05 to 2020.04.07 23:59
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex,M1: history begins from 2020.04.06 00:05
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex,M1 (MetaQuotes-Demo): generating based on real ticks
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex,M1: testing of Experts\test.ex5 from 2020.04.08 00:00 to 2020.04.09 00:00 started
2020.04.21 11:20:51.257 Core 01 AUDNZD.RannForex : real ticks begin from 2020.04.07 00:00:00
2020.04.21 11:20:51.257 Core 01 2020.04.08 00:01:11   2000
2020.04.21 11:20:51.257 Core 01 2020.04.08 00:01:11   0
2020.04.21 11:20:51.257 Core 01 2020.04.08 00:01:11   2000
2020.04.21 11:20:51.257 Core 01 2020.04.08 00:01:11   0
2020.04.21 11:20:51.257 Core 01 2020.04.08 00:01:11   ExpertRemove() function called
2020.04.21 11:20:51.257 Core 01 removed itself within OnTick

Porque hay más garrapatas en el probador que en la primera ejecución. Y no tiene nada que ver con las coberturas y las redes.