Características del lenguaje mql5, sutilezas y técnicas - página 223

 
fxsaber #:

Para un caso particular en el que se utiliza un campo numérico para ordenar (la situación más común), escribí una variante que es varios órdenes de magnitud más rápida que la anterior. Pero consume el doble de memoria. Es relevante para matrices grandes.


Aplicación (con medición del tiempo de ejecución).


Resultado.

¿Qué le parece esta opción?

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

¿Qué te parece esto?

No puedo probarlo.

 
fxsaber #:

No lo compruebes.

Biblioteca QuickSort aquí

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

La biblioteca QuickSort está aquí

Gracias, ¡es una muy buena opción! Parece que yo también tengo QuickSort, pero por alguna razón es tremendamente lento.


Su opción podría ser envuelto en macros de alguna manera para que sea más rápido de usar ...

 
fxsaber #:

Gracias, ¡es una muy buena opción! Parece que tengo QuickSort también, pero por alguna razón los frenos son salvajes.


Su opción podría ser envuelto en macros para que sea más rápido de usar....

No veo por qué necesita macros. Es muy simple como es.

 

cómo formatear correctamente algo que se parece a esto en C:

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

???

intentando ordenar a través de plantillas:

template <typename T>

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

}

no funciona - no se puede poner un puntero de función en el argumento. Debe haber un typedef separado

pero el typedef no puede (¿o puede?) ser una plantilla.

los macroms crecen fuera de estos problemas :-)

 
Maxim Kuznetsov #:

cómo formatear correctamente algo que se parece a esto en C:

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

???

Estamos intentando utilizar plantillas:

falla - no puedes poner un puntero de función en el argumento. Debe haber un typedef separado

pero el typedef no puede (¿o sí?) ser una plantilla....

los macroms superan estos 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);
  }
 

He descubierto una característica poco obvia de MQL (y 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"
  }

Es decir, el valor por defecto se sustituye en el parámetro (p) en el punto de llamada al método (p.f1()) y este valor se toma de la descripción del método en la clase C1 - el tipo declarado de la variable ptr, no el tipo real del objeto obj.

(Lo cual, en general, es lógico).

 

Foro sobre negociación, sistemas automatizados de negociación y prueba de estrategias de negociación

Errores, fallos, preguntas

Andrey Dik, 2022.06.24 08:38

¿MQL_VISUAL_MODE es un caso especial de MQL_TESTER?

¿MQL_OPTIMIZATION es un caso especial de MQL_TESTER?

Es decir, ¿MQL_TESTER incluye tanto MQL_VISUAL_MODE como MQL_OPTIMIZATION?

Necesito que el EA realice algunas acciones cuando trabaje en un gráfico y en modo visual, pero no en todos los demás casos. No consigo averiguar cómo seleccionar las banderas adecuadas para este caso al comprobar MQLInfoInteger()?

Podría hacerlo muy simple, por ejemplo, así:

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

{

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

}

pero la bandera MQL_CHART_MODE no se proporciona en mql5.


¿alguien tiene alguna idea?

 
Andrey Dik #:

¿Alguien tiene alguna idea?

if (ChartID()!=0) {

    // Graphical chart presents
    // draws on it

}