Sipariş numaralandırma döngüsünün organizasyonu - sayfa 9

 
fxsaber :

değişti

Şimdi uyarılar olmadan.

Cevap kendini gösteriyor - eğer Ticket == PrevTicket ---> return WRONG_VALUE .

İşlev sıfırdan küçük bir değer döndürdüyse, onu yeniden çağırmanız gerekir.

 
Artyom Trishkin :

Cevap kendini gösteriyor - eğer Ticket == PrevTicket ---> return WRONG_VALUE .

Yani bu, komşu biletlerin eşitliği şeklinde netlik için tanımladığım sorunun belirli bir örneğine bir çözüm.

Aslında sorun hala aynı - döngü sırasında indekslemeyi sallamak. Bu, bazı biletlerin atlanacağı veya biletin birden sonra tekrarlanacağı vb. bir duruma yol açabilir.

IsChange'e bir alternatif bulamadım.

 
fxsaber :

Yani bu, komşu biletlerin eşitliği şeklinde netlik için tanımladığım sorunun belirli bir örneğine bir çözüm.

Aslında sorun hala aynı - döngü sırasında indekslemeyi sallamak. Bu, bazı biletlerin atlanacağı veya biletin birden sonra tekrarlanacağı vb. bir duruma yol açabilir.

IsChange'e bir alternatif bulamadım.

Zamanlayıcıda bir liste oluşturuyoruz ve onunla çalışıyoruz.

 
Artyom Trishkin :

Zamanlayıcıda bir liste oluşturuyoruz ve onunla çalışıyoruz.

Daha iyi kod.

 
fxsaber :

Daha iyi kod.

Kodu göstermek çok zor - birbiriyle ilişkili sınıflardan oluşan bir kitaplık var.

Anlamı şudur - zamanlayıcıda hesaptaki tüm emirleri ve pozisyonları inceleriz ve CArrayObj listesini doldururuz. Güncel bilgileri tek geçişte almak için sürekli güncelliyoruz.

Pozisyonları kapatmak veya emirleri silmek gerekirse, bu listeyi alır ve kapatma (değiştirme) fonksiyonları için gerekli emir nesnelerini ve bunların biletlerini seçeriz. Bu sipariş nesnesi fiziksel olarak yoksa (bu eylemler sırasında kapatılır veya silinir), listedeki bir sonrakine gideriz, çünkü bu zaten kapalıdır ve zamanlayıcının bir sonraki yinelemesinde liste zaten güncellenecektir. Olası sorunlardan akla gelen ilk şey, alınan liste ile işlemlerin yürütülmesi sırasında işlem ortamı değiştiğinde alınan listenin alakasız olmasıdır. Ama gördüğüm kadarıyla, listede kayıtlı bir emrin fiziksel olarak yokluğu çok can sıkıcı olmamalı - sadece bir hata alıyoruz ve listede bir sonrakine gidiyoruz - bu liste bir ticaret ortamındaki gibi karıştırılmıyor ve atlamak imkansızdır - sadece bir siparişin bulunmadığı gerçeğinin bir ifadesi Listedeki karşılık gelen giriş.

Şimdiye kadar bana böyle görünüyor, çünkü bunu henüz kodda uygulamadım. Sadece uygulamaya yaklaşıyorum, ancak başlangıçta diğer bazı sınıfları tamamlamak gerekiyor (özellikler dalında fonksiyonların değiştirilmesi sorusu soruldu). Uygulamayı başlattığımda, olası sorunlar orada görünecek ve bunları çözme ve ortadan kaldırma yöntemlerine karar vereceğim.

 
Artyom Trishkin :

Cevap kendini gösteriyor - eğer Ticket == PrevTicket ---> return WRONG_VALUE .

İşlev sıfırdan küçük bir değer döndürdüyse, onu yeniden çağırmanız gerekir.

Kesinlikle hiçbir şey yapılmasına gerek yoktur. Bir aptalın bakışı ile mantık üzerinden gitmek yeterlidir.

1. 6 siparişimiz var

  • 0 bilet 100
  • 1 bilet 101
  • 2 bilet 102
  • 3 bilet 103
  • 4 bilet 104
  • 5 bilet 105

Değişiklikler için siparişleri sıralamaya başlıyoruz,

5 bilet 105'i seçin, değiştirmenin gerekli olup olmadığını kontrol edin, değiştirin.

