Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 846

 
Pokrov:

J'ai GetLastError après les fonctions et si une erreur se produit, ne va-t-on pas aller dans ce bloc (tel qu'il est écrit) et les commandes ne seront pas exécutées ? Je comprends la chaîne, par exemple OrderSend() -> GetLastError -> bloc d'erreur Sleep(3000) RefreshRates() -> sortie du bloc et si les conditions demeurent OrderSend() est demandé à nouveau. Ou bien mon raisonnement et mes concepts sont erronés. Je comprends que vous voulez écrire la valeur de retour 1 ou 0 dans le bloc, mais mes fonctions sont simples et ne sont pas liées à des valeurs booléennes comme SignalBuy, si je comprends bien, les valeurs de retour devraient être retournées là.

Faites une boucle sur le nombre de tentatives de commerce à l'erreur. Rafraîchir l'environnement commercial. Réinitialiser la valeur de l'erreur précédente et envoyer une demande de transaction avec une vérification du résultat renvoyé. Si une erreur est renvoyée, il faut l'analyser et, en fonction du code d'erreur, soit interrompre complètement le cycle, soit effectuer les actions nécessaires pour corriger l'erreur et passer à l'itération suivante du cycle. Si l'opération de négociation a réussi, interrompre la boucle et renvoyer au programme appelant la valeur correspondant à la logique du programme pour le traitement ultérieur du résultat de la demande de négociation (soit l'indicateur de réussite de l'exécution de la fonction, soit le numéro du ticket d'ordre ouvert, etc.)
 
Pokrov:

J'ai GetLastError après les fonctions et si une erreur se produit, ne va-t-on pas aller dans ce bloc (tel qu'il est écrit) et les commandes ne seront pas exécutées ? Je comprends la chaîne, par exemple OrderSend() -> GetLastError -> bloc d'erreur Sleep(3000) RefreshRates() -> sortie du bloc et si les conditions demeurent OrderSend() est demandé à nouveau. Ou bien mon raisonnement et mes concepts sont erronés. Je comprends que vous voulez écrire la valeur de retour 1 ou 0 dans le bloc, mais mes fonctions sont simples et ne sont pas liées à des valeurs booléennes comme SignalBuy, si je comprends bien, les valeurs de retour devraient être retournées là.

J'ajouterai également que dans votre exemple, il n'y a pas de réaction après l'obtention d'une erreur. La seule différence est que nous avons vérifié ou non, sauf que nous avons décidé de dormir un peu ou de rafraîchir les données. Sortez juste à la fin de la fonction OnTick().
 
Bonjour !

J'ai besoin de conseils. Selon les conditions, la position doit être fermée et après 121 secondes, une nouvelle position doit être ouverte. Comment puis-je le faire avec Sleep(121000) ?

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
Sleep(121000);
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}
 
abeiks:
Bonne journée !

J'ai besoin de conseils. Selon les conditions, la position doit être fermée et après 121 secondes, une nouvelle position doit être ouverte. Comment puis-je le faire avec Sleep(121000) ?

Aide : OnTimer()
 
artmedia70:
OnTimer() à la rescousse
Merci ! Je n'ai jamais utilisé OnTimer() et cette partie du code se trouve dans void OnTick(). Puis-je traiter la fonction OpenPosition() avec OnTimer() ? Si vous pouvez, s'il vous plaît corriger le code comment insérer OnTimer() là correctement...
void OnTick()
{
...

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
EventSetTimer(121); 
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}

...   
}
 

Je viens de réinstaller Windows 7 et je voulais installer Mt4, le problème est que les fichiers ne se téléchargent pas, que dois-je faire ?

 
Alexei et Artem, merci pour vos commentaires et conseils d'experts !
 
abeiks:
Merci ! Je n'ai jamais utilisé OnTimer(). Cette partie du code se trouve dans void OnTick(). Serait-il donc possible de gérer la fonction OpenPosition() par OnTimer() ? Si vous pouvez, s'il vous plaît corriger le code comment insérer OnTimer() là correctement...

Le timer est démarré dans OnInit()

EventSetTimer(1); // раз в секунду

Pour commencer le compte à rebours, vous devez trouver l'heure de fermeture de la dernière position dans la minuterie et compter 121 sukunds à partir de cette heure. Pour passer le drapeau vous permettant d'ouvrir une nouvelle position, utilisez une variable globale dont la portée couvre l'ensemble du programme. Vous pouvez faire en sorte qu'il contienne initialement une valeur supérieure à 121, par exemple 122 (vous pouvez modifier le temps d'attente dans les paramètres).

Dans OnTick(), vérifiez cette variable. Si elle est supérieure à 121 et qu'il n'y a pas de position, vous ouvrez une position et, après avoir vérifié si elle a été ouverte avec succès, vous remettez la variable à zéro.

Dès que la position est fermée, la minuterie voit l'heure de fermeture de la position (elle le fait en continu une fois par seconde) et si de l'heure actuelle à l'heure de fermeture de la position il s'est écoulé moins de 121ème seconde, la minuterie commence à compter - chaque seconde la valeur variable est ajoutée de 1.

Approximativement. Là où il peut y avoir un bug - si la position n'a pas encore été fermée, son temps de fermeture est de zéro. Cela peut causer un problème de démarrage du compte à rebours. Vous pouvez réinitialiser la variable à -1, par exemple.

Oui, n'oubliez pas de détruire le timer dans OnDeinit() :

//+------------------------------------------------------------------+
   void OnDeinit(const int reason) {EventKillTimer();}
//+------------------------------------------------------------------+
 
artmedia70:

Le timer est démarré dans OnInit()

Pour lancer le compte à rebours, vous devez trouver dans la minuterie l'heure à laquelle la dernière position a été fermée et compter 121 secondes à partir de cette heure. Pour passer le drapeau permettant d'ouvrir une nouvelle position, utilisez une variable globale qui est extensible par l'ensemble du programme. Vous pouvez lui faire contenir initialement une valeur supérieure à 121, par exemple 122 (vous pouvez modifier le temps d'attente dans les paramètres).

Dans OnTick() vous vérifiez cette variable. S'il est supérieur à 121 et qu'il n'y a pas de position, ouvrez une position et, après avoir vérifié si elle a été ouverte avec succès, remettez la variable à zéro.

Dès que la position est fermée, la minuterie voit l'heure de fermeture (elle le fait en continu une fois par seconde) et si de l'heure actuelle à l'heure de fermeture de la position il s'est écoulé moins de 121ème seconde, la minuterie commence à compter - chaque seconde la valeur variable est ajoutée par 1.

Approximativement. Là où il peut y avoir un bug - si la position n'a pas encore été fermée, son temps de fermeture est de zéro. Cela peut causer un problème de démarrage du compte à rebours. Vous pouvez réinitialiser la variable à -1, par exemple.

Oui, n'oubliez pas de détruire le timer dans OnDeinit() :

Je l'ai, merci. J'espérais le faire en une seule ligne, mais je vais probablement devoir travailler un peu plus longtemps.

 
abeiks:

Je vois, merci. J'espérais le faire en une seule ligne, mais je suppose que ça va demander plus de travail.