"CopyTicks"in Test Edilmesi - sayfa 19

 

1434 - CopyTicks tarafından önceden indirilmiş 1000 onayın alınması ortalama 1 ms sürer. Yavaş yavaş.

Daha önce alınan son onayın from_msc'sinden TRADE0tick'i istiyorum. 3 tik alıyorum, ancak 0,3 - 0,9 ms'de! - Çok yavaşladı.

 
fxsaber :

Yukarıdaki kodu yoğun bir şekilde günlüğe kaydetti ve nedenlerini çözdü. CopyTicks (> 0'dan) en sonuncusundan önce işaretler alırsa, bazılarını atlayabilir.

Servis Masasından çok önemli cevap

Asıl sorunla ilgili olarak - bir sonraki aramadaki CopyTicks aynı süre için daha fazla onay verebilir:

Gerçekten öyle. Sorun şu ki, alış/satış ve son/hacimlerin değişim veri akışları, zaten değişim tarafında birbirleriyle senkronize edilmeyen farklı akışlardır.

Bu nedenle, önce alış / satışın 12:12:12.300 değişim zamanı ile geldiği, biraz sonra son / hacmin 12:12:12.299 zamanı ile geldiği durumlar ortaya çıkar.

Buna göre, son tıklamadan (12:12:12.300) beri veri talep ettiğinizde, 12:12:12.299 için yeni bir son almayacaksınız.

not. terminal, zamana göre sıralanmış keneleri kaydeder ve döndürür. Yani CopyTicks'te verilen tiklerin zaman sırası her zaman artar.

Onay almak için iki akış vardır - BİLGİ ve TİCARET. ALL sentezlenmiş bir birliktir (terminal tarafında görünüyor), bu nedenle bu tür olaylar meydana gelebilir.

Bu tür kelimelerin olması sentez yüzündendi.

Slava :

CopyTicks çağrısından sonraki ilk onay kayıtları sıfır içermeyecek, ancak talep edilen zaman noktasındaki mevcut teklif, satış ve son değerleri içerecektir.

Bu nedenle, TÜM kenelerle çalışırken, neyle uğraştığınızı açıkça anlamanız gerekir. Onay bayraklarının da sentezlenmesi mümkündür. Bu konularla ilgili ayrıntılı bilgi istiyorum.

CopyTicks düzgün çalışıyorsa, bantla böyle bir sorun ortaya çıkmamalıdır.

Yardım'ın ciddi şekilde destekleneceğini düşünüyorum.

 
fxsaber :
Herhangi bir aşırı yükü kendiniz ekleyebilirsiniz.
Ben çok şey yapabilirim, sen çok şey yapabilirsin, diğer programcılar da çok şey yapabilir, ama umarım geliştiriciler tüm "doldurma" yı daha iyi bilir ve gerekli keneleri elde etmek için hızlı algoritmalar oluşturabilir.
 

COPY_TICKS_TRADE bayrağıyla test edilen CopyTicks

Farklılıklar yok.

 2016.10 . 03 15 : 50 : 48.507 Check_ticks (RTS- 12.16 ,M1)      History ticks = 9
2016.10 . 03 15 : 50 : 48.507 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 9
2016.10 . 03 15 : 50 : 48.956 Check_ticks (RTS- 12.16 ,M1)      History ticks = 11
2016.10 . 03 15 : 50 : 48.956 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 11
2016.10 . 03 15 : 50 : 49.184 Check_ticks (RTS- 12.16 ,M1)      History ticks = 12
2016.10 . 03 15 : 50 : 49.184 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 12
2016.10 . 03 15 : 50 : 49.510 Check_ticks (RTS- 12.16 ,M1)      History ticks = 14
2016.10 . 03 15 : 50 : 49.511 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 14
2016.10 . 03 15 : 50 : 51.568 Check_ticks (RTS- 12.16 ,M1)      History ticks = 15
2016.10 . 03 15 : 50 : 51.568 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 15
2016.10 . 03 15 : 50 : 51.627 Check_ticks (RTS- 12.16 ,M1)      History ticks = 16
2016.10 . 03 15 : 50 : 51.627 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 16
2016.10 . 03 15 : 50 : 53.143 Check_ticks (RTS- 12.16 ,M1)      History ticks = 19
2016.10 . 03 15 : 50 : 53.143 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 19
2016.10 . 03 15 : 50 : 54.514 Check_ticks (RTS- 12.16 ,M1)      History ticks = 27
2016.10 . 03 15 : 50 : 54.514 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 26
2016.10 . 03 15 : 50 : 54.542 Check_ticks (RTS- 12.16 ,M1)      History ticks = 27
2016.10 . 03 15 : 50 : 54.542 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 27
2016.10 . 03 15 : 50 : 54.847 Check_ticks (RTS- 12.16 ,M1)      History ticks = 30
2016.10 . 03 15 : 50 : 54.847 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 30
2016.10 . 03 15 : 50 : 57.052 Check_ticks (RTS- 12.16 ,M1)      History ticks = 31
2016.10 . 03 15 : 50 : 57.052 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 31
2016.10 . 03 15 : 50 : 57.301 Check_ticks (RTS- 12.16 ,M1)      History ticks = 32
2016.10 . 03 15 : 50 : 57.301 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 32
2016.10 . 03 15 : 51 : 00.498 Check_ticks (RTS- 12.16 ,M1)      History ticks = 44
2016.10 . 03 15 : 51 : 00.498 Check_ticks (RTS- 12.16 ,M1)      Dynamic ticks = 44
Dosyalar:
Check_ticks.mq5  41 kb
 
prostotrader :

COPY_TICKS_TRADE bayrağıyla test edilen CopyTicks

Farklılıklar yok.

 
fxsaber :

Yukarıdaki kodu yoğun bir şekilde günlüğe kaydetti ve nedenlerini çözdü. CopyTicks (> 0'dan) en sonuncusundan önce işaretler alırsa, bazılarını atlayabilir.

Misal.

= 2016.09.29 11:05:55.564 ile istenen onay işaretleri. Yanıt olarak üç onay aldı

Bir süre sonra, uzaktan bir onay geçmişi talep ediyorum ve CopyTicks'in daha önce kaçırdığı bir onay işareti görüyorum

İşte böyle bir hata!

Kene veritabanına paralel yazma ve ondan okuma bir tür çatışma gibi görünüyor.

1434 - TİCARET keneleri için aynı hata. Üreme Uzman Danışmanı
 #include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

long LastTime = 0 ; // time_msc-время последнего тика (самого свежего), полученного из истории
int Count = 0 ;     // Количество тиков в последенем запросе, у которых time_msc == LastTime

// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_TRADE , const uint count = 100000 )
{
   int Res = 0 ;

   MqlTick NewTicks[];
   const int NewAmount = CopyTicks ( Symbol (), NewTicks, flags, LastTime, count);

   if ((NewAmount > 0 ) && (Count < NewAmount))
  {
    Res = ArrayCopy (Ticks, NewTicks, 0 , Count);

     // Взяли крайнее время из текущей истории
    LastTime = Ticks[Res - 1 ].time_msc;
    Count = 1 ;

     // Находим (Count) в текущей истории количество тиков со временем LastTime
     for ( int i = Res - 2 ; i >= 0 ; i--)
    {
       if (Ticks[i].time_msc < LastTime)
         break ;

      Count++;
    }
  }
  
   return (Res);
}

string GetTickFlag( uint tickflag )
{
   string flag = "" ;

#define TICKFLAG_MACRO(A) flag += (( bool )(tickflag & TICK_FLAG_ ##A)) ? " TICK_FLAG_" + #A : "" ;
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef TICKFLAG_MACRO

   if (flag == "" )
    flag = " FLAG_UNKNOWN (" + ( string )tickflag + ")" ;
     
   return (flag);
}

#define TOSTRING(A) " " + #A + " = " + ( string )Tick.A

string TickToString( const MqlTick &Tick )
{
   return (TOSTRING(time) + "." + ( string ) IntegerToString (Tick.time_msc % 1000 , 3 , '0' ) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

#define TOSTRING2(A) #A + " = " + ( string )(A) + " "

template < typename T>
bool ArrayEqual( const T &Array1[], const T &Array2[] )
{
   const int Amount = MathMin ( ArraySize (Array1), ArraySize (Array2));
   bool Res = (Amount > 0 );

   if (Res)
     for ( int i = 0 ; i < Amount; i++)
       if (_R(Array1[i]) != Array2[i]) // https://www.mql5.com/ru/code/16280
      {
         Print (TOSTRING2(i) + TOSTRING2( ArraySize (Array1)) + TOSTRING2( ArraySize (Array2)));
         Print (TOSTRING2(TickToString(Array1[i])) + "\n" + TOSTRING2(TickToString(Array2[i])) + "\n" );
         Print (TOSTRING2(TickToString(Array1[i - 1 ])) + "\n" + TOSTRING2(TickToString(Array2[i - 1 ])) + "\n" );
        
        Res = false ;
        
         ExpertRemove ();

         break ;
      }

   return (Res);
}

void OnTick ( void )
{
   static bool FirstRun = true ;
   static MqlTick PrevTicks[];
  
   if (FirstRun)
  {
    LastTime = TimeCurrent () * 1000 ;
    Count = 0 ;
    
    FirstRun = false ;
  }
  
   MqlTick Ticks[];

   // Взяли свеженькие тики
   const int Amount = GetFreshTicks(Ticks);

   ArrayCopy (PrevTicks, Ticks, ArraySize (PrevTicks));
  
   if ( ArraySize (PrevTicks) > 0 )    
  {
     MqlTick NewTicks[];
    
     // Взяли историю тиков
     Print ( CopyTicks ( _Symbol , NewTicks, COPY_TICKS_TRADE , PrevTicks[ 0 ].time_msc, 1000000 ));
    
     // Проверка на совпадение собираемой истории с самой историей
     Print (ArrayEqual(NewTicks, PrevTicks) ? "Equal" : "Not Equal" );
  }  
}
Sonuç
 2016.10 . 04 10 : 36 : 17.743 Test13 (RTS- 12.16 ,M1)   Not Equal
2016.10 . 04 10 : 36 : 17.743 Test13 (RTS- 12.16 ,M1)   ExpertRemove () function called
2016.10 . 04 10 : 36 : 17.743 Test13 (RTS- 12.16 ,M1)   
2016.10 . 04 10 : 36 : 17.743 Test13 (RTS- 12.16 ,M1)   TickToString(Array2[i- 1 ]) =  time = 2016.10 . 04 10 : 37 : 07.791 bid = 99680.0 ask = 99690.0 last = 99690.0 volume = 4 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY 
2016.10 . 04 10 : 36 : 17.743 Test13 (RTS- 12.16 ,M1)   TickToString(Array1[i- 1 ]) =  time = 2016.10 . 04 10 : 37 : 07.791 bid = 99680.0 ask = 99690.0 last = 99690.0 volume = 4 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY 
2016.10 . 04 10 : 36 : 17.743 Test13 (RTS- 12.16 ,M1)   
2016.10 . 04 10 : 36 : 17.743 Test13 (RTS- 12.16 ,M1)   TickToString(Array2[i]) =  time = 2016.10 . 04 10 : 37 : 07.791 bid = 99680.0 ask = 99690.0 last = 99690.0 volume = 4 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY 
2016.10 . 04 10 : 36 : 17.743 Test13 (RTS- 12.16 ,M1)   TickToString(Array1[i]) =  time = 2016.10 . 04 10 : 37 : 08.773 bid = 99690.0 ask = 99700.0 last = 99690.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL 
2016.10 . 04 10 : 36 : 17.743 Test13 (RTS- 12.16 ,M1)   i = 144 ArraySize (Array1) = 145 ArraySize (Array2) = 146 
2016.10 . 04 10 : 36 : 17.743 Test13 (RTS- 12.16 ,M1)   145
2016.10 . 04 10 : 36 : 16.768 Test13 (RTS- 12.16 ,M1)   Equal

TİCARET akışının toplanan gerçek zamanlı tik geçmişi, daha sonra tarihe itilen 2016.10.04 10:37:08.773 saatine sahip bir tik içermiyordu.

Bu, yukarıdaki kelimelerle biraz tutarsız. Sorunlar sadece sentezlenmiş ALL akışında değil, aynı zamanda doğrudan - TİCARET ile de ilgilidir.

 
fxsaber :
1434 - TİCARET keneleri için aynı hata. Üreme Uzman Danışmanı
Üzgünüm, bu benim en kaba birlikteliğim.
 
fxsaber :

1434 - CopyTicks tarafından önceden indirilmiş 1000 onayın alınması ortalama 1 ms sürer. Yavaşça, bir nevi.

Daha önce alınan son onayın from_msc'sinden TRADE0tick'i istiyorum. 3 tik alıyorum, ancak 0,3 - 0,9 ms'de! - Çok yavaşladı.

Gerçek! Yine de hızlandırmak mı?

 

Bu fırsatı değerlendirerek, CopyTicks ile yapılan çalışmalar için geliştiricilere teşekkür etmek istiyorum!

CopyTicks'in kesinlikle doğru çalıştığını iddia etmeyeceğim, ancak bantla oldukça net bir şekilde çalışmayı ve CopyTicks'in kendisini daha derinden anlamayı başardım.

Tekerleği yeniden icat etmemek için, burada ve burada teybe dayalı tik göstergeleri yazmanın hata ayıklanmış örneklerini görebilirsiniz.

 
from_time'dan to_time'a keneler almak için en uygun (performans) algoritma nedir?