MetaTrader 5プラットフォームビルド1640:カスタムシンボルの作成とテスト

ターミナルにカスタム金融商品を作成することができるようになりました。この新しいオプションを使用すると、任意のシンボルを作成してその設定を構成し、シンボルに価格データをインポートしてチャートを表示できます。

21 7月 2017

ターミナル

  1. ターミナルにカスタム金融商品を作成することができるようになりました。この新しいオプションを使用すると、任意のシンボルを作成してその設定を構成し、シンボルに価格データをインポートしてチャートを表示できます。

    カスタムシンボルの作成
    板情報コンテキストメニューを使用してシンボル管理ウィンドウを開き「カスタムシンボルの作成」をクリックします。


    多数のシンボルパラメータの設定が可能です。パラメータとその説明の完全なリストは ドキュメントでみられます。カスタムシンボルは、同様のシンボルのパラメータをコピーして変更することで素早く設定することができます。「コピー元」フィールドで既存のシンボルを選択します。
    カスタムシンボルの名前は、ブローカーによって提供されるシンボルの名前と同じであってはなりません。同じ名前のシンボルが存在するサーバーに接続すると、カスタムシンボルが削除されます。
    ここではパラメータのインポートとエクスポートのコマンドも利用できます。カスタムシンボルはターミナル間で簡単に共有または転送することができます。設定はJSONテキストファイルにエクスポートされます。
    カスタムシンボルの管理
    すべてのシンボルは、個別のカスタムグループに表示されます。シンボルを変更または削除する必要がある場合は、リストのコンテキストメニューを使用します。



    価格履歴のインポート
    価格データは、任意のテキストファイル、およびMetaTrader履歴ファイル(HSTとHCC )からカスタムシンボルにインポートすることができます。シンボルを選択して「バー」タブに移動します。


    インポートダイアログで、ファイルへのパスを指定し、必要なパラメータを設定します。

    • Separator — テキストファイルの要素セパレータ
    • Skip columns and rows — インポート中にスキップされる列(左から右)と行(上から下)の量
    • Shift — 時間単位の時間シフト。このオプションは、異なるタイムゾーンに保存されたデータをインポートするときに使用されます。
    • Use selected only — 行ビュー領域で強調表示された行のみをインポートします。行はCtrlキーまたはShiftキーを長押しすると強調表示できます。

    分足のファイルは「日付 時刻 始値 高値 安値 終値 ティックボリューム ボリューム スプレッド」の形式を持つはずです。例:
    2016.06.27    00:01:00    1.10024    1.10136    1.10024    1.10070    18    54000000    44
    2016.06.27    00:02:00    1.10070    1.10165    1.10070    1.10165    32    55575000    46
    2016.06.27    00:03:00    1.10166    1.10166    1.10136    1.10163    13    13000000    46
    2016.06.27    00:04:00    1.10163    1.10204    1.10155    1.10160    23    51000000    41
    カスタムシンボルでは任意の既存製品のデータを使用することができます。データをエクスポートし(このオプションは以前のプラットフォームのバージョンで追加されました)、必要に応じて変更し、データをインポートし直します。
    価格履歴はMetaTrader 5に分足バーの形で保存され、他のすべての時間枠は、これらのバーに基づいて作成されます。また、より長い時間枠のデータをインポートすることもできますが、より短い時間枠のチャートではギャップが生じます。たとえば、時間足のデータをインポートすると、1時間に1つのバーがM1チャートに表示されます。
    カスタムシンボルの価格データは、下記のような別のカスタムディレクトリに保存されます(取引サーバのデータが保存されているディレクトリではありません)。
    C:\Users\[windows account]\AppData\Roaming\MetaQuotes\Terminal\[instance id]\bases\Custom

    カスタムシンボルの使用
    カスタムシンボルの使用は、ブローカーが提供する製品の使用に似ています。カスタムシンボルは板情報ウィンドウに表示され、 シンボルのチャートを開いたり、その上に指標や分析オブジェクトを適用することができます。カスタムシンボルは取引できません。

    カスタムシンボルのテスト戦略
    カスタムシンボルはストラテジーテスターでの自動売買ロボットや指標のテストに使用できます。これにより、ブローカーが現在提供できない銘柄についても戦略の最適化が可能になります。履歴を正しくインポートし、カスタムシンボルのプロパティを設定するだけです。



    ストラテジーテスターは証拠金と利益を計算するときには自動的に利用可能なクロスレートを使用します。 Forexタイプの証拠金計算を使用してAUDCAD.customシンボルを作成し、口座通貨をUSDにしたとします。この場合、テスターはForexシンボル名に基づいて次の順序で必要なシンボルを検索します。
    1.     まず、AUDUSD.custom(証拠金計算用)とUSDCAD.custom(取引利益計算用)のシンボルの検索が実行されます。
    2.     これらのシンボルがいずれも存在しない場合、必要な通貨ペアに対応する最初のシンボル(名前はそれぞれAUDUSDおよびUSDCAD)の検索が実行されます。たとえば、AUDUSD.bとNZDUSD.bのシンボルが見つかると、証拠金と利益を計算するためにはそれらのレートが使用されます。

    他種の証拠金計算を持つ製品(先物取引および証券取引所)では、商品通貨を預金通貨に変換するために通貨ペアが必要です。預金通貨がCHFであり、利益および証拠金通貨がGBPで表されるカスタムシンボルを作成したとします。この場合、テストシンボルの検索は次の順序で実行されます。
    1. GBPCHF(GBP対CHF)に対応する取引シンボルの存在が確認される。
    2. そのようなシンボルが存在しない場合、GBPCHFに対応する最初の取引シンボル(GBPCHF.bまたはGBPCHF.defなど)が検索される。

    カスタム製品を使用してアプリケーションをテストする場合は、取引口座に必要な通貨ペアがすべてあることを確認してください。ペアが欠如している場合、テスト中の取引結果と証拠金の計算は不可能です。

    今後のプラットフォームでは可能性がさらに広がる
    カスタムシンボルの開発はまだ完了しておらず、次のビルドでも多くの機能が追加される予定です。エキスパートアドバイザーからカスタムシンボルに直接履歴をインポートできるだけでなく、そのようなシンボルのデータ(クオーツを追加)を実時間でインポートすることもできます。

  2. Time&Sales機能にボリュームによるフィルタリングを追加しました。

    指定された値未満のボリュームを持つ取引は、Time&Salesテーブルから非表示にすることができます。このフィルタが適用されていると「Time&Sales」ウィンドウには大きな取引だけが表示されます。
    Time&Salesウィンドウの最初の行をダブルクリックして最小ボリュームを指定し、板情報の他の領域をクリックします。取引がフィルタリングされ、現在のフィルタ値がボリューム列ヘッダーに表示されます。


    Time&Salesのコンテキストメニューを使用して最小ボリュームを指定することもできます。

  3. 板情報をアクティブチャートにバインドするオプションを追加しました。金融商品のチャートに切り替えるたびに、板情報ウィンドウで同じ商品が自動的に有効になります。したがって、新しいシンボルごとに板情報ウィンドウを開く必要はありません。



  4. ターミナルウィンドウを最小化/最大化した後のツールバーのリフレッシュを修正しました。
  5. 取引チケットとポジションチケットが重なった場合のポジション取引履歴の生成を修正しました。

MQL5

  1. MQL5プログラムを価格履歴でプロファイリングするオプションが追加されました。このオプションを使うと、新しいティックを待たずにプログラムの性能を確認することができます。
    実際のデータに基づいてプロファイリングする場合、プログラムはターミナルの通常のチャートで起動されます。多くのプログラム、特に指標は、新しいティックの到着時にのみ計算を実行するため(OnTickOnCalculate)、その性能を評価するためには、実時間で新しいティックを待たなければなりません。履歴データを使用したプログラムのテストでは、必要な負荷をすぐに提供できます。プロファイリングはストラテジーテスターのビジュアルモードで開始され、一度に多くの新しいティックイベントが受信されます。



  2. unionサポートを追加しました。unionは、同じメモリ領域を共有する複数の変数からなる特別なデータ型で、同じビットシーケンスを2つ(またはそれ以上)の異なる方法で解釈する能力を提供します。unionの宣言は 'union'キーワードで始まります。
    union LongDouble
    {
      long   long_value;
      double double_value;
    };
    構造体とは異なり、さまざまなunionメンバは同じメモリ領域に属します。この例では、LongDoubleのunionは、long型とdouble型の値が同じメモリ領域を共有するように宣言されています。long_valueとdouble_value変数が(メモリ内で)重複しているので、構造体とは異なり、long型の値とdouble型の実数値を同時に格納することはできません。一方、MQL5プログラムは、unionからのデータをいつでも整数(long)または実数(double)として 処理することができるため、unionでは、同じデータシーケンスを表す2つ(またはそれ以上)のオプションを受け取ることができます。

    unionの宣言中に、コンパイラは、変数unionに最大(サイズ)の型を格納するのに十分なメモリ領域を自動的に割り振ります。union要素にアクセスするためには、構造体要素にアクセスするのと同じ構文(点演算子)が使用されます。
    union LongDouble
    {
      long   long_value;
      double double_value;
    };
    //+------------------------------------------------------------------+
    //| スクリプトプログラム開始関数                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       LongDouble lb;
    //--- 無効な-nan(ind)番号を取得して表示する
       lb.double_value=MathArcsin(2.0);
       printf("1.  double=%f                integer=%I64X",lb.double_value,lb.long_value);
    //--- 正規化された最大値l(DBL_MAX)
       lb.long_value=0x7FEFFFFFFFFFFFFF;
       printf("2.  double=%.16e  integer=%I64X",lb.double_value,lb.long_value);
    //--- 正規化された最小正 (DBL_MIN)
       lb.long_value=0x0010000000000000;    
       printf("3.  double=%.16e  integer=%.16I64X",lb.double_value,lb.long_value);
      }
    /*  実行結果
        1.  double=-nan(ind)                integer=FFF8000000000000
        2.  double=1.7976931348623157e+308  integer=7FEFFFFFFFFFFFFF
        3.  double=2.2250738585072014e-308  integer=0010000000000000
    */

  3. 構造物やクラスオブジェクトに対する暗黙のコピー演算子の自動生成を追加しました。コンパイラは自動的にコピー演算子を作成します。これにより、b = aのようなオブジェクトの単純なエントリを書くことができます。
    class Foo
      {
       int               value;
    public:
       string Description(void){return IntegerToString(value);};
       //--- デフォルトコンストラクタ
                         Foo(void){value=-1;};
       //--- パラメータ付きのコンストラクタ
                         Foo(int v){value=v;};
      };
    //+------------------------------------------------------------------+
    //|  Foo型オブジェクトを持つ構造体                           |
    //+------------------------------------------------------------------+
    struct MyStruct
      {
       string            s;
       Foo               foo;
      };
    //+------------------------------------------------------------------+
    //| スクリプトプログラム開始関数                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       MyStruct a,b;
       Foo an_foo(5);
       a.s="test";
       a.foo=an_foo;
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    //---
       Print("b=a");
       b=a;
    //---
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    /*
       Execution result;
       a.s=test a.foo.Description()=5
       b.s= b.foo.Description()=-1
       b=a
       a.s=test a.foo.Description()=5
       b.s=test b.foo.Description()=5
    */
      }
    オブジェクトメンバ単位のコピーは暗黙の演算子で実行されます。

    • メンバがオブジェクトの場合、このオブジェクトに対応するコピー演算子が呼び出されます。
    • メンバがオブジェクトの配列である場合、各要素に対して適切なコピー演算子を呼び出す前に、ArrayResizeを使用して受信配列が必要なサイズに増減されます。
    • メンバが単純型の配列である場合、コピーにはArrayCopy関数が使用されます。
    • メンバがオブジェクトへのポインタである場合、コピーされるのはポインタでそれが指しているオブジェクトではありません。

    必要に応じて、オーバーロードを使用して暗黙のコピー演算子の代わりに動作をオーバーライドして独自のオプションを作成することができます。

  4. Copy*関数を使用してエキスパートアドバイザーから価格履歴にアクセスする際のメモリ使用量を最適化しました。大量のデータを扱う場合、メモリ消費量は何倍も削減されます。

  5. datetimeのMqlDateTimeへの変換が成功したかどうかをTimeToStruct関数が返すブール値で確認できるようになりました。
  6. 文字列、動的配列、オブジェクト、ポインタを含む構造体の FileWriteStruct および FileReadStruct 関数の使用を禁止しました。
  7. 以下の応答コードが追加されました。

    • TRADE_RETCODE_REJECT_CANCEL — 未決注文をアクティブにする要求が拒否され、注文がキャンセルされました。
    • TRADE_RETCODE_LONG_ONLY — シンボル に"Only long positions are allowed(買いポジションのみ)"が設定されているため、リクエストが拒否されました。
    • TRADE_RETCODE_SHORT_ONLY — シンボルに"Only short positions are allowed(売りポジションのみ)"が設定されているため、リクエストが拒否されました。
    • TRADE_RETCODE_CLOSE_ONLY — シンボルに"Only closing of existing positions is allowed(既存ポジションの決済のみ)"が設定されているため、リクエストが拒否されました。

  8. SYMBOL_ORDER_MODE パラメータを持つSymbolInfoInteger関数の新しい戻り値を追加しました。SYMBOL_ORDER_CLOSEBY — Close By操作(反対方向のポジションによるポジションの決済)の許可。
  9. SYMBOL_CUSTOMブール値プロパティがENUM_SYMBOL_INFO_INTEGER列挙に追加されました。このプロパティは、シンボルがカスタムであるかどうかを調べることができます。プロパティを取得するにはSymbolInfoInteger 関数を使用します。
  10. 注文、取引、ポジションの作成理由を取得できるようになりました。

    新しいプロパティ


    注文、取引、ポジション作成の理由
    取引操作の作成理由を得るための3つの変数が追加されました。
    ENUM_POSITION_REASON ENUM_DEAL_REASON ENUM_ORDER_REASON 理由の詳細
    POSITION_REASON_CLIENT DEAL_REASON_CLIENT ORDER_REASON_CLIENT この操作は、デスクトップターミナルから出された注文がアクティブ化された結果として実行されました。
    POSITION_REASON_MOBILE DEAL_REASON_MOBILE ORDER_REASON_MOBILE この操作は、モバイルアプリケーションから出された注文がアクティブ化された結果として実行されました。
    POSITION_REASON_WEB DEAL_REASON_WEB ORDER_REASON_WEB この操作は、Webプラットフォームから出された注文がアクティブ化された結果として実行されました。
    POSITION_REASON_EXPERT DEAL_REASON_EXPERT ORDER_REASON_EXPERT この操作は、MQL5プログラム(エキスパートアドバイザーまたはスクリプト)から出された注文がアクティブ化された結果として実行されました。
    - DEAL_REASON_SL ORDER_REASON_SL この操作は、ストップロスのアクティブ化の結果として実行されました。
    - DEAL_REASON_TP ORDER_REASON_TP この操作は、テイクプロフィットのアクティブ化の結果として実行されました。
    - DEAL_REASON_SO ORDER_REASON_SO この操作は、ストップアウトイベントの結果として実行されました。
    - DEAL_REASON_ROLLOVER - この約定は、ロールオーバのために実行されました。
    - DEAL_REASON_VMARGIN - この約定は、変動証拠金を課金した後に実行されました。
    - DEAL_REASON_SPLIT - この約定は、スプリットが公表された時にポジションが存在した株式または他の資産のスプリット(低下)の後に実行されました。

  11. 同期とティック履歴へのアクセスを最適化しました。
  12. CopyTicksRange関数でティックを統計配列に返すよう修正しました。以前のバージョンでは、この場合、常に0個のティックが返されました。
  13. ファジー論理ライブラリにさまざまな修正を加えました。

シグナル

  1. 取引口座の接続がない場合、ウェブサイトからのシグナルが開かれる問題を修正しました。

テスター

  1. 注文履歴及び約定履歴による作業を最適化して加速化しました。大量のデータ(数万回の履歴エントリ)を扱う場合の操作速度は何倍も向上しました。
  2. テストレポートのポジション保持時間の計算を修正しました。

MetaEditor

  1. デバッガでの静的クラスメンバ配列の内容の表示を修正しました。
  2. デバッグされたプログラムにブレークポイントのリストを追加しました。このリストは「デバッグ」タブのコンテキストメニューを使用して開くことができます。


    ブレークポイントにジャンプするには、ブレークポイントをダブルクリックします。
ドキュメントを更新しました。