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

 
Bir dizi yapının uygun şekilde sıralanması
 #property strict

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#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);                                              \
                                                                                 \
      SORT::QuickSort(Array, Start, Start + Count - 1 );                          \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
  };                                                                             \
                                                                                 \
  SORT::Sort(ARRAY);                                                             \
}


Başvuru

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


Sonuç

Бары без сортировки - как получили.
                 [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
[ 0 ] 2019.05 . 01 14 : 00 : 00 0.94437 0.94496 0.94420 0.94494            985        12              0
[ 1 ] 2019.05 . 01 15 : 00 : 00 0.94494 0.94512 0.94313 0.94322            2593        13              0
[ 2 ] 2019.05 . 01 16 : 00 : 00 0.94322 0.94350 0.94272 0.94272            2020        12              0
[ 3 ] 2019.05 . 01 17 : 00 : 00 0.94272 0.94439 0.94267 0.94433            3922        11              0
[ 4 ] 2019.05 . 01 18 : 00 : 00 0.94434 0.94474 0.94423 0.94437            1004        13              0

Сортируем по open-цене.
                 [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
[ 0 ] 2019.05 . 01 17 : 00 : 00 0.94272 0.94439 0.94267 0.94433            3922        11              0
[ 1 ] 2019.05 . 01 16 : 00 : 00 0.94322 0.94350 0.94272 0.94272            2020        12              0
[ 2 ] 2019.05 . 01 18 : 00 : 00 0.94434 0.94474 0.94423 0.94437            1004        13              0
[ 3 ] 2019.05 . 01 14 : 00 : 00 0.94437 0.94496 0.94420 0.94494            985        12              0
[ 4 ] 2019.05 . 01 15 : 00 : 00 0.94494 0.94512 0.94313 0.94322            2593        13              0

Сортируем по high-цене.
                 [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
[ 0 ] 2019.05 . 01 16 : 00 : 00 0.94322 0.94350 0.94272 0.94272            2020        12              0
[ 1 ] 2019.05 . 01 17 : 00 : 00 0.94272 0.94439 0.94267 0.94433            3922        11              0
[ 2 ] 2019.05 . 01 18 : 00 : 00 0.94434 0.94474 0.94423 0.94437            1004        13              0
[ 3 ] 2019.05 . 01 14 : 00 : 00 0.94437 0.94496 0.94420 0.94494            985        12              0
[ 4 ] 2019.05 . 01 15 : 00 : 00 0.94494 0.94512 0.94313 0.94322            2593        13              0

Сортируем по времени.
                 [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
[ 0 ] 2019.05 . 01 14 : 00 : 00 0.94437 0.94496 0.94420 0.94494            985        12              0
[ 1 ] 2019.05 . 01 15 : 00 : 00 0.94494 0.94512 0.94313 0.94322            2593        13              0
[ 2 ] 2019.05 . 01 16 : 00 : 00 0.94322 0.94350 0.94272 0.94272            2020        12              0
[ 3 ] 2019.05 . 01 17 : 00 : 00 0.94272 0.94439 0.94267 0.94433            3922        11              0
[ 4 ] 2019.05 . 01 18 : 00 : 00 0.94434 0.94474 0.94423 0.94437            1004        13              0
 
fxsaber :
Bir dizi yapının uygun şekilde sıralanması


       if (Count == WHOLE_ARRAY )                                                  \
        Count = :: ArraySize (Array) - Start ; 

Sarı, eksikleri vurguladı. Ve bana göründüğü gibi, argümanlar sırasına göre, önce Başlat ve sonra Say daha iyi.

Bu arada, yapı dizilerini dizinlere göre sıralamak muhtemelen daha rasyoneldir (yapıların kendilerini değil, dizinleri yeniden düzenleme anlamında), ancak bu elbette yapının boyutuna bağlıdır.

 
Alexey Navoykov :

Sarı, eksikleri vurguladı.

Teşekkürler, özledim.

Ve bana göründüğü gibi, argümanlar sırasına göre önce Başlat ve sonra Say daha iyi.

İmza, MT4-ArraySort'tan ödünç alındı.

Bu arada, yapı dizilerini dizinlere göre sıralamak muhtemelen daha rasyoneldir (yapıların kendilerini değil, dizinleri yeniden düzenleme anlamında), ancak bu elbette yapının boyutuna bağlıdır.

Aklıma ilk gelen bu oldu ama kabul etmedi. Çünkü orijinal dizinin ve dizin dizisinin ArrayCopy'sinin kullanılmasını gerektirir. Ve bu ekstra. hafıza. Ve örneğin on milyonlarca MqlTick öğesinden bir dizinin bu şekilde sıralanması, makine çekmeyebilir.

İki sıralama seçeneği eklemek mümkün olabilirdi, ancak bunları kaynak koduna dahil etmedi. Gösteride muhtemelen en değerli şey kullanım kolaylığı ve uygulama yöntemidir. Çalıştıktan sonra, ihtiyaçlarınızı nasıl ekleyeceğiniz ve yapılara sahip dizilerin diğer işlevleri için bir analog yapacağınız (ArrayMaximum, vb.) netleşir.

ArraySort - Операции с массивами - Справочник MQL4
ArraySort - Операции с массивами - Справочник MQL4
  • docs.mql4.com
//| Script program start function                                    |
 

#define kullanmadan bu kodu nasıl basit bir sınıfa dönüştürebilirim?

 
Vladimir Pastushak :

#define kullanmadan bu kodu nasıl basit bir sınıfa dönüştürebilirim?

Mümkün değil. ArraySortStruct'un nasıl çalıştığını anlamadan bir fonksiyon olarak kullanıldığı varsayılır.

Kaynak kodunu biraz inkludnik'e attılar ve unuttular. Bundan sonra, herhangi bir yeni başlayan (ve sadece değil) için gerçekten uygun bir "işlev" her zaman elinizin altında.

 
millet, yardıma bir bağlantı atın eğer böyle bir bayrak varsa, FORTS MOEX'te akşam (ek) işlem seansının açılış saati için bir bayrağa ihtiyacınız var, aksi takdirde her şeye baktım ama bulamadım, yok' 19:00 veya 19:05'te koltuk değneği tanımı yazmak istiyorsanız, işlem seansı açılacaktır
 

Eşit olasılıkla 0'dan maksimuma rastgele sayı:

 uint get_rand( uint max)
{
   static bool f = false ;
   if ( ! f ) {
      f = true ;
       srand ( GetTickCount ());
   }  
   uint limit = (max+ 1 ) * ( ( 32767 + 1 ) / (max+ 1 ));
   uint val;
   while ((val = rand ()) >= limit);
   return val % (max+ 1 );
}
 
Renat Fatkhullin :

Multibuffer, editördeki işi hızlandırır ve güvenlidir.

Diske hiçbir şey yazmaz ve yalnızca verileri bellekte tutar.

Hangi puandan başlayarak siteye resim ekleyebilirim?
 
Vict :

Eşit olasılıkla 0'dan maksimuma rastgele sayı:

İşleviniz aşağıdakilere %100 eşdeğerdir:

 uint get_rand( uint max)
  {
   static bool f = true ;
   if (f) {f = ~f; srand ( GetTickCount ());} 
   return rand () % (max+ 1 );
  }

çünkü Her şeyden önce

 uint limit = (max+ 1 ) * ( 32767 + 1 / (max+ 1 ));

basitleştirilmiş

 uint limit = (max+ 1 ) * 32767 + 1 ; // т.е. при даже max=0 limit =32768

ikinci oldu

 while ((val = rand ()) >= limit);

her zaman bir kez yürütülür.

Karmaşıklık, basitliğin ayrıntılı bir ifadesidir. ))

 
Nikolai Semko :

İşleviniz aşağıdakilere %100 eşdeğerdir:

çünkü Her şeyden önce

basitleştirilmiş

ikinci oldu

her zaman bir kez yürütülür.

Karmaşıklık, basitliğin ayrıntılı bir ifadesidir. ))

Çok dikkatlisiniz, teşekkürler. Bir hata yaptım, parantez koymadım ve "dürüst olmayan" işlevini kullanırdım.

Not: orijinal gönderiyi düzenledi.