Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 223

 
fxsaber #:

Für einen bestimmten Fall, in dem ein numerisches Feld zum Sortieren verwendet wird (die häufigste Situation), habe ich eine Variante geschrieben, die um mehrere Größenordnungen schneller ist als die vorherige. Aber sie verbraucht doppelt so viel Speicher. Sie ist für große Arrays relevant.


Anwendung (mit Messung der Ausführungszeit).


Ergebnis.

Was halten Sie von dieser 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 #:

Wie wäre es damit?

Ich kann es nicht testen.

 
fxsaber #:

Nicht nachsehen.

QuickSort Bibliothek hier

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

Die QuickSort-Bibliothek finden Sie hier

Danke, das ist eine sehr gute Option! Ich scheine QuickSort auch zu haben, aber aus irgendeinem Grund ist es wahnsinnig langsam.


Ihre Option könnte in Makros irgendwie verpackt werden, um es schneller zu machen, zu verwenden...

 
fxsaber #:

Danke, das ist eine sehr gute Option! Ich scheine auch QuickSort zu haben, aber aus irgendeinem Grund sind die Bremsen wild.


Ihre Option könnte in Makros eingewickelt werden, um es schneller zu machen, zu verwenden....

Ich wüsste nicht, warum Sie Makros brauchen. Es ist sehr einfach, wie es ist.

 

wie man etwas, das wie folgt aussieht, in C richtig formatiert:

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

???

Ich versuche, durch Vorlagen zu sortieren:

template <typename T>

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

}

funktioniert nicht - man kann keinen Funktionszeiger in das Argument einfügen. Es muss ein separater typedef sein

aber typedef kann nicht (oder doch??) eine Vorlage sein.

macroms wachsen aus diesen Problemen heraus :-)

 
Maxim Kuznetsov #:

wie man etwas, das so aussieht, in C richtig formatiert:

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

???

Wir versuchen, Vorlagen zu verwenden:

scheitert - Sie können keinen Funktionszeiger in das Argument einfügen. Es muss einen separaten Typedef geben

aber typedef kann nicht (oder kann es??) eine Vorlage sein....

macroms wachsen aus diesen Problemen heraus :-)

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

Ich habe eine nicht offensichtliche Eigenschaft von MQL (und C++) entdeckt

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"
  }

Das heißt, der Standardwert wird beim Methodenaufruf (p.f1()) in den Parameter (p) eingesetzt, und dieser Wert wird der Methodenbeschreibung in der Klasse C1 entnommen - dem deklarierten Typ der Variablen ptr, nicht dem tatsächlichen Typ des Objekts obj.

(Was im Allgemeinen logisch ist).

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Fehler, Bugs, Fragen

Andrey Dik, 2022.06.24 08:38

MQL_VISUAL_MODE ist ein Spezialfall von MQL_TESTER?

MQL_OPTIMIZATION ist ein Spezialfall von MQL_TESTER?

Ich meine, MQL_TESTER umfasst sowohl MQL_VISUAL_MODE als auch MQL_OPTIMIZATION?

Ich brauche den EA, um einige Aktionen auszuführen, wenn ich in einem Diagramm und im visuellen Modus arbeite, aber nicht in allen anderen Fällen. Ich kann nicht herausfinden, wie ich die richtigen Flags für diesen Fall auswählen kann, wenn ich MQLInfoInteger() prüfe?

Ich könnte es sehr einfach machen, zum Beispiel so:

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

{

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

}

aber das Flag MQL_CHART_MODE ist in mql5 nicht vorgesehen.


Hat jemand eine Idee?

 
Andrey Dik #:

Hat irgendjemand eine Idee?

if (ChartID()!=0) {

    // Graphical chart presents
    // draws on it

}