MetaTrader 5 build 3440:モバイルWebターミナルバージョンとMQL5の新しい行列メソッド

新しいWebターミナルは、モバイルデバイスをフル機能でサポートします。インターフェイスは画面サイズに自動的に適応し、iOSおよびAndroidのスマートフォンおよびタブレットからの効率的な操作を可能にします

4 11月 2022

Webプラットフォームのモバイル版

新しいWebターミナルは、モバイルデバイスをフル機能でサポートします。インターフェイスは画面サイズに自動的に適応し、iOSおよびAndroidのスマートフォンおよびタブレットからの効率的な操作を可能にします。

新しいWebターミナルにモバイルデバイスのサポートが追加

また、Webターミナルには多くの修正と改良が加えられています。

新しいMetaTrader 5 Webターミナルは、取引機能の完全なセットをサポートします。ユーザーは次のことができるようになります。

  • デモ口座とライブ口座を操作する
  • 金融銘柄のクウォートを受け取る
  • 任意の市場で取引する
  • 30を超える指標と20のグラフィカルオブジェクトを使用して銘柄相場を分析する
  • ファンダメンタル分析に経済カレンダーのデータを使用する


ターミナル

  1. タスクマネージャー機能を拡張しました。新しいバージョンでは、消費されたリソースをより正確に監視できます。

    • スレッドのスタックサイズの表示を追加
    • コンテキストスイッチの数の表示を追加
    • システムおよびサードパーティのDLLスレッドの認識を追加
    • カーネルモードの動作時間の表示を追加。ユーザーモードで費やされた時間と比較してこのメトリックが増加した場合、システムレベルの問題(ドライバーの問題、ハードウェアエラー、または遅いハードウェア)が存在する可能性があります。詳細については、Microsoftドキュメントをお読みください。
    • ユーザーモード動作時間の表示を追加

    利用可能なデバイスを制御するOpenCLマネージャ


  2. 利用可能なデバイスを管理するためのターミナル設定の新しいOpenCLタブ。新しいOpenCLマネージャーを使用すると、計算に使用するデバイスを明示的に指定できます。

    利用可能なデバイスを制御するOpenCLマネージャ

  3. FIFOモードで動作しているアカウントの板情報にストップロスとテイクプロフィットレベルの表示を追加しました(このモードは証券会社側で有効にすることができます)。

    FIFOルールによると、各商品のポジションは、開かれた順序でのみ決済できます。ストップレベルによるポジション決済を確実にFIFOに準拠させるために、次のロジックがクライアントターミナル側に実装されています。

    同じ商品に複数のポジションが存在する場合、いずれかのポジションにストップレベルを配置すると、他のすべてのポジションにも同じレベルが配置されます。したがって、レベルがトリガーされると、すべてのポジションがFIFO準拠の順序で決済されます。

    ユーザーが既にポジションを持っている商品の板情報を開くと、既存のポジションのレベル(存在する場合)がストップロスおよびテイクプロフィットフィールドで自動的に指定されるようになりました。

  4. ツールボックス\取引ウィンドウのXボタンを使用したストップロスとテイクプロフィットレベルの削除を修正しました。クイックトレード機能を無効にした際にエラーが発生していました。ボタンをクリックすると、関連するレベルの値が空の取引ダイアログが開きます。

  5. 取引レポートのグラフキャプションと最終手数料計算を修正しました。このセクションでは、レポート統計に誤った利益が表示され、株式および残高グラフのツールチップに誤った値が表示されることがありました。

