OnTradeTransaction 기능에 대한 질문 - 페이지 7

 
votor :

설명할 수 없는 것 같습니다. 다음은 실제 예입니다. 코드는 다음과 같습니다.

 void OnTradeTransaction ( const MqlTradeTransaction & trans,

                         const MqlTradeRequest & request,

                         const MqlTradeResult & result)

  {

      Count++;   

   Print ( "Ontrade_test = " ,Count);

 }

Обработчик стоит в двух советниках, при совершении 1 сделки он отрабатывается множество раз в двух советниках. Код выдает:

   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 밀리 초 만에 빠르게 작동하지만 만일을 대비하여 질문했습니다.

 void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
  {
   // Здесь надо поставить фильтр по типу транзакции
   // По символу и магику
   // и только если всё совпало, тогда 
      Count+ +;    
   Print ( "Ontrade_test = " ,Count);
 }
 
votor :

설명할 수 없는 것 같습니다. 다음은 실제 예입니다. 코드는 다음과 같습니다.

무효 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

시장 출구


 //+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if (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 );
        }
       else
         return ;
       if (deal_reason!=- 1 )
         DebugBreak ();
       if (deal_symbol==m_symbol.Name() && deal_magic==m_magic)
         if (deal_entry== DEAL_ENTRY_OUT )
           {

           }
     }
  }
 
Alexey Viktorov :

OnTradeTransaction 이벤트가 브로드캐스트되며 터미널에서 수행한 모든 작업이 "떨어지는" 것입니다.

각 고문은 자신의 행동을 필터링해야 합니다.

 void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result )
{  
   switch (trans.type)
  {
     case TRADE_TRANSACTION_REQUEST :
     break ;
     case TRADE_TRANSACTION_DEAL_ADD :
     break ;
     case TRADE_TRANSACTION_HISTORY_ADD :
     break ;
     case TRADE_TRANSACTION_ORDER_UPDATE :
     break ;
  }  
}

더 나아가 각 유형에서 티켓으로 필터링합니다. 주문이 비동기식으로 전송되면

먼저 요청 ID별로 티켓을 얻은 다음 티켓으로 필터링합니다.

 case TRADE_TRANSACTION_REQUEST :
   if ((my_request_id > 0 ) && (result.request_id == my_request_id))
      {
         if (result.order > 0 )
          {
            my_order_ticket = result.order;
          }
      }
break ;

TRADE_TRANSACTION_REQUEST 이벤트는 항상 먼저 오고 나머지는 "원하는 대로"

추가됨

이 모든 것은 여러 번 논의되었습니다.

"거래소 거래" 섹션에서 검색

 

감사합니다. 필요한 거래를 "기록"하는 것으로 나타났습니다.