mql5语言的特点、微妙之处以及技巧 - 页 223

 
fxsaber #:

针对数字字段用于排序的特殊情况(这是最常见的情况),我编写了一个变体,它比前一个变体快了几个数量级。但它消耗的内存是前者的两倍。它适用于大型数组。


应用(测量执行时间)。


结果

您认为该方案如何?

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

这样如何?

我无法测试。

 
fxsaber #:

不要检查。

此处的 QuickSort 库

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

QuickSort 库在这里

谢谢,这是个不错的选择! 好像也用过 QuickSort,但不知为什么,速度非常慢。


你的方案可以用宏来包装,这样使用起来会更快......

 
fxsaber #:

谢谢,这是个不错的选择! 好像也有QuickSort,但不知道为什么,刹车总是乱响。


你的方案可以用宏来包装,这样使用起来会更快....

我不明白为什么需要宏。它本身就很简单。

 

如何在 C 语言中正确格式化如下内容?

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

???

试图对模板进行排序:

template <typename T>

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

}

不起作用--你不能在参数中加入函数指针。必须有一个单独的类型定义

但 typedef 不能(或者可以?

macroms 可以解决这些问题 :-)

 
Maxim Kuznetsov #:

如何在 C 语言中正确格式化类似这样的内容:

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

???

我们正在尝试使用模板:

失败 - 不能在参数中加入函数指针。必须有一个单独的类型定义

但 typedef 不能(或者可以)是模板....

macroms 可以解决这些问题 :-)

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

我发现了 MQL(和 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"
  }

那就是,在方法调用(p.f1())时,默认值会被替换到参数 (p) 中,而这个值取自类 C1 中的方法描述 - 变量 ptr 的声明类型,而不是对象 obj 的实际类型。

(一般来说,这是符合逻辑的)。

 

关于交易、自动交易系统和交易策略测试的论坛

错误、错误、问题

Andrey Dik, 2022.06.24 08:38

MQL_VISUAL_MODE 是 MQL_TESTER 的特例吗?

MQL_OPTIMIZATION 是 MQL_TESTER 的特例 吗?

我的意思是,MQL_TESTER包括MQL_VISUAL_MODEMQL_OPTIMIZATION?

我不知道在检查 MQLInfoInteger() 时如何为这种情况选择正确的标志?

我可以做得很简单,例如,像这样:

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

{

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

}

但是 mql5 中没有提供 MQL_CHART_MODE 标志


有人有什么想法吗?

 
Andrey Dik #:

有人有什么想法吗?

if (ChartID()!=0) {

    // Graphical chart presents
    // draws on it

}