"CopyTicks"in Test Edilmesi - sayfa 41

 
CopyTicksRange istenen tüm onay işaretlerini doğru şekilde döndürdüğünde bir hatayla karşılaştım, ancak LastError == ERR_HISTORY_TIMEOUT(4403).


 
fxsaber :

tkc dosyaları aya göre ayrılmıştır. Bununla ilgili sorular

  1. Kene verileri henüz terminale indirilmemişse, CopyTicks çağrıldığında, terminal hangi tkc dosyalarının çekileceğini nasıl bilebilir?
Mevcut olandan başlayarak her ay çeker.
  1. CopyTicksRange, CopyTicks'i temel alıyor mu yoksa bağımsız mı?
CopyTicks'e dayalı, yani. hiç optimize edilmemiş.
  1. Örneğin, Eylül ayı için onay almanın CopyTicksRange kullanmanın CopyTicks kullanmaktan her zaman daha hızlı olacağını doğru anlıyor muyum? CopyTicks, giriş parametreleri aracılığıyla hangi ay verilerinin çekilmesi gerektiğini bilmiyor mu?

Hayır, CopyTicksRange yukarıdaki nokta nedeniyle aynı derecede yavaş olacaktır. İşte CopyTicksRange'ın mevcut uygulamasının bazı saçmalıklarını gösteren bir komut dosyası

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

void OnStart ()
{  
  
   MqlTick Ticks[];
  
   ResetLastError ();
  
   Print ( __FUNCTION__ );
   Print (TOSTRING( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_ALL , 1 , 2 )));
   Print (TOSTRING( _LastError ));
}

Hangi tkc dosyalarının çekilmesi gerektiğine dair bilgiler açıkça verilmiş gibi görünüyor. Ama hayır, CopyTicks ile aynı şekilde çekecektir - tüm tkc dosyaları. Ve zaman aşımı üzerinde çalışmayı bırakın. Her ne kadar aslında neredeyse anında çalışması gerekirdi.

  1. Göstergedeki geçmişi mümkün olan en kısa sürede almanız gerekir. CopyTicksRange üzerinden istekte bulunmak ve her şey indirilene kadar -1 şeklinde bir yumruk almak mümkündür. Ve aya göre sorarsanız: şimdiki, sonra önceki, vb. Daha yavaş olmayacak, ancak aynı zamanda gösterge en azından bir miktar geçmişle çalışmaya hazır olacak. Doğru?

Görüldüğü gibi fark yok (yukarıdaki paragraflara bakın).

 

CopyTicks, UninitializeReason != REASON_CHARTCHANGE olduğunda OnDeinit'te çalışmaz

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

void TickTest()
{
   MqlTick Ticks[];

   ResetLastError ();
   Print (TOSTRING( CopyTicks ( _Symbol , Ticks)));
   Print (TOSTRING( _LastError ));
}

void OnInit ()
{
   Print ( "\n" + __FUNCTION__ );
  
  TickTest();
}

void OnDeinit ( const int )
{
   Print ( "\n" + __FUNCTION__ );
   Print (TOSTRING( UninitializeReason ()));
  
  TickTest();
}


Sonuç (uzmanın çıkarılmasından sonra)

 OnInit
CopyTicks ( _Symbol ,Ticks) = 2000
_LastError = 0

OnDeinit
UninitializeReason () = 1
CopyTicks ( _Symbol ,Ticks) = - 1
_LastError = 4401


Tehdit Bu danışmanlarda olur. Göstergelerde, OnDeinit'teki CopyTicks iyi çalışıyor.

 
Bir hesabı ( başka bir ticaret sunucusu ) değiştirirken , eski hesabın son 2000 kenesini bir dosyaya yazmanız gerekir. Nasıl yapılır?


bu işe yaramayacak

 void OnDeinit ( const int )
{
   MqlTick Ticks[];

   CopyTicks ( _Symbol , Ticks); // Если была смена торгового сервера, то БД-тиков поменялась

   FileSave ( __FILE__ , Ticks);
}


Hesabı değiştirmeden önce, işleme sırasında (OnChartEvent'te) tüm ticaret ortamının henüz yenisine geçmediği CHARTEVENT_ACCOUNTCLOSING olayını oluşturmanızı rica ediyorum.

 
fxsaber :
Bir hesabı ( başka bir ticaret sunucusu ) değiştirirken , eski hesabın son 2000 kenesini bir dosyaya yazmanız gerekir. Nasıl yapılır?


bu işe yaramayacak


Bir hesabı değiştirmeden önce, lütfen işleme sırasında (OnChartEvent'te) tüm ticaret ortamının yenisine geçmediği CHARTEVENT_ACCOUNTCLOSING olayını oluşturun.

Zihne göre, aynı Windows'ta yapıldığı gibi geri bildirim eklemek gerekli olacaktır.

Bir grafikte (veya grafik dışı) olayda bir bayrak şeklinde, ayarlandığında olayın kendisi (bu durumda hesap değiştirme) iptal edilir.

 

Kesin olsun, ancak durum düzeldi, hatalar hakkında düzinelerce rapor düzeltildi ve bu CopyTicks ile yenileri görünmeye ve görünmeye devam ediyor.

Böyle şakalardan bıktım

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

void OnStart ()
{
   MqlTick Ticks[];

   if ( CopyTicks ( _Symbol , Ticks, COPY_TICKS_ALL , 0 , 131072 + 1 ) > 0 ) // Если прибавлять не единицу, а ноль, то все будет работать
  {
     const ulong BeginTime = Ticks[ 0 ].time_msc;
    
     Print (TOSTRING( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_INFO , BeginTime, LONG_MAX )));
     Print (TOSTRING( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_INFO , BeginTime, ( TimeCurrent () + 1 ) * 1000 )));
  }
}


Sonuç

 CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_INFO ,BeginTime, LONG_MAX ) = 0
CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_INFO ,BeginTime,( TimeCurrent ()+ 1 )* 1000 ) = 131073


Üniteyi kaynaktan çıkarma

 CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_INFO ,BeginTime, LONG_MAX ) = 131072
CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_INFO ,BeginTime,( TimeCurrent ()+ 1 )* 1000 ) = 131072


Farklı sembollerde ve ticaret sunucularında oynanabilir. İzin gününde kontrol edildi - tırnak işaretleri duruyor.


Bu konudaki hataları ne zaman yeneceğiz?

 

Gerçekten de, dilde böyle ilginç bir özellik, güdük güvertesinde çalışır ...

Bir soru. Semboller menüsü aracılığıyla kulplu keneler (685.007 adet) yüklendi. 2016.11.01 00:00'dan 2016.11.08 00 :00'a kadar EURUSD'ye ihtiyacım var. İşte bir ekran görüntüsü.



Programlı olarak şöyle soruyorum:

 void OnStart ()
  {
   string symbol= "EURUSD" ;
   MqlTick ticks_array[];
   uint flags= COPY_TICKS_INFO ;
   ulong from_msc,to_msc;
   from_msc=( ulong ) D'01.11.2016 00:00' ;
   to_msc=( ulong ) D'08.11.2016 00:00' ;
//--- получить тики - 20 попыток
   for ( int att= 0 ;att< 20 ;att++)
     {
       int copied= CopyTicksRange (symbol,ticks_array,flags,from_msc,to_msc);
       if (copied> 0 )
         break ;
       Sleep ( 100 );
     }
//--- остановка
   DebugBreak ();
  }


Çıktı 0. Sorun ne?

 
Dennis Kirichenko :

Çıktı 0. Sorun ne?

1000 ile ve ile çarpın.

 
fxsaber :

1000 ile ve ile çarpın.


Kahretsin, ayıp, bildirdi. Teşekkür ederim.

 
Bu CopyTicksRange hatasını yerelleştirmek için çok zaman kaybettim


 template < typename T>
T MyPrint( const T Value, const string Str )
{
   static const bool IsDebug = MQLInfoInteger ( MQL_DEBUG );

//  if (IsDebug)
  {
//    DebugBreak(); // если хочется посмотреть средствами дебага

     Print (Str + " = " + ( string )Value);
  }
  
   return (Value);
}

#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + ( string ) __LINE__ + ": " + #A)

int GetSymbolTicks( const string Symb, MqlTick &Ticks[] )
{
   const bool Selected = SymbolInfoInteger (Symb, SYMBOL_SELECT );

   const int Amount = SymbolInfoInteger (Symb, SYMBOL_CUSTOM ) && (Selected || SymbolSelect (Symb, true )) ? _P( CopyTicksRange (Symb, Ticks, COPY_TICKS_INFO )) : - 1 ; // здесь баг!
  
   if (!Selected)
     SymbolSelect (Symb, false );

   return (Amount);
}

bool TicksToSymbol( const string Symb, const MqlTick &Ticks[] )
{
   const int Size = ArraySize (Ticks);
  
   CustomTicksDelete (Symb, Ticks[ 0 ].time_msc, Ticks[Size - 1 ].time_msc);
  
   return (Size ? (_P( CustomTicksReplace (Symb, Ticks[ 0 ].time_msc, Ticks[Size - 1 ].time_msc, Ticks)) > 0 ) : false );
}

void OnStart ()
{
   MqlTick Ticks[];
    
   if ( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_INFO , D'2017.12.01' * 1000 , ( TimeCurrent () + 1 ) * 1000 ) > 100 ) // Если поставить сегодня - D'2017.12.05', то баг не проявится
  {
     ArrayResize (Ticks, 100 );
    
     static const string Name = _Symbol + "_Custom" ;
    
     CustomSymbolDelete (Name);
    
     if ( CustomSymbolCreate (Name) && CustomSymbolSetInteger (Name, SYMBOL_DIGITS , _Digits ))
    {    
      TicksToSymbol(Name, Ticks);
    
       MqlTick Ticks2[];
      
      GetSymbolTicks(Name, Ticks2);
    }

     CustomSymbolDelete (Name);
  }
}

EURUSD M1 MetaQuotes-Demo'daki ilk çalıştırmadan sonra doğru sonuca sahibiz

 bool TicksToSymbol( const string , const MqlTick &[]), Line = 36 : CustomTicksReplace (Symb,Ticks[ 0 ].time_msc,Ticks[Size- 1 ].time_msc,Ticks) = 100
int GetSymbolTicks( const string , MqlTick &[]), Line = 22 : CopyTicksRange (Symb,Ticks, COPY_TICKS_INFO ) = 100


Sonraki tüm başlatmalar hatayı gösterecek

 bool TicksToSymbol( const string , const MqlTick &[]), Line = 36 : CustomTicksReplace (Symb,Ticks[ 0 ].time_msc,Ticks[Size- 1 ].time_msc,Ticks) = 100
int GetSymbolTicks( const string , MqlTick &[]), Line = 22 : CopyTicksRange (Symb,Ticks, COPY_TICKS_INFO ) = 0


Terminali yeniden başlattıktan sonra durum kendini tekrar edecek: ilk başlatma mükemmel, sonrakiler bir hata.


PS Kaynakta vurgulanan yoruma dikkat edin!