두 명의 Expert Advisors에서 OnTradeTransaction의 처리 시간이 최대 밀리초까지 일치함을 알 수 있습니다. 그래서 질문이 생겼습니다. "거래" 이벤트가 한 Expert Advisor의 한 OnTradeTransaction에 먼저 발생한 다음 다른 Expert Advisor의 다음 이벤트에 발생합니까, 아니면 모든 Expert Advisor의 모든 처리기에 동시에 도착합니까? 글쎄, 병렬 다중 스레드 작업이나 프로그래밍에서 호출되는 것처럼. 나는 모든 것이 순차적으로 발생한다고 확신합니다. 1 밀리 초 만에 빠르게 작동하지만 만일을 대비하여 질문했습니다.
voidOnTradeTransaction ( constMqlTradeTransaction & trans,
constMqlTradeRequest & request,
constMqlTradeResult & result)
{
// Здесь надо поставить фильтр по типу транзакции// По символу и магику// и только если всё совпало, тогда
Count+ +; Print ( "Ontrade_test = " ,Count);
}
두 명의 Expert Advisors에서 OnTradeTransaction의 처리 시간이 최대 밀리초까지 일치함을 알 수 있습니다. 그래서 질문이 생겼습니다. "거래" 이벤트가 한 Expert Advisor의 한 OnTradeTransaction에 먼저 발생한 다음 다른 Expert Advisor의 다음 이벤트에 발생합니까, 아니면 모든 Expert Advisor의 모든 처리기에 동시에 도착합니까? 글쎄, 병렬 다중 스레드 작업이나 프로그래밍에서 호출되는 것처럼. 나는 모든 것이 순차적으로 발생한다고 확신합니다. 1 밀리 초 만에 빠르게 작동하지만 만일을 대비하여 질문했습니다.
하나의 심볼(m_symbol.Name())과 하나의 매직(m_magic)에 대한 OnTradeTransaction 핸들러.
트랜잭션을 먼저 포착
TRADE_TRANSACTION_DEAL_ADD
역사에 거래를 추가합니다. 주문 실행 또는 계정 잔액 작업의 결과로 수행됩니다.
그런 다음 거래인지 확인하십시오.
DEAL_ENTRY_OUT
시장 출구
//+------------------------------------------------------------------+//| 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 )
{
}
}
}
설명할 수 없는 것 같습니다. 다음은 실제 예입니다. 코드는 다음과 같습니다.
등.
두 명의 Expert Advisors에서 OnTradeTransaction의 처리 시간이 최대 밀리초까지 일치함을 알 수 있습니다. 그래서 질문이 생겼습니다. "거래" 이벤트 가 한 Expert Advisor의 한 OnTradeTransaction에 먼저 발생한 다음 다른 Expert Advisor의 다음 이벤트에 발생합니까, 아니면 모든 Expert Advisor의 모든 처리기에 동시에 도착합니까? 글쎄, 병렬 다중 스레드 작업이나 프로그래밍에서 호출되는 것처럼. 나는 모든 것이 순차적으로 발생한다고 확신합니다. 1 밀리 초 만에 빠르게 작동하지만 만일을 대비하여 질문했습니다.
설명할 수 없는 것 같습니다. 다음은 실제 예입니다. 코드는 다음과 같습니다.
무효 OnTradeTransaction(const MqlTradeTransaction & trans,
const MqlTradeRequest(&R) 요청,
const MqlTradeResult&result)
{
카운트++;
Print("Ontrade_test = ",카운트);
}
핸들러는 두 명의 Expert Advisors에서 사용되며 1개의 거래를 할 때 두 개의 Expert Advisors에서 여러 번 처리됩니다. 코드 출력:
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 ...
등.
두 명의 Expert Advisors에서 OnTradeTransaction의 처리 시간이 최대 밀리초까지 일치함을 알 수 있습니다. 그래서 질문이 생겼습니다. "거래" 이벤트 가 한 Expert Advisor의 한 OnTradeTransaction에 먼저 발생한 다음 다른 Expert Advisor의 다음 이벤트에 발생합니까, 아니면 모든 Expert Advisor의 모든 처리기에 동시에 도착합니까? 글쎄, 병렬 다중 스레드 작업이나 프로그래밍에서 호출되는 것처럼. 나는 모든 것이 순차적으로 발생한다고 확신합니다. 1 밀리 초 만에 빠르게 작동하지만 만일을 대비하여 질문했습니다.
하나의 심볼(m_symbol.Name())과 하나의 매직(m_magic)에 대한 OnTradeTransaction 핸들러.
트랜잭션을 먼저 포착
TRADE_TRANSACTION_DEAL_ADD
역사에 거래를 추가합니다. 주문 실행 또는 계정 잔액 작업의 결과로 수행됩니다.
그런 다음 거래인지 확인하십시오.
DEAL_ENTRY_OUT
시장 출구
OnTradeTransaction 이벤트가 브로드캐스트되며 터미널에서 수행한 모든 작업이 "떨어지는" 것입니다.
각 고문은 자신의 행동을 필터링해야 합니다.
더 나아가 각 유형에서 티켓으로 필터링합니다. 주문이 비동기식으로 전송되면
먼저 요청 ID별로 티켓을 얻은 다음 티켓으로 필터링합니다.
TRADE_TRANSACTION_REQUEST 이벤트는 항상 먼저 오고 나머지는 "원하는 대로"
추가됨
이 모든 것은 여러 번 논의되었습니다.
"거래소 거래" 섹션에서 검색
감사합니다. 필요한 거래를 "기록"하는 것으로 나타났습니다.