Errores, fallos, preguntas - página 2201

 

Esta noche decidió traducir una página del inglés -

"El sitio utiliza cookies. Más información sobre nuestra política de cookies".

Escribí el enlace en Yandex Translator y leí la traducción. Cuando accedí al sitio web de MQL5 obtuve lo siguiente:

¿Cuál es la forma correcta de traducir las páginas de otros idiomas aquí, para no tener este tipo de cosas?
 
Vladimir M.:

Esta noche decidió traducir una página del inglés -

"El sitio utiliza cookies. Más información sobre nuestra política de cookies".

Escribí el enlace en Yandex Translator y leí la traducción. Cuando accedí a la página web de MQL5 obtuve lo siguiente:

¿Cuál es la forma correcta de traducir páginas de otros idiomas para evitar esto?

De alguna manera dudo que el texto contenga caracteres especiales invisibles en combinación única para identificar a los usuarios que utilizan el copypaste.
Pero podría ser ....

 

Amigos, apelo a vuestra experiencia y os pido orientación para encontrar la solución adecuada.

Tengo un EA que a ciertos intervalos (cada pocos minutos) descarga los datos en un archivo, ejecuta un programa externo y lee los datos del archivo. El ciclo completo dura unos 600 milisegundos.

¿Cómo hacer cuando se prueba una estrategia, para que el programa espere hasta que el programa externo termine (es decir, durante este tiempo, el flujo de precios debe estar en pausa, o idealmente, saltarse los ticks durante 600 milisegundos)?

De lo contrario, ahora durante la ejecución de un programa externo vuelan varios días de ticks al probar una estrategia :-(. En el probador visual el EA funciona. Pero probar una estrategia en varios años de historia llevaría una cantidad de tiempo increíble.

 
fxsaber:

No lo entiendo en absoluto. Este es el código

De alguna manera se queja de pasar un puntero por referencia. Al mismo tiempo, la función f recibe tranquilamente el puntero por referencia.


El resultado es

El operador int fue llamado sin problemas, mientras que el operador puntero no.

Sí, hay un problema de este tipo. Se produce un error al pasar un puntero por referencia a un operador sobrecargado. Esto apareció en las últimas compilaciones, todo estaba bien antes. He enviado una solicitud al servicio de ayuda desde hace algunos meses, pero no hay respuesta o hola como de costumbre.

Esto es especialmente crítico para las matrices de punteros, ya que no hay otra forma de enviarlas, excepto por referencia:

class A
{
 public: 
  A* operator+(const A*const& array[]) { return NULL; }
};

Así que todavía estoy sentado en la construcción de 1554.

 
romachandr:

Bien como un golpe de efecto (no quiere decir que sea malo):

Experto:

1. el archivo de comandos del shell se llama

2. se espera un archivo que señale la finalización de las acciones externas

3. supresión del archivo de señales


Script del shell de comandos:

1. ejecutar un programa externo

2. creación de archivos de señales

Por lo tanto: el enlace se insertó automáticamente, no se trata de eso en absoluto.

Por cierto, ¿cómo se ejecuta un programa externo? Si a través de algún ProcessCreate() o ShelExecute(), entonces puedes dar el handle resultante a WaitForSingleObject(), pero eso es bailar con la declaración de tipo winapi.

 
pavlick_:

Bien como un golpe de efecto (no quiere decir que sea malo):

Experto:

1. se invoca un archivo de script de shell

2. se espera un archivo que señale la finalización de las acciones externas

3. se elimina el archivo de señales


Script del shell de comandos:

1. ejecutar un programa externo

2. creación de archivos de señales

Por lo tanto: el enlace se insertó automáticamente, no se trata de eso en absoluto.

Por cierto, ¿cómo se ejecuta un programa externo? Si a través de algún processCreate() o ShelExecute(), entonces puedes dar el handle resultante a WaitForSingleObject(), pero esto es un baile con la declaración de tipos winapi.

El programa externo se lanza mediante ShellExecuteW().

A la salida de la ejecución del programa se genera un archivo. De hecho, puede ser un archivo de señales.

Pero no entiendo cómo suspender el probador en este momento?

No estoy prácticamente familiarizado con winapi. Si realmente ayuda, estoy listo para profundizar.

 
romachandr:

El programa externo se inicia con ShellExecuteW().

Se genera un archivo a la salida de la ejecución del programa. En esencia, puede ser un archivo de señales.

Pero no entiendo cómo pausar el probador en este momento?

No estoy muy familiarizado con winapi. Si realmente ayuda, estoy dispuesto a profundizar.

El winapi tiene el siguiente mecanismo:

Los objetos que son descritos por el HANDLE devuelto al ser creados (hilos, procesos, mutexes, ...) tienen una bandera de señal. En el caso de un proceso, lo fijará cuando termine. WaitForSingleObject() detiene la ejecución del hilo actual (su EA) hasta que se establezca la bandera, es decir, el EA saldrá de WaitForSingleObject() después de que el programa externo termine.

ShellExecuteW() devuelve HINSTANCE en lugar de HANDLE, no estoy seguro de que funcione para la función WaitForSingleObject(), pero vale la pena intentarlo. Si falla, debe usar ShellExecuteEx, por ejemplo (pero se pasan argumentos no triviales dentro de él).

http://fkn.ktu10.com/?q=node/633

https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx

 
pavlick_:

Winapi tiene el siguiente mecanismo:

Los objetos que son descritos por el HANDLE devuelto al ser creados (hilos, procesos, mutexes, ...) tienen una bandera de señal. En el caso de un proceso, lo fijará cuando termine. WaitForSingleObject() detiene la ejecución del hilo actual (su EA) hasta que se establezca la bandera, es decir, el EA saldrá de WaitForSingleObject() después de que el programa externo termine.

ShellExecuteW() devuelve HINSTANCE en lugar de HANDLE, no estoy seguro de que funcione para la función WaitForSingleObject(), pero vale la pena intentarlo. Si falla, debe usar ShellExecuteEx, por ejemplo (pero se pasan argumentos no triviales dentro de él).

http://fkn.ktu10.com/?q=node/633

https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx

Gracias por el consejo.

Voy a investigarlo.

 
romachandr:

Pero no entiendo cómo pausar el probador en este momento?

#import "Kernel32.dll"
 void Sleep(int milliseconds);
#import


void OnTick()
{
  while(! Condition()) Kernel32::Sleep(10);
}
 
¿Qué es tan difícil? Vigilar el archivo de resultados + el sueño nativo resuelve el problema.