FORTS: OnTradeTransaction() dönüş kodları - sayfa 9

 
Михаил :

Anlamadın.

Bu sunucu 20 saniye boyunca YERLEŞTİRİLDİ sipariş durumunu göndermedi.

Sunucu geliştiricileri demek istedim.
 
Михаил :

ORDER_STATE_STARTED sırasının durumunun "donduğu" bir OBVIOUS terminal hatası var  

Sonunda anladın mı?

Borsa bu sipariş hakkında tam olarak ne diyor ? Hızlı bir şekilde yayınlandı mı? Evet ise, sunucunun veya MT terminalinin hatası açıktır ve bu durum durumu güncellemez. Ve bununla zaten servis masasına gidebilirsiniz.

 

Sorunu Hizmet Masasında Mikhail ile tartışmanın bir sonucu olarak:

Görünüşe göre sipariş sisteminin nasıl çalıştığını ve ne anlama geldiğini açıklamak gerekiyor.

Böyle:

1. Bir istek gönderirsiniz

buy limit 5.00 SNGR-3.16 at 35501

2. MT5 sunucusu bu talebi kontrol eder (parametreler, ön alım satım vb.). Sorun varsa, isteğe yanıt olarak ilgili hata kodunu alırsınız.

Bundan sonra, kendisine bir bilet (#24025010) atayarak yeni bir sipariş başlatır - siparişin durumu başlatıldı olarak ayarlanır. MT5'teki sipariş kimliğini, borsada sipariş verirken borsadaki siparişle ilişkilendirmek için bir sipariş bileti oluşturmanız gerekir.
Terminale, başlatılmış durumda yeni bir sipariş ekleme hakkında bir işlem gönderilir - bu, OnTradeTransaction'da izlenebilir.

3. Ardından, alım satım sunucusu (ağ geçidi aracılığıyla) talebinizi borsaya gönderir, eğer talep başarılı bir şekilde gönderildiyse, talebinize yerleştirilmiş bir yanıt gönderilir - bunun anlamı
"istek gönderildi", çalışmasının sonuçları eşzamansız olarak yürütülecektir, çünkü borsanın ne kadar sürede yanıt vereceği önceden bilinmiyor.

Buna göre, şu anda günlükte bir giriş görüyorsunuz.

2015.11.26 10:48:23.726 Trades  'xxxxxx': buy limit 5.00 SNGR-3.16 at 35501 placed for execution in 7 ms

4. Bir süre sonra borsa, sistemine bir emir verir, tanımlayıcısını ona atar ve ardından ağ geçidini ve MT5 sunucusunu bu konuda bilgilendirir.
Borsa emir vermişse, borsadaki emir tanımlayıcı MT5'teki emire atanır ve emir durumu başlatıldı => verildi olarak değişir.
Borsa herhangi bir nedenle sipariş vermeyi reddederse, sipariş iptal edilir.

Tüm bunlar, sadece OnTradeTransaction'a gelen işlemleri günlüğe kaydederek izlenebilir.

================================================= =============================

Ne oluyor:

1. Bir sipariş talebi gönderirsiniz - 1-3. paragraflara bakın.

2. Ve MT5'te zaten bir emir varken, henüz borsada değilken, bu emri geri çekmek için bir talep gönderirsiniz.
Ancak bu sipariş başlangıç (başlatıldı) durumunda olduğundan ve buna ilişkin bir siparişin varlığı tanımlanmadığından siparişi iptal etmeyi reddettiniz.
çünkü bu durumda davranış tanımsızdır.

Uzman Danışmanınızın mantığında uygun kontroller-düzeltmeler yapmanız gerekmektedir.


ZY Başka bir şey, bir saniye içinde

 2015.11 . 26 10 : 48 : 24.583 Trades   ' xxxxxx' : failed cancel order # 24025010 buy limit 5.00 SNGR- 3.16 at 35501.00000 [Invalid request]
(ve özellikle 20 saniye) siparişin verilmiş olması gerekirdi, sıralıyoruz, olası sorunlardan birini bulduk - düzeltiyoruz.
 
MQ Alexander :
Açıklama için teşekkürler! Lütfen bunu belgelere ekleyin!
 
MQ Alexander :

Sorunu Hizmet Masasında Mikhail ile tartışmanın bir sonucu olarak:

Görünüşe göre sipariş sisteminin nasıl çalıştığını ve ne anlama geldiğini açıklamak gerekiyor.

Böyle:

1. Bir istek gönderirsiniz


2. MT5 sunucusu bu talebi kontrol eder (parametreler, ön alım satım vb.). Sorun varsa, isteğe yanıt olarak ilgili hata kodunu alırsınız.

Bundan sonra, kendisine bir bilet (#24025010) atayarak yeni bir sipariş başlatır - siparişin durumu başlatıldı olarak ayarlanır. MT5'teki sipariş kimliğini, borsada sipariş verirken borsadaki siparişle ilişkilendirmek için bir sipariş bileti oluşturmanız gerekir.
Başlatılmış durumda yeni bir sipariş ekleme hakkında terminale bir işlem gönderilir - bu, OnTradeTransaction'da izlenebilir.

3. Ardından, alım satım sunucusu (ağ geçidi aracılığıyla) talebinizi borsaya gönderir, eğer talep başarılı bir şekilde gönderildiyse, talebinize yerleştirilmiş bir yanıt gönderilir - bunun anlamı
"istek gönderildi", çalışmasının sonuçları eşzamansız olarak yürütülecektir, çünkü borsanın ne kadar sürede yanıt vereceği önceden bilinmiyor.

Buna göre, şu anda günlükte bir giriş görüyorsunuz.

4. Bir süre sonra borsa, sistemine bir emir verir, tanımlayıcısını ona atar ve ardından ağ geçidini ve MT5 sunucusunu bu konuda bilgilendirir.
Borsa emir vermişse, borsadaki emir tanımlayıcı MT5'teki emire atanır ve emir durumu başlatıldı => verildi olarak değişir.
Borsa herhangi bir nedenle sipariş vermeyi reddederse, sipariş iptal edilir.

Tüm bunlar, sadece OnTradeTransaction'a gelen işlemleri günlüğe kaydederek izlenebilir.

================================================= =============================

Ne oluyor:

1. Bir sipariş talebi gönderirsiniz - 1-3. paragraflara bakın.

2. Ve MT5'te zaten bir emir varken, henüz borsada değilken, bu emri geri çekmek için bir talep gönderirsiniz.
Ancak bu sipariş başlangıç (başlatıldı) durumunda olduğundan ve buna ilişkin bir siparişin varlığı tanımlanmadığından siparişi iptal etmeyi reddettiniz.
çünkü bu durumda davranış tanımsızdır.

Uzman Danışmanınızın mantığında uygun kontroller-düzeltmeler yapmanız gerekmektedir.


ZY Başka bir şey, bir saniye içinde

(ve özellikle 20 saniye) siparişin verilmiş olması gerekirdi, sıralıyoruz, olası sorunlardan birini bulduk - düzeltiyoruz.
"Başlatılan" siparişin durumunun hangi noktada "yerleştirildi" durumuna değiştiği belirsizliğini koruyor. Bu, açıklamalarınızın 3. paragrafına göre mi, açıklamalarınızın 4. paragrafına göre mi yoksa her iki durumda da 3. ve 4. paragraflara göre mi oluyor?
 
Yury Kirillov :
"Başlatılan" siparişin durumunun hangi noktada "yerleştirildi" durumuna değiştiği belirsizliğini koruyor. Bu, açıklamalarınızın 3. paragrafına göre mi, açıklamalarınızın 4. paragrafına göre mi yoksa her iki durumda da 3. ve 4. paragraflara göre mi oluyor?
M.Q.Alexander :

4. Bir süre sonra borsa, sistemine bir emir verir, tanımlayıcısını ona atar ve ardından ağ geçidini ve MT5 sunucusunu bu konuda bilgilendirir.
Borsa emir vermişse, borsadaki emir tanımlayıcı MT5'teki emire atanır ve emir durumu başlatıldı => verildi olarak değişir.

 
MQ Alexander :

3. Ardından, alım satım sunucusu (ağ geçidi aracılığıyla) talebinizi borsaya gönderir, eğer talep başarılı bir şekilde gönderildiyse, talebinize yerleştirilmiş bir yanıt gönderilir - bunun anlamı

"istek gönderildi", çalışmasının sonuçları eşzamansız olarak yürütülecektir, çünkü borsanın ne kadar sürede yanıt vereceği önceden bilinmiyor.

Buna göre, şu anda günlükte bir giriş görüyorsunuz.

2015.11.26 10:48:23.726 Trades  'xxxxxx': buy limit 5.00 SNGR-3.16 at 35501 placed for execution in 7 ms

4. Bir süre sonra borsa, sistemine bir emir verir, tanımlayıcısını ona atar ve ardından ağ geçidini ve MT5 sunucusunu bu konuda bilgilendirir.
Borsa emir vermişse, borsadaki emir tanımlayıcı MT5'teki emire atanır ve emir durumu başlatıldı => verildi olarak değişir.

İşte kafa karışıklığının başka bir nedeni: Günlük, siparişin zaten verildiğini söylüyor, ancak aslında durum henüz değişmedi.

Belki "gönderildi" ve "yerleştirildi" gibi bir şey yazmayın, ancak sipariş borsa tarafından gerçekten kabul edilmiyor mu?

 

Aşağıdaki ortaya çıkıyor.

Bir sipariş üzerinde herhangi bir işlem gerçekleştirmeden önce (veya sonra),

her seferinde durumuna "bakmanız" gerekir (bir şey düşünmediyseniz düzeltin):

 enum ENUM_ORD_REAL_STATE
{
  ORD_NOT_SPECIFIED         = 0 , //Состояние ордера не определено
  ORD_NONE_CANCELED         = 1 , //Ордера нет, отменён пользователем
  ORD_NONE_PARTIAL_CANCELED = 2 , //Ордера нет, исполнился частично (не был залит вторым объёмом)
  ORD_NONE_PARTIAL          = 3 , //Ордера нет, исполнился частично
  ORD_NONE_EXPIRED          = 4 , //Ордера нет, удалён по сроку
  ORD_NONE_FILLED           = 5 , //Ордера нет, исполнился полностью
  ORD_NONE_REJECTED         = 6 , //Ордера нет, отклонён брокером(биржей)
  ORD_BUSY                  = 7 , //Ордер находится в переходном состоянии
  ORD_EXIST                 = 8 , //Ордер выставлен на биржу, возможны действия над ним
  ORD_EXIST_PARTIAL         = 9    //Ордер выставлен на биржу, частично исполнился, возможны действия над ним
};
//
ENUM_ORD_REAL_STATE CheckOrderState( const ulong ticket )
{
   if ( ticket > 0 )
  {
     if ( HistoryOrderSelect ( ticket ) ) //Только не существующий ордер может находится в истории
    {
       ENUM_ORDER_STATE ord_state = ENUM_ORDER_STATE ( HistoryOrderGetInteger ( ticket, ORDER_STATE ) );
       double init_volume = HistoryOrderGetDouble ( ticket, ORDER_VOLUME_INITIAL );
       double cur_volume = HistoryOrderGetDouble ( ticket, ORDER_VOLUME_CURRENT );
//---      
       switch ( ord_state )
      {
                                                           
         case ORDER_STATE_CANCELED :       if ( init_volume == init_volume )
                                         {
                                           return ( ORD_NONE_CANCELED );
                                         }
                                         else
                                         {
                                           return ( ORD_NONE_PARTIAL_CANCELED );
                                         }  
                                         break ;
                                         
         case ORDER_STATE_PARTIAL :         return ( ORD_NONE_PARTIAL );
                                         break ;
                                         
         case ORDER_STATE_EXPIRED :         return ( ORD_NONE_EXPIRED );
                                         break ;
                                                                              
         case ORDER_STATE_FILLED :         return ( ORD_NONE_FILLED );
                                         break ;
                                         
         case ORDER_STATE_REJECTED :       return ( ORD_NONE_REJECTED );
                                         break ;   
 
       
      }
    }
     else
     if ( OrderSelect ( ticket ) ) 
    {
       ENUM_ORDER_STATE ord_state = ENUM_ORDER_STATE ( OrderGetInteger ( ORDER_STATE ) );
//---      
       switch ( ord_state )
      {
         case ORDER_STATE_STARTED :
         case ORDER_STATE_REQUEST_ADD :
         case ORDER_STATE_REQUEST_MODIFY :
         case ORDER_STATE_REQUEST_CANCEL : return ( ORD_BUSY );
                                         break ; 
 
         case ORDER_STATE_PARTIAL :         return ( ORD_EXIST_PARTIAL );
                                         break ;
                                          
         case ORDER_STATE_PLACED :         return ( ORD_EXIST );
                                         break ;
      }
    }
  }
   return ( ORD_NOT_SPECIFIED );
}
 
Михаил :

Aşağıdaki ortaya çıkıyor.

Bir sipariş üzerinde herhangi bir işlem gerçekleştirmeden önce (veya sonra),

her seferinde durumuna "bakmanız" gerekir (bir şey düşünmediyseniz düzeltin):

Doğru değil,

HistoryOrderSelect ( bilet ) geçmişine bakarsak, o zaman HistoryOrderGetInteger() , HistoryOrderGetDouble() kullanmamız gerekir.

 
Sergey Chalyshev :

Doğru değil,

HistoryOrderSelect ( bilet ) geçmişine bakarsak, o zaman HistoryOrderGetInteger() , HistoryOrderGetDouble() kullanmamız gerekir.

Doğru, yazım hatası :)

teşekkürler düzeltildi...