Características da linguagem mql5, subtilezas e técnicas - página 223

 
fxsaber #:

Para um caso específico em que um campo numérico é usado para classificação (a situação mais comum), escrevi uma variante que é várias ordens de magnitude mais rápida do que a anterior. Mas ela consome o dobro de memória. Ela é relevante para matrizes grandes.


Aplicativo (com medição do tempo de execução).


Resultado.

O que você acha dessa opção?

#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 #:

O que você acha disso?

Não posso testá-lo.

 
fxsaber #:

Não verifique.

Biblioteca do QuickSort aqui

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

A biblioteca QuickSort está aqui

Obrigado, essa é uma ótima opção! Parece que eu também tenho o QuickSort, mas, por algum motivo, ele é extremamente lento.


Sua opção poderia ser envolvida em macros de alguma forma para torná-la mais rápida de usar...

 
fxsaber #:

Obrigado, essa é uma ótima opção! Parece que também tenho o QuickSort, mas, por algum motivo, os freios são loucos.


Sua opção poderia ser incluída em macros para agilizar o uso....

Não vejo por que você precisa de macros. É muito simples como está.

 

como formatar corretamente algo que se parece com isso em C:

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

???

tentando classificar os modelos:

template <typename T>

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

}

não funciona - você não pode colocar um ponteiro de função no argumento. Deve haver um typedef separado

mas o typedef não pode (ou pode??) ser um modelo.

Os macroms se livram desses problemas :-)

 
Maxim Kuznetsov #:

como formatar corretamente algo parecido com isso em C:

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

???

Estamos tentando usar modelos:

falha - você não pode colocar um ponteiro de função no argumento. Deve haver um typedef separado

mas o typedef não pode (ou pode??) ser um template....

Os macroms superam esses problemas :-)

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

Descobri um recurso não óbvio da MQL (e do 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"
  }

Ou seja, o valor padrão é substituído no parâmetro (p) no momento da chamada do método (p.f1()) e esse valor é retirado da descrição do método na classe C1 - o tipo declarado da variável ptr, não o tipo real do objeto obj.

(O que, em geral, é lógico).

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Erros, bugs, perguntas

Andrey Dik, 2022.06.24 08:38

MQL_VISUAL_MODE é um caso especial de MQL_TESTER?

MQL_OPTIMIZATION é um caso especial de MQL_TESTER?

Quero dizer, MQL_TESTER inclui tanto MQL_VISUAL_MODE quanto MQL_OPTIMIZATION?

Preciso que o EA execute algumas ações ao trabalhar em um gráfico e no modo visual, mas não em todos os outros casos. Não consigo descobrir como selecionar os sinalizadores corretos para esse caso ao verificar MQLInfoInteger()?

Eu poderia fazer isso de forma muito simples, por exemplo, assim:

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

{

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

}

mas o sinalizador MQL_CHART_MODE não é fornecido no mql5.


Alguém tem alguma ideia?

 
Andrey Dik #:

Alguém tem alguma opinião?

if (ChartID()!=0) {

    // Graphical chart presents
    // draws on it

}