OnTradeTransaction işlevi hakkında soru - sayfa 7

 
votor :

Açıklayamadığım bir şey. İşte gerçek bir örnek. İşte kod:

 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 ...

vb.

OnTradeTransaction'ın iki Expert Advisor'da işlem süresinin milisaniyelere kadar denk geldiği görülmektedir. Dolayısıyla soru ortaya çıktı, "anlaşma" olayı önce bir Uzman Danışmandaki bir OnTradeTransaction'a, ardından başka bir Uzman Danışmandaki bir sonrakine mi geliyor, yoksa bir şekilde tüm Uzman Danışmanlardaki tüm işleyicilere aynı anda mı geliyor? Paralel çok iş parçacıklı çalışma gibi veya programlamada çağrıldığı gibi. Her şeyin sırayla gerçekleştiğine eminim, sadece bir milisaniyede hızlı bir şekilde çalışıyor, ama her ihtimale karşı sordum.

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

Açıklayamadığım bir şey. İşte gerçek bir örnek. İşte kod:

void OnTradeTransaction(const MqlTradeTransaction ve işlem,

const MqlTradeRequest&request,

const MqlTradeResult&sonucu)

{

Say++;

Print("Ontrade_test = ",Sayı);

}

İşleyici iki Expert Advisor'da kullanılır, 1 işlem yapılırken iki Expert Advisor'da defalarca işlenir. Kod çıktıları:

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 ...

vb.

OnTradeTransaction'ın iki Expert Advisor'da işlem süresinin milisaniyelere kadar denk geldiği görülmektedir. Dolayısıyla soru ortaya çıktı, "anlaşma" olayı önce bir Uzman Danışmandaki bir OnTradeTransaction'a, ardından başka bir Uzman Danışmandaki bir sonrakine mi geliyor, yoksa bir şekilde tüm Uzman Danışmanlardaki tüm işleyicilere aynı anda mı geliyor? Paralel çok iş parçacıklı çalışma gibi veya programlamada çağrıldığı gibi. Her şeyin sırayla gerçekleştiğine eminim, sadece bir milisaniyede hızlı bir şekilde çalışıyor, ama her ihtimale karşı sordum.


BİR sembol (m_symbol.Name()) ve bir büyü (m_magic) için OnTradeTransaction işleyicisi.

Önce işlemi yakalamak

TRADE_TRANSACTION_DEAL_ADD

Tarihe bir anlaşma ekleme. Hesap bakiyesi ile emir yürütme veya işlemler sonucunda gerçekleştirilir.


o zaman bir anlaşma olup olmadığına bakın

DEAL_ENTRY_OUT

Pazar çıkışı


 //+------------------------------------------------------------------+
//| 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 olayı yayınlanır, terminaliniz tarafından gerçekleştirilen tüm işlemler orada "düşer".

Sadece her danışman kendi eylemlerini filtrelemelidir.

 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 ;
  }  
}

ayrıca her türde, sipariş eşzamansız olarak gönderilirse bilete göre filtreleriz, o zaman

önce request kimliğine göre bir bilet alıyoruz ve ardından bilete göre filtreleme yapıyoruz.

 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 olayı her zaman önce gelir, gerisi "istedikleri gibi"

Katma

Bütün bunlar defalarca tartışıldı.

"Borsa ticareti" bölümünde arama yapın

 

Teşekkürler, gerekli işlemleri "kaydetmiş" görünüyor.