記事"R で 統計分布を MQL5 に -"についてのディスカッション - ページ 4

 
fxsaber:

何なんだ?数学バイブルの目標は明確だ。

Rでロバストな数学モデルを見つけること。彼らはそれを見つけたので、Rで調査した。そして、biblaとこの記事を犠牲にすることで、RからMQLに既製の研究されたソリューション(実際には取引アルゴリズム)を簡単に移植することができる。あらゆる種類の機械学習は、常に金融市場に適合している。
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でコードをコンパイルする。これは大きなアドバンテージとなり、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

Rの20マイクロ秒に対してMQL5は10マイクロ秒と、2倍の速さである。

i7-4930k、Windows 10 x64、MetaTrader 5 x64、仮想化なし、外部負荷なしで計算。

 
Renat Fatkhullin:

ところで、Rの数学ライブラリの全速最適化というのは、かなり誇張されている。

これは、ダイナミック・オブジェクト/エンティティを扱うことによる、真正面からのコード記述と乱暴なシステム・オーバーヘッドの結果である。 Rとは異なり、MQL5は明確に型付けされた配列を操作し、ネイティブのx64でコードをコンパイルする。これは大きなアドバンテージとなり、Rの関数のDLL実装に対しても勝つことができる。


上記の例に基づいたテストを以下に示す:R 3.3.1 x64

トリプル実行では、最短20マイクロ秒であった。

同じテストをMQL5でも行った:

Rの20マイクロ秒に対してMQL5は10マイクロ秒と、2倍の速さである。

i7-4930k、Windows 10 x64、MetaTrader 5 x64、仮想化なし、外部負荷なしで計算。

おめでとうございます!両者とも完勝だ。
 
Renat Fatkhullin:

ところで、Rの数学ライブラリの全速最適化というのは、かなり誇張されている。

これは、ダイナミック・オブジェクト/エンティティを扱うことによる、真正面からのコード記述と乱暴なシステム・オーバーヘッドの結果である。 Rとは異なり、MQL5は明確に型付けされた配列を操作し、ネイティブのx64でコードをコンパイルする。これは大きなアドバンテージとなり、Rの関数のDLL実装に対しても勝つことができる。


上記の例に基づいたテストを以下に示す:R 3.3.1 x64

トリプル実行では、最短20マイクロ秒であった。

同じテストをMQL5でも行った:

MQL5では、Rの20マイクロ秒に対して10マイクロ秒と、2倍の速さである。

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

ベクトル用に再定義された関数があります。

はい、ありがとうございます。そのように動作します。私の場合はこのように動作しました。すぐにお伝えしなければならないのは、私はMTを32ビットのVyneの下で動かしているということです。だから答えが64ビットの方が速いということになるのでしょう。



 
ivanivan_11:

はい、ありがとうございます。そのように動作します。私の場合はこのように動作しました。)

それは深刻ではない。

wyneでも32bitでも。32ビットでは、MT5はMT4と同様の古いコンパイラを使用しています。MT5の64ビット版専用の新しいコンパイラで作成された64ビットコードに比べると、数十倍遅い。32ビットと64ビットのMQL5プログラムの速度を比較したレポートを発表しました。

各MQL5プログラムには、実際にはコンパイルされたコードが2部含まれています:互換性のために古いシステム用の32ビットと新しいシステム用の64ビットです。

私たちは32ビットコンパイラの開発を完全に放棄しました。

そのため、最大限のパフォーマンスを得たいのであれば、MetaTrader 5の64ビット版のみを使用する必要があります。


ちなみに、MT4に座っている方への情報ですが、そこでもMQL4コードの実行速度は 64ビットのMetaTrader 5よりも数十倍遅いです。

 
Andrey Dik:
おめでとう!両者とも完勝だ。

Rの最初のパスはbyte/or jitコンパイルなので、max>1.5avg, min~=avgとなる。

まあ、達成...:-)

 
Maxim Kuznetsov:

Rの最初のパスはbyte/or jitコンパイルなので、max>1.5 avg、min~=avgとなる)?

まあ、達成...:-)

Rは、最初の実行と最大時間ではなく、何度も実行して最小時間を 取った。

だから、"コールドスタート "では説明できない。そして、すべてのライブラリコードがDLLにあるような環境であってもだ。事実上、ウォームアップするものは何もない。

しかし、説明できることがある:

  1. 純粋に型付けされた ダブル・データを 扱うため、Rのようなダイナミック・オブジェクトのオーバーヘッドがない。
  2. MQL5のコンパイラは恐ろしく効率的だ。出来上がったasmコードを見ると、本当に恐ろしくなる。
  3. ソースコード内にMQL5ライブラリが存在するため、そのコードを呼び出し先に直接ネイティブにインライン化し、呼び出し先のconst環境を最大限に利用することができる。

    DLLで最適化されていない実装は、環境を学習してそれに適応する機会がありません。