请观看如何免费下载自动交易
请在Twitter上找到我们!
加入我们粉丝页
有趣的脚本?
因此发布一个链接 -
让其他人评价
喜欢这个脚本? 在MetaTrader 5客户端尝试它
程序库

使用函数指针进行 Introsort(内省排序 - MetaTrader 5程序库

显示:
150
等级:
(5)
已发布:
2025.04.04 10:55
\MQL5\Scripts\Introsort_FuncPtr\
Introsort.mqh (17.31 KB) 预览
MQL5自由职业者 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务

自省排序

这是原始 Introsort 库修订版 ,现在Introsort() 函数 可接受一个指向自定义比较函数的可选函数指针。

Intro 或 Introspective 排序是一种混合排序算法,可提供快速性能。它是一种基于比较的排序算法,分为三个阶段。它使用 quicksort 排序以及 heapsort 和 insertion-sort 算法。

快速排序
快速排序是一种分而治之的算法,其工作原理是在数组中选择一个枢轴元素,然后将其他元素分成两个子数组,并检查元素是大还是小。快速排序平均耗时 O(nlog(n)),最坏情况下复杂度为 O(n2)。

堆排序
堆排序算法是一种基于二元堆比较的排序方法。它是一种不稳定的排序算法,最坏情况和平均情况时间复杂度均为 O(nlog(n)),最佳情况时间复杂度为 O(n)。

插入排序
插入排序算法是一种简单的排序方法,它一次只建立一个最终排序数组。最坏情况和平均情况的时间复杂度为 O(n2),最佳情况为 O(n)。

Introsort 算法结合了这三种算法的优点。它从快速排序开始,当递归深度超过基于开始排序的元素数量的水平时,切换到堆排序,当元素数量小于某个阈值时,切换到插入排序。

  • 如果分区大小有可能超过最大深度限制,那么 Introsort 会切换到 Heapsort。
  • 如果分区大小太小,Quicksort 会切换到插入排序。
  • 如果分区大小低于限制且不太小,则执行简单的快速排序。

Introsort 的运行性能特别好。它是目前使用最快的比较排序算法之一,也是 C++ STL、Microsoft .NET Framework 类库、GNU 标准 C++ 库和 LLVM libc++ 库提供的 std::sort 算法的常用实现。

参考文献

//+------------------------------------------------------------------+
//| Introsort|
//+------------------------------------------------------------------+
/**
 * 使用比较函数 less 对输入数组进行就地排序。
 * 您可以指定自己的比较函数。如果没有指定函数
 *,则使用升序排序。
 */
template<typename T>
void Introsort(T &arr[]);

//+------------------------------------------------------------------+
//| 使用指向自定义 Less() 函数的指针进行内排序。
//| 自定义 Less() 函数包含两个参数和逻辑
//| 来决定它们在排序数组中的相对顺序。其原理是
//| 提供灵活性,以便 Introsort() 可以用于任何 | | | | | 排序。
//| 类型(包括用户定义的类型,如对象或结构)||......
//| 并可用于获得任何所需的排序顺序(升序、|......)。
//| 结构字段的降序或自定义顺序)。
//+------------------------------------------------------------------+
template<typename T, typename LessFunc>
void Introsort(T &arr[], LessFunc pfnLess);

比较函数 Less:

您可以指定自己的比较函数。如果没有指定函数,则使用升序排序。自定义 Less() 函数接收两个参数,并包含决定它们在排序数组中相对顺序的逻辑。这样做的目的是提供灵活性,使 Introsort() 可用于任何类型(包括用户定义的类型),并可用于获得任何所需的顺序(递增、递减或任何其他顺序)。例如,按自定义排序顺序对对象或结构(用户定义类型)数组进行排序:

bool MyLessFunc(const MyStruct &x, const MyStruct &y)
  {
//--- 按 A 排序(升序)
   if(x.A < y.A) return(true);
   if(x.A > y.A) return(false);

//--- 如果 A 相同,则按 B 排序(升序)
   if(x.B < y.B) return(true);
   if(x.B > y.B) return(false);

//--- 如果 B 相同,则按 C 排序(升序)
   if(x.C < y.C) return(true);
   if(x.C > y.C) return(false);

//--- 所有键都相同
   return(false);
  }


// 定义指向自定义 Less 函数的指针类型。
typedef bool (*pLess)(const MyStruct &x, const MyStruct &y);


// 使用自定义 Less 函数对结构数组进行排序。
Introsort(structArray, (pLess)MyLessFunc);


由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/57233

角度和速度 角度和速度

该指标显示价格变化的角度或平均速度。

创建加密卷配置文件的基本库 创建加密卷配置文件的基本库

在图表上创建 Volume Profiles 的基本库。

第二栏 第二栏

该指标在图表上任意绘制第二个时间框架。

价格变化 价格变化

按时间间隔改变字符价格