Necesito ayuda de los desarrolladores y programadores de MT4 - página 3

 
Un experto obsesionado es un mauvais ton.
 
Integer:

2. A mitad de camino de la nueva ficha. Anteriormente, la ventana de propiedades del Asesor Experto en bucle no se abría. Ahora sí, y sería bueno que ahora hubiera una reacción a los cambios de parámetros. O bien, la ventana de propiedades podría cerrarse para evitar la confusión del usuario.

¡Exactamente! Eso es lo que intento decir, pero nadie lo escucha.

El "service Desk" se negó, por lo que creo que no entendieron en absoluto la situación. Este es un extracto del mensaje de solicitud:

¿Por qué le dices a un programador lo que puede y no puede hacer? La transmisión se realizó sin errores. La ejecución se realiza sin errores. El usuario ve "A=5" en la pestaña de parámetros de entrada, y el sistema da "A=1" al Asesor Experto. Utilizar el bucle start() o while() es cuestión de gustos. El bucle no es infinito, como usted afirma. Si ha observado cuidadosamente el texto del Asesor Experto, no es while(true), sino while(!IsStopped()&&IsConnected()&&IsExpertEnabled()). En las versiones anteriores de MT4 el usuario no podía cambiar los valores de los parámetros de entrada durante la ejecución de la función Sleep(). En la nueva construcción ya no existe esa barrera. Así que, o bien devuelve la prohibición de cambiar los parámetros de entrada en esta situación, o bien se asegura de que no se cambien sólo en la pestaña"INPUTS", sino en el contador. Eso es todo.


Entero:

1. Cuando instalé el terminal MetaTrader4, en la ventana de instalación hay una invitación al foro, a este foro y no a otro.

Mis disculpas. Pero he notado que la línea entre MT4 y MT5 está desapareciendo gradualmente. Y fue a partir de mi perfil en "www.mql5.com" que solicité a "servicedesk" (espero que por primera y última vez). Rellené un formulario que te muestra claramente la posibilidad de elegir la versión del terminal - elegí "MT4".

He aquí otro extracto de una orden ya cerrada (no sé si se leen la orden después de cerrarla apresuradamente ellos mismos...) (desde luego, gracioso, pero sólo se me ocurre un proverbio de coger pulgas).

En tal caso, ¿por qué el usuario ve claramente sus nuevos valores? Mientras el EA puede funcionar en su totalidad, estos nuevos valores son una ficción, y no están disponibles para el EA. La función RefreshRates() permite al EA obtener las cotizaciones actuales en CUALQUIER ciclo. ¿Por qué no proporcionar una función similar para obtener los valores actualizados de los parámetros de entrada o añadir esta característica a la función RefreshRates() existente?

Al pulsar dos veces el botón "AutoTrading" (para apagar y encender los EAs) se rompe el ciclo, tras lo cual los nuevos valores están disponibles, pero sólo después de un tick (nueva cotización) en el SÍMBOLO GRÁFICO. Y no sabemos cuándo llegará, y el Asesor Experto no tiene prohibido procesar otros símbolos también, y el usuario no necesita esta pérdida de tiempo. Así que tenemos algo así como "Volver al futuro". Se ha lanzado una nueva MT4. Es más moderno, más rápido. Dicen que se ralentiza muy bien en la pantalla, esperando las cotizaciones de UN símbolo, mientras las cotizaciones de otros símbolos están en plena marcha. Es decir, ahora les digo a mis clientes: cambien los parámetros, pulsen dos veces el botón "Expert Advisors" para apagarlos y encenderlos, y esperen junto al mar: algún día hará "tick".

Nunca he pedido ayuda antes y espero no hacerlo en el futuro. De todos modos, tarde o temprano encontraré una forma de evitar el "gancho". Esto siempre ha sido así, desde que existe MT4 y por supuesto su"probador de estrategias", del que prefiero no hablar ahora. Pero, por supuesto, cualquier imprecisión en tiempo real es algo muy grave, sobre todo para un usuario que se juega su dinero, a veces por sumas bastante importantes. Como no he visto ninguna otra forma eficaz de evitar este fallo, he recurrido al "servicio de atención al cliente" y, para ser sincero, dudaba un poco de que se negaran a solucionarlo. Bueno...

Ya está bien de que todo tenga que hacerse "a pesar de" y no "gracias a".

 
Integer:
Wex, utiliza un temporizador, ya puedes prescindir de los bucles.

Tienes razón, por supuesto, los nuevos EAs pueden ser programados de manera muy diferente. Pero hay muchos EAs ya bien programados. Y los clientes no entienden por qué lo que han pagado deja de funcionar correctamente de repente.

Es decir, hay una tendencia muy desagradable de incompatibilidad en principio de EAs ya desarrollados (Asesores Expertos o scripts, incluso indicadores) con las nuevas builds de MT4.

Y no utilicé nada no estándar en la programación por una cuestión de principios. Mi EA se basa únicamente en las características y funciones de MQL4 BOMB. Ya estaba inundado de un montón de indicadores y EAs (en su mayoría complejos o los llamados "multidivisas"), que o bien no funcionan en absoluto en las nuevas builds de MT4, o aparentemente funcionan bien, pero aparecen situaciones como la de mi ejemplo. (En cuanto a los errores de traducción, me he dado cuenta, por ejemplo, de las variables con nombre "nuevo" -entiendo- debido a la ampliación de la lista de palabras reservadas).

 

