OrderSend ile MT5'te nasıl düzgün çalışılır - sayfa 11

 
prostotrader :

iki değil bir :)

if (transaction.type == TRADE_TRANSACTION_REQUEST && request.action == TRADE_ACTION_DEAL )

Bir sipariş bileti almak için OrderSendAsymc kullandığınızda TRADE_TRANSACTION_REQUEST gereklidir.

Ve orada yanlış olan ne? Nereden biliyorsun, belki OrderSendAsync() kullanıyorum?
Bunu, örneğin ticaret talebini gönderen Uzman Danışmanın damgasını kontrol etmek için kullanamaz mıyım? Veya örneğin, son işlemin yapıldığı pozisyonun biletini kontrol etmek için mi?

Son olarak, işlemin yapıldığı fiyatı kontrol etmek için bu olayı kullanabilirim (her ne kadar kabul etsem de, bu olaydaki fiyatı kontrol etmek yalnızca asenkron ticaret kullanıldığında anlamlıdır).

Yani, eşzamansız sipariş göndermeyi kullanırsam kod doğru mu?

 
Oleg Shenker :

Ve orada yanlış olan ne? Nereden biliyorsun, belki OrderSendAsync() kullanıyorum?
Bunu, örneğin ticaret talebini gönderen Uzman Danışmanın damgasını kontrol etmek için kullanamaz mıyım? Veya örneğin, son işlemin yapıldığı pozisyonun biletini kontrol etmek için mi?

Son olarak, işlemin yapıldığı fiyatı kontrol etmek için bu olayı kullanabilirim (her ne kadar kabul etsem de, bu olaydaki fiyatı kontrol etmek yalnızca asenkron ticaret kullanıldığında anlamlıdır).

Yani, eşzamansız sipariş göndermeyi kullanırsam kod doğru mu?

Konu denir

"OrderSend ile nasıl çalışılır"

Bu işlev (geliştiriciler tarafından tasarlandığı gibi) tamamen senkronize olmalıdır, yani bir sipariş gönderilmelidir ve bir bilet alındıysa,

o zaman her şey sırayla. Ancak şimdi bu işlev tam olarak doğru çalışmıyor, bu nedenle bir sipariş bileti aldıktan sonra,

OnTradeTransaction'da her şeyin yolunda olduğuna dair onay alınmalıdır.

Yani bu siparişteki veriler terminalde tamamen senkronize edilir.

//+------------------------------------------------------------------+
// Expert TradeTransaction function                                  |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   switch (trans.type)
     {
       case TRADE_TRANSACTION_ORDER_UPDATE :
           switch (trans.order_state)
           {
             case ORDER_STATE_PLACED :
               if (order_ticket==trans.order)
                 {
                   Print ( __FUNCTION__ , " Order plased done. Ticket = " ,trans.order);
                   if (order_ticket> 0 )
                    {
                     if ( OrderSelect (order_ticket))
                       {
                         //Данные по ордеру синхронизированы
                       }
                     else
                       {
                         Print ( __FUNCTION__ , " Order not select! Ticket = " ,trans.order);
                       }
                    }
                   else
                    {
                     Print ( __FUNCTION__ , " Wrong order ticket = " ,trans.order);
                    }
                 }
               break ;
           }
         break ;
     }
  }
 
prostotrader :

Konu denir

"OrderSend ile nasıl çalışılır"

Bu işlev (geliştiriciler tarafından tasarlandığı gibi) tamamen senkronize olmalıdır, yani bir sipariş gönderilmelidir ve bir bilet alındıysa,

o zaman her şey sırayla. Ancak şimdi bu işlev tam olarak doğru çalışmıyor, bu nedenle bir sipariş bileti aldıktan sonra,

OnTradeTransaction'da her şeyin yolunda olduğuna dair onay alınmalıdır.

Yani bu siparişteki veriler terminalde tamamen senkronize edilir.

