Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 165

 
fxsaber :

Evet, tarih okumam var.

O zaman göstergemin yavaşladığını yazdın.
Bunun nedenini buldum. 30.000 işlemlik bir hesaba yüklendiğinde.
Frenleri indirmeyi başardım. Times in 4. Tarih okumasını biraz değiştirdi ve kodu optimize etti. Ama hala oradalar. Çünkü filtreler var ve bir filtreye tıkladığınızda her şey yeniden hesaplanıyor.
Her şey dizilerden okunsa da.
5000 işlemlik hesaplarda her şey yolunda. Ama büyükler sorun.
Bu sadece o gösterge için geçerli değildir.

Temiz bir tarih okuma projesi yaptım.
Belki internettir. Sonuçta, tarih çok fazla veridir.

 

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

Kitaplıklar: Kolay Kanvas

Nikolai Semko , 2020.02.17 05:15

İlgili programcılara kanvasın test modunda nasıl çalıştığına dair önemli bir noktayı açıklamak istiyorum.
Bu toplulukta tanınmış bir programcı bana şu soruyla yaklaştı:

- Neden test modunda, nesneler üzerinde oluşturulan panel, tuvalde uygulanandan daha hızlı bir şekilde yeniden çizilirken, normal modda her şey tuvalin hızıyla uyumludur?

Anladıktan sonra, bu sorunun nedenini ve çözümünü anladım.

Gerçek şu ki, nesnelerle, tüm ekranın yeniden çizilmesiyle birlikte yeniden çizim gerçekleşir ve test cihazındaki ekran saniyede 30 kareden fazla yeniden çizilmez.

Nesneler nihayetinde aynı tuvaldir (dahili), ancak bir nesnenin özelliklerini değiştirdiğinizde, nesne tuvali oluşturulmaz (yeniden hesaplanmaz), ancak yalnızca test cihazında gerçekleşen ekran yenileme (ChartRedraw) anında oluşturulur. (ve normal modda da) gözlerimizin değişiklikleri ayırt edemediği sıklıkta değildir, yani. Saniyede ~32 kareden fazla değil.

Diyelim ki panel her tik değiştiriyor. Ardından, varsayılan test cihazında, tuval her onay işaretinde yeniden hesaplanacaktır, ancak test cihazında yeniden çizim yine de ~30 milisaniyeden (~30 kare/saniye) daha fazla gerçekleşmez.

Başka bir deyişle, tuval, ekranda görüntülendiğinden çok daha sık yeniden hesaplanacaktır, bu nedenle orantısız bir kaynak harcaması vardır.

Bu sorunun çözümü, tuvalin yeniden hesaplanmasını ve yeniden çizilmesini bilgisayar zamanının her 15-30 milisaniyesinde bir defadan fazla olmayacak şekilde kontrol etmek olacaktır, o zaman gereksiz boş yeniden hesaplama döngüleri olmayacaktır.

Örneğin şöyle:

 void OnTick ()
  {
   static uint lastCalc= 0 ;
   uint cur= GetTickCount ();
   if (cur-lastCalc> 15 ) {
    ReDrawMyCanvas();
    lastCalc=cur;
   }
  }

 
Örneğin, bir "EURUSD.txt" (büyük karakterler) dosyası oluşturmanız gerekiyorsa ve diskte zaten "eurusd.txt" (küçük karakterler) varsa, dosya adı öncekiyle aynı olacaktır.
 
fxsaber :
Örneğin, bir "EURUSD.txt" (büyük karakterler) dosyası oluşturmanız gerekiyorsa ve diskte zaten "eurusd.txt" (küçük karakterler) varsa, dosya adı öncekiyle aynı olacaktır.

Ayrıca EURUSD TicksLongOpt.set kaydettiğimde eurusd tickslongopt.set kaydediliyor. Daha sonra yeniden adlandırmanız gerekir. Ve bunun gibi birçok can sıkıcı küçük şey var.

 
Edgar Akhmadeev :

Ayrıca EURUSD TicksLongOpt.set kaydettiğimde eurusd tickslongopt.set kaydediliyor. Daha sonra yeniden adlandırmanız gerekir. Ve bunun gibi birçok can sıkıcı küçük şey var.

Bence önce silip sonra yaratırsanız, o zaman her şey yoluna girecek.

 
fxsaber :

Bence önce silip sonra yaratırsanız, o zaman her şey yoluna girecek.

Hayır, sadece terminal iletişim kutusundan kaydederken yeni bir dosya oluşturmaktan bahsediyorum. Herkeste yoksa, o zaman başka bir şeye bağlıdır. Bu arada bende Win7 var.

 
Edgar Akhmadeev :

Hayır, yeni bir dosya oluşturmaktan bahsediyorum, yani terminal iletişim kutusundan kaydederken. Herkeste yoksa, o zaman başka bir şeye bağlıdır. Bu arada bende Win7 var.

FileOpen ve FileSave işlevleri anlamına geliyordu.

 
fxsaber :

FileOpen ve FileSave işlevleri anlamına geliyordu.

Evet, ancak şimdi bunun yersiz olduğunu fark ettim, konu dille ilgili ...

 

Çalışmıyor, güncelleyebilir misiniz? Yazma şablonu bildirimlerine yerel sınıflarda TestarrSort.mq5 izin verilmez 81 3

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define ArraySortStruct(ARRAY, FIELD)                                            \
{                                                                                \
   class SORT                                                                     \
  {                                                                              \
   private :                                                                       \
     template < typename T>                                                        \
     static void Swap( T &Array[], const int i, const int j )                     \
    {                                                                            \
       const T Temp = Array[i];                                                   \
                                                                                 \
      Array[i] = Array[j];                                                       \
      Array[j] = Temp;                                                           \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
                                                                                 \
     template < typename T>                                                        \
     static int Partition( T &Array[], const int Start, const int End )           \
    {                                                                            \
       int Marker = Start;                                                        \
                                                                                 \          
       for ( int i = Start; i <= End; i++)                                         \
         if (Array[i]. ##FIELD <= Array[End]. ##FIELD)                               \
        {                                                                        \
          SORT::Swap(Array, i, Marker);                                          \
                                                                                 \
          Marker++;                                                              \
        }                                                                        \
                                                                                 \
       return (Marker - 1 );                                                       \
    }                                                                            \
                                                                                 \
     template < typename T>                                                        \
     static void QuickSort( T &Array[], const int Start, const int End )          \
    {                                                                            \
       if (Start < End)                                                           \
      {                                                                          \
         const int Pivot = Partition(Array, Start, End);                          \
                                                                                 \
        SORT::QuickSort(Array, Start, Pivot - 1 );                                \
        SORT::QuickSort(Array, Pivot + 1 , End);                                  \
      }                                                                          \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
                                                                                 \
   public :                                                                        \
     template < typename T>                                                        \ 
     static void Sort( T &Array[], int Count = WHOLE_ARRAY , const int Start = 0 ) \
    {                                                                            \
       if (Count == WHOLE_ARRAY )                                                  \
        Count = :: ArraySize (Array)- Start; ;                                     \
                                                                                 \
      SORT::QuickSort(Array, Start, Start + Count - 1 );                          \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
  };                                                                             \
                                                                                 \
  SORT::Sort(ARRAY);                                                             \
}                                                                                \


void OnStart ()
{
   MqlRates Rates[];
  
   CopyRates ( _Symbol , PERIOD_CURRENT , 0 , 5 , Rates); // Взяли бары
  
   Print ( "\nБары без сортировки - как получили." );
   ArrayPrint (Rates);
  
   Print ( "\nСортируем по open-цене." );
  ArraySortStruct(Rates, open);
   ArrayPrint (Rates);

   Print ( "\nСортируем по high-цене." );
  ArraySortStruct(Rates, high);
   ArrayPrint (Rates);

   Print ( "\nСортируем по времени." );
  ArraySortStruct(Rates, time);
   ArrayPrint (Rates);
}

 
Vladimir Pastushak :

Çalışmıyor, güncelleyebilir misiniz? Yazma şablonu bildirimlerine yerel sınıflarda TestarrSort.mq5 izin verilmez 81 3

Ne yazık ki, dilin olanakları kesildi. Bu kod çalışmıyor.

 void OnStart ()
{
   class A
  {
     template < typename T> // template declarations are not allowed in local classes
     void f() {}
  };
}


Ama bir alternatif deneyebilirsiniz.

 template < typename T>                                       
void ArrayReindex( T &Array[], const double &TmpSort[][ 2 ] )
{                         
  T TmpArray[];
  
   for ( int i = :: ArrayResize (TmpArray, :: ArrayRange (TmpSort, 0 )) - 1 ; i >= 0 ; i--)
    TmpArray[i] = Array[( int )(TmpSort[i][ 1 ] + 0.1 )];
    
  :: ArraySwap (Array, TmpArray);
              
   return ;     
}             

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define ArraySortStruct(ARRAY, FIELD)                                      \
{                                                                          \
   double TmpSort[][ 2 ];                                                     \
                                                                           \
   for ( int i =:: ArrayResize (TmpSort, :: ArraySize (ARRAY)) - 1 ; i >= 0 ; i--) \
  {                                                                        \
    TmpSort[i][ 0 ] = ( double )ARRAY[i].FIELD;                                \
    TmpSort[i][ 1 ] = i;                                                     \
  }                                                                        \
                                                                           \
  :: ArraySort (TmpSort);                                                    \
  ::ArrayReindex(ARRAY, TmpSort);                                          \
}                                         

void OnStart ()
{
   MqlRates Rates[];
  
   CopyRates ( _Symbol , PERIOD_CURRENT , 0 , 5 , Rates); // Взяли бары
  
   Print ( "\nБары без сортировки - как получили." );
   ArrayPrint (Rates);
  
   Print ( "\nСортируем по open-цене." );
  ArraySortStruct(Rates, open);
   ArrayPrint (Rates);

   Print ( "\nСортируем по high-цене." );
  ArraySortStruct(Rates, high);
   ArrayPrint (Rates);

   Print ( "\nСортируем по времени." );
  ArraySortStruct(Rates, time);
   ArrayPrint (Rates);
}


ZY İşte başka bir kullanım örneği.

Neden: