Quelque chose que je ne suis pas doué pour expliquer, apparemment. Voici un exemple concret. Voici le code :
voidOnTradeTransaction(constMqlTradeTransaction& trans,
constMqlTradeRequest& request,
constMqlTradeResult& result)
{
Count++;
Print("Ontrade_test = ",Count);
}
Обработчик стоит в двух советниках, при совершении 1 сделки он отрабатывается множество раз в двух советниках. Код выдает:
18:31:06.495 ontrade_trans_functions (MXI-12.17,H1) Ontrade_test = 118:31:06.495 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 118:31:06.497 ontrade_trans_functions (MXI-12.17,H1) Ontrade_test = 218:31:06.497 ontrade_trans_functions2 (MXI-12.17,M5) Ontrade_test = 218:31:06.498 ontrade_trans_functions (MXI-12.17,M5) Ontrade_test = 318:31:06.498 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 318:31:06.500 ontrade_trans_functions (MXI-12.17,M5) Ontrade_test = 418:31:06.500 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 4 ...
et ainsi de suite.
Nous pouvons voir que le temps de réponse de OnTradeTransaction dans deux Expert Advisors coïncide avec des millisecondes. J'ai donc une question : l'événement "deal" arrive-t-il d'abord à un OnTradeTransaction dans un EA et ensuite au suivant dans un autre EA ou arrive-t-il d'une manière ou d'une autre à tous les handlers de tous les EA en même temps ? Eh bien, c'est comme une opération parallèle multithread ou quel que soit le nom qu'on lui donne en programmation. Je suis sûr que tout se passe de manière séquentielle, tout est simplement traité en une milliseconde, mais j'ai posé la question juste au cas où.
voidOnTradeTransaction(constMqlTradeTransaction& trans,
constMqlTradeRequest& request,
constMqlTradeResult& result)
{
// Здесь надо поставить фильтр по типу транзакции// По символу и магику// и только если всё совпало, тогда
Count++; Print("Ontrade_test = ",Count);
}
Le gestionnaire est implémenté dans deux Expert Advisors, il est donc exécuté plusieurs fois dans deux Expert Advisors lorsqu'une transaction est effectuée. Le code sort :
Vous pouvez voir que le temps de réponse de OnTradeTransaction dans les deux Expert Advisors est le même en millisecondes. J'ai donc une question : l'événement de transaction arrive-t-il d'abord à un OnTradeTransaction dans un EA et ensuite au suivant dans un autre EA ou arrive-t-il d'une manière ou d'une autre à tous les gestionnaires de tous les EA en même temps ? Eh bien, c'est comme une opération parallèle multithread ou quel que soit le nom qu'on lui donne en programmation. Je suis sûr que tout se passe de manière séquentielle, c'est juste que ça marche vite à la milliseconde près, mais j'ai posé la question juste au cas où.
Gestionnaire OnTradeTransaction pour UN symbole (m_symbol.Name()) et une magie (m_magic).
Attrapez d'abord la transaction
TRANSACTION_COMMERCIALE_ADDITIONNELLE
Ajouter la transaction à l'historique. Cela se fait à la suite de l'exécution d'un ordre ou de transactions sur le solde du compte.
puis nous regardons s'il s'agit d'une transaction.
DEAL_ENTRY_OUT
Sortie du marché
//+------------------------------------------------------------------+//| TradeTransaction function |//+------------------------------------------------------------------+voidOnTradeTransaction(constMqlTradeTransaction &trans,
constMqlTradeRequest &request,
constMqlTradeResult &result)
{
//--- get transaction type as enumeration value ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in historyif(type==TRADE_TRANSACTION_DEAL_ADD)
{
long deal_ticket =0;
long deal_order =0;
long deal_time =0;
long deal_time_msc =0;
long deal_type =-1;
long deal_entry =-1;
long deal_magic =0;
long deal_reason =-1;
long deal_position_id =0;
double deal_volume =0.0;
double deal_price =0.0;
double deal_commission =0.0;
double deal_swap =0.0;
double deal_profit =0.0;
string deal_symbol ="";
string deal_comment ="";
string deal_external_id ="";
if(HistoryDealSelect(trans.deal))
{
deal_ticket =HistoryDealGetInteger(trans.deal,DEAL_TICKET);
deal_order =HistoryDealGetInteger(trans.deal,DEAL_ORDER);
deal_time =HistoryDealGetInteger(trans.deal,DEAL_TIME);
deal_time_msc =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC);
deal_type =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
deal_entry =HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
deal_magic =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
deal_reason =HistoryDealGetInteger(trans.deal,DEAL_REASON);
deal_position_id =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);
deal_volume =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
deal_price =HistoryDealGetDouble(trans.deal,DEAL_PRICE);
deal_commission =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION);
deal_swap =HistoryDealGetDouble(trans.deal,DEAL_SWAP);
deal_profit =HistoryDealGetDouble(trans.deal,DEAL_PROFIT);
deal_symbol =HistoryDealGetString(trans.deal,DEAL_SYMBOL);
deal_comment =HistoryDealGetString(trans.deal,DEAL_COMMENT);
deal_external_id =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID);
}
elsereturn;
if(deal_reason!=-1)
DebugBreak();
if(deal_symbol==m_symbol.Name() && deal_magic==m_magic)
if(deal_entry==DEAL_ENTRY_OUT)
{
}
}
}
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
Quelque chose que je ne suis pas doué pour expliquer, apparemment. Voici un exemple concret. Voici le code :
et ainsi de suite.
Nous pouvons voir que le temps de réponse de OnTradeTransaction dans deux Expert Advisors coïncide avec des millisecondes. J'ai donc une question : l'événement "deal" arrive-t-il d'abord à un OnTradeTransaction dans un EA et ensuite au suivant dans un autre EA ou arrive-t-il d'une manière ou d'une autre à tous les handlers de tous les EA en même temps ? Eh bien, c'est comme une opération parallèle multithread ou quel que soit le nom qu'on lui donne en programmation. Je suis sûr que tout se passe de manière séquentielle, tout est simplement traité en une milliseconde, mais j'ai posé la question juste au cas où.
Quelque chose que je ne suis pas doué pour expliquer, apparemment. Voici un exemple concret. Voici le code :
void OnTradeTransaction(const MqlTradeTransaction& trans,
const MqlTradeRequest& request,
const MqlTradeResult& result)
{
Compte++ ;
Print("Ontrade_test = ",Count) ;
}
Le gestionnaire est implémenté dans deux Expert Advisors, il est donc exécuté plusieurs fois dans deux Expert Advisors lorsqu'une transaction est effectuée. Le code sort :
18:31:06.495 ontrade_trans_functions (MXI-12.17,H1) Ontrade_test = 1
18:31:06.495 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 1
18:31:06.497 ontrade_trans_functions (MXI-12.17,H1) Ontrade_test = 2
18:31:06.497 ontrade_trans_functions2 (MXI-12.17,M5) Ontrade_test = 2
18:31:06.498 ontrade_trans_functions (MXI-12.17,M5) Ontrade_test = 3
18:31:06.498 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 3
18:31:06.500 ontrade_trans_functions (MXI-12.17,M5) Ontrade_test = 4
18:31:06.500 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 4 ...
et ainsi de suite.
Vous pouvez voir que le temps de réponse de OnTradeTransaction dans les deux Expert Advisors est le même en millisecondes. J'ai donc une question : l'événement de transaction arrive-t-il d'abord à un OnTradeTransaction dans un EA et ensuite au suivant dans un autre EA ou arrive-t-il d'une manière ou d'une autre à tous les gestionnaires de tous les EA en même temps ? Eh bien, c'est comme une opération parallèle multithread ou quel que soit le nom qu'on lui donne en programmation. Je suis sûr que tout se passe de manière séquentielle, c'est juste que ça marche vite à la milliseconde près, mais j'ai posé la question juste au cas où.
Gestionnaire OnTradeTransaction pour UN symbole (m_symbol.Name()) et une magie (m_magic).
Attrapez d'abord la transaction
TRANSACTION_COMMERCIALE_ADDITIONNELLE
Ajouter la transaction à l'historique. Cela se fait à la suite de l'exécution d'un ordre ou de transactions sur le solde du compte.
puis nous regardons s'il s'agit d'une transaction.
DEAL_ENTRY_OUT
Sortie du marché
L'événementOnTradeTransaction est un événement de diffusion, toutes les actions effectuées par votre terminal y sont "déversées".
C'est juste que chaque EA doit filtrer ses propres actions.
Ensuite, dans chaque type, nous filtrons par ticket, si la commande est envoyée de manière asynchrone, alors
D'abord, nous obtenons le ticket par son ID de demande et ensuite nous filtrons par le ticket.
L'événementTRADE_TRANSACTION_REQUEST arrive toujours en premier, les autres "comme ils veulent".
Ajouté
Ce point a été discuté à de nombreuses reprises.
Consultez le site Exchange Trading
Merci, il semble que les bonnes affaires soient "écrites".