Question sur la fonction OnTradeTransaction - page 2

 
Mikalas:

Oui, il est possible de ne pas utiliser OnTradeTransaction, mais il faudrait alors fouiller dans l'historique, ce qui réduirait les performances globales de l'EA.

Chaque développeur a le choix !

C'est pourquoi j'ai commencé à creuser dans cette direction...

Merci pour cette précision. Je vais continuer à creuser. Personne ne me bouscule. :))))

 
AlexeyVik:

C'est pourquoi j'ai commencé à creuser dans cette direction...

Merci pour cette précision. Je vais continuer à creuser. Personne ne me bouscule. :))))

L'exemple que j'ai donné est juste une assurance que l'événement TradeTransaction n'aura pas lieu.

En fait, j'ai eu 6 mois de travail quotidien de l'EA sur un compte réel avec 2000 transactions par jour,

Je n'ai JAMAIS eu de situation "d'urgence" !

Bonne chance !

 
C-4:
Comme si on avait tout compris et qu'on tapait des mains de joie. Désolé, mais votre code est un désordre.

Ah oui, j'ai complètement oublié, Vasiliy !

Le code est 100% fonctionnel - lancez l'EA sur la démo et voyez comment il fonctionne.

en mode normal, puis commentez la fonction OnTradeTransaction et vous aurez

vous verrez comment fonctionne le mode "urgence".

 
AlexeyVik:

Donc, si vous n'utilisez pas l'asynchronie, il n'y a pas besoin du gestionnaire OnTradeTransaction, car les hiboux attendront une réponse du serveur ?

Ne compliquez pas les choses. Il n'est pas nécessaire d'utiliser l'asynchronie pour négocier sur FORTS. Pour commencer, consultez cet article, chapitre 3 : "Les bases des opérations asynchrones". Ce n'est pas grand-chose, c'est très basique, mais c'est suffisant pour commencer à l'étudier. Le code décrit ici est 100% asynchrone, cependant, cela ne l'empêche pas de fonctionner en mode synchrone sans recevoir tous les événements OnTradeTransaction et autres.

AlexeyVik:

Mais jusqu'à présent, je n'ai pas trouvé le meilleur moyen de déterminer si un ordre stop a été activé. Par exemple, je règle le marché Achat 0.1 et SellStop 0.3, mais quand il active 0.3, il reste 0.2 et à quel moment dois-je le suivre... Il s'avère donc que nous devons suivre deux ordres à chaque tic. Et je voulais soulager les hiboux et ne surveiller que lorsque la transaction a lieu. Je ne voulais même pas contrôler, mais vérifier ce qui s'était passé et décider de ce qu'il fallait faire. Mais je suppose que ce n'est pas le cas... Peut-être vaut-il mieux revenir aux vieilles méthodes, celles qui ont fait leurs preuves...

La solution doit être basée sur votre tâche. Dans MetaTrader 5, vous n'avez qu'une seule position active à un moment donné, c'est donc à vous de la surveiller. Il n'est pas nécessaire de consulter l'historique des commandes. Si vous avez toujours besoin de l'historique des commandes, vous devez alors clarifier votre objectif.

 
Mikalas:

Ah oui, j'ai complètement oublié, Vasiliy !

Le code est 100% fonctionnel - lancez l'EA sur la démo et voyez comment il fonctionne.

en mode normal, puis commentez la fonction OnTradeTransaction et vous aurez

vous verrez comment fonctionne le mode "urgence".

J'ai regardé votre code de plus près. Vous rendez les choses trop compliquées. Il ne devrait pas y avoir de mode "urgence". Que vous utilisiez le type de négociation synchrone ou asynchrone, vous devez vous concentrer sur l'analyse de l'environnement de négociation. L'analyse des événements de type OnTradeTransaction a un caractère auxiliaire.

Mikalas:

Oui, vous pouvez choisir de ne pas utiliser OnTradeTransaction mais dans ce cas, vous devrez consulter l'historique, ce qui réduira considérablement les performances globales d'un EA.

Chaque développeur a le choix !

Ce n'est pas vrai. L'analyse de l'historique ne diminue pas les performances de l'EA. Au lieu de votre long CheckOrder(), il suffit d'écrire quelque chose comme ceci (code réel de travail) :

///
/// Отслеживает поступление новых трейдов в истории трейдов.
///
void TrackingHistoryDeals()
{
    int total = HistoryDealsTotal();
    //Перебираем все доступные трейды и формируем на их основе прототипы будущих позиций типа COrder
    for(; dealsCountNow < HistoryDealsTotal(); dealsCountNow++)
    {  
        ulong ticket = HistoryDealGetTicket(dealsCountNow);
        AddNewDeal(ticket);
        graphRebuild = true;
    }
}

C'est tout. L'arrivée de nouvelles transactions sera automatiquement détectée par la fonction TrackingHistoryDeals(), qui sera à son tour appelée par la minuterie du système. Cette fonction doit également être appelée dans OnTradeTransaction(), par exemple à l'occurrence de l'événement TRADE_TRANSACTION_DEAL_ADD, afin de gagner en rapidité et de ne pas dépendre de l'autorisation du timer défini. Si cet événement est perdu, le conseiller expert découvre les changements un peu plus tard (dans mon cas, c'est 200 ms), attend le prochain appel de la minuterie et obtient des informations sur le déclenchement de l'ordre.

 
C-4:

J'ai regardé votre code de plus près. Vous compliquez les choses. Il ne devrait pas y avoir de mode "crash". Que vous utilisiez le type de négociation synchrone ou asynchrone, vous devez vous concentrer sur l'analyse de l'environnement de négociation. L'analyse d'événements tels que OnTradeTransaction est de nature auxiliaire.

Ce n'est pas vrai. L'analyse de l'historique ne réduit pas les performances du conseiller expert. Au lieu de votre long CheckOrder(), il vous suffit d'écrire quelque chose comme ceci (code de travail réel) :

