Особенности языка 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, 1e5);
  
  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 #:

Не проверить.

Библиотека QuickSort здесь

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

Библиотека QuickSort здесь

Спасибо, очень хороший вариант! Вроде, у меня тоже QuickSort, но по какой-то причине дикие тормоза.


Ваш бы вариант как-нибудь в макросы обернуть дополнительно, чтобы быстрее пользоваться...

 
fxsaber #:

Спасибо, очень хороший вариант! Вроде, у меня тоже QuickSort, но по какой-то причине дикие тормоза.


Ваш бы вариант как-нибудь в макросы обернуть дополнительно, чтобы быстрее пользоваться...

Не представляю, зачем тут макросы. И так всё очень просто.

 

как правильно оформить то что на 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) значения по умолчанию производится в точке вызова метода (p.f1()) и это значение берется из описания метода в классе C1 - объявленном типе переменной ptr, а не реальном типе объекта obj.

(Что, в общем-то, логично).

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Andrey Dik, 2022.06.24 08:38

MQL_VISUAL_MODE частный случай MQL_TESTER?

MQL_OPTIMIZATION частный случай MQL_TESTER?

то есть,  MQL_TESTER включает в себя и  MQL_VISUAL_MODE и  MQL_OPTIMIZATION?

мне нужно, что бы советник выполнял некоторые действия при работе на чарте и в визуальном режиме, но не делал этого во всех остальных случаях. не соображу, как подобрать правильно для такого случая флаги при проверке 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

}

Причина обращения: