文章 "MQL5 中的统计分布 - 取最佳的 R" - 页 4

 
fxsaber:

搞什么鬼?数学圣经的目标很明确。

在 R 中找到一个强大的数学模型。他们找到了,所以在 R 中进行了研究。然后你就可以轻松地将现成的研究方案(事实上是一种交易算法)从 R 移植到 MQL,而不需要 bibla 和这篇文章。各种机器学习总是适合金融市场。
用 MQl 编写是件麻烦事。)直接从 R(等等)调用所需的功能会更容易(也更可靠))。Renat 提到了这些方法--它们不是最简单、最现代的,但它们是存在的。例如,如何将 COM 对象附加到 MT?部分可以(不是全部)--(原谅我)通过垫片))))。
 
СанСаныч Фоменко:

我有不明白的地方

在 MQL 中调用指定函数的结果是什么?标量还是向量?

下面是我们在 R 中得到的结果

n <- 2000

>

> k <- seq(0, n, by = 20)

>

> dbinom(k, n, pi/10, log = TRUE)

[1] -754.219687 -660.247472 -592.126636 -534.532344 -483.881605

[6] -438.460449 -397.256529 -359.600217 -325.015561 -293.146935

[11] -263.718651 -236.510862 -211.344286 -188.070044 -166.562645

[16] -146.714976 -128.434635 -111.641185 -96.264050 -82.240889

[21] -69.516303 -58.040813 -47.770020 -38.663934 -30.686405

[26] -23.804662 -17.988917 -13.212041 -9.449276 -6.678001

[31] -4.877524 -4.028903 -4.114796 -5.119322 -7.027950

> a<-dbinom(k, n, pi/10, log = TRUE)

> str(a)

num [1:101] -754 -660 -592 -535 -484 ...

也就是说,在 R 中调用该函数会得到一个向量,可以用通用方法绘制 plot

> plot(a)

请将更新后的文件放到 /Include/Math/Stat 中。

它为向量添加了一个重载函数 + 一个额外的 log_mode 参数。

下面是你的计算结果,与 R 的结果完全一致:

#include <Math/Stat/Binomial.mqh>

void OnStart(void)
  {
   double    vars[101];
   double    results[101];
   const int N=2000;
//--- 
   for(int i=0;i<=N;i+=20)
      vars[i/20]=i;

   MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
      
   for(int i=0;i<ArraySize(results);i++)
      Print(results[i]);
//---
  }

结论:

-754.2196869142003
-660.2474717208812
-592.1266359491199
-534.5323437511825 
...

我们正在努力添加向量操作,以便在语法上尽可能接近 R。

当然,我们还将添加大量新的单元测试。

附加的文件:
Binomial.mqh  19 kb
 

顺便说一句,关于 R 中数学库全速优化的说法非常夸张。

与 R 不同,MQL5 使用类型清晰的数组,并以本地 x64 编译代码。这给 MQL5 带来了巨大的优势,即使在与 R 中函数的 DLL 实现对抗时也能获胜。


以下是基于上述示例的测试:R 3.3.1 x64

install.packages("microbenchmark")

library(microbenchmark)
n <- 2000
k <- seq(0,n,by=20)
res <- microbenchmark(a<-dbinom(k, n, pi/10, log = TRUE))
print(res)



Unit: microseconds
                                 expr    min     lq     mean median    uq    max neval
 a <- dbinom(k, n, pi/10, log = TRUE) 20.167 20.168 20.88726 20.469 20.77 35.819   100

三重运行显示最少需要 20 微秒。

在 MQL5 中进行了同样的测试:

#include <Math/Stat/Binomial.mqh>

void OnStart(void)
  {
   double    vars[101];
   double    results[101];
   const int N=2000;
//--- 
   for(int i=0;i<=N;i+=20)
      vars[i/20]=i;

   ulong msc=GetMicrosecondCount();
   MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
   msc=GetMicrosecondCount()-msc;
      
   Print("Time: ",msc," msc");
//---
  }


2016.10.10 21:21:12.156 new (Si-12.16,H1)       Time: 10 msc

MQL5 的计算速度是 R 的两倍:10 微秒对 20 微秒。

计算基于 i7-4930k、Windows 10 x64、MetaTrader 5 x64、无虚拟化和无外部负载。

 
Renat Fatkhullin:

顺便说一句,关于 R 中数学库全速优化的说法非常夸张。

与 R 不同,MQL5 使用类型清晰的数组,并以本地 x64 编译代码。这给 MQL5 带来了巨大的优势,甚至可以让您在与 R 中函数的 DLL 实现对抗中获胜。


以下是基于上述示例的测试:R 3.3.1 x64

三重运行显示最少需要 20 微秒。

在 MQL5 中进行了同样的测试:

MQL5 的计算速度是 R 的两倍:10 微秒对 20 微秒。

计算基于 i7-4930k、Windows 10 x64、MetaTrader 5 x64、无虚拟化和无外部负载。

恭喜你!!!在两个刀片上都取得了全胜!两款刀片均获胜。
 
Renat Fatkhullin:

顺便说一句,关于 R 中数学库全速优化的说法非常夸张。

与 R 不同,MQL5 使用类型清晰的数组,并以本地 x64 编译代码。这给 MQL5 带来了巨大的优势,即使在与 R 中函数的 DLL 实现对抗时也能获胜。


以下是基于上述示例的测试:R 3.3.1 x64

三重运行显示最少需要 20 微秒。

在 MQL5 中进行了同样的测试:

MQL5 的计算速度是 R 的两倍:10 微秒对 20 微秒。

计算使用 i7-4930k,Windows 10 x64,MetaTrader 5 x64,无虚拟化,无外部负载。

结果出现错误((

vars' - 参数转换不允许

 
ivanivan_11:

我得到了一个错误信息((

vars' - 参数转换不允许

你需要从https://www.mql5.com/ru/forum/97153/page4#comment_2882502 获取更新文件

那里添加了用于向量的重载函数。

 
Renat Fatkhullin:

您需要从https://www.mql5.com/ru/forum/97153/page4#comment_2882502 获取更新文件。

有一个重新定义的向量函数。

我必须马上告诉你,我是在 32 位的 vyne 下运行 MT 的。这就是为什么我猜答案会是--64 位更快)))为了避免任何混淆--R 也是 32 位的。



 
ivanivan_11:

是的,谢谢你。它就是这样工作的。我就是这样工作的。我必须说,我是在 Wyne 下运行 MT 的,32 位。那么答案是什么呢,我可以猜测 - 64 位更快))))。

这并不严重。

在 wyne 下,甚至是 32 位。32 位 MT5 使用与 MT4 类似的旧编译器。它比 64 位代码慢几十倍,而 64 位代码是由专门为 MT5 64 位版本创建的新编译器生成的。我们发布了一份报告,比较 32 位和 64 位 MQL5 程序的速度。

每个 MQL5 程序实际上包含两份编译代码:32 位用于旧系统以保证兼容性,64 位用于新系统。

我们已经完全放弃了 32 位编译器的开发,因为它没有意义,也没有未来。

因此,如果您想获得最高性能,只能使用 64 位版本的 MetaTrader 5。


顺便提一下,MT4 用户须知--MQL4代码执行速度 也比 64 位 MetaTrader 5 慢几十倍。

 
Andrey Dik:
祝贺你双赢。

计算速度是编译后类似 R 计算速度的两倍(R 的第一道是字节/或 jit 编译,因此最大值>1.5avg,最小值~=avg)?

好吧,成就......:-)

 
Maxim Kuznetsov:

计算速度是编译后相同 R 计算速度的两倍(R 的第一道是字节/或 jit 编译,因此最大值>1.5avg,最小值~=avg)?

好吧,成就......:-)

R 用了多次运行的最短时间,而不是第一次运行的最长时间

因此,"冷启动 "在这里并不能解释问题。即使是在所有库代码都在 DLL 中的环境下。实际上没有什么需要预热的。

但可以解释的是

  1. 由于使用纯类型的 双倍数据,因此不存在 R 中动态对象的开销
  2. MQL5 中的编译器效率极高。看一下编译出来的 asm 代码真的很吓人。
  3. 源代码中存在 MQL5 库,这允许您将其代码直接内联到调用位置,并最大限度地利用被调用位置的 const 环境。

    与动态链接库中未经优化的实现相比,编译器在这方面有很大的空间,因为动态链接库没有机会学习环境并进行调整。