Uno es demasiado perezoso para leer la documentación. El resto muestra que son muy inteligentes... ¡Uf!

Captura el código :)

Todavía no sé cuál es su problema.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright     "Grizzly_v :)"
#property link          "http://www.mql5.com"
//+------------------------------------------------------------------+
extern int      A1=      1;
extern int      A2=      2;
int      C1,C2;
//+------------------------------------------------------------------+
int OnInit(){
   C1=A1;
   C2=A2;
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
   Comment("");
}
//+------------------------------------------------------------------+
void OnTick(){
   string   t;

   t=TimeToStr(TimeCurrent(),TIME_MINUTES|TIME_SECONDS);
   Comment(t+"\nA1="+A1+"   A2="+A2+"\nC1="+C1+"   C2="+C2);
}
//+------------------------------------------------------------------+
 
grizzly_v:

Uno es demasiado perezoso para leer la documentación. El resto muestra que son muy inteligentes... ¡Uf!

Captura el código :)

Todavía no sé cuál es su problema.

El problema es que el Asesor Experto está en bucle, por lo que el evento OnTick no se produce en él y no ve los parámetros cambiados.
 

Bueno, eso es todo entonces. El mismo ciclo sólo a través de las nuevas funciones.

  extern int      A1=      1;
  extern int      A2=      2;
         int      C1,C2;
//+------------------------------------------------------------------+
int OnInit(){
   C1=A1;
   C2=A2;
   EventSetMillisecondTimer(100);
   return(0);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer(){
   string   t;
   RefreshRates();
   t=TimeToStr(TimeCurrent(),TIME_MINUTES|TIME_SECONDS);
   Comment(t+"\nA1="+A1+"   A2="+A2+"\nC1="+C1+"   C2="+C2);
}
//+------------------------------------------------------------------+
 
stringo:

1. Echa un vistazo al perfil de Wex. Se trata de un desarrollador profesional de MQL4. Haciendo el tonto. O de trolling. No sé por qué.

2. Tenemos que pensar en esto. No se puede interrumpir forzosamente el bucle cuando llegan nuevos parámetros. Algo así como la función IsNewParameter que debería ser llamada por el propio programador en el bucle sin fin

1. Yo también he notado la rareza...

2. Eso estaría muy bien.

 
stringo:

1. Echa un vistazo al perfil de Wex. Se trata de un desarrollador profesional de MQL4. Haciendo el tonto. O de trolling. No está claro por qué.

2. aquí es donde tenemos que pensar. No podemos interrumpir forzosamente el bucle a la llegada de nuevos parámetros. Algo así como la función IsNewParameter que debería ser llamada por el propio programador en el bucle sin fin

Stringo.

La variable no parece entrar en un bucle tan eterno. El método init no funciona cuando se cambian los valores. Y las variables externas se pasan sólo a través de init. Las funciones OnTick y OnTimer se pueden utilizar ahora en los Asesores Expertos,

OnChartEvent. Por lo que recuerdo, la función de inicio en Expert Advisor se activaba en un nuevo tick.

Extracto de la documentación:

El programa recibe eventos sólo de la carta en la que se lanza. Todos los eventos se procesan uno a uno en el orden en que se reciben. Si ya hay un evento NewTick en la cola o si este evento está en estado de procesamiento, no se coloca un nuevo evento NewTick en la cola del programa mql4. Del mismo modo, si la cola del programa mql4 ya contiene el evento ChartEvent o dicho evento está siendo procesado, un nuevo evento de este tipo no se colocará en la cola. Los eventos de temporizador se procesan según el mismo esquema - si hay o ya hay un evento de temporizador en la cola, entonces un nuevo evento de este tipo no se pondrá en la cola.

Por lo tanto, como la función de inicio hace un bucle infinito, cuando ocurra un nuevo evento, la función no se iniciará y las variables dentro de ella no se actualizarán.

Sólo hay una salida, utilizar las nuevas características del lenguaje y no molestarse con las antiguas funciones.

События клиентского терминала - Документация на MQL4
  • docs.mql4.com
События клиентского терминала - Документация на MQL4
 
artmedia70:

1. Yo también he notado la rareza...

Y en el ojo ajeno siempre se puede ver hasta una paja. Y cuantos más troncos haya en el ojo, más pequeña será la paja que se pueda discernir.

En cualquier negocio, lo que cuenta es el resultado, no el proceso. El resultado es el siguiente: el negro se presenta como blanco -literalmente, no en sentido figurado- el sistema ejecutivo muestra al usuario otro valor en lugar de uno. Dónde se haga esto -dentro de alguna función, o fuera de ella- no importa. Un sistema multitarea en tiempo real es capaz de manejar varios procesos simultáneamente. En ese proceso, la función Sleep() se "ejecuta" la mayor parte del tiempo y no consume ningún recurso del sistema. Esto es lo clásico que se utiliza esencialmente para suspender el proceso. Todos los demás procesos pueden funcionar sin obstáculos.

- Camaradas, ¿podemos cumplir el plan en un 102%?

- ... Sí, podemos.

Razón de la queja: