"CopyTicks"in Test Edilmesi - sayfa 18

 
fxsaber :
YALNIZCA bant gerekliyse (COPY_TICKS_TRADE - time_msc, last, volume ve flags), bu çözüm tamamen uygundur - hiçbir hata bulunamadı.
Nikrom uymuyor! Bir bug daha keşfedildi

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

Gizemli hisse senedi göstergesi

fxsaber , 2016.09.27 18:32

Görünüşe göre, CopyTicks'teki girdi sıfır olmadığında tüm frenler.

Son çağrıdan bu yana onaylar istense bile, bu modda CopyTicks'in çok çarpık bir uygulaması gibi görünüyor. Uçması gerekiyor gibi görünüyor, ama hayır.

 
Onaylar ve DOM güncellemelerinde bir dizi iyileştirme yaptığımız bu hafta betayı bekleyin.
 
Renat Fatkhullin :
Onaylar ve DOM güncellemelerinde bir dizi iyileştirme yaptığımız bu hafta betayı bekleyin.
1432 - birçok hata çözüldü. Teşekkür ederim!
 
fxsaber :
1432 - birçok hata çözüldü. Teşekkür ederim!

Fakat hepsi değil.

Eklenen geçmiş, gerçek olanla karşılaştırılırsa, COPY_TICKS_ALL modunda tutarsızlıklar var (TİCARET ve BİLGİ - sorun değil). danışman

 #include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

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));
}

// Дописывает свежие тики после предыдущего запуска
int AddFreshTicks( MqlTick &Ticks[], const string Symb = NULL , const uint flags = COPY_TICKS_ALL )
{
   int Res = 0 ;
   const int Amount = ArraySize (Ticks);
  
   MqlTick NewTicks[];  
   const int NewAmount = (Amount == 0 ) ? CopyTicks ((Symb == NULL )? Symbol () : Symb, NewTicks, flags, ( ulong )( TimeCurrent () - 100) * 1000 ) :
                                         CopyTicks ((Symb == NULL )? Symbol () : Symb, NewTicks, flags, Ticks[Amount - 1 ].time_msc);
  
   if (NewAmount > 0 )
  {
     if (Amount > 0 )
    {
       // Взяли крайнее время из предыдущей истории
       const long LastTime = Ticks[Amount - 1 ].time_msc;
      
       int Count = 1 ;
      
       // Находим (Count) в предыдушей истории количество тиков со временем LastTime
       for ( int i = Amount - 2 ; i >= 0 ; i--)
      {
         if (Ticks[i].time_msc < LastTime)
           break ;
          
        Count++;
      }

       if ((Count < Amount) && (Count < NewAmount))      
        Res = ArrayCopy (Ticks, NewTicks, Amount, Count);
    }
     else
      Res = ArrayCopy (Ticks, NewTicks);
  }
  
   return (Res);
}

#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" );
        
        Res = false ;

         break ;
      }

   return (Res);
}

void OnTick ( void )
{
 static MqlTick PrevTicks[];
  
   // Дописываем свежие тики после предыдущего вызова
  AddFreshTicks(PrevTicks, _Symbol , COPY_TICKS_ALL );
  
   MqlTick Ticks[];
  
   if ( ArraySize (PrevTicks) > 0 )
  {
     // Взяли историю тиков
     Print ( CopyTicks ( _Symbol , Ticks, COPY_TICKS_ALL , PrevTicks[ 0 ].time_msc, 100000 ));
    
     // Проверка на совпадение собираемой истории с самой историей
     Print (ArrayEqual(Ticks, PrevTicks) ? "Equal" : "Not Equal" );
  }
}

Sonuç

 2016.09 . 29 10 : 36 : 23.722 Test10 (Si- 12.16 ,M1)    Not Equal
2016.09 . 29 10 : 36 : 23.722 Test10 (Si- 12.16 ,M1)    
2016.09 . 29 10 : 36 : 23.722 Test10 (Si- 12.16 ,M1)    TickToString(Array2[i]) =  time = 2016.09 . 29 10 : 36 : 20.547 bid = 64353.0 ask = 64354.0 last = 64353.0 volume = 4 TICK_FLAG_BID 
2016.09 . 29 10 : 36 : 23.722 Test10 (Si- 12.16 ,M1)    TickToString(Array1[i]) =  time = 2016.09 . 29 10 : 36 : 20.546 bid = 64353.0 ask = 64354.0 last = 64353.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL 
2016.09 . 29 10 : 36 : 23.722 Test10 (Si- 12.16 ,M1)    i = 57 ArraySize (Array1) = 59 ArraySize (Array2) = 58 
2016.09 . 29 10 : 36 : 23.722 Test10 (Si- 12.16 ,M1)     59
 
fxsaber :

Fakat hepsi değil.

Eklenen geçmiş gerçek olanla karşılaştırılırsa, COPY_TICKS_ALL modunda tutarsızlıklar var (TİCARET ve BİLGİ - sorun değil). danışman

Sonuç

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ı

 2016.09 . 29 11 : 05 : 58.724 Test10 (Si- 12.16 ,M1)     2 :  time = 2016.09 . 29 11 : 05 : 55.580 bid = 64380.0 ask = 64382.0 last = 64381.0 volume = 4 TICK_FLAG_BID TICK_FLAG_ASK
2016.09 . 29 11 : 05 : 58.724 Test10 (Si- 12.16 ,M1)     1 :  time = 2016.09 . 29 11 : 05 : 55.576 bid = 64379.0 ask = 64381.0 last = 64381.0 volume = 4 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY
2016.09 . 29 11 : 05 : 58.724 Test10 (Si- 12.16 ,M1)     0 :  time = 2016.09 . 29 11 : 05 : 55.564 bid = 64379.0 ask = 64381.0 last = 64380.0 volume = 1 TICK_FLAG_BID TICK_FLAG_ASK

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

 2016.09 . 29 11 : 05 : 58.732 Test10 (Si- 12.16 ,M1)    time = 2016.09 . 29 11 : 05 : 55.579 bid = 64380.0 ask = 64382.0 last = 64381.0 volume = 16 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY 

İşte böyle bir hata!

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

 
Artık tüm COPY_TICKS_* modlarında başka bir hata

Kene geçmişini parçalar halinde toplarsanız, gerçek tarihle örtüşmeyebileceği ortaya çıkıyor. Danışman onu gösteriyor.

 #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 ( ArrayResize (Ticks, Res));
}

// Сравнение двух массивов
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
      {
        Res = false ;
        
         ExpertRemove ();

         break ;
      }

   return (Res);
}

void OnTick ()
{
   // возьмем тики с начала утренней сессии
  Count = 0 ;
  LastTime = ( TimeCurrent () - ( TimeCurrent () % ( 24 * 3600 ))) * 1000 ;
  
   MqlTick Ticks[];     // История, собранная по частям
   MqlTick NewTicks[]; // массив для следующей части тиков
  
   // Собираем историю по частям  
   while (GetFreshTicks(NewTicks, COPY_TICKS_TRADE , 100000 ) > 0 )
     ArrayCopy (Ticks, NewTicks, ArraySize (Ticks));
    
   if ( ArraySize (Ticks) > 0 )    
  {
     // Взяли ВСЮ историю тиков
     Print ( CopyTicks ( _Symbol , NewTicks, COPY_TICKS_TRADE , Ticks[ 0 ].time_msc, 10000000 )); // 10000000 - большое число, чтобы все выкачать.
    
     // Проверка на совпадение собранной по частям истории с самой историей
     Print (ArrayEqual(NewTicks, Ticks) ? "Equal" : "Not Equal" );
  }    
}

Sonuç

 2016.09 . 30 16 : 02 : 54.661 Test (Si- 12.16 ,M1)      Not Equal
2016.09 . 30 16 : 02 : 54.661 Test (Si- 12.16 ,M1)       ExpertRemove () function called
2016.09 . 30 16 : 02 : 54.621 Test (Si- 12.16 ,M1)       333740
2016.09 . 30 16 : 02 : 54.121 Test (Si- 12.16 ,M1)      Equal
2016.09 . 30 16 : 02 : 54.071 Test (Si- 12.16 ,M1)       333736
2016.09 . 30 16 : 02 : 53.791 Test (Si- 12.16 ,M1)      Equal
2016.09 . 30 16 : 02 : 53.741 Test (Si- 12.16 ,M1)       333723

Bu EA hala zayıf bir hata gösteriyor. Parçalar halinde toplanan tarihte, parçaların eksik olabileceğini ve birkaç dakika sürebileceğini öğrendim. Kod şeklinde sadece özlü ve anlaşılır bir çoğaltma ile gelmedim. Ve zor olanı ortaya koymak - mantıklı değil çünkü. kimse bakmayacak bile.

Genel olarak, CopyTicks hatalarını yenmenin bir yolu yoktur. Ve EA'nın bant modunda (COPY_TICKS_TRADE) çalıştığını unutmayın. Onlar. Bir bantla bile çalışmak imkansızdır.


 
fxsaber :
Artık tüm COPY_TICKS_* modlarında başka bir hata

Hem belirli bir andan başlayarak hem de belirli, örneğin sabit bir miktarda kene almaya çalıştınız mı?

Koddan, son andan itibaren belirli bir miktar (100000) gibi görünüyor. Ve eğer sadece N kene alırsanız. Geçişler olacak mı?

Hemen söylemeliyim ki, kendim şimdiye kadar tiklerle fazla denemedim ...

 
Alexey Kozitsyn :

Hem belirli bir andan başlayarak hem de belirli, örneğin sabit bir miktarda kene almaya çalıştınız mı?

Koddan, son andan itibaren belirli bir miktar (100000) gibi görünüyor. Ve eğer sadece N tik alırsanız. Geçişler olacak mı?

Hemen söylemeliyim ki, kendim şimdiye kadar tiklerle fazla denemedim ...

Sınanmış.

Bugün demoda yeni bir yapı vaat ediyorlar. Yani beklerken.

 
fxsaber :

Sınanmış.

Bugün demoda yeni bir yapı vaat ediyorlar. Yani beklerken.

Umarım CopyTicks() düzeltilir.

Bu arada, CopyTicks()'in ortaya çıkışından bu yana, geliştiriciler geliştiricilerden diğer Copy...() işlevleri gibi işlev aşırı yüklemeleri eklemelerini istiyor. Ekleyeceklerini söylediler. Ve sessizlik...

 
Alexey Kozitsyn :

Bu arada, CopyTicks()'in ortaya çıkışından bu yana geliştiriciler, geliştiricilerden diğer Copy...() işlevleri gibi aşırı işlev yüklemeleri eklemelerini istiyor. Ekleyeceklerini söylediler. Ve sessizlik...

Herhangi bir aşırı yükü kendiniz ekleyebilirsiniz.