C'est tout. L'arrivée de nouvelles transactions sera automatiquement détectée par la fonction TrackingHistoryDeals(), qui sera à son tour appelée par la minuterie du système. Cette fonction doit également être appelée dans OnTradeTransaction(), par exemple à l'occurrence de l'événement TRADE_TRANSACTION_DEAL_ADD, afin de gagner en rapidité et de ne pas dépendre de l'autorisation du timer défini. Si l'événement est perdu, le conseiller expert découvre les changements un peu plus tard (dans mon cas, c'est 200 ms), attend le prochain appel du minuteur et obtient des informations sur le déclenchement de l'ordre.

Nous parlons des langues différentes.

Vous avez votre opinion, et moi, si vous me le permettez, j'aurai la mienne.

Tu ne vois même pas les choses évidentes :

Lorsque l'événement TradeTransaction arrive, vous n'avez pas besoin de vérifier quoi que ce soit - TOUTES les données existent déjà !

La fonction CheckOrder() ne fonctionne PAS du tout si l'événement TradeTransaction est arrivé ! !!

 
Mikalas:

Nous parlons dans des "langues différentes".

Restez avec votre opinion, et moi, avec votre permission, je resterai avec la mienne.

Non, nous parlons la même langue - MQL5 et son dialecte asynchrone OrderSendAsync. Quelle que soit la façon dont on l'envisage, les tâches d'Async doivent être résolues de la même manière. Jetez un coup d'œil à monarticle ci-dessus. Code asynchrone - interaction synchrone avec des experts externes. Essentiellement une manifestation non triviale du polymorphisme. Tout cela est dû au fait que l'accent est mis dans ce code sur l'analyse des changements de l'environnement commercial. Cela prouve une fois de plus que le modèle événementiel est utile mais de caractère secondaire, dont on peut se passer même dans les opérations asynchrones.
 
C-4:
Non, nous parlons la même langue - MQL5 et son dialecte asynchrone OrderSendAsync. Quelle que soit la façon dont vous le voyez, vous devez résoudre les mêmes problèmes avec Async. Jetez un coup d'œil à monarticle ci-dessus. Code asynchrone - interaction synchrone avec des experts externes. Essentiellement une manifestation non triviale du polymorphisme. Tout cela grâce au fait que l'accent est mis dans ce code sur l'analyse des changements de l'environnement commercial. Cela prouve une fois de plus que le modèle événementiel est utile, mais d'importance secondaire, et que nous pouvons nous en passer même dans les opérations asynchrones.
Vasiliy, ne sois pas têtu, exécute l'exemple sur la démo - alors tu comprendras TOUT !
 
Mikalas:
Vasily, ne persistez pas, et exécutez l'exemple sur une démo - alors vous comprendrez TOUT !

Merci, je n'en ai plus envie :

2015.02.05 23:37:21.147 TestTradeTrans (AUDCAD,H1) OnTradeTransaction : Ticket d'ordre non reçu. Demande = 14

2015.02.05 23:37:20.767 TestTradeTrans (AUDCAD,H1) OnTradeTransaction : Ticket d'ordre non reçu. Demande = 13

2015.02.05 23:37:20.464 TestTradeTrans (AUDCAD,H1) OnTradeTransaction : Ticket d'ordre non reçu. Demande = 12

2015.02.05 23:37:20.105 TestTradeTrans (AUDCAD,H1) OnTradeTransaction : Ticket d'ordre non reçu. Demande = 11

2015.02.05 23:37:19.912 TestTradeTrans (AUDCAD,H1) OnTradeTransaction : Ticket d'ordre non reçu. Demande = 10

2015.02.05 23:37:19.832 TestTradeTrans (AUDCAD,H1) OnTradeTransaction : Ticket d'ordre non reçu. Demande = 9

2015.02.05 23:37:19.036 TestTradeTrans (AUDCAD,H1) OnTradeTransaction : Ticket d'ordre non reçu. Demande = 7

2015.02.05 23:37:05.723 TestTradeTrans (AUDCAD,H1) OnTradeTransaction : Ticket d'ordre non reçu. Demande = 6

2015.02.05 23:36:59.919 TestTradeTrans (AUDCAD,H1) OnTradeTransaction : Ticket d'ordre non reçu. Demande = 5

2015.02.05 23:36:59.199 TestTradeTrans (AUDCAD,H1) OnTradeTransaction : Ticket d'ordre non reçu. Demande = 4

2015.02.05 23:36:53.693 TestTradeTrans (AUDCAD,H1) OnTradeTransaction : Ticket d'ordre non reçu. Demande = 3

2015.02.05 23:36:52.689 TestTradeTrans (AUDCAD,H1) OnTradeTransaction : Ticket d'ordre non reçu. Demande = 2

2015.02.05 23:36:44.410 Experts AutoTrading est activé

2015.02.05 23:36:41.995 TestTradeTrans (AUDCAD,H1) Ordre non envoyé ! AUDCAD Return Code = AutoTrading n'est pas autorisé par le terminal client

2015.02.05 23:36:39.996 TestTradeTrans (AUDCAD,H1) Ordre non envoyé ! Code de retour AUDCAD = AutoTradeTrans n'est pas autorisé par le terminal client

2015.02.05 23:36:39.958 TestTradeTrans (AUDCAD,H1) Ordre non envoyé ! Code de retour AUDCAD = AutoTradeTrans n'est pas autorisé par le terminal client

2015.02.05 23:36:34.581 MQL5 'TestTradeTrans.mq5' a été compilé avec succès.

J'ai réussi à le désactiver, sinon il aurait inondé tout le terminal.

Z.I. Au fait, n'essayez pas d'intégrer ce code dans l'article. Cet exemple n'est en aucun cas acceptable, car il envoie un nombre incalculable d'ordres à chaque tic! !!

 
C-4:

Merci, je n'en ai plus envie :

J'ai réussi à l'éteindre, sinon les rebonds auraient inondé tout le terminal.

:)

1. EXEMPLE pour les FORTS

2. Ne pouvez-vous pas mettre des points d'ancrage ?

3. J'ai l'impression que vous lisez des messages à travers une ligne :)

Faisons comme ça.

Je te pose des questions et tu y réponds, d'accord ?

Question 1 : Comment reconnaître le ticket d'ordre (en envoyant la commande OrderSendAsync) si aucun événement TradeTransaction n'est arrivé (ou n'est pas utilisé) ?