Caractéristiques du langage mql5, subtilités et techniques - page 223

 
fxsaber #:

Pour un cas particulier où un champ numérique est utilisé pour le tri (la situation la plus courante), j'ai écrit une variante qui est plusieurs ordres de grandeur plus rapide que la précédente. Mais elle consomme deux fois plus de mémoire. Elle est pertinente pour les grands tableaux.


Application (avec mesure du temps d'exécution).


Résultat.

Que pensez-vous de cette option ?

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

Que pensez-vous de ceci ?

Je ne peux pas le tester.

 
fxsaber #:

Ne pas vérifier.

Bibliothèque QuickSort ici

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

La bibliothèque QuickSort est ici

Merci, c'est une très bonne option ! Il me semble que j' ai aussi QuickSort, mais pour une raison que j'ignore, il est extrêmement lent.


Votre option pourrait être enveloppée dans des macros d'une manière ou d'une autre pour la rendre plus rapide à utiliser...

 
fxsaber #:

Merci, c'est une très bonne option ! Il me semble que j' ai aussi QuickSort, mais pour une raison que j'ignore, les freins sont sauvages.


Votre option pourrait être enveloppée dans des macros pour la rendre plus rapide à utiliser....

Je ne vois pas pourquoi vous avez besoin de macros. C'est très simple comme ça.

 

comment formater correctement quelque chose qui ressemble à ceci en C :

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

? ??

en essayant de trier des modèles :

template <typename T>

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

}

ne fonctionne pas - vous ne pouvez pas mettre un pointeur de fonction dans l'argument. Il doit y avoir un typedef séparé

mais le typedef ne peut pas (ou peut-il ??) être un modèle.

Les macroms s'affranchissent de ces problèmes :-)

 
Maxim Kuznetsov #:

comment formater correctement quelque chose qui ressemble à cela en C :

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

? ??

Nous essayons d'utiliser des modèles :

échec - on ne peut pas mettre un pointeur de fonction dans l'argument. Il doit y avoir un typedef séparé

mais le typedef ne peut pas (ou peut-il ??) être un template....

Les macroms s'affranchissent de ces problèmes :-)

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

J'ai découvert une caractéristique peu évidente de MQL (et de 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"
  }

C'est-à-dire que la valeur par défaut est substituée au paramètre (p) au moment de l'appel de la méthode (p.f1()) et cette valeur est tirée de la description de la méthode dans la classe C1 - le type déclaré de la variable ptr, et non le type réel de l'objet obj.

(Ce qui, en général, est logique).

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Erreurs, bugs, questions

Andrey Dik, 2022.06.24 08:38

MQL_VISUAL_MODE est un cas particulier de MQL_TESTER ?

MQL_OPTIMIZATION est un cas particulier de MQL_TESTER?

Je veux dire que MQL_TESTER inclut à la fois MQL_VISUAL_MODE et MQL_OPTIMIZATION ?

J'ai besoin que l'EA effectue certaines actions lorsqu'il travaille sur un graphique et en mode visuel, mais pas dans tous les autres cas. Je n'arrive pas à comprendre comment sélectionner les bons drapeaux pour ce cas lors de la vérification de MQLInfoInteger() ?

Je pourrais le faire très simplement, par exemple, comme ceci :

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

{

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

}

mais l'indicateur MQL_CHART_MODE n' est pas fourni dans mql5.


Quelqu'un a-t-il une idée ?

 
Andrey Dik #:

Quelqu'un a-t-il une idée sur la question ?

if (ChartID()!=0) {

    // Graphical chart presents
    // draws on it

}

Raison: