Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 223

 
fxsaber #:

Per un caso particolare in cui un campo numerico viene utilizzato per l'ordinamento (la situazione più comune), ho scritto una variante che è di diversi ordini di grandezza più veloce della precedente. Ma consuma il doppio della memoria. È importante per gli array di grandi dimensioni.


Applicazione (con misurazione del tempo di esecuzione).


Risultato.

Cosa ne pensate di questa opzione?

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

Che ne dite di questo?

Non posso testarlo.

 
fxsaber #:

Non controllare.

Libreria QuickSort qui

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

La libreria QuickSort è qui

Grazie, è un'ottima opzione! Sembra che anch'io abbia QuickSort, ma per qualche motivo è estremamente lento.


La vostra opzione potrebbe essere inserita in qualche modo nelle macro per renderla più veloce da usare...

 
fxsaber #:

Grazie, è un'ottima opzione! Sembra che anch'io abbia QuickSort, ma per qualche motivo i freni sono impazziti.


La tua opzione potrebbe essere racchiusa in macro per renderne più veloce l'utilizzo....

Non vedo perché siano necessarie delle macro. È molto semplice così com'è.

 

come formattare correttamente qualcosa che assomiglia a questo in C:

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

???

cercando di ordinare i modelli:

template <typename T>

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

}

non funziona: non è possibile inserire un puntatore a una funzione nell'argomento. Deve esserci un typedef separato

ma il typedef non può (o può??) essere un template.

I macroms crescono per ovviare a questi problemi :-)

 
Maxim Kuznetsov #:

come formattare correttamente qualcosa di simile in C:

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

???

Stiamo cercando di utilizzare dei modelli:

non è possibile inserire un puntatore a una funzione nell'argomento. Deve esserci un typedef separato

ma il typedef non può (o può??) essere un template....

I macrom crescono per risolvere questi problemi :-)

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

Ho scoperto una caratteristica non ovvia di MQL (e di 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"
  }

Cioè, il valore predefinito viene sostituito nel parametro (p) al momento della chiamata del metodo (p.f1()) e questo valore viene preso dalla descrizione del metodo nella classe C1 - il tipo dichiarato della variabile ptr, non il tipo reale dell'oggetto obj.

(Il che, in generale, è logico).

 

Forum sul trading, sui sistemi di trading automatizzati e sul test delle strategie di trading

Errori, bug, domande

Andrey Dik, 2022.06.24 08:38

MQL_VISUAL_MODE è un caso speciale di MQL_TESTER?

MQL_OPTIMIZATION è un caso speciale di MQL_TESTER?

Cioè, MQL_TESTER include sia MQL_VISUAL_MODE che MQL_OPTIMIZATION?

Ho bisogno che l'EA esegua alcune azioni quando lavora su un grafico e in modalità visuale, ma non in tutti gli altri casi. Non riesco a capire come selezionare i flag giusti per questo caso quando controllo MQLInfoInteger()?

Potrei farlo molto semplicemente, ad esempio, in questo modo:

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

{

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

}

ma il flag MQL_CHART_MODE non è previsto in mql5.


Qualcuno ha qualche idea?

 
Andrey Dik #:

Qualcuno ha qualche idea?

if (ChartID()!=0) {

    // Graphical chart presents
    // draws on it

}

Motivazione: