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

 
fxsaber # :

기능(서브필드 및 메소드)과 편리한 사용법을 유지하는 방법을 모르겠습니다. 아마도 이 옵션이 귀하의 필요에 맞을 것입니다.


애플리케이션.

그것은 매우 빨랐고 지금은 잘 작동합니다. 감사합니다!


사랑으로 러시아로❤️! ;-)

 
MQL5에서는 이러한 매크로를 작성하는 것이 쉬웠습니다.
 class MqlRatestime
{
public :
   static void f( MqlRates &Value ) { Print (Value.time); }
};

class MqlTicktime
{
public :
   static void f( MqlTick &Value ) { Print (Value.time); }
};

void OnStart ()
{  
   MqlRates Rates;
   MqlTick Tick;
  
  MACROS(Rates, time); // MqlRatestime::f(Rates);
  MACROS(Tick, time);   // MqlTicktime::f(Tick);
}


현재 버전의 MQL5에서 가능한가요? 나는 이 장애물을 극복할 수 있는 능력이 부족했습니다.

 template declarations are allowed on global, namespace or class scope only
 
fxsaber # :
MQL5에서는 이러한 매크로를 작성하는 것이 쉬웠습니다.


현재 버전의 MQL5에서 이것이 가능합니까? 나는 이 장애물을 극복할 수 있는 능력이 부족했습니다.

작업을 이해하지 못했습니다. 매크로 대체 내에서 MqlRatestime 클래스(템플릿)를 선언해야 합니까?
 
mktr8591 # :
작업을 이해하지 못했습니다. 매크로 대체 내에서 MqlRatestime 클래스(템플릿)를 선언해야 합니까?
다른 유형의 매개변수에 대해 다른 매크로 대체가 필요한 것 같습니다.
왜 이것이 함수 오버로딩이 아닌 매크로 대체로 수행되어야 하는지 이해할 수 없습니다.
 
mktr8591 # :
작업을 이해하지 못했습니다. 매크로 대체 내에서 MqlRatestime 클래스(템플릿)를 선언해야 합니까?

아니요, 클래스는 이미 선언되었습니다. 주석은 원하는 결과를 나타냅니다. 매크로에 대한 입력은 개체이고 출력은 이 개체의 유형 이름을 포함하는 클래스라고 합니다.

 
Sergey Gridnev # :
다른 유형의 매개변수에 대해 다른 매크로 대체가 필요한 것 같습니다.
왜 이것이 함수 오버로딩이 아닌 매크로 대체로 수행되어야 하는지 이해할 수 없습니다.

작업은 이것 에서 태어났습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

mql5 언어의 특징, 미묘함 및 작업 방법

fxsaber , 2022.02.11 15:44

ArraySortStruct_Define( MqlRates , open)
ArraySortStruct_Define( MqlRates , high)
ArraySortStruct_Define( MqlRates , time)

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

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

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

유형을 지정해야 하는 입력 매개변수를 강조 표시했습니다. 그 결과 매크로에 3개의 입력이 생성됩니다. 그리고 나는 유형이없는 두 가지를 원합니다.

 
fxsaber # :

아니요, 클래스는 이미 선언되었습니다. 주석은 원하는 결과를 나타냅니다. 매크로에 대한 입력은 개체이고 출력은 이 개체의 유형 이름을 포함하는 클래스라고 합니다.

이 문제를 해결하는 방법을 모르겠습니다.

그리고 두 개의 매개변수가 있는 ArraySortStruct에 대해 - 작동 방식은 다음과 같습니다.

 #define ArraySortStruct(ARRAY, FIELD) SortOnField_ ##FIELD::SORT::Sort(ARRAY)

ArraySortStruct_Define(SortOnField_, open)
ArraySortStruct_Define(SortOnField_, high)
ArraySortStruct_Define(SortOnField_, time)


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);
  }
 
mktr8591 # :

그리고 두 개의 매개변수가 있는 ArraySortStruct에 대해 - 작동 방식은 다음과 같습니다.

당신이 맞습니다, 감사합니다! 나는 갑자기 그것을 과장했다. 정렬 옵션은 남겨두겠습니다.

 // Сортировка массива структур и указателей на объекты по полю.
#define ArraySortStruct_Define(FIELD)                                            \
namespace SortOnField_ ##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 ;                                                                    \
    }                                                                            \
  };                                                                             \
}

#define ArraySortStruct(ARRAY, FIELD) SortOnField_ ##FIELD::SORT::Sort(ARRAY)


애플리케이션.

 ArraySortStruct_Define(open)
ArraySortStruct_Define(high)
ArraySortStruct_Define(time)

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 아쉽지만 서브필드나 방식으로는 불가능하다.

 
이것은 누군가에게는 새로운 소식이 아닐 수도 있지만 나에게는 놀라운 일이었습니다.
DLL이 다른 MT5 프로그램에서 동시에 사용되는 경우
그런 다음 그것을 사용하는 첫 번째 실행 프로그램에 의해 한 번 로드된다는 점을 명심하십시오.
즉, DLL 환경은 가져오기 횟수에 관계없이 하나의 공통 프로세스에 있습니다.
점은 무엇인가? DLL에서 사용하는 전역 포인터가 하나의 공통 프로세스 공간에 있다는 사실.
그리고 그것은 매우 편리합니다.
 
Roman # :
이것은 누군가에게는 새로운 소식이 아닐 수도 있지만 나에게는 놀라운 일이었습니다.
DLL이 다른 MT5 프로그램에서 동시에 사용되는 경우
그런 다음 그것을 사용하는 첫 번째 실행 프로그램에 의해 한 번 로드된다는 점을 명심하십시오.
즉, DLL을 가져오는 횟수에 관계없이 DLL의 상태는 하나의 공유 프로세스에 있습니다.
점은 무엇인가? DLL에서 사용하는 전역 포인터가 하나의 공통 프로세스 공간에 있다는 사실.
그리고 그것은 매우 편리합니다.

이것은 뉴스가 아니며 항상 태어날 때부터 그렇게 작동합니다.

데이터가 __atomic__보다 큰 경우에만 중요 섹션(또는 std::thread 터미널의 뮤텍스)으로 데이터에 액세스/보호해야 합니다.