//+------------------------------------------------------------------+
// Expert TradeTransaction function                                  |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   switch (trans.type)
     {
       case TRADE_TRANSACTION_ORDER_UPDATE :
           switch (trans.order_state)
           {
             case ORDER_STATE_PLACED :
               if (order_ticket==trans.order)
                 {
                   Print ( __FUNCTION__ , " Order plased done. Ticket = " ,trans.order);
                   if (order_ticket> 0 )
                    {
                     if ( OrderSelect (order_ticket))
                       {
                         //Данные по ордеру синхронизированы
                       }
                     else
                       {
                         Print ( __FUNCTION__ , " Order not select! Ticket = " ,trans.order);
                       }
                    }
                   else
                    {
                     Print ( __FUNCTION__ , " Wrong order ticket = " ,trans.order);
                    }
                 }
               break ;
           }
         break ;
     }
  }


Harika! Bunu biliyorum. Sadece ben asenkron sipariş gönderimi kullanıyorum. Başka bir problemim var, aynı işlem için REQUEST olayı (işlemin son özeti anlamında) iki kez geldi.
 
Oleg Shenker :
Harika! Bunu biliyorum. Sadece ben asenkron sipariş gönderimi kullanıyorum. Başka bir problemim var, aynı işlem için REQUEST olayı (işlemin son özeti anlamında) iki kez geldi.

OrderSEndAsync siparişleri verirken OnTradeTransaction'da mesajları nasıl işleyeceğinizi tam olarak anlamıyorsunuz

Bu Uzman Danışmanı kaydedin ve nasıl çalıştığını görün

Dosyalar:
TestOrders.mq5  25 kb
 
prostotrader :

OrderSEndAsync siparişleri verirken OnTradeTransaction'da mesajları nasıl işleyeceğinizi tam olarak anlamıyorsunuz

Bu Uzman Danışmanı kaydedin ve nasıl çalıştığını görün

Bu yüzden size TradeTransactions'ı nasıl doğru bir şekilde işleyeceğinizi soruyorum.

 
Oleg Shenker :

Bu yüzden size TradeTransactions'ı nasıl doğru bir şekilde işleyeceğinizi soruyorum.

OrderSendAsync için sipariş şudur:

OrderSendAsync komutuyla bir sipariş gönderirken, başarılı gönderimin ardından bir order_id alırsınız.

bool SendOrderAsyncMode()
  {
   double price= SymbolInfoDouble ( Symbol (), SYMBOL_SESSION_PRICE_LIMIT_MAX );
   MqlTradeRequest request={ 0 };
   MqlTradeResult   result={ 0 };
   order_ticket= 0 ;
   order_id= 0 ;
   request.action = TRADE_ACTION_PENDING ;
   request.magic  = 9876543210 ;
   request.symbol = Symbol ();
   request.volume = 1 ;
   request.price  = price;
   request.type= ORDER_TYPE_SELL_LIMIT ;
   request.comment= "Async mode" ;
   request.type_filling= ORDER_FILLING_RETURN ;
   request.type_time= ORDER_TIME_DAY ;
   if ( OrderSendAsync (request,result))
     {
       if ((result.retcode== TRADE_RETCODE_PLACED ) || (result.retcode== TRADE_RETCODE_DONE ))
        {
         if (result.request_id> 0 )
           {
            order_id=result.request_id;
             Print ( __FUNCTION__ , " Order sent in async mode" );
             return ( true );
           }
         else
           {
             Print ( __FUNCTION__ , " Error order sent in async mode! Retcode = " ,result.retcode);
           }
        }
       else
        {
         Print ( __FUNCTION__ , " Error order sent in async mode! Retcode = " ,result.retcode);
        }
     }
   else
     {
       Print ( __FUNCTION__ , " Order not sent in async mode." );
     }
   return ( false );
  }

Ayrıca , TÜM diğer veriler OnTradeTransaction'da alınır

1. Bir sipariş bileti alma

void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   switch (trans.type)
     {
       case TRADE_TRANSACTION_REQUEST :
         if ((order_id> 0 ) && (order_id==result.request_id))
           {
            order_id= 0 ;
            order_ticket=result.order;
             Print ( __FUNCTION__ , " Order get ticket done. Ticket = " ,result.order);
           }
         break ;
     }
}

2. Piyasa veya limit (beklemede olmayan) emir kullanıyorsanız, yani hemen gerçekleştirilenler

veya reddedilirse, TRADE_TRANSACTION_HISTORY_ADD'yi izlemeniz gerekir, çünkü her durumda

bu tür siparişler tarihe eklenir.

void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   switch (trans.type)
     {
       case TRADE_TRANSACTION_HISTORY_ADD :
         if (order_ticket==trans.order)
           {
             //Берем данные из истории
           }
         break ;
    }
  }


3. Bekleyen emirler kullanıyorsanız (parçalar halinde yürütülebilirler), o zaman izlemelisiniz

üç olayı durdurun TRADE_TRANSACTION_ORDER_UPDATE, TRADE_TRANSACTION_HISTORY_ADD, TRADE_TRANSACTION_DEAL_ADD

TRADE_TRANSACTION_ORDER_UPDATE - bir siparişin verildiği (değiştirildiği) bilgisini almak için kullanılır

TRADE_TRANSACTION_DEAL_ADD - bir anlaşmanın yapıldığını öğrenin

TRADE_TRANSACTION_HISTORY_ADD - İşlem sisteminde emir YOK, emir verilerine bakın

Hepsi "bilgelik"

Katma

OrderSendAsync ve OnTradeTransaction kombinasyonu kusursuz çalışıyor , FOREX'te de kontrol ettim (demo)

ve FORTS (gerçek)

 
prostotrader :

Katma

OrderSendAsync ve OnTradeTransaction kombinasyonu kusursuz çalışıyor , FOREX'te de kontrol ettim (demo)

ve FORTS (gerçek)

Teşekkür ederim! Artık OnTradeTransaction() işlevini nasıl kullanacağımı biliyorum veya başka sırlar var mı?

TradeTransaction() olayının kaybolması nasıl sorun olmaz?

 
Oleg Shenker :

Teşekkür ederim! Artık OnTradeTransaction() işlevini nasıl kullanacağımı biliyorum veya başka sırlar var mı?

TradeTransaction() olayının kaybolması nasıl sorun olmaz?

Artık sır yok.

Kaybedilebilir (ancak 4-5 ayda 3-4 kez ve güçlü piyasa hareketliliği zamanlarında oldu),

böylece sigorta zarar vermez.

 

Ve işte bir siparişi kontrol etmenin özel bir örneği

Terminal günlüğü:

2017.01.05 11:46:01.673 Trades  'xxxxx': buy limit 1.00 PLT-6.17 at 952.3
2017.01.05 11:46:02.895 Trades  'xxxxx': accepted buy limit 1.00 PLT-6.17 at 952.3
2017.01.05 11:46:02.896 Trades  'xxxxx': buy limit 1.00 PLT-6.17 at 952.3 placed for execution in 1223.187 ms

Uzman günlüğü:

2017.01 . 05 11 : 46 : 02.829  trader (PLT- 3.17 ,H1)      CheckOrders: Задержка ответа сервера. Ожидание продолжается...


Sipariş 2017.01.05 11:46:01.673 tarihinde gönderildi.

Sunucudan 1 saniyeden fazla yanıt gelmedi, sipariş kontrol edildi.

Normal modda cevap 7-10 ms içinde gelir.

 

" MT5'te OrderSend ile Nasıl Çalışılır " konusunun sorusunun yanıtlanması

basit bir cevap var

Geliştiriciler hatayı düzeltene kadar, o zaman

ulong pre_ticket; //Предварительный тикет
ulong order_ticket; //Тикет ордера
//---
if ( OrderSend (request,result))
  {
     if (result.retcode== TRADE_RETCODE_DONE )
    {
      pre_ticket=result.order;
    }  
  }
//----------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
{
   switch (trans.type)
   {
     case TRADE_TRANSACTION_ORDER_UPDATE :
       if ((pre_ticket> 0 ) && (trans.order==pre_ticket))
       {
         switch (trans.order_state)
         {
           case ORDER_STATE_PLACED :
             order_ticket = pre_ticket;
           break ;
         }
       }
     break ;
   }
}

Ve düzelttiklerinde

ulong order_ticket; //Тикет ордера
//---
if ( OrderSend (request,result))
  {
     if (result.retcode== TRADE_RETCODE_DONE )
    {
      order_ticket=result.order;
    }  
  }