MQL5

  1. ベクトルと行列のCopyTicksメソッドとCopyTicksRangeメソッドが追加されました。これにより、ティックデータ配列をベクトルおよび行列に簡単にコピーできます。
    bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    コピーされたデータ型は、ENUM_COPY_TICKS列挙を使用して「flags」パラメーターで指定されます。以下の値が使用可能です。
    COPY_TICKS_INFO    = 1,       // ticks resulting from Bid and/or Ask changes
    COPY_TICKS_TRADE   = 2,       // ticks resulting from Last and Volume changes
    COPY_TICKS_ALL     = 3,       // all ticks having changes
    COPY_TICKS_TIME_MS = 1<<8,    // time in milliseconds
    COPY_TICKS_BID     = 1<<9,    // Bid price
    COPY_TICKS_ASK     = 1<<10,   // Ask price
    COPY_TICKS_LAST    = 1<<11,   // Last price
    COPY_TICKS_VOLUME  = 1<<12,   // volume
    COPY_TICKS_FLAGS   = 1<<13,   // tick flags
    複数のデータ型が選択されている場合(行列でのみ使用可能)、行列内の行の順序は、列挙内の値の順序に対応します。

  2. matrix::Assignおよびvector::Assignメソッドの機能を拡張しました。

    行列に1次元の配列またはベクトルを割り当てることができるようになりました。
    bool matrix::Assign(const vector &vec);
    結果は1行の行列になります。

    また、行列をベクトルに割り当てることができるようになりました(行列の平滑化が実行されます)。
    bool vector::Assign(const matrix &mat);
  3. ベクトルと行列のSwapメソッドが追加されました。
    bool vector::Swap(vector &vec);
    bool vector::Swap(matrix &vec);
    bool vector::Swap(double &arr[]);
    bool matrix::Swap(vector &vec);
    bool matrix::Swap(matrix &vec);
    bool matrix::Swap(double &arr[]);
    各配列、ベクトル、または行列は、そのオブジェクトの要素を含むメモリバッファを参照します。Swapメソッドは、要素をメモリに書き込むことなく、これらのバッファへのポインタを実際に交換します。したがって、行列は行列のままであり、ベクトルはベクトルのままになります。行列とベクトルを交換すると、ベクトル要素を持つ1行の行列と、フラット表現の行列要素を持つベクトルになります(Flatメソッドを参照してください)。
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---
      matrix a= {{1, 2, 3}, {4, 5, 6}};
      Print("a before Swap: \n", a);
      matrix b= {{5, 10, 15, 20}, {25, 30, 35, 40}, {45, 50, 55, 60}};
      Print("b before Swap: \n", b);  
    //--- swap matrix pointers
      a.Swap(b);
      Print("a after Swap: \n", a);
      Print("b after Swap: \n", b);
      /*
      a before Swap:
      [[1,2,3]
      [4,5,6]]
      b before Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      
      a after Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      b after Swap:
      [[1,2,3]
      [4,5,6]]
      */
      vector v=vector::Full(10, 7);
      Print("v before Swap: \n", v);
      Print("b before Swap: \n", b);
      v.Swap(b);
      Print("v after Swap: \n", v);
      Print("b after Swap: \n", b);
      /*
      v before Swap:
      [7,7,7,7,7,7,7,7,7,7]
      b before Swap:
      [[1,2,3]
      [4,5,6]]
      
      v after Swap:
      [1,2,3,4,5,6]
      b after Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      */
     }
    Swap()メソッドは、動的配列を使用した操作も可能にします(固定サイズの配列をパラメーターとして渡すことはできません)。配列は任意の次元にすることができますが、サイズは合意されています。つまり、行列またはベクトルの合計サイズは、配列のゼロ次元の倍数でなければなりません。配列のゼロ次元は、最初のインデックスに含まれる要素の数です。たとえば、動的な3次元配列「doublearray[][2][3]」の場合、ゼロ次元は2番目と3番目の次元のサイズの積です(2x3=6)。そのため、このような配列は、合計サイズが6の倍数である行列とベクトルを使用するSwapメソッドでのみ使用できます(6、12、18、24など)。

    次の例を考えてください。
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- fill the 1x10 matrix with the value 7.0
      matrix m= matrix::Full(1, 10, 7.0);
      Print("matrix before Swap:\n", m);
    //--- try to swap the matrix and the array
      double array_small[2][5]= {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
      Print("array_small before Swap:");
      ArrayPrint(array_small);
      if(m.Swap(array_small))
       {
        Print("array_small after Swap:");
        ArrayPrint(array_small);
        Print("matrix after Swap: \n", m);
       }
      else // the matrix size is not a multiple of the first array dimension
       {
        Print("m.Swap(array_small) failed. Error ", GetLastError());
       }
      /*
      matrix before Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      array_small before Swap:
               [,0]     [,1]     [,2]     [,3]     [,4]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000
      [1,]  6.00000  7.00000  8.00000  9.00000 10.00000
      m.Swap(array_small) failed. Error 4006
      */
    //--- use a larger matrix and retry the swap operation
      double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
         {2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
         {3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
       };
      Print("array_static before Swap:");
      ArrayPrint(array_static);
      if(m.Swap(array_static))
       {
        Print("array_static after Swap:");
        ArrayPrint(array_static);
        Print("matrix after Swap: \n", m);
       }
      else // a static array cannot be used to swap with a matrix
       {
        Print("m.Swap(array_static) failed. Error ", GetLastError());
       }
      /*
      array_static before Swap:
             [,0]     [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000  6.00000  7.00000  8.00000  9.00000 10.00000
      [1,]  2.00000  4.00000  6.00000  8.00000 10.00000 12.00000 14.00000 16.00000 18.00000 20.00000
      [2,]  3.00000  6.00000  9.00000 12.00000 15.00000 18.00000 21.00000 24.00000 27.00000 30.00000
      m.Swap(array_static) failed. Error 4006
      */
    //--- another attempt to swap an array and a matrix
      double array_dynamic[][10];    // dynamic array
      ArrayResize(array_dynamic, 3); // set the first dimension size
      ArrayCopy(array_dynamic, array_static);
    //--- now use a dynamic array for swap
      if(m.Swap(array_dynamic))
       {
        Print("array_dynamic after Swap:");
        ArrayPrint(array_dynamic);
        Print("matrix after Swap: \n", m);
       }
      else //  no error
       {
        Print("m.Swap(array_dynamic) failed. Error ", GetLastError());
       }
      /*
      array_dynamic after Swap:
            [,0]    [,1]    [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]    [,9]
      [0,] 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000
      matrix after Swap:
      [[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30]]
      */
     }
  4. ベクトルと行列のLossGradientメソッドを追加しました。このメソッドは、予測値の損失関数の偏導関数のベクトルまたは行列を計算します。線形代数では、このようなベクトルは勾配と呼ばれ、機械学習で使用されます。
    vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const;
    matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
  5. SQLiteでのFOREIGNKEYSの使用を有効にして、SQLクエリでテーブル間の関係を強制します。  例:
    CREATE TABLE artist(
      artistid    INTEGER PRIMARY KEY, 
      artistname  TEXT
    );
    
    CREATE TABLE track(
      trackid     INTEGER, 
      trackname   TEXT, 
      trackartist INTEGER,
      FOREIGN KEY(trackartist) REFERENCES artist(artistid)
    );

  6. メソッドとオブジェクトの一貫性に応じて適切なクラスメソッドの選択を修正しました。

MetaEditor

  1. MQL5Storageへのコミットのコメントの許容長を増加しました。 変更をリポジトリにコミットするときの詳細なコメントは、大規模なプロジェクトで作業する場合に適していると考えられていますが、以前はコメントの長さが128文字に制限されていました。許可される長さは、最大260文字になりました。

MetaTester

  1. ビジュアルモードでのテスト速度スイッチの感度が向上しました。

クラッシュログに報告されるエラーを修正しました。