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

 
fxsaber #:

숫자 필드를 정렬에 사용하는 특정 경우(가장 일반적인 상황)를 위해 이전보다 몇 배나 빠른 변형을 작성했습니다. 하지만 메모리를 두 배나 많이 소비합니다. 이는 대규모 배열과 관련이 있습니다.


애플리케이션(실행 시간 측정 포함).


결과.

이 옵션에 대해 어떻게 생각하시나요?

#include <QuickSort.mqh>

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279
#define _BV2(A) _BV(A, 100) // Алертим все, что исполняется дольше 100 микросекунд.

struct STRUCT : public MqlTick
{
  double Num;
};

typedef bool (*FuncLess)( const STRUCT&, const STRUCT& );

bool Less( const STRUCT& struct1, const STRUCT& struct2 )
{
   return struct1.Num < struct2.Num;
}

void function1( STRUCT& array[] )
{
   QuickSort< STRUCT, FuncLess >( array, Less );
}

void OnStart()
{
  STRUCT Array[];
  
  const int Size = ArrayResize(Array, 1 e5);
  
  for (int i = Size - 1; i >= 0; i--)
    Array[i].Num = Size - i;
    
//  _BV2(ArraySortStruct(Array, Num));
//  _BV2(ArraySortStruct2(Array, Num));
  
  _BV2( function1( Array ) );
  
}
 
Koldun Zloy #:

이건 어때요?

테스트할 수 없습니다.

 
fxsaber #:

확인하지 마세요.

퀵소트 라이브러리는 여기

Быстрая сортировка.
Быстрая сортировка.
  • www.mql5.com
Функции для сортировки массивов. Позволяют сортировать строки и структуры по любому условию.
 
Koldun Zloy #:

QuickSort 라이브러리는 여기에 있습니다.

고마워요, 아주 좋은 옵션입니다! 저도 퀵소트가 있는 것 같지만 어떤 이유에서인지 속도가 매우 느립니다.


이 옵션을 매크로로 감싸서 더 빠르게 사용할 수 있다면...

 
fxsaber #:

고마워요, 아주 좋은 옵션입니다! 저도 퀵소트가 있는 것 같지만 어떤 이유에서인지 브레이크가 거칠어요.


옵션을 매크로로 감싸서 더 빠르게 사용할 수 있습니다....

매크로가 왜 필요한지 모르겠네요. 매우 간단합니다.

 

C에서 다음과 같이 보이는 것을 올바르게 포맷하는 방법:

int sort(void *arr,size_t isize,size_t size, int (*cmp)(void *item1,void *item2)); /// типовой прототип sort с функцией сравнения

???

템플릿을 정렬하려고 합니다:

template <typename T>

int sort(T &arr[],int (*cmp)(const T &,const T&))
{ {

}

는 작동하지 않습니다. 인자에 함수 포인터를 넣을 수 없기 때문입니다. 별도의 typedef가 있어야 합니다.

가 있어야 하지만 typedef는 템플릿이 될 수 없습니다(또는 될 수 있나요??).

매크로는 이러한 문제에서 비롯된 것입니다 :-)

 
Maxim Kuznetsov #:

C에서 이와 같은 형식을 올바르게 지정하는 방법을 알아보세요:

int sort(void *arr,size_t isize,size_t size, int (*cmp)(void *item1,void *item2)); /// типовой прототип sort с функцией сравнения

???

템플릿을 사용하려고 합니다:

실패 - 인자에 함수 포인터를 넣을 수 없습니다. 별도의 typedef

가 있어야 하지만 typedef는 템플릿이 될 수 없습니다(또는 될 수 있나요??) ....

매크로는 이러한 문제에서 비롯된 것입니다 :-)

template <typename T> struct SORT
  {
   typedef int       (*cmp)(const T &, const T&);
   static  int       Do(T &arr[], cmp) {return 0;}
  };

int SortInt(const int &, const int &) {return 0;}

void OnStart()
  {
   int arr[];
   SORT<int>::Do(arr, SortInt);
  }
 

MQL(및 C++)에서 명확하지 않은 기능을 발견했습니다.

class C1
  {
public:
   virtual void      f1(int p = 1) {Print(p);}
  };
class C2: public C1
  {
public:
   virtual  void     f1(int p = 2) {Print(p);}
  };

void OnStart()
  {
   C2 obj;
   C1 *p = &obj;
   p.f1();        //Prints "1"
  }

즉, 메서드 호출 시점(p.f1())에서 기본값이 매개변수(p)로 치환되고 이 값은 객체의 실제 유형이 아닌 선언된 유형인 변수 ptr의 클래스 C1의 메서드 설명에서 가져온다는 것입니다.

(일반적으로 논리적입니다).

 

트레이딩, 자동매매 시스템 및 트레이딩 전략 테스트 포럼

오류, 버그, 질문

안드레이 딕, 2022.06.24 08:38

MQL_VISUAL_MODE는 MQL_TESTER의 특수한 경우인가요?

MQL_OPTIMIZATION은 MQL_TESTER의 특수한 경우인가요 ?

내 말은, MQL_TESTER에는 MQL_VISUAL_MODE와 MQL_OPTIMIZATION이 모두 포함되나요 ?

차트에서 작업하고 시각적 모드에서 작업 할 때 EA가 일부 작업을 수행해야하지만 다른 모든 경우에는 그렇지 않습니다. MQLInfoInteger ()를 확인할 때이 경우에 적합한 플래그를 선택하는 방법을 알 수 없습니까?

예를 들어 다음과 같이 매우 간단하게 할 수 있습니다:

if (MQLInfoInteger(MQL_VISUAL_MODE) || MQLInfoInteger(MQL_CHART_MODE))

{

  //выполняем некоторые действия

}

하지만 MQL_CHART_MODE 플래그는 mql5에서 제공되지 않습니다.


누구든지 생각이 있으신가요?

 
Andrey Dik #:

의견 있으신 분?

if (ChartID()!=0) {

    // Graphical chart presents
    // draws on it

}