mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 134

 
구조 배열의 편리한 정렬
 #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);                                                             \
}


애플리케이션

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


결과

Бары без сортировки - как получили.
                 [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 :
구조 배열의 편리한 정렬


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

노란색은 누락된 부분을 강조 표시했습니다. 그리고 내가 보기에 인수 순서대로 먼저 시작하고 다음으로 계산하는 것이 좋습니다.

그건 그렇고, 아마도 구조 배열을 인덱스로 정렬하는 것이 더 합리적일 수 있습니다(구조 자체가 아니라 인덱스를 재정렬한다는 의미에서). 그러나 이것은 물론 구조의 크기에 따라 다릅니다.

 
Alexey Navoykov :

노란색은 누락된 부분을 강조 표시했습니다.

덕분에 놓쳤습니다.

그리고 내가 보기에 인수 순서대로 먼저 시작하고 다음으로 계산하는 것이 좋습니다.

MT4-ArraySort 에서 빌린 서명.

그건 그렇고, 아마도 구조 배열을 인덱스로 정렬하는 것이 더 합리적일 수 있습니다(구조 자체가 아니라 인덱스를 재정렬한다는 의미에서). 그러나 이것은 물론 구조의 크기에 따라 다릅니다.

이것이 가장 먼저 마음에 들었지만 거부했습니다. 왜냐하면 원본 배열과 인덱스 배열의 ArrayCopy를 사용해야 합니다. 그리고 이것은 추가입니다. 메모리. 예를 들어, 수천만 개의 MqlTick 요소에서 배열을 정렬하면 기계가 풀링되지 않을 수 있습니다.

두 가지 정렬 옵션을 포함할 수 있지만 소스 코드에는 포함하지 않았습니다. 데모에서 가장 가치 있는 것은 아마도 사용의 용이성과 구현 방법일 것입니다. 공부한 후에는 필요에 추가하고 구조가 있는 배열의 다른 기능(ArrayMaximum 등)에 대한 아날로그를 만드는 방법이 명확해집니다.

ArraySort - Операции с массивами - Справочник MQL4
ArraySort - Операции с массивами - Справочник MQL4
  • docs.mql4.com
//| Script program start function                                    |
 
fxsaber :
구조 배열의 편리한 정렬


애플리케이션


결과

#define 을 사용하지 않고 이 코드를 간단한 클래스로 어떻게 변환할 수 있습니까?

 
Vladimir Pastushak :

#define 을 사용하지 않고 이 코드를 간단한 클래스로 어떻게 변환할 수 있습니까?

안 돼요. ArraySortStruct가 어떻게 작동하는지 이해하지 못한 채 함수로 사용 된다고 가정합니다.

그들은 소스 코드를 일부 잉크루드닉에 던지고 잊어버렸습니다. 그 후, 초보자(뿐만 아니라)를 위한 정말 편리한 "기능"이 항상 가까이에 있습니다.

 
사람들, 도움말에 링크를 던져주세요. 그런 플래그가 있으면 FORTS MOEX에서 저녁(추가) 거래 세션 의 시작 시간에 플래그가 필요합니다. 그렇지 않으면 모든 것을 살펴보았지만 찾지 못했습니다. 19:00 또는 19:05에 목발 정의를 작성하고 싶습니다. 거래 세션이 열립니다
 

동일한 확률로 0에서 최대까지의 난수:

 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 :

다중 버퍼는 편집기에서 작업 속도를 높이고 안전합니다.

디스크에 아무 것도 쓰지 않고 메모리에만 데이터를 보관합니다.

어떤 등급부터 사이트에 사진을 삽입할 수 있나요?
 
Vict :

동일한 확률로 0에서 최대까지의 난수:

귀하의 기능은 다음과 100% 동일합니다.

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

왜냐하면 가장 먼저

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

단순화

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

두 번째가 되었다

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

항상 한 번 실행됩니다.

복잡성은 단순성에 대한 자세한 설명입니다. ))

 
Nikolai Semko :

귀하의 기능은 다음과 100% 동일합니다.

왜냐하면 가장 먼저

단순화

두 번째가 되었다

항상 한 번 실행됩니다.

복잡성은 단순성에 대한 자세한 설명입니다. ))

세심한 주의를 기울이고 있습니다. 감사합니다. 내가 실수를 했고, 대괄호를 넣지 않았고, "부정직한" 기능을 사용했을 것입니다.

추신: 원본 게시물을 수정했습니다.

사유: