Errores, fallos, preguntas - página 1781

 

Rendimiento inestable

  • Ruta de localización del indicador: \N - Indicadores - Prueba_i.ex5
  • Ruta de destino del Asesor Experto: \Experts\Test.ex5
  • Ruta de ubicación del script: \N - Guiones - Prueba_s.ex5

Secuencia de pasos: Conecte el script 'Test_s.ex5' varias veces al gráfico M15 (símbolo EURUSD)

Resultado:

2017.02.05 15:17:59.076 OnStart 1a vez adjunta
2017.02.05 15:18:03.293 OnStart 2ª vez adjunta
2017.02.05 15:18:07.760 OnStart 3ª vez que se une
2017.02.05 15:18:07.778 OnInit
2017.02.05 15:18:07.781 OnDeinit:1
2017.02.05 15:18:16.891 OnStart 4ª vez que se une

Los resultados de las uniones son diferentes. No se espera que sean diferentes, pero el resultado es aleatorio: la línea con OnInit\OnDeinit puede aparecer desde la 1ª vez, o desde la 10ª vez

//Test_i.mq5 //Индикатор
void OnInit()                    { Print( __FUNCTION__ ); }
void OnDeinit( const int reason ) { Print( __FUNCTION__, ":", reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }
//Test_s.mq5 //Скрипт
#import "..\\Experts\\Test.ex5"
        void OnInit();
#import
void OnStart()
{
        Print( __FUNCTION__ );
        OnInit();
}

Se adjunta el archivo de expertos (en realidad se utiliza como una biblioteca), el código aquí https://www.mql5.com/ru/forum/1111/page1801#comment_4059227

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
Archivos adjuntos:
Test.mq5  1 kb
 

No entiendo si el error es mío o del terminal

En el 5º dígito
void OnStart()
  {

double A=1.11111;
double B=1.11111;
double C=1.11111;

long CalcX=
NormalizeDouble(A,Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(B,Digits)*MathPow(10,(Digits+1)*2-1)+
NormalizeDouble(C,Digits)*MathPow(10,(Digits+1)*1-1);

Print ("CalcX=",CalcX);  
  }

Imprime CalcX=111111111111111104 valor esperado CalcX=1111111111111111

 
A100:

Orden incorrecto de las llamadas a las funciones al cambiar el periodo del gráfico

  • Ruta de ubicación de los indicadores: \NIndicators\Test_i.ex5
  • Ruta de acceso a la ubicación del experto:\NExperts\Test.ex5

Secuencia de acciones:

  1. Adjunte el Asesor Experto 'Test.ex5' al gráfico M5 (símbolo GBPUSD)
  2. Cambiar el periodo del gráfico a M15
  3. Cambiar el periodo del gráfico a M30
  4. Eliminar el Asesor Experto del gráfico

Muestra los registros. Para que puedas ver el marco temporal.

Queda por añadir aquí que la adición de un indicador al gráfico y la eliminación de un indicador del gráfico son operaciones no síncronas.

Además, cuando se cambia el marco temporal, el indicador no se descarga inmediatamente de este marco temporal. Y crea una nueva copia del indicador en el nuevo marco temporal. Veo tus impresiones en el constructor-destructor, ¿crees que el destructor se llama inmediatamente? No, se equivoca. El destructor se llama cuando el indicador se descarga, y el indicador se descarga sólo en unos segundos después de la eliminación del indicador
 
Slawa:
Muestra los registros. Así que puedes ver el momento.
Queda por añadir que añadir un indicador a un gráfico y eliminar un indicador de un gráfico son operaciones no síncronas.
Además, cuando cambie el marco temporal, el indicador no se descargará inmediatamente de este marco temporal. Y crea una nueva copia del indicador en el nuevo marco temporal. Veo tus impresiones en el constructor-destructor, ¿crees que el destructor se llama inmediatamente? No, se equivoca. El destructor se llama cuando el indicador se descarga y el indicador sólo se descarga unos segundos después de eliminar el indicador

Se supone que hay suficiente tiempo entre los pasos (cambios de periodo del gráfico)

2017.02.05 19:49:49.984 I::I->M5 #paso 1: unirse a
2017.02.05 19:49:49.984 OnInit->M5

2017.02.05 19:51:39.853 I::I->M15 #paso 2: cambio de periodo M5 ->M15
2017.02.05 19:51:39.853 OnInit->M15
2017.02.05 19:53:29.813 OnDeinit->M15:3 #paso 3: cambio de periodo M15->M30
2017.02.05 19:53:29.813 I::~I->M15
2017.02.05 19:53:29.864 I::I->M30
2017.02.05 19:53:29.864 OnInit->M30

2017.02.05 19:54:03.245 OnDeinit->M30:3 #paso 4: cambio de periodo M30->H1
2017.02.05 19:54:03.245 I::~I->M30
2017.02.05 19:54:03.286 I::I->H1
2017.02.05 19:54:03.286 OnInit->H1
2017.02.05 19:55:02.984 I::I->H4 #paso 5: cambio de periodo H1 ->H4
2017.02.02.05 19:55:02.984 OnInit->H4
2017.02.05 19:55:02.984 OnDeinit->H1:3
2017.02.05 19:55:02.984 I::~I->H1

2017.02.05 19:55:50.697 I::I->D1 #paso 6: Cambio de periodo H4 ->D1
2017.02.05 19:55:50.697 OnInit->D1
2017.02.05 19:55:50.697 OnDeinit->H4:3
2017.02.05 19:55:50.697 I::~I->H4
2017.02.05 19:56:11.122 OnDeinit->M5:1 #paso 7: borrar
2017.02.05 19:56:11.122 I::~I->M5

2017.02.05 19:56:11.122 OnDeinit->D1:1
2017.02.05 19:56:11.123 I::~I->D1

La no simultaneidad sólo afecta al diferente orden de las llamadas a las funciones dentro de un paso (como se ve en los pasos #3 y #5)

Como puede ver, se esperan todos los cambios posteriores del período del gráfico, excepto el primero (paso#2:dos líneas de salida), (similar al paso#3:cuatro líneas de salida). ¿Y por qué el primer cambio de periodo del gráfico debería ser diferente de todos los demás? ¿Cómo es mejor/peor? ¿Por qué las dos líneas de salida que faltan del paso#2 (y sólo esa) se han desplazado al paso#7 (resaltado en rojo)?

 
-Aleks-:

No entiendo si el error es mío o del terminal

Imprime CalcX=111111111111111104 valor esperado CalcX=1111111111111111

Si el número de decimales significativos en el doble es > DBL_DIG=15, las reglas normales no funcionan
 
A100:

Se supone que hay suficiente tiempo entre los pasos (cambios de periodo del gráfico)

2017.02.05 19:49:49.984 I::I->M5 #paso1: unirse a
2017.02.05 19:49:49.984 OnInit->M5

2017.02.05 19:51:39.853 I::I->M15 #paso 2: cambio de periodo M5 ->M15
2017.02.05 19:51:39.853 OnInit->M15
2017.02.05 19:53:29.813 OnDeinit->M15:3 #paso 3: cambio de periodo M15->M30
2017.02.05 19:53:29.813 I::~I->M15
2017.02.05 19:53:29.864 I::I->M30
2017.02.05 19:53:29.864 OnInit->M30

2017.02.05 19:54:03.245 OnDeinit->M30:3 #paso 4: cambio de periodo M30->H1
2017.02.05 19:54:03.245 I::~I->M30
2017.02.05 19:54:03.286 I::I->H1
2017.02.05 19:54:03.286 OnInit->H1
2017.02.05 19:55:02.984 I::I->H4 #paso 5: cambio de periodo H1 ->H4
2017.02.02.05 19:55:02.984 OnInit->H4
2017.02.05 19:55:02.984 OnDeinit->H1:3
2017.02.05 19:55:02.984 I::~I->H1

2017.02.05 19:55:50.697 I::I->D1 #paso 6: Cambio de periodo H4 ->D1
2017.02.05 19:55:50.697 OnInit->D1
2017.02.05 19:55:50.697 OnDeinit->H4:3
2017.02.05 19:55:50.697 I::~I->H4
2017.02.05 19:56:11.122 OnDeinit->M5:1 #paso 7: borrar
2017.02.05 19:56:11.122 I::~I->M5

2017.02.05 19:56:11.122 OnDeinit->D1:1
2017.02.05 19:56:11.123 I::~I->D1

La no simultaneidad sólo afecta al diferente orden de las llamadas a las funciones dentro de un paso (como se ve en los pasos #3 y #5)

Como podemos ver, todos los cambios de periodo subsiguientes del gráfico, excepto el primero (paso #2), tienen lugar como se esperaba (similar al paso #3). ¿Por qué el primer cambio de periodo debe ser diferente de todos los demás? ¿Cómo es mejor/peor?

Permítanme que intente explicarlo de nuevo

Hay algún tipo de indicador en el gráfico M5. Cuando se cambia el marco temporal de M5 a M15 se crea una segunda copia del mismo indicador. Se envía una orden a ambos indicadores: el primero a M5 Deinit, el segundo a M15 Init. Al mismo tiempo, no sabemos cuál de estos comandos se ejecutará antes que el otro - hay una carrera clásica entre los diferentes hilos.

Después de eso, el primer indicador tendrá su contador de uso disminuido. En varios segundos después de que el contador de uso se ponga a cero, el indicador se descargará del gráfico. En ese momento se llamará a los destructores de los objetos globales de este indicador
 
Slawa:
Permítanme que intente explicarlo de nuevo

Hay un indicador determinado en el gráfico M5. Cuando se cambia el marco temporal de M5 a M15 se crea una segunda copia del mismo indicador. Se envía una orden a ambos indicadores: el primero a M5 Deinit, el segundo a M15 Init. Al mismo tiempo, no sabemos cuál de estos comandos se ejecutará antes que el otro - hay una carrera clásica entre los diferentes hilos.

Después de eso, el primer indicador tendrá su contador de uso disminuido. En varios segundos después de que el contador de uso se ponga a cero, el indicador se descargará del gráfico. Los destructores de los objetos globales de este indicador serán llamados

Afirmo (y propongo comprobarlo) que cuando se cambia el timeframe de M5 a M15 no se envía el comando M5 Deinit al primer indicador (y sólo a él - en este caso M5) y no se descarga del gráfico hasta que el usuario elimina el EA

Si se excluye laestructura I en 'Test_i.ex5' (sin efecto), la salida se simplifica:


2017.02.05 20:49:06.842 OnInit->M5

2017.02.05 20:49:21.253 OnInit->M15(*) cambio de periodo M5 -> M15: el indicador M5 no está descargado
2017.02.05 20:56:40.001OnDeinit->M15:3 cambio de periodo M15 -> M30: el indicadorM15 se descarga inmediatamente
2017.02.05 20:56:40.132 OnInit->M30

Han pasado más de 5 minutos desde (*), pero el indicador M5 no está descargado

Cómo eliminar el Asesor Experto del gráfico

2017.02.05 20:57:35.176OnDeinit->M5: 1 el indicador M5 se descarga sólo después de eliminar el Asesor Experto
2017.02.05 20:57:35.177 OnDeinit->M30:1

 
Slawa:
Permítanme que intente explicarlo de nuevo

Hay un indicador determinado en el gráfico M5. Cuando se cambia el marco temporal de M5 a M15, se crea la segunda copia del mismo indicador. Se envía una orden a ambos indicadores: el primero a M5 Deinit, el segundo a M15 Init. Al mismo tiempo, no sabemos cuál de estos comandos se ejecutará antes que el otro - hay una carrera clásica entre los diferentes hilos.

Después de eso, el primer indicador tendrá su contador de uso disminuido. En varios segundos después de que el contador de uso se ponga a cero, el indicador se descargará del gráfico. En ese momento los destructores de los objetos globales de este indicador serán llamados
¿Puede explicar de qué hilos estamos hablando? ¿No funcionan todos los indicadores de un símbolo en un hilo?
 
Vladimir Gribachev:

Fallos al instalar los indicadores de Bill Williams

Puse fractales - lo hace

set AO - ADX is set

construir 1031

Error de cientos de años con el menú que no se actualiza al cambiar la estructura del directorio /MQx/Indicators :-) El fallo es tan antiguo que ya se percibe como una característica, acostúmbrate a él... la usabilidad es de mazo a mazo, pero el número pi es el que más rápido cuenta :-)
 
A100:
Si el número de decimales significativos en el doble > DBL_DIG=15, las reglas normales no funcionan

¿Cuáles funcionan?

En el archivo de ayuda dice que el valor máximo para long es9223372036854775807 - obviamente no lo alcanzo.