Algo que eu não sou bom em explicar, aparentemente. Aqui está um exemplo da vida real. Aqui está o código:
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 ...
e assim por diante.
Podemos ver que o tempo de resposta da OnTradeTransaction em dois Expert Advisors coincide com milissegundos. Então, tenho uma pergunta: o evento "deal" vem primeiro para uma OnTradeTransaction em uma EA e depois para a próxima em outra EA ou, de alguma forma, chega a todos os manipuladores de todas as EA de uma só vez? Como uma operação paralela multi-tarefa ou o que quer que se chame na programação. Tenho certeza de que tudo acontece sequencialmente, é processado em apenas um milissegundo, mas eu perguntei apenas por precaução.
voidOnTradeTransaction(constMqlTradeTransaction& trans,
constMqlTradeRequest& request,
constMqlTradeResult& result)
{
// Здесь надо поставить фильтр по типу транзакции// По символу и магику// и только если всё совпало, тогда
Count++; Print("Ontrade_test = ",Count);
}
O manipulador é implementado em dois Expert Advisors para que seja executado várias vezes em dois Expert Advisors quando uma operação é realizada. O código sai:
Você pode ver que o tempo de resposta da OnTradeTransaction nos dois Expert Advisors é o mesmo em milissegundos. Então, tenho uma pergunta: o evento comercial chega primeiro a uma OnTradeTransaction em uma EA e depois a outra em outra EA ou chega de alguma forma a todos os manipuladores de todas as EA de uma só vez? Bem, é como uma operação paralela com múltiplas roscas ou o que quer que se chame na programação. Tenho certeza de que tudo acontece sequencialmente, só funciona rápido dentro de um milissegundo, mas eu perguntei por precaução.
O manipulador da OnTradeTransaction para UM símbolo (m_symbol.Name()) e um mágico (m_magic).
Apanhe a transação primeiro
TRADE_TRANSACTION_DEALDEAL_ADD
Acrescente a transação ao histórico. Isto é feito como resultado da execução de ordens ou transações de saldo de conta.
então procuramos ver se se trata de um comércio
DEAL_ENTRY_OUT
Saída do mercado
//+------------------------------------------------------------------+//| 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)
{
}
}
}
Algo que eu não sou bom em explicar, aparentemente. Aqui está um exemplo da vida real. Aqui está o código:
e assim por diante.
Podemos ver que o tempo de resposta da OnTradeTransaction em dois Expert Advisors coincide com milissegundos. Então, tenho uma pergunta: o evento "deal" vem primeiro para uma OnTradeTransaction em uma EA e depois para a próxima em outra EA ou, de alguma forma, chega a todos os manipuladores de todas as EA de uma só vez? Como uma operação paralela multi-tarefa ou o que quer que se chame na programação. Tenho certeza de que tudo acontece sequencialmente, é processado em apenas um milissegundo, mas eu perguntei apenas por precaução.
Algo que eu não sou bom em explicar, aparentemente. Aqui está um exemplo da vida real. Aqui está o código:
nulo OnTradeTransaction(const MqlTradeTransaction& trans,
const MqlTradeRequest& request,
const MqlTradeResult& result)
{
Conta +++;
Print("Ontrade_test = ",Count);
}
O manipulador é implementado em dois Expert Advisors para que seja executado várias vezes em dois Expert Advisors quando uma operação é realizada. O código sai:
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 ...
e assim por diante.
Você pode ver que o tempo de resposta da OnTradeTransaction nos dois Expert Advisors é o mesmo em milissegundos. Então, tenho uma pergunta: o evento comercial chega primeiro a uma OnTradeTransaction em uma EA e depois a outra em outra EA ou chega de alguma forma a todos os manipuladores de todas as EA de uma só vez? Bem, é como uma operação paralela com múltiplas roscas ou o que quer que se chame na programação. Tenho certeza de que tudo acontece sequencialmente, só funciona rápido dentro de um milissegundo, mas eu perguntei por precaução.
O manipulador da OnTradeTransaction para UM símbolo (m_symbol.Name()) e um mágico (m_magic).
Apanhe a transação primeiro
TRADE_TRANSACTION_DEALDEAL_ADD
Acrescente a transação ao histórico. Isto é feito como resultado da execução de ordens ou transações de saldo de conta.
então procuramos ver se se trata de um comércio
DEAL_ENTRY_OUT
Saída do mercado
O eventoOnTradeTransaction é um evento de transmissão, todas as ações que seu terminal realiza são "despejadas" lá.
É só que cada EA tem que filtrar suas próprias ações.
Então em cada tipo, filtramos por bilhete, se o pedido for enviado de forma assíncrona, então
primeiro, obtemos o bilhete através de sua identificação de pedido e depois filtramos pelo bilhete.
O eventoTRADE_TRANSACTION_REQUEST vem sempre em primeiro lugar, os outros "como eles querem".
Adicionado
Isto já foi discutido muitas vezes.
Procure-o em Exchange Trading
Obrigado, parece estar recebendo os acordos certos "anotados".