Şu anda, oyuncu eller sipariş 2 bilet 102'yi sildi ve liste değişti. Şimdi 105 biletli sipariş listede dördüncü oldu, 4. Ve yine modifikasyon için seçildiği ortaya çıktı. Ama sonuçta, doğrulamadan çalışmıyoruz ... değiştirmenin gerekli olup olmadığını kontrol ettik, AMA !!! Yapma... ne olmuş??? Siparişin yeniden seçilmesini kim kötü hissetti?

 
Artyom Trishkin :

Kodu göstermek çok zor - birbiriyle ilişkili sınıflardan oluşan bir kitaplık var.

Anlamı şudur - zamanlayıcıda hesaptaki tüm emirleri ve pozisyonları inceleriz ve CArrayObj listesini doldururuz. Güncel bilgileri tek geçişte almak için sürekli güncelliyoruz.

Pozisyonları kapatmak veya emirleri silmek gerekirse, bu listeyi alır ve kapatma (değiştirme) fonksiyonları için gerekli emir nesnelerini ve bunların biletlerini seçeriz. Bu sipariş nesnesi fiziksel olarak yoksa (bu eylemler sırasında kapatılır veya silinir), listedeki bir sonrakine gideriz, çünkü bu zaten kapalıdır ve zamanlayıcının bir sonraki yinelemesinde liste zaten güncellenecektir. Olası sorunlardan akla gelen ilk şey, alınan liste ile işlemlerin yürütülmesi sırasında işlem ortamı değiştiğinde alınan listenin alakasız olmasıdır. Ama gördüğüm kadarıyla, listede kayıtlı bir emrin fiziksel olarak yokluğu çok can sıkıcı olmamalı - sadece bir hata alıyoruz ve listede bir sonrakine gidiyoruz - bu liste bir ticaret ortamındaki gibi karıştırılmıyor ve atlamak imkansızdır - sadece bir siparişin bulunmadığı gerçeğinin bir ifadesi Listedeki karşılık gelen giriş.

Şimdiye kadar bana böyle görünüyor, çünkü bunu henüz kodda uygulamadım. Sadece uygulamaya yaklaşıyorum, ancak başlangıçta diğer bazı sınıfları tamamlamak gerekiyor (özellikler dalında fonksiyonların değiştirilmesi sorusu soruldu). Uygulamayı başlattığımda, olası sorunlar orada görünecek ve bunları çözme ve ortadan kaldırma yöntemlerine karar vereceğim.

İşte bunun uygulanması

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Sipariş numaralandırma döngüsünün organizasyonu

fxsaber , 2017.09.11 20:29

 // Редкий, но правильный костяк модификации ордеров
for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS ))
     if ( OrderModify ( OrderTicket (), Price, SL, TP, OrderExpiration ()))     
    {
       i = OrdersTotal (); // Хотя бы так
      
       // А лучше так
//      OnTick(); break; // вместо строки выше лучше делать такой вызов (переполнения стека от рекурсивных вызовов быть не должно)
    }


Bir ticaret talebi gönderdikten sonra, ticaret ortamı değişir, bu nedenle ticaret sunucusunun yanıtından hemen sonra TS'nin tüm ticaret mantığını sıfırdan yürütmeniz önerilir.

Sadece hala IsChange gerektiriyor. Zamanlayıcı bir seçenek değildir. Uyku(1) bile tüm resmi bozar.

 
Alexey Viktorov :

Kesinlikle hiçbir şey yapılmasına gerek yoktur. Bir aptalın bakışı ile mantık üzerinden gitmek yeterlidir.

Yani evet, siparişin kapanması/aktivasyonu kontrol edilirse sorun olmaz.
Kendi bilet diziniz varsa, sipariş basitçe atlanacaktır.

not. Bir vaka daha atacağım - bekleyen, gerçek bir emrin (darbe için) durdurulmasına ayarlanmışsa, o zaman durdurma tetiklendiğinde, beklemede olanın açılması belirsiz bir süre için ertelenebilir. Yani bir emir piyasada çalışacak ve ikincisi belli sayıda kene asacak...

 
fxsaber :

İşte bunun uygulanması

Sadece hala IsChange gerektiriyor. Zamanlayıcı hiç bir seçenek değil. Sleep(1) bile tüm resmi bozar.

IsChange() zamanlayıcıda yeni uygulandı (henüz tamamlanmamış test sürümü):

 //+------------------------------------------------------------------+
//| Обновляет список ордеров                                         |
//+------------------------------------------------------------------+
int CMarketCollection::Refresh( void )
  {
   :: ZeroMemory (m_struct_market);
   int number_new= 0 , total=:: OrdersTotal ();
   m_list_all_orders.Clear();
   for ( int i= 0 ; i<total; i++){
       if (!:: OrderSelect (i, SELECT_BY_POS )) continue ;
       long ticket=:: OrderTicket ();
      m_struct_market.hash_sum_acc+=ticket;
      m_struct_market.total_volumes+=:: OrderLots ();
       ENUM_ORDER_TYPE type=( ENUM_ORDER_TYPE ):: OrderType ();
       if (type== ORDER_TYPE_BUY || type== ORDER_TYPE_SELL ){
         CMarketOrder* order= new CMarketOrder();
         if (order== NULL ) continue ;
         m_list_all_orders.InsertSort(order);
         m_struct_market.total_positions++;
         }
       else {
         CMarketPending* order= new CMarketPending();
         if (order== NULL ) continue ;
         m_list_all_orders.InsertSort(order);
         m_struct_market.total_pending++;
         }
      }
   //--- Первый запуск
   if (m_hash_sum_acc_prev== WRONG_VALUE ){
      m_hash_sum_acc_prev=m_struct_market.hash_sum_acc;
      m_total_positions_prev=m_struct_market.total_positions;
      m_total_pending_prev=m_struct_market.total_pending;
      m_total_volume_prev=m_struct_market.total_volumes;
      }
   //---
   if (m_struct_market.hash_sum_acc!=m_hash_sum_acc_prev){
      number_new=(m_struct_market.total_pending+m_struct_market.total_positions)-(m_total_positions_prev+m_total_pending_prev);
       Print (FUNC, "Хэш-сумма всех ордеров и позиций изменилась" );
       //--- Увеличисля общий объём
       if (:: NormalizeDouble (m_struct_market.total_volumes-m_total_volume_prev, 3 )> 0 ){
         Print (FUNC, "Общий объём увеличился" );
         if (m_struct_market.total_positions>m_total_positions_prev) Print (FUNC, "Количество позиций увеличилось" );
         if (m_struct_market.total_pending>m_total_pending_prev) Print (FUNC, "Количество ордеров увеличилось" );
         //--- Отправка EVENT в управляющий класс CEngine
         // сделать!
         }
       //--- Уменьшился общий объём
       else if (:: NormalizeDouble (m_struct_market.total_volumes-m_total_volume_prev, 3 )< 0 ){
         Print (FUNC, "Общий объём уменьшился" );
         if (m_struct_market.total_positions<m_total_positions_prev) Print (FUNC, "Количество позиций уменьшилось" );
         if (m_struct_market.total_pending<m_total_pending_prev) Print (FUNC, "Количество ордеров уменьшилось" );
         //--- Отправка EVENT в управляющий класс CEngine
         // сделать!
         }
       else {
         // что-то ещё, не пойму пока что именно - не было претендентов ещё
         }
       //---
      m_hash_sum_acc_prev=m_struct_market.hash_sum_acc;
      m_total_positions_prev=m_struct_market.total_positions;
      m_total_pending_prev=m_struct_market.total_pending;
      m_total_volume_prev=m_struct_market.total_volumes;
      }
   //---
   //---
   return number_new;
  }
//+------------------------------------------------------------------+

Kontrol sınıfında, değişikliği her iki sınıfın (test cihazında) Refresh() işlevinden döndürülen sayıya göre yakalayabilirsiniz:

 //+------------------------------------------------------------------+
//| Таймер                                                           |
//+------------------------------------------------------------------+
void CEngine:: OnTimer ( void )
  {
   //--- Обновление списка исторических ордеров и позиций
   m_new_history=History.Refresh();
   if (m_new_history> 0 ){
       Print (FUNC, "Изменение в исторических на " ,m_new_history);
       //--- реакция
      }
   //--- Обновление списка рыночных ордеров и позиций
   m_new_market=Market.Refresh();
   if (m_new_market!= 0 ){
       Print (FUNC, "Изменение в активных на " ,m_new_market);
       //--- реакция
      }
   //---
   Sym. OnTimer ();
  }
//+------------------------------------------------------------------+

veya henüz uygulanmayan özel bir etkinlikte (demo, gerçek).

 
Artyom Trishkin :

IsChange() zamanlayıcıda yeni uygulandı (henüz tamamlanmamış test sürümü):

Ya IsChange beş satır ise?