Erreurs, bugs, questions - page 1724

 
coderex:

Tout va bien ici, le placement des ordres doit être contrôlé par OnTradeTransaction, d'ailleurs, si vous vous connectez à l'échange directement par Plaza2, la situation est la même - vous devez contrôler l'arrivée des messages concernant le placement des ordres. Dans MT4, cette fonction est synchrone, mais la même option est disponible dans MT5, seulement dans ce cas, la logique s'arrêtera jusqu'à ce que la fonction ne reçoive aucune réponse.

Si vous voulez, je peux vous envoyer la classe de contrôle, mais elle est écrite pour le placement de marché, mais bientôt je la finaliserai pour les limiteurs.

Pour contrôler la demande, vous devez vous rappeler le fait de son placement. La classe vous sera envoyée.
 
fxsaber:
Je vous demande instamment de poster quelque chose sur la kodobase ! A des fins éducatives.

Impossible pour la raison que vous avez vous-même indiquée https://www.mql5.com/ru/forum/1111/page1743#comment_2877482. Récemment je n'ai pas pu localiser l'erreur, j'ai passé beaucoup de temps à former le code source en servicedesk - à la fin rien n'est sorti à cause des nombreuses références croisées (l'une tire l'autre en progression géométrique) - j'ai envoyé .ex5

À des fins pédagogiques, je peux suggérer la tâche suivante : sans introduire de variables supplémentaires, simplifiez h() de sorte que f() soit appelé dans tous les cas une fois.

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
#endif
        {
                if ( f() )
                        g1();
                g2();
        }
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум трейдеров MQL5.community
 
A100:

Erreur de compilation

(*) En général, dans le schéma (1), on peut substituer à la place de T à la fois A->(2) et A->(3).

Pourquoi ça ? Un motif avec const ne peut pas accepter non-const - cela viole le contrat.

 
A100:

À des fins pédagogiques, je peux suggérer la tâche suivante : sans introduire de variables supplémentaires, simplifiez h() de sorte que f() soit appelée une fois dans tous les cas

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
        {
                g1();
                g2();
        }
#else
        if ( f() )
                g1();
        g2();
#endif
}
 
Stanislav Korotky:

Pourquoi ça ? Un modèle avec const ne peut pas accepter non-const - cela viole le contrat.

Le modèle n'est pas en soi (contrairement à la fonction) - sa tâche est d'effectuer une substitution (par analogie avec #define). S'il n'y a pas de contradictions à la fin du remplacement (et il n'y en a pas), le modèle a rempli sa tâche. Au moins, j'ai essayé de le compiler en C++ et le compilateur n'a donné aucune erreur ou avertissement.
 
fxsaber:
Il ne s'agit pas vraiment d'une simplification. Dans l'original MACRO+2*f+g1+g2=5 - vous avez : MACRO+2*f+2*g1+2*g2=7.
 
Sergey Diubakin:

Quelqu'un a-t-il rencontré un problème similaire ? Un "bug" dans le terminal ou le mien ?

Que retourne GetLastError()?
 
fxsaber:

MT5-OrderSend n'est PAS entièrement synchronisé - il n'y a pas de synchronisation avec l'environnement de trading. Cela signifie que les relevés historiques ne correspondent pas à la situation réelle.

Aucun temps mort n'est envisageable. Il n'existe pas de solution fiable à ce problème, car vous devez traiter les questions de synchronisation au niveau du terminal, et non au niveau du serveur.

En fait, les utilisateurs de MT5 sont confrontés à ce que les développeurs de ponts MT4 rencontrent.

Si un OrderSend est envoyé, vous devez vous RAPPELER (c'est là que réside la vulnérabilité potentielle) qu'il a été effectué. Ensuite, ignorez l'historique actuel (environnement de trading) jusqu'à ce que le message correspondant arrive dans OnTrade. Une fois qu'il est arrivé, N'OUBLIEZ PAS d'oublier.

Lorsqu'il n'y a pas de REMEMBER, vous pouvez vous fier à l'historique comme dans MT4.

MT4-OrderSend est TOTALEMENT synchronisé.
Je me demande pour quelle raison on fait cela...
J'ai cru comprendre que si vous utilisez OrderSendAsync de manière asynchrone, vous pouvez gérer à la fois OnTrade et OnTradeTransaction. Avec OrderSend, je veux avoir un comportement simple, comme dans MT4. Une fois qu'il est appelé, nous obtenons en sortie les positions ouvertes déjà modifiées et l'historique.
Il y a un point subtil. Si l'état actuel est stocké dans une variable globale et que l'attente des changements d'état prend un temps relativement long, et que le trader parvient à modifier les paramètres de l'EA, les variables globales seront réinitialisées et l'état sera écarté.
 
bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
        if ( f() )

        {
                g1();
#ifdef  MACRO
        }
#endif
                 g2();
#ifndef  MACRO
        }
#endif
}
 
A100:
Il ne s'agit pas vraiment d'une simplification. Dans la version originale MACRO+2*f+g1+g2=5 - vous avez : MACRO+2*f+2*g1+2*g2=7.
Je ne comprends pas pourquoi il n'y a pas un seul appel ? Les mêmes œufs, mais de côté, comme suggéré ci-dessuspar Sergey Dzyublik.