MetaTrader 5 build 3390:OpenCLと数学関数におけるFloat、機械学習における活性化関数と損失関数

ターミナル:取引商品のファンダメンタルデータベースを更新しました。取引所商品で利用可能なデータアグリゲーターが15件に拡大されました。ユーザーは、最も人気のある経済アグリゲーターを介して、さらに多くのティッカー情報にアクセスすることができるようになります。

4 8月 2022

ターミナル

  1. 取引口座への初回接続時に自動的にチュートリアルを開く機能を追加しました。これは、初心者が取引の基本を学び、プラットフォームの機能を探求するのに役立ちます。チュートリアルはいくつかのセクションに分かれており、それぞれのセクションが特定のトピックに関する簡単な情報を提供しています。トレーニングの進捗は青色の線で表示されます。

    取引口座への初回接続時に自動的にチュートリアルを開く機能を追加しました。


  2. 利益で決済」/「損失で決済」一括操作を修正しました。以前は、反対のポジションが存在する場合はそれが使用されていました。たとえば、EURUSDの買いポジションが2つあり、EURUSDの売りポジションが1つある場合、3つのポジションすべてが「損失で決済」一括操作中に決済されます。売買は「Close by」操作によって決済され、残りの買いは通常の操作によって決済されます。コマンドが適切に動作して、選択したポジション(利益または損害) のみを決済するようになりました。

  3. 負の履歴価格の表示を修正しました。このような価格は、すべての時間枠で正しく表示されるようになります。
  4. ターミナルによるシステムリソースの消費を最適化し、大幅に削減しました。
  5. 取引商品のファンダメンタルデータベースを更新しました。取引所商品で利用可能なデータアグリゲーターが15件に拡大されました。ユーザーは、最も人気のある経済アグリゲーターを介して、さらに多くのティッカー情報にアクセスすることができるようになります。

    取引商品のファンダメンタルデータベースを更新しました。

    世界の取引所市場には、約7,000の証券と2,000以上のETFが上場しています。さらに、取引所では、先物などのデリバティブが提供されています。MetaTrader 5プラットフォームでは、為替商品の巨大なデータベースにアクセスできます。ファンダメンタルデータにアクセスするには、[気配値表示]から直接ワンクリックで選択したアグリゲーターのWebサイトに切り替えることができます。各金融商品の情報ソースを選択することができ、利便性に優れています。

  6. 新しい注文ウィンドウのストップロスとテイクプロフィットの表示を修正しました。FIFO口座の場合、同じ銘柄の既存のポジションのストップレベルに従って、ストップレベルが自動的に設定されます。この手順は、FIFOルールに準拠するために必要です。

MQL5

  1. 数学関数で行列とベクトルを扱えるようになりました。

    当社は、MetaTrader 5プラットフォームのアルゴリズム取引と機械学習のための機能拡張を続けています。以前は、新しいデータ型として、行列とベクトルを追加し、データ処理に配列を使用する必要性をなくしました。これらのデータ型を使った操作のために、MQL5には70以上のメソッドが追加されています。これらの新しいメソッドにより、線形代数と統計学の計算を1回の操作でおこなうことができるようになりました。乗算、変換、連立方程式を簡単に実装でき、過剰なコード行数を必要としません。最新のアップデートには数学機能が含まれています。

    数学関数はもともと、スカラー値に対して関連する演算をおこなうために設計されたものです。このビルド以降、ほとんどの関数が行列やベクトルに適用できるようになります。これには、MathAbs、MathArccos、MathArcsin、MathArctan、MathCeil、MathCos、MathExp、MathFloor、MathLog、MathLog10、MathMod、MathPow、MathRound、MathSin、MathSqrt、MathTan、MathExpm1、MathLog1p、MathArccosh、 MathArcsinh、MathArctanh、MathCosh、MathSinh、MathTanhなどが含まれています。このような操作は、行列やベクトルを要素ごとに扱うことを意味します。例:
    //---
      matrix a= {{1, 4}, {9, 16}};
      Print("matrix a=\n",a);
    
      a=MathSqrt(a);
      Print("MatrSqrt(a)=\n",a);
      /*
       matrix a=
       [[1,4]
        [9,16]]
       MatrSqrt(a)=
       [[1,2]
        [3,4]]
      */
    MathModおよびMathPowの場合、2番目の要素には、適切なサイズのスカラーまたは行列/ベクトルを指定することができます。

    次は、ベクトルに数学関数を適用して標準偏差を計算する例です。
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- Use the initializing function to populate the vector
      vector r(10, ArrayRandom); // Array of random numbers from 0 to 1
    //--- Calculate the average value
      double avr=r.Mean();       // Array mean value
      vector d=r-avr;            // Calculate an array of deviations from the mean
      Print("avr(r)=", avr);
      Print("r=", r);
      Print("d=", d);
      vector s2=MathPow(d, 2);   // Array of squared deviations
      double sum=s2.Sum();       // Sum of squared deviations
    //--- Calculate standard deviation in two ways
      double std=MathSqrt(sum/r.Size());
      Print(" std(r)=", std);
      Print("r.Std()=", r.Std());    
     }
    /*
      avr(r)=0.5300302133243813
      r=[0.8346201971495713,0.8031556138798182,0.6696676534318063,0.05386516922513505,0.5491195410016175,0.8224433118686484,...
      d=[0.30458998382519,0.2731254005554369,0.1396374401074251,-0.4761650440992462,0.01908932767723626,0.2924130985442671, ...
       std(r)=0.2838269732183663
      r.Std()=0.2838269732183663
    */ 
    //+------------------------------------------------------------------+
    //| Fills the vector with random values                              |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }
    

  2. テンプレート関数において、対応する matrix, matrixf, vector, vectorf 型の代わりに、対応するmatrix<double>, matrix<float>, vector<double>, vector<float>という表記をサポートするようにしました。
  3. float型を用いた演算のための数学関数を改善しました。Float型の行列とベクトルに数学関数を適用できるようになったことで、float型のスカラーに適用する数学関数が改善されました。以前は、これらの関数パラメータは無条件にdouble型にキャストされ、その後、対応する数学関数の実装が呼び出されてその結果がfloat型にキャストバックされていました。余分な型キャストをすることなく、演算が実装されるようになりました。

    次の例では、数学的な正弦の計算の違いを示しています。

    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---  Array of random numbers from 0 to 1
      vector d(10, ArrayRandom);
      for(ulong i=0; i<d.Size(); i++)
       {
        double delta=MathSin(d[i])-MathSin((float)d[i]);
        Print(i,". delta=",delta);
       }
     }
    /*
       0. delta=5.198186103783087e-09
       1. delta=8.927621308885136e-09
       2. delta=2.131878673594656e-09
       3. delta=1.0228555918923021e-09
       4. delta=2.0585739779477308e-09
       5. delta=-4.199390279957527e-09
       6. delta=-1.3221741035351897e-08
       7. delta=-1.742922250969059e-09
       8. delta=-8.770715820283215e-10
       9. delta=-1.2543186267421902e-08
    */
    //+------------------------------------------------------------------+
    //| Fills the vector with random values                              |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }

  4. 行列とベクトルに対する活性化関数と導関数を追加しました。
    AF_ELU               ELU(指数線形ユニット)
    AF_EXP               指数
    AF_GELU              ガウシアンエラー線形ユニット
    AF_HARD_SIGMOID      ハードシグモイド
    AF_LINEAR            線形
    AF_LRELU             Leaky REctified線形ユニット
    AF_RELU              正規化線形ユニット
    AF_SELU              SELU (Scaled Exponentia線形ユニット)
    AF_SIGMOID           シグモイド
    AF_SOFTMAX           ソフトマックス
    AF_SOFTPLUS          ソフトプラス
    AF_SOFTSIGN          ソフトサイン
    AF_SWISH             スウィッシュ
    AF_TANH              ハイパーボリックタンジェント
    AF_TRELU             しきい値化されたREctified線形ユニット
    ニューラルネットワークの活性化関数は、重み付けされた入力信号の和が、ネットワークレベルでどのようにノード出力信号に変換されるかを決定します。活性化関数の選択は、ニューラルネットワークの性能に大きな影響を与えます。モデルの異なる部分には、異なる活性化関数を使用できます。MQL5では、既知のすべての関数に加え、導関数が用意されています。導関数により、学習時に受けた誤差を基にした調整値を高速に算出することができます。

  5. 行列とベクトルに対する損失関数を追加しました。以下のパラメータがあります。
    LOSS_MSE            平均二乗誤差
    LOSS_MAE            平均絶対誤差
    LOSS_CCE            カテゴリー別 交差エントロピー
    LOSS_BCE            バイナリ交差エントロピー
    LOSS_MAPE           MAPE (平均絶対誤差率)
    LOSS_MSLE           平均二乗対数誤差
    LOSS_KLD            カルバック・ライブラー ダイバージェンス
    LOSS_COSINE         コサイン類似度/近接度
    LOSS_POISSON        ポワッソン
    LOSS_HINGE          ヒンジ
    LOSS_SQ_HINGE       2乗 ヒンジ
    LOSS_CAT_HINGE      カテゴリカル・ヒンジ
    LOSS_LOG_COSH       ハイパーボリックコサインの 対数
    LOSS_HUBER          フーバー

    損失関数は、モデルが実際の値をどの程度予測できるかを評価するものです。モデル構築は、各段階での関数値の最小化を目標とします。アプローチは、特定のデータセットに依存します。また、損失関数は重みとオフセットに依存することができます。損失関数はニューラルネットワークの一般的な評価をおこなうため、ベクトルではなく一次元です。

  6. 行列およびベクトル用のmatrix::CompareByDigitsおよび vector::CompareByDigitsメソッドを追加しました。2つの行列/ベクトルの要素を有効数字まで比較します。

  7. 文字列のMathMinおよびMathMax関数のサポートが追加されました。これらの関数は辞書式比較を使用します。文字はアルファベット順に比較され、大文字と小文字が区別されます。

  8. OpenCLオブジェクトの最大数を256から6,5536に増加しました。OpenCLオブジェクトハンドルは、MQL5プログラム内でCLContextCreateCLBufferCreateCLProgramCreate関数を使用して作成します。従来の256ハンドルという制限は、機械学習の手法を効率的に利用するためには不十分でした。

  9. doubleをサポートしていないグラフィックカードでOpenCLを使用できるようにしました。従来、MQL5のプログラムではdoubleをサポートするGPUのみが使用可能でしたが、多くのタスクではfloatを使用した計算が可能です。Float型は、スペースを取らないため、当初は並列計算のためのネイティブと考えられていました。よって、旧来の要件が解除されました。

    特定のタスクにdoubleをサポートするGPUを強制的に使用するよう設定するには、CLContextCreateの呼び出しにCL_USE_GPU_DOUBLE_ONLYを使用します。
       int cl_ctx;
    //--- Initializing the OpenCL context
       if((cl_ctx=CLContextCreate(CL_USE_GPU_DOUBLE_ONLY))==INVALID_HANDLE)
         {
          Print("OpenCL not found");
          return;
         }

  10. CustomBookAdd関数の動作を修正しました。以前は、MqlBookInfo::volume_realフィールドに 0 以外の値があると、この関数で気配値表示のスナップショットを作成することができませんでした。以下のようにチェックがおこなわれるようになりました。
    送信されたデータについて次が検証されます。各要素で、タイプ、価格、数量データが指定されていること。MqlBookInfo.volumeとMqlBookInfo.volume_realが0または負でないこと。両方のボリュームが負の場合、エラーとみなされます。ボリュームの種類はどちらか一方、または両方を指定することができます。システムは指定されている方または正である方を使用します。

       volume=-1 && volume_real=2:volume_real=2を使用

       volume=3 && volume_real=0:volume=3を使用

    高精度ボリュームMqlBookInfo.volume_realはMqlBookInfo.volumeより優先度が高くなります。したがって、両方の値が指定され、かつ有効である場合は、volume_real が使用されます。

    気配値表示要素のいずれかが誤って記述されている場合、転送された状態は完全に破棄されます。

  11. CalendarValueLast関数の動作を修正しました。通貨フィルタを使用する際、経済指標カレンダーの変更後に連続して関数を呼び出すと(呼び出し後に「change」パラメータに新しい値を設定)、エラーにより一部のeventsがスキップされる可能性がありました。
    CalendarValueLast(change, result, "", "EUR")
  12. ArrayBSearch関数の動作を修正しました。同一の要素が複数見つかった場合は、ランダムなものではなく、最初の結果へのリンクが返されるようになります。
  13. クラス内のテンプレート関数の可視性チェックを修正しました。エラーのため、private/protectedとして宣言されたクラステンプレート関数がpublicに見えることがありました。

MetaEditor

  1. MetaAssistのエラーとあいまいな動作を修正しました。
  2. ターミナルのインストール先ディレクトリのパスを示す%terminal%マクロのサポートを追加しました(例:%terminal%MQL5EExperts)。 

    ターミナルのインストール先ディレクトリのパスを示す%terminal%マクロのサポートを追加しました(例:%terminal%MQL5EExperts)

  3. デバッガでの配列の表示を改善しました。
  4. デバッガから値をコピーするためのバッファを増量しました。
  5. エラーヒントを改善しました。
  6. プロジェクトファイル(*.mproj)に相対パスの表示を追加しました。従来は絶対パスを使用していたため、プロジェクトを移動した場合、コンパイルエラーが発生していました。
  7. BMPをグローバルに利用可能な32ビットビットビットマップ配列として、プロジェクトに自動的に埋め込む機能を追加しました。これにより、グラフィカルリソースを読み込むために、コード内部でを呼び出す必要がなくなります。
    'levels.bmp' as 'uint levels[18990]'
    
  8. 拡張BMPファイル形式の読み込みを改善しました。
  9. UI翻訳を更新しました。
  10. クラッシュログに報告されるエラーを修正しました。