Geliştiriciler! Oluşturduğunuz şeyi hiç test ediyor musunuz? - sayfa 10

 
Mikalas :

İşte o zamanlar! Tarihte doğru mu?

papaklass, muhtemelen, OnTradeTransaction'ın hata döndürdüğü anlamına mı geliyordu?

OnTradeTransaction'daki bilgiler güvenilir olmayabilirse, bilgilerin güvenilir olduğundan emin olmak için geçmişten alınması gerekir.

Bilgiler her zaman OnTradeTransaction'a gelmiyorsa, tüm bilgilerin işlendiğinden emin olmak için bilgilerin geçmişten alınması gerekir.

Soru şu ki, o zaman neden OnTradeTransaction önemli değilse, her halükarda tarihten bilgi alınması gerekiyor? - Yalnızca hata kontrolü içinse. Bir sipariş verilmiş gibi - komisyoncu bunu reddetti, OnTradeTransaction'da siparişin neden reddedildiğinin cevabını yakaladılar ve analiz ettiler.

 
sergeev :
neden 9 sayfada salya akıyor?

Lütfen kaba olmayın! Bu arada, zaten 10!

Ve burada yazılanları okumama hakkınız var!

 
Mikalas :

C-4 elbette işlenecek, ama neden OnRefresh() gerekli?

Birçok olay -> bir işleyici.
 
C-4 :
Birçok olay -> bir işleyici.
Tüm açılardan hatalar tek bir yığında! :)
 
Mikalas :
Tüm açılardan hatalar tek bir yığında! :)

Hatalar değil, veriler gönderilir. Hatalar işleyicide olabilir, ancak yalnızca bir işleyici olduğu için düzeltilmesi kolaydır.

papaklas :
Ben, tam olarak bu konuda. Olayların ayrılması gereklidir.
Olayların ayrılmasına değil, işleyicilerin ayrılmasına ihtiyacımız var. Olaylar veri üretir. Her veri türünün kendi işleyicisi vardır. Verileri tam olarak kimin aldığı önemli değildir, her veri türünün kendine özgü işleyicisi olması önemlidir.
 
C-4 :

Hatalar değil, veriler gönderilir. Hatalar işleyicide olabilir, ancak yalnızca bir işleyici olduğu için düzeltilmesi kolaydır.

Olayların ayrılmasına değil, işleyicilerin ayrılmasına ihtiyacımız var. Olaylar veri üretir. Her veri türünün kendi işleyicisi vardır. Verileri tam olarak kimin aldığı önemli değildir, her veri türünün kendine özgü işleyicisi olması önemlidir.

Burada paylaşılmayan nedir?

 void OnTradeTransaction ( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result )
{
 // Print( "Ticket = ", string( trans.order ), " --> ", EnumToString( trans.type ), " --> ", EnumToString(trans.order_state) );
  
   switch ( trans.type )
  {
     TRADE_TRANSACTION_ORDER_DELETE :       switch ( trans.order_state )
                                         {
                                           Удаление ордера из списка открытых.
                                           Ордер может быть удален из открытых в результате выставления
                                           соответствующего запроса либо в результате исполнения (заливки) и переноса в историю.
 
                                         } 
                                         break ;
    
     TRADE_TRANSACTION_ORDER_ADD :         switch ( trans.order_state )
                                         {
                                           Добавление нового открытого ордера.
                                         } 
                                         break ;
                                          
     TRADE_TRANSACTION_DEAL_ADD :           switch ( trans.order_state )
                                         {
                                           Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета.
                                         }
                                         break ;
                                                    
     case TRADE_TRANSACTION_HISTORY_ADD :   switch ( trans.order_state )
                                         {
                                           Добавление ордера в историю в результате исполнения или отмены.
                                         }
                                         break ;
    
     case TRADE_TRANSACTION_ORDER_DELETE :   switch ( trans.order_state )
                                         {
                                           Удаление ордера из списка открытых.
                                           Ордер может быть удален из открытых в результате выставления
                                           соответствующего запроса либо в результате исполнения (заливки) и переноса в историю.
                                         }
                                         break ;
                                         
     case TRADE_TRANSACTION_ORDER_UPDATE : switch ( trans.order_state )
                                         {
                                           Изменение открытого ордера. 
                                           К данным изменениям относятся не только явные изменения
                                           со стороны клиентского терминала или торгового сервера,
                                           но также и изменение его состояния при выставлении
                                           (например, переход из состояния ORDER_STATE_STARTED в ORDER_STATE_PLACED или
                                           из ORDER_STATE_PLACED в ORDER_STATE_PARTIAL и т.д.).
                                         }
                                         break ;
                                         
     case TRADE_TRANSACTION_DEAL_UPDATE :   switch ( trans.order_state )
                                         {
                                           Изменение сделки в истории. Возможны ситуации, 
                                           когда ранее исполненная сделка изменяется на сервере.
                                           Например, сделка была изменена во внешней торговой системе (бирже),
                                           куда она была выведена брокером.
                                         }
                                         break ;
                                         
     case TRADE_TRANSACTION_DEAL_DELETE : switch ( trans.order_state )
                                        {
                                          Удаление сделки из истории.
                                          Возможны ситуации, когда ранее исполненная сделка удаляется на сервере.
                                          Например, сделка была удалена во внешней торговой системе (бирже), куда она была выведена брокером.
                                        }
                                         break ; 
             
     case TRADE_TRANSACTION_HISTORY_UPDATE : switch ( trans.order_state )
                                           {
                                             Изменение ордера, находящегося в истории ордеров.
                                             Данный тип предусмотрен для расширения функциональности на стороне торгового сервера.
                                           }
                                           break ;
                                          
     case TRADE_TRANSACTION_HISTORY_DELETE : switch ( trans.order_state )
                                           {
                                             Удаление ордера из истории ордеров.
                                             Данный тип предусмотрен для расширения функциональности на стороне торгового сервера.
                                           }
                                           break ;
                                                                                 
     case TRADE_TRANSACTION_POSITION :       switch ( trans.order_state )
                                           {
                                            Изменение позиции, не связанное с исполнением сделки. 
                                            Данный тип транзакции свидетельствует именно о том,
                                            что позиция была изменена на стороне торгового сервера.
                                            У позиции может быть изменен объем, цена открытия,
                                            а также уровни Stop Loss и Take Profit.
                                            Информация об изменениях передается в структуре MqlTradeTransaction
                                            через обработчик OnTradeTransaction .
                                            Изменение позиции (добавление, изменение или ликвидация) в результате совершения
                                            сделки не влечет за собой появление транзакции TRADE_TRANSACTION_POSITION .
                                           }
                                           break ;                                                                                                                                                                                  
   case TRADE_TRANSACTION_REQUEST :  Уведомление о том, что торговый запрос обработан сервером,
                                     и результат его обработки получен.
                                      Для транзакций данного типа в структуре MqlTradeTransaction
                                      необходимо анализировать только одно поле - type (тип транзакции).
                                      Для получения дополнительной информации необходимо анализировать второй
                                      и третий параметры функции OnTradeTransaction (request и result).
                                     break ;
}
 

Ama dahası var

 const MqlTradeRequest &request, const MqlTradeResult &result
 
Mikalas :

Burada paylaşılmayan nedir?

Bir sürü kombinatorik. Alt satır: OnTradeTransaction ve karmaşık mantıkta dev bir sayfa. Nasıl yapacağımı cevaplayamıyorum çünkü görevi bilmiyorum. Her durumda, durum->durum->durum... endişe verici.
 
papaklass :

Sunduğunuz şey (veri türlerinin yönetimi) de şu anda MK'da. OnTradeTransaction işleyicisi, belirli bir MqlTradeTransaction veri türünü işler. Doğru, bu veri türüne pek çok şey dolduruldu, yani. farklı olaylara karşılık gelen veri türleri.

Her olayın kendi verisine ve kendi işleyicisine sahip olduğunu öneriyorum. Kaç olay, çok işleyici. TAM OLARAK olayların ayrılması (pozisyon açma, pozisyon kapatma, emir verme, emir değiştirme, pozisyon değiştirme vb.). Ve hangi veri türlerinin hangi olaya atfedileceğine geliştiricilerin karar vermesine izin verin.

"İşleyici" kelimesiyle, şu veya bu olayın geldiği bir sistem işlevini değil, bu olayı analiz eden belirli bir EA modülünü kastediyorum. Özellikle gerekli miktarda özel işleyiciler oluşturmak temel olduğundan, her biri kendi olayı için birçok On... işlevi üretmek anlamsızdır. İşte benim için nasıl yapıldığı:

 ///
/// Принимаем событие.
///
void OnEvent(Event* event)
{
   switch (event.EventId())
   {
       case EVENT_MOUSE_MOVE:
           OnMouseMove(event);
           break ;
       case EVENT_KEY_DOWN:
           OnKeyDown(event);
           break ;
       case EVENT_ORDER_CHANGE:
           OnOrderChange(event);
           break ;
       //etc...
   }
}

Aynı Event sınıfının, tamamen farklı veri türlerine ihtiyaç duyan tamamen farklı işleyicilere geçirilmesi garip görünebilir. Örneğin, OnMouseMove, fare ve koordinatları üzerinde basılan tuşların bir maskesini, OnKeyDown(), basılan tuşun kodunu ve OnOrderChange, değişen bir sipariş biletini ve muhtemelen hangi değişikliğin meydana geldiğini açıklayan bir numaralandırmayı gerektirir. Event sınıfının tüm olası olaylar için alanlar içerdiğini düşünebilirsiniz. Ancak öyle değil. Aslında, olay sınıfının bir nesnesi var olamaz, çünkü yapıcısı korumalı kapsamda gizlidir. Ancak onun soyundan gelenler bolca bulunur - her soyundan yalnızca kendi olayını işlemek için. Ancak, herhangi bir olay için, hangi türe ait olduğunu gösteren bir tanımlayıcı vardır. Bu tanımlayıcıyı bilerek, büyükten küçüğe güvenli bir tür dönüşümü gerçekleştirebilirsiniz. Bu tür çocuk için, işleyici geçildiği anda örtük bir dönüşüm gerçekleşir. Olay işleyicilerimizin gerçekte nasıl gördüklerini görelim:

 ///
/// Реагируем на перемещение мыши.
///
OnMouseMove(EventMouseMove* event)
{
   int yCoord = event.YCoord();
   int xCoord = event.XCoord();
   printf ( "X координата: " + xCoord + "; Y координата: " + yCoord);
}

///
/// Реагируем на перемещение мыши.
///
OnOrderChange(EventOrderChange* event)
{
   int ticket = event.Ticket();
   ENUM_ORDER_STATE state = event.OrderState();
   printf ( "Ордер с тикетом " + ticket + " изменил свое состояние на " + EnumToString(state));
}

//etc...
Güzellik ... Görünüşe göre sadece bir olay var - olay, ama aslında onlarca olabilir. Olay, türü dışında pratikte herhangi bir bilgi içermiyor gibi görünüyor, ancak aslında işleyiciler yalnızca kendileri tarafından bilinen yöntemlere özgürce atıfta bulunuyorlar.
 

"Dış" ve "iç" olaylar yoktur, sadece olaylar vardır. Ve bu olayların sayısı potansiyel olarak sonsuz olabilir. Her şey bir olay olabilir. Bir olay herhangi bir veri içerebilir. Bu felsefeyi takip ederek, yeni, daha yüksek bir veri soyutlama düzeyi elde ederiz. Neden kafanızda sınırlamalar yaratıyorsunuz, neden sınırlayıcı bir soyutlamaya bir sınıflandırma dayatıyorsunuz!?

papaklass :

İç ve dış olaylar arasındaki temel fark, yürütme süresidir. Dahili olanlar için pratik olarak sıfıra eşittir, harici olanlar için ise yüzlerce milisaniyeden saniyeye kadar ölçülür.

Olayların yürütme süresi yoktur. Etkinlik geldiyse, zaten yerine getirilmiştir. Asenkron mod bu şekilde çalışır. Bu nedenle olayları iç ve dış olarak sınıflandırmak ne kadar hızlı yanlış yürütüldükleri için yanlıştır. Hiçbir şekilde sınıflandırmamak, ancak belirli bir uygulamadan son derece soyutlanmış düşünmek doğrudur.

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
Neden: