Erreurs, bugs, questions - page 2201

 
Vladimir M.:

Ce soir, j'ai décidé de traduire une page de l'anglais -

"Le site utilise des cookies. En savoir plus sur notre politique en matière de cookies."

J'ai tapé le lien dans Yandex Translator, j'ai lu la traduction. Lorsque j'ai accédé au site Web de MQL5, j'ai obtenu ce qui suit :

Quelle est la manière correcte de traduire les pages d'autres langues pour éviter cela ?

Je doute que le texte contienne des jokers invisibles dans une combinaison unique pour identifier les utilisateurs utilisant le copier-coller.
Mais cela pourrait être....

 

Mes amis, je fais appel à votre expérience et je vous demande de me guider pour trouver la bonne solution.

J'ai un EA qui à certains intervalles (toutes les quelques minutes) décharge des données dans un fichier, exécute un programme externe et lit les données du fichier. Le cycle complet prend environ 600 millisecondes.

Comment faire, lors du test d'une stratégie, pour que le programme attende la fin du programme externe (c'est-à-dire que pendant ce temps, le flux de prix doit être mis en pause, ou idéalement, sauter des ticks pendant 600 millisecondes) ?

Sinon maintenant pendant l'exécution d'un programme externe plusieurs jours de ticks s'envolent lors du test d'une stratégie :-(. Dans le testeur visuel, l'EA fonctionne. Mais tester une stratégie sur plusieurs années d'histoire prendrait un temps fou.

 
fxsaber:

Je ne le comprends pas du tout. Voici le code

Il se plaint en quelque sorte de passer un pointeur par référence. Dans le même temps, la fonction f reçoit calmement le pointeur par référence.


Le résultat est

L'opérateur int a été appelé sans problème, alors que l'opérateur pointeur ne l'a pas été.

Oui, il y a un tel problème. Une erreur se produit lors du passage d'un pointeur par référence dans un opérateur surchargé. Cela est apparu dans les dernières constructions, tout était ok avant. J'ai envoyé une demande au help-desk depuis quelques mois déjà, mais il n'y a aucune réponse ou bonjour comme d'habitude.

Ceci est particulièrement critique pour les tableaux de pointeurs, car il n'y a pas d'autre moyen de les envoyer, sauf par référence :

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

Donc je suis toujours assis sur la construction du 1554.

 
romachandr:

Eh bien comme un travail de hache (cela ne veut pas dire qu'il est mauvais) :

Expert :

1. un fichier de script shell est invoqué

2. un dossier signalant l'achèvement des actions extérieures est attendu

3. suppression du fichier de signaux


Script de commande shell :

1. exécuter un programme externe

2. création du fichier de signaux

D'où : le lien a été inséré automatiquement, il ne s'agit pas du tout de cela.

Au fait, comment exécute-t-on un programme externe ? Si par le biais d'un ProcessCreate() ou ShelExecute(), alors vous pouvez donner le handle résultant à WaitForSingleObject(), mais c'est une question de déclaration de type winapi.

 
pavlick_:

Eh bien comme un travail de hache (cela ne veut pas dire qu'il est mauvais) :

Expert :

1. Le fichier de script du shell de commande est appelé

2. un dossier signalant l'achèvement des actions extérieures est attendu

3. suppression du fichier de signaux


Script de commande shell :

1. exécuter un programme externe

2. création du fichier de signaux

D'où : le lien a été inséré automatiquement, il ne s'agit pas du tout de cela.

Au fait, comment exécute-t-on un programme externe ? Si par le biais d'un processCreate() ou ShelExecute(), alors vous pouvez donner le handle résultant à WaitForSingleObject(), mais c'est une danse avec la déclaration de type winapi.

Le programme externe est lancé avec ShellExecuteW().

A la sortie de l'exécution du programme, un fichier est généré. En fait, il peut s'agir d'un fichier de signaux.

Mais je ne comprends pas comment suspendre le testeur à ce moment-là ?

Je ne suis pas pratiquement familier avec winapi. Si ça aide vraiment, je suis prêt à aller plus loin.

 
romachandr:

Le programme externe est lancé avec ShellExecuteW().

Un fichier est généré à la sortie de l'exécution du programme. Il peut s'agir essentiellement d'un fichier de signaux.

Mais je ne comprends pas comment mettre le testeur en pause à ce moment-là ?

Je ne suis pas vraiment familier avec Winapi. Si ça aide vraiment, je suis prêt à aller plus loin.

Le winapi a le mécanisme suivant :

Les objets décrits par le HANDLE retourné lors de la création (threads, processus, mutex, ...) ont un drapeau de signal. Dans le cas d'un processus, il le fixera lorsqu'il se terminera. WaitForSingleObject() arrête l'exécution du thread actuel (votre EA) jusqu'à ce que l'indicateur soit activé, c'est-à-dire que l'EA quittera WaitForSingleObject() après la fin du programme externe.

ShellExecuteW() retourne HINSTANCE au lieu de HANDLE, je ne suis pas sûr que cela fonctionnera pour la fonction WaitForSingleObject(), mais cela vaut la peine d'essayer. Si elle échoue, vous devez utiliser ShellExecuteEx, par exemple (mais des arguments non triviaux sont passés à l'intérieur).

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

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

 
pavlick_:

Winapi dispose du mécanisme suivant :

Les objets qui sont décrits par le HANDLE retourné lors de leur création (threads, processus, mutex, ...) ont un drapeau de signal. Dans le cas d'un processus, il le fixera lorsqu'il se terminera. WaitForSingleObject() arrête l'exécution du thread actuel (votre EA) jusqu'à ce que l'indicateur soit activé, c'est-à-dire que l'EA quittera WaitForSingleObject() après la fin du programme externe.

ShellExecuteW() retourne HINSTANCE au lieu de HANDLE, je ne suis pas sûr que cela fonctionnera pour la fonction WaitForSingleObject(), mais cela vaut la peine d'essayer. Si elle échoue, vous devez utiliser ShellExecuteEx, par exemple (mais des arguments non triviaux sont passés à l'intérieur).

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

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

Merci pour le conseil !

Je vais m'en occuper.

 
romachandr:

Mais je ne comprends pas comment mettre le testeur en pause à ce moment-là ?

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


void OnTick()
{
  while(! Condition()) Kernel32::Sleep(10);
}
 
Qu'est-ce qui est si difficile ? Gardez un œil sur le fichier de résultat + Sleep natif résout le problème.
 
Комбинатор:
Qu'est-ce qui est si difficile ? Gardez un œil sur le fichier de résultat + Sleep natif résout le problème.

Au fait, oui. Le plus facile :)))