Errores, fallos, preguntas - página 1658

 
Alexey Volchanskiy:

Independientemente de la pregunta, llamar a cualquier función siempre es más lento que acceder a una variable de la pila, en este caso nType.

Independientemente de esta obviedad, la pregunta era sobre las funciones en línea. Es decir, ¿no se sustituye OrderType() en tiempo de compilación por algo como order.type.

Personalmente, siempre guardo en caché esasllamadas a funciones MQL, como en tu segundo caso.

Como han demostrado las mediciones, es innecesario.

 
Sergei Vladimirov:

Independientemente de esta obviedad, la pregunta era sobre las funciones en línea. Es decir, ¿no se sustituye OrderType() por algo como order.type al compilar?

Como han demostrado las mediciones, esto es innecesario.

A juzgar por la implementación interna de los arrays, el mismo ArraySize debe estar en línea. Pero yo siempre lo uso así (no lo he medido)

En lugar de

for (int i = 0; i < ArraySize(Array); i++)

Yo uso

const int Amount = ArraySize(Array);

for (int i = 0; i < Amount; i++)
En términos de rendimiento, recientemente me sorprendió este hecho

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

¿Cómo se pasa por una enumeración de forma coherente?

fxsaber, 2016.08.22 09:13

Se ha añadido estática a la matriz. Funciona casi tres veces más rápido que el interruptor. Deshazte de ese interruptor. Gracias por el consejo.
Por lo tanto, parece que es mejor no confiar en la optimización del compilador, pero siempre "ayudar" a través de las llamadas a la función más pequeña y el uso en todas partes posibles y lógicamente const y estática.
 
Sergei Vladimirov:

Independientemente de esta obviedad, la pregunta era sobre las funciones en línea. Es decir, ¿no se sustituye OrderType() por algo como order.type al compilar?

Como las mediciones mostraron, es innecesario.

Tú mismo lo escribiste:

Sergei Vladimirov2016.09.01 02:53 RU

Lo he comprobado yo mismo. El segundo código se ejecuta 4 veces más rápido. Todo está claro, la cuestión está fuera de la mesa.

 
Sergei Vladimirov:
Lo he probado yo mismo. El segundo código se ejecuta cuatro veces más rápido. Todo está claro, la pregunta está eliminada.
No midas sólo en modo de perfil/depuración. No hay ninguna línea en absoluto. Sólo debería estar la versión de lanzamiento.
 
Inv Андрей Иващенко:

¡Buenas tardes!

Señores oficiales, ¿pueden decirme por dónde empezar a coger un bicho?

Asesor experto multidivisa. Después de la primera operación, el probador se detiene.

Da un error, cuyo código no puedo encontrar.

Sí, el probador funciona bien desde la fecha de inicio 2016.05.01. Si cambio esta fecha - el probador se detiene y el error, el registro de abajo.

Ayuda, por favor.

Responderme a mí mismo:

Se trata de un error en el probador. Por el momento, es necesario añadir el mango de cualquier indicador técnico en OnInit a todos los símbolos, en los que trabaja el Asesor Experto.

 
Alexey Volchanskiy:

Tú mismo lo escribiste:

Sergei Vladimirov2016.09.01 02:53 RU

Lo he comprobado yo mismo. El segundo código se ejecuta 4 veces más rápido. Todo está claro, la cuestión está fuera de la mesa.

En el siguiente comentario escribí cifras: la ganancia con una sola operación es de 1 nanosegundo. Cuando se optimiza una estrategia por ticks en un tramo de dos años y varios miles de ejecuciones, guardar un ns puede tener sentido. Pero en el comercio real...
 
A100:

En la compilación 1398 sigue apareciendo el error 'EX5 loading failed' (aparentemente no relacionado con ese ejemplo).

En la compilación corregida 1400 el error en un caso similar se reproduce ahora como "llamada a una función virtual pura". Y sin un comentario está bien

//Script1.mq5
typedef void (*fn)();
#import "Script2.ex5"
        void g( fn );
#import
void h() /*export*/ {} //если export без комментария - нормально
void OnStart() { g( h ); }
//Script2.mq5
#property library
typedef void (*fn)();
void g( fn f ) export { f(); }
 

No se puede aplicar :: para resolver la ambigüedad


#import "Script1.ex5"
        void g();
#import "Script2.ex5"
        void g();
#import
typedef void (*fn)();
void OnStart()
{
        Script1::g(); //нормально
        Script2::g(); //нормально
        fn f = Script1::g; //Error
}
 
Inv Андрей Иващенко:

Responde a mí mismo:

Se trata de un error en el probador. Por el momento, debe añadir una manija de cualquier indicador técnico en OnInit a todos los símbolos, en los que el Asesor Experto trabaja.

Y parece que el problema se produce cuando se obtiene sólo el primer tick en una nueva barra, el probador parece "atascarse" y se retrasa 1 barra, es decir, el EA piensa que la barra no existe y en la visualización realmente no lo hace, pero después de un par de segundos la barra aparece, en el caso de la prueba en M1 el valor correcto viene en el segundo tick (si entiendo bien), espero que los desarrolladores arreglen este molesto momento lo antes posible ...

Además:

resulta que para sortear este punto ahora hay que saltarse artificialmente el primer tick de una nueva barra...

 
No se puede hacer la depuración de EA en RTS-9.16 BCS-MetaTrader5 por CTRL+F5. El probador escribe
Tester  Leverage 1:1 set error