- ONNX(Open Neural Network Exchange)モデルを用いた操作に対応しました。
ONNXは、機械学習モデルのためのオープンソースフォーマットです。このフォーマットは、Chainer、Caffee2、PyTorchを含む多くのプラットフォームでサポートされています。専用ツールを使ってONNXモデルを作成し、MQL5アプリケーションに統合して、取引の意思決定に利用することができます。
サポートされるすべての関数は、ドキュメントに記載されています。テスト用ONNXモデルの例は、MetaEditorの公開プロジェクトで確認できます。ツールボックスで[公開プロジェクト]からONNX.Price.Predictionプロジェクトを探し、コンテキストメニューから[参加]を選択します。プロジェクトがコンピューターにダウンロードされ、ナビゲーターに表示されます。
プロジェクトをコンパイルし、EURUSDH1で実行し、結果を確認することができます。
モデルとそれを実行するMQL5コードに加え、プロジェクトにはPricePredictionTraining.pyというPythonスクリプトも含まれています。これは、ONNXモデルを自分で作成する方法を紹介するものです。スクリプトを実行するには、Pythonをコンピュータにインストールして、次のようにコマンドプロンプトから必要なモジュールをインストールしてください。
python.exe -m pip install --upgrade pip
python -m pip install --upgrade tensorflow
python -m pip install --upgrade pandas
python -m pip install --upgrade scikit-learn
python -m pip install --upgrade matplotlib
python -m pip install --upgrade tqdm
python -m pip install --upgrade metatrader5
python -m pip install --upgrade onnx==1.12
python -m pip install --upgrade tf2onnx
ONNXの使用方法は、ドキュメントに記載されています。
- 一般行列乗算(GeMM)のサポートを追加しました。このアルゴリズムは、タスクの並列化とL1/L2/L3キャッシュの最適化された利用により、一部のプロセッサタイプでの計算を高速化します。計算速度は、KernelLibrary(MKL)(英語)やOpenBLASなどの一般的なパッケージと同程度です。詳細な比較テストはまもなく公開されます。
新しいアルゴリズムは現在、matrix::GeMMメソッドでサポートされています。お使いのプロセッサがAVXおよびFMA(英語)命令をサポートしている場合(2013年以降にリリースされたほとんどのプロセッサがこれらの命令をサポートしています)、アルゴリズムは自動的に有効化されます。
-
行列とベクトルをDLLに転送する機能が追加されました。これにより、外部変数から、該当する型を利用する関数をインポートすることができます。
行列とベクトルは、バッファへのポインタとしてDLLに渡されます。たとえば、float型の行列を渡すには、DLLからエクスポートされた関数の対応するパラメータが、float型のバッファポインタを受け取る必要があります。次は例です。
MQL5
#import "mmlib.dll"
bool sgemm(uint flags,matrix<float> &C,const matrix<float> &A,const matrix<float> &B,ulong M,ulong N,ulong K,float alpha,float beta);
#import
C++
extern "C" __declspec(dllexport) bool sgemm(UINT flags,float *C,const float *A,const float *B,UINT64 M,UINT64 N,UINT64 K,float alpha,float beta)
バッファに加えて、正しく処理されるために行列とベクトルのサイズを渡す必要があります。
-
同期された時系列をMqlRatesから別の配列にコピーするための新しいCopySeries関数を追加しました。
CopySeries関数を使用すると、1回の呼び出しで必要な時系列のみを別の指定された配列に取得できますが、時系列データはすべて同期されます。これは、特定のインデックスNで結果として得られる配列のすべての値が、指定された銘柄/時間枠のペアの同じバーに属することを意味します。したがって、プログラマーはバーの開始時間までに受信したすべての時系列の同期を確保する必要はありません。
時系列の完全なセットをMqlRates配列として返すCopyRatesとは異なり、CopySeries関数を使用すると、特定の必要な時系列を個別の配列に取得できます。これは、時系列の種類を選択するためのフラグの組み合わせを指定することで実現できます。関数に渡される配列の順序は、MqlRates構造体のフィールドの順序と一致する必要があります。
struct MqlRates
{
datetime time;
したがって、現在の銘柄/時間枠の最後の100バーの「time」、「close」、「real_volume」時系列の値を取得する必要がある場合は、次の呼び出しを使用します。
datetime time[];
double close[];
long volume[];
CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
time、close、volume配列の順序は、MqlRates構造体内のフィールドの順序と一致する必要があります。rates_maskの値の順序は無視されます。マスクは次のようになります。
COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE
例
- OrderSend関数の動作を修正しました。同じ口座が複数のプラットフォームで同時に使用された場合、関数リクエストは間違った注文チケットを返す可能性がありました。
- EX5ライブラリのインポートを修正しました。インポートしたライブラリの名前と、インポート先のファイル名が一致しない場合はエラーとなります。