MetaTrader 4 Build 900: MQL4でのクラスパターンとメモリー動作の最適化

MetaTrader 4の最新のアップロード

22 10月 2015

ターミナル

  1. ターミナル:非アクティブ(未接続)アカウントのパスワード変更に関する不具合の修正を行いました。




  2. 大容量のヒストリー使用時のメモリーの使用と解放を最適化しました。
  3. 大容量のニュースカテゴリー使用を修正、また最適化しました。

シグナル

  1. 『ナビゲータ』ウィンドウのコンテクストメニューのシグナルからの回答を修正しました。


MQL4

  1. C++でのパラメータ化されたクラスを作成することを可能にするクラスパターンが追加されました。これは、より多く抽出したり、一様に異なるクラスのオブジェクト操作の為に同じコードを使用することを可能にするものです。使用例:
    //+------------------------------------------------------------------+
    //|                                                    TemplTest.mq5 |
    //|                        Copyright 2015, MetaQuotes Software Corp. |
    //|                                             https://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2015, MetaQuotes Software Corp."
    #property link      "https://www.mql5.com"
    #property version   "1.00"
    //+------------------------------------------------------------------+
    //| クラスパターンを指定します。                                            |
    //+------------------------------------------------------------------+
    template<typename T>
    class TArray
      {
    protected:
       T                 m_data[];
    
    public:
    
       bool              Append(T item)
         {
          int new_size=ArraySize(m_data)+1;
          int reserve =(new_size/2+15)&~15;
          //---
          if(ArrayResize(m_data,new_size,reserve)!=new_size)
             return(false);
          //---
          m_data[new_size-1]=item;
          return(true);
         }
       T                 operator[](int index)
         {
          static T invalid_index;
          //---
          if(index<0 || index>=ArraySize(m_data))
             return(invalid_index);
          //---
          return(m_data[index]);
         }   
      };
    //+------------------------------------------------------------------+
    //| ポインター配列のパターンクラスは                                        |
    //| デストラクタに保存されたポインターオブジェクトを削除します。                    |
    //|                                                                  |
    //| TArrayクラスパターンからの継承にご注意ください。                           |
    //+------------------------------------------------------------------+
    template<typename T>
    class TArrayPtr : public TArray<T *>
      {
    public:
       void             ~TArrayPtr()
         {
          for(int n=0,count=ArraySize(m_data);n<count;n++)
             if(CheckPointer(m_data[n])==POINTER_DYNAMIC)
                delete m_data[n];
         }
      };
    //+------------------------------------------------------------------+
    //| クラスを指定し、それへのオブジェクトポインタを配列に保存します。                 |
    //+------------------------------------------------------------------+
    class CFoo
      {
       int               m_x;
    public:
                         CFoo(int x):m_x(x) { }
       int               X(void) const { return(m_x); }
      };
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    TArray<int>     ExtIntArray;   // TArrayのパターンをインスタンス化します(TArrayのパターンをint型に特殊化)
    TArray<double>  ExtDblArray;   // TArrayのパターンをインスタンス化します (TArrayのパターンをdouble型に特殊化します)
    TArrayPtr<CFoo> ExtPtrArray;   // TArrayPtrのパターンをインスタンス化します (TArrayPtrのパターンをCFoo型に特殊化します)
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //--- 配列データを書き込みます。
       for(int i=0;i<10;i++)
         {
          int integer=i+10;
          ExtIntArray.Append(integer);
          
          double dbl=i+20.0;
          ExtDblArray.Append(dbl);
          
          CFoo *ptr=new CFoo(i+30);
          ExtPtrArray.Append(ptr);
         }
    //--- 配列の内容を出力します。
       string str="Int:";
       for(i=0;i<10;i++)
          str+=" "+(string)ExtIntArray[i];      
       Print(str);   
       str="Dbl:";
       for(i=0;i<10;i++)
          str+=" "+DoubleToString(ExtDblArray[i],1);
       Print(str);   
       str="Ptr:";
       for(i=0;i<10;i++)
          str+=" "+(string)ExtPtrArray[i].X();      
       Print(str);
    //--- TArrayPtr<CFoo>のオブジェクトデストラクタで削除されるため、newを通して作成されたCFooのオブジェクトは削除しなくてもよい  
      }
    実行結果:
    TemplTest EURUSD,M1: Ptr: 30 31 32 33 34 35 36 37 38 39
    TemplTest EURUSD,M1: Dbl: 20.0 21.0 22.0 23.0 24.0 25.0 26.0 27.0 28.0 29.0
    TemplTest EURUSD,M1: Int: 10 11 12 13 14 15 16 17 18 19
  2. 時折MQL4-プログラムが落ちる原因となっていた、ArrayCopy機能でのメモリーの再分配を修正しました。

テスター

  1. インディケータテスト終了後にグローバルレベルにおいて指定された変数がリセットされる不具合を修正しました。
  2. 取引サーバへの未接続下でのテストを修正しました。

MetaEditor

  1. В MetaAssistでの型引用時の機能名の定義を修正しました。
  2. 大きなファイルを開く修正をしました。
  3. ライブラリページからの検索呼出の為のホットキーFが追加されました。同様に、コードを使用するコマンドの為にステータスバーに多数のプロンプトが追加されました。:インデントの増大/減少、ナビゲーション、ケースシフトなど。


クラッシュログで報告された不具合を修正しました。