
HedgeTerminalパネルを利用して MetaTrader 5 で双方向トレードとポジションヘッジを行う - パート1
目次
- はじめに
- 第1章双方向トレードの組織論
- 1.1. 双方向トレードを行うことについてのMetaTrader 5 のチャンス
- 1.2. ペアオーダー-ヘッジと統計の基礎
- 1.3. MetaTrader 5 のネットポジションとHedgeTerminalのポジションの関係
- 1.4. 双方向トレードを実装するアルゴリズムの条件
- 第2章HedgeTerminalのインストールと初回起動
- 2.1. HedgeTerminalのインストール
- 2.2. 3ステップインストールインストールダイアグラムと起こりうる問題の解決
- 2.3. HedgeTerminalの開始-初回起動
- 2.4. ファイナンシャル処理のヘッジと計算
- 2.5. ワン・クリック・トレーディング
- 2.6. ストップロスとテイクプロフィットの設定-トレーリングストップ
- 2.7. レポート作成
- 2.8. 通貨スワップ提示
- 2.9. 一番下の行
- 2.10. HedgeTerminalテーブルの表示変更
- 2.11. 計画された未実装の機能
- 第3章HedgeTerminalのボンネットの下で処理の仕様と原則
- 3.1. グローバルな輪郭とローカルの輪郭情報のコンテキスト、転送、格納
- 3.2. グローバル情報とローカル情報の格納
- 3.3. ストップロスレベルとテイクプロフィットレベルオーダーシステムの問題と OCO 注文
- 3.4. OCO 注文は双方向のポジション保護の問題を解決することができるのか?
- 3.5. オーダー初期化へのリンクの格納
- 3.6. HedgeTerminal処理の限界
- 3.7. ペア注文のメカニズムとアクションの決定論
- 3.8. ディールの分割と連結-オーダー算術の基礎
- 3.9. オーダーとディールの仮想化
- 3.10. オーダー非表示のメカニズム
- 3.11. 適応メカニズム
- 3.12. パフォーマンスとメモリ使用法
- おわりに
はじめに
過去1年半の間にs MetaQuotes は MetaTrader 4 と MetaTrader 5 のプラットフォームを統一されたトレーディングエコシステムに統合するという偉業をなしとげました。いまや両プラットフォームはプログラムソリューションの共通マーケットを共有しています。それは AppStore でそこで外部開発者からのさまざまなプロダクツを提供しています。両プラットフォームに対するコンパイラも統一されました。両プラットフォームは MQL5 と1種類のプログラム言語に基づく共通のコンパイラを持つに至りました。利用するプラットフォームに応じ異なる関数設定を持つ MQL がそれです。CodeBase に置かれ、誰もが利用できるソースコードもすべて改定され、その中には新たなコンパイラと互換性を持つよう調整されているものもあります。
このプラットフォームの主要な統一にはそのトレード部分の統一は含まれていません。トレード環境の主な部分は共有されているにもかかわらず MetaTrader 4 のトレードモデルと MetaTrader 5 のそれはまだ根本的に互換性がありません。MetaTrader 4 はオーダーシステムによってトレードポジションの個別管理を促進します。オーダーシステムとはこのターミナルにおいて双方向のトレードをシンプルで簡単にする特殊なプログラムエンティティです。MetaTrader 5 はトレーダーの義務の主要な表現が集計ネットポジションである為替取引を対象としています。MetaTrader 5 におけるオーダーとは単に金融商品を売買する指示にすぎません。
上記2種類のトレーディングプラットフォームの違いは数多くの激論やディベートを引き起こしています。ただ、議論は議論に過ぎません。残念ながら MetaTrader 5の発売以来、MetaTrader 4 のように双方向のポジションとしてトレーダーの義務を提示できるような役に立つ解決法は一つも発表されておりません。さまざまな解決法を提案する記事は数多くあるものの、広範囲にわたって便利に利用するに十分な柔軟性を持ち合わせているものはありません。その上、考慮すべき細かいニュアンスが多き為替取引に適切な判断はひとつもありません。
本稿は MetaTrader プラットフォームの第4バージョンと第5バージョンファンの間の論争を収める必要があります。本稿では完全なプログラム仕様の形式で汎用的な解決をし、この仕様を実装するプログラムソリューションを抽出していきます。本稿はビジュアルパネルと仮想化ライブラリHedgeTerminalについてお話します。これは MetaTrader 4 のように双方向のポジションとしてトレーダーの義務を提示できるものです。同時にHedgeTerminalにあるモデルはトレードオーダー実行特性を考慮します。それが意味するところは、店頭での FOREX と、たとえばモスクワ株式市場のデリバティブセクションで派生証券を取り引きするような集中型の為替取引両方を問題なく実装することができるということです。
HedgeTerminalは MetaTrader 5 たーになる内でのトレーディングターミナル機能を完全に備えています。仮想化 のメカニズムによって、それは現ポジションの表示を変更します。よってトレーダーまたは売買ロボットは個別のトレードポジションを管理することができるのです。ポジション数、その方向はどちらも重要ではありません。私が強調したいのは、ここでお話しているのは仮想化、トレーダーの義務ではあっても質的特性ではないものの表現を転換する特別なメカニズムだということです。
これはトレーダーのファイナンシャル活動の結果を表すことではなくこの活動の表現を変換することです。HedgeTerminalは MetaTrader 5 のトレード環境および MQL5 プログラム言語を基にしています。ターミナルに新しいトレード情報をもたらすことはなく、ただ現トレード環境を異なる角度で見えるようにするのです。それはHedgeTerminalは基本的に MetaTrader 5 でそのネイティブなアプリケーションであることを意味します。とはいうものの、それらの間に識別記号をつけることはできます。HedgeTerminalは小さく数ある MetaTrader 5 アプリケーションの一つにすぎないため包摂記号が適切でしょう。
仮想化の可能性とHedgeTerminalの存在は3個のパラダイムに基づきます。
- 概念的に完全で保証される個別の双方向トレードトランザクションへのポジションのネット表現が可能である。この意見は為替取引用に設計されたものも含め、外部のトレーディングプラットフォームの中には双方向ポジション管理をする手法があることを裏付けます。
- ユーザーレベルの MetaTrader 5 のトレードモデルはお互いにオーダーの一方行のリンクを作成することを可能にする。計算により特定方法で作成されるリンクは衝突を避けることが示されました。また破損した履歴の場合、あらゆる不可抗力の状況であっても、双方向のトランザクションは遡及的に修正され、ネット表現で計算される財務実績に着地する可能性があるのです。
- MQL5 の高度な API により識別記号を MQL5 と MetaTrader 5 ターミナルの間に入れることができる。すなわち、MetaTrader 5 におけるほとんどすべてはプログラムインターフェースと MQL5 プログラム言語をとおしてアクセス可能であるのです。たとえばターミナルのみなさんバージョンはHedgeTerminalのように MetaTrader 5 内で書くことが可能なのです。
本稿では根本的なアルゴリズムとHedgeTerminalがどのように動作するかお話します。仕様および安定的な双方向トレードを保証するアルゴリズムについて詳細にお伝えします。HedgeTerminalを使用しようと思うか、ご自身のトレーディングアルゴリズムを管理するのに自分のライブラリを作成するかにかかわらず、みなさんは本稿と続編に有用な情報を見つけることでしょう。
本稿は特にプログラマー向けというわけではありません。プログラミングに経験がなくても理解できる内容となっています。本稿には意図的に MQL のソースコードは取り上げていません。ソースコードはすべて書影原則やデータ整理をスキーム的に表すより多くの説明図、表、に置き換えました。私は経験からプログラミング原理をよく理解していても、コードを分析するより共通パターンを見つける方がずっと簡単であることを解っています。
本稿第二部では Expert Advisors を「HedgeTerminalAPI」可視化ライブラリに統合すること、それからプログラミングについてもお話します。ただしその場合でも特に初心者プログラマーのためにコードがわかりやすいようにすべてをシンプルに行いました。たとえばHedgeTerminalがオブジェクト指向アプリケーションであっても、クラスのようなオブジェクト指向のコンストラクションは、使用していません。
本稿の読み方
本稿はかなり長いものとなっています。一方、これは実質的に本テーマに関するあらゆる質問がここでみつかるという点でよいことです。もう一方で、数多くのユーザーは必要に応じていつでも関連するセクションに戻ってもっとも重要な情報だけ読みたいとお思いでしょう。本稿はテーマについて完全に一貫した表現をしています。書籍同様、各章に関して要約を付けていくつもりです。それでみなさんはその章を読む必要があるかどうか判断できます。
第1部 第1章 双方向トレード組織理論 この章ではHedgeTerminalの主要な考え方を述べます。双方向トレードの組織に関する詳細な情報が必要ない場合は、HedgeTerminalの処理の一般的原理についての考えを理解するだけで十分です。本章は読者のみなさんが一読されることをお薦めします。
第1部 第2章 HedgeTerminalのインストール、初回起動 本章ではHedgeTerminalのビジュアルパネルの起動とセットアップについてお話します。HedgeTerminalのビジュアルパネルを使うつもりがなければこの章はとばしていただいてかまいません。ですがHedgeTerminalAPI ライブラリを使おうとお思いなら、本章の 2.1 節および 2.2 節は読む必要があります。それらはHedgeTerminalインストーラに特化してお話しています。インストーラはすべてのHedgeTerminalプロダクツに共通したコンポーネントです。
第1部 第2章 HedgeTerminalのボンネットの下で処理の仕様と原則 本章はHedgeTerminal内部の整理、そのアルゴリズム、内部データ整理について強調しています。双方向トレードに興味のある方にとってはこの章は有益でしょう。ご自身の仮想化ライブラリを開発し同時に多くのロボットを使用しているプロのアルゴリズムトレーダーにとっても本章は有用かもしれません。
第2部 第1章 Expert Advisors とHedgeTerminalの通信と通信パネル 本章はこの点を模索している方やプロとしてアルゴリズムトレードを行っている人にとってはありがたいものとなることでしょう。そこではHedgeTerminalライブラリでの作業と売買ロボットのアーキテクチャの共通原理述べています。
第2部 第2章 API HedgeTerminalのドキュメンテーション HedgeTerminalAPI ライブラリの関数使用に関するドキュメンテーションを持ちます。この章は時々参照する可能性のあるドキュメンテーションのリストとして書かれています。ここには不必要な話や過度のテキストはありません。この章にあるのは関数、ストラクチャ、列挙のプロトタイプとその使用法の簡単な例だけです。
第2部 第3章 非同期的トレード処理の基本 HedgeTerminalはその動作において非同期的処理を行います。本章はそれらを使用する経験についても話します。本章は作業においてHedgeTerminalを使用しようと思っているかいないかに関わらずあらゆる読者が有用な情報を見つけることができるよう本稿に盛り込まれています。
第2部 第4章 MetaTrader 環境におけるマルチスレッドプログラミングの基礎 本章ではマルチスレッドとは何か、それをどのように作成するか、どのようなパターンのデータ組織が使用可であるか、説明します。第3章のように全 MetaTrader ユーザーとマルチスレッドアプリケーション開発の経験を共有します。
本章が十分興味を引くもので、みなさんに最後までお読みいただけることを願っています。
第1章 双方向トレードの組織論
1.1. 双方向トレードを行うことについてのMetaTrader 5 のチャンス
記事 "Principles of Exchange Pricing through the Example of Moscow Exchange's Derivatives Market" には交換価格形成の微妙な意味合いやマーケット参加者の財務実績の計算方法が注意を払って述べられています。モスクワ市場での値付けと計算は FOREX トレードで受け入れられるコンセプトや計算方法とはかなり異なることが概説されています。
概して Forex を MetaTrader 4 ターミナルでトレードする際、交換価格の形成はより複雑で隠された重要な詳細を持つのです。
たとえば、MetaTrader 4 ではトレーダーの注文を実行するディールは隠されており、一方 MetaTrader 5 ではそのような情報は利用可能なようになっています。一方 MetaTrader 5 で詳細なトレードはつねに必要とは限りません。経験のないユーザーや初心者のプログラマーにとってそれは作業を難しくし、誤解を招く可能性があります。たとえば、MetaTrader 4では実行される注文の価格を検索するためにはただ『価格』列で相当する値を検索すればよいだけです。MQL4 プログラム言語で OrderOpenPrice() 関数を呼ぶだけです。In MetaTrader 5 では注文を実行したディールをすべて検索し、それからそれらを詳細に調べその加重平均価格を計算する必要があります。この価格がまさに注文実行価格なのです。
他に MetaTrader 5 ではトレード環境の拡張表現がこの情報を分析するためにさらなる労力を要求する場合があります。それは論理的な質問を求めます。
MetaTrader 5 には MetaTrader 4 と同じくらいシンプルでわかりやすいトレード処理方法はあるか、また必要なトレード詳細情報すべてへの便利なアクセスを維持する方法はあるのか?MetaTrader 4と同じシンプルな方法でMetaTrader 5 を使用して双方向為替トレードを作成する方歩はあるのだろうか?これら質問に対する答えは「はい、あります!」です。
MetaTrader 4 および MetaTrader 5 ターミナルの機能ダイアグラムを参照しそれがどのように可能なのか理解します。
図1 MetaTrader 4 および MetaTrader 5 の機能
見てのとおり『MetaTrader 5』セットには『MetaTrader 4』サブセットが入っています。それはMetaTrader 5 でできることが MetaTrader 4 ではできなくても MetaTrader 4 でできることはなんでも MetaTrader 5 でできるということです。MetaTrader 5 の新機能は必然的にトレード情報表示の量と複雑性を増します。この難しさは MetaTrader 5 環境で動作する特別なアシスタントプログラムに委託されます。アシスタントプログラムはターミナルの機能を同レベルに保ちながら複雑性を処理します。本章ではそういったプログラムの一つであるHedgeTerminal に着目します。
HedgeTerminalは MetaTrader 5 ターミナル内の本格的なトレーディングターミナルです。それは MetaTrader 5 のトレード環境を利用し、MQL5 言語によってそれを変換し、便利なグラフィカルインターフェースとして表示します。-独立したアルゴリズムと連携するためのパネル HedgeTerminalUltimate と特別なインターフェース HedgeTerminalAPI(Expert Advisors、スクリプト、インディケータ)です。
MetaTrader 4 は双方向ポジションまたはロックオーダーを利用する機能を備えています。MetaTrader 5 でもそのような機能はありますが、明確ではありません。これは特定のアドオンプログラムを用いて有効にできます。それがHedgeTerminalの本質です。HedgeTerminalは MetaTrader 5 に内蔵されておりその環境を利用します。ディールや MetaTrader 4 の注文にひじょうに似て見える統合されたポジションへの注文ごとの情報収集をし、MetaTrader 5 の機能をすべて備えています。
そのようなポジションは完了または部分的にロックオーダー(アクティブなロングおよびショートポジションが同時に存在する場合)の可能性があります。そういうポジションを保持する機会はHedgeTerminalの目的ではありません。その主な目的は分析、管理、アクセスしやすいであろう統一されたグループ(ポジション)でトレード情報を一元化することです。双方向ポジションはHedgeTerminalに存在することができます。それはただこれがひじょうに便利だからにすぎません。1アカウントで複数のトレーダーがトレードを行っている場合、または複数の戦略が使われている場合、トレードアカウントの分割が必要です。
また為替取引ではオーダーの部分的実行、ポジションのロールオーバー、変動証拠金の計算、統計、その他など数多く二ュアンスを考慮する必要があります。HedgeTerminalはこれら課題を満たすために開発されました。それは MetaTrader 4 に似ていて、同時に為替取引環境で正確に動作する常に高いレベルのインターフェースをユーザーや Expert Advisor に提供します。
1.2. ペアオーダー-ヘッジと統計の基礎
安定してトレード技術やアルゴリズムを管理するために必要なのはどのトレード処理がどのアルゴリズムに依存するかを確実に知ることです。私は『確実に』ということばを強調しました。それはいかに小さいものであろうと失敗の可能性があれば、遅かれ早かれポジション管理が息づまるのは必然だからです。 そうすると統計の損傷をもたらし、アカウントで異なるアルゴリズムを管理する考えを弱体化することになります。
信頼性あるトレードの分離処理は2つの基本的機能を基にしています。
- 2 つのトレード注文を結合する あるいは『一対にする』 機能で、それにより 2 つのオーダーのどちらが独立した(仮想の)ポジションをオープンし、どちらがこのポジションをクローズするかつねに明確になります。
- ペアリングに対するオーダーを分析しながらアルゴリズムはすべてのプログラムモジュールについて完全に決定論的で統一されている必要があります。
アルゴリズムの決定論についての2番目の条件は以下で詳しく考察します。ここから最初の条件に注目していきます。
オーダーとは売るか買うかの指示です。オーダーは定義されたエンティティで、それにはマジックナンバーやオーダーナンバー、要求価格、オープンする条件のような主要な情報以外にも別に数多くの情報『フィールド』があります。
MetaTrader 5 におけるそのようなフィールドのひとつが『オーダーマジック』です。これは個別のユニークな番号でオーダーをマークするために売買ロボットや Expert Advisor に対して使用される特定のフィールドで、『マジックナンバー』とも呼ばれます。トレーディングアルゴリズムがこのフィールドを分析するときそれはつねに問題のオーダーがそのアルゴリズムによって出されたかまたは別のアルゴリズムによって出されたか確認することができるため、このフィールドはトレーディングアルゴリズムにとってひじょうに大切なものですが、マニュアルのトレードでは使用されません。
例を見ていきます。従来のロングポジションをオープンし、いくらか時間が経つとクローズする必要があるとします。そのためにはオーダーを2つ出す必要があります。最初のオーダーはこのポジションをオープンし、2番目のオーダーはこのポジションをクローズするのです。
図2 履歴ネットポジションを形成するオーダー
オーダーをマーケットに送信するとき、2番目のオーダーの『マックナンバー』フィールドに1番目のオーダーのマジックナンバーを書き込むとどうなるのでしょうか?
のちにこのオーダーのフィールドが読まれ、値が1番目のオーダーのナンバーに等しければ、確実に2番目のオーダーは1番目のオーダーに関連しており、それの逆である、すなわちクローズするオーダーであるということができます。
ダイアグラムではこのぺリングは次のようなものです。
図3 ペアリングオーダー
通常そのようなオーダーは対と呼ばれます。2番目のオーダーが1番目にリンクしているためです。新しいポジションをオープンする1番目のオーダーは開始 または オープン オーダーと呼ばれます。2番目のオーダーは終了オーダーと呼びます。
そのようなオーダーの対をポジションと言います。MetaTrader 5での『ポジション』のコンセプトを混乱しないように、われわれはそのような一対のポジションを双方向ポジション、ヘッジポジション、 HedgeTerminalポジションと言うことにします。MetaTrader 5 でのポジションはネットポジションまたはMetaTrader 5従来ポジション と呼びます。
従来のものと異なり、明らかにHedgeTerminalのポジション数とその方向は任意でありえます。別のオーダーからはひとつも参照されない実行されたオーダーがあったらどうなるのでしょうか?そのようなオーダーはアクティブな双方向ポジションとして提示することができます。実際、このオーダーにリンクした逆のオーダーが出されると、それは最初のオーダーをクローズするオーダーとなります。そのようなオーダー同士が対になり、クローズした双方向ポジションとなります。2つのオーダーのボリュームが等しく方向が逆であるからです。
それではポジションによってHedgeTerminalで意味するものを定義します。
実行されたオーダーが別のオーダーからはひとつも参照されなければ、HedgeTerminalはそのようなオーダーを アクティブな双方向ポジションとして処理します。
実行されたオーダーが別の任意のオーダーから参照されれば、そのような2つのオーダーは対になりHedgeTerminalによって結合した履歴のまたはクローズした双方向ポジションとして処理されます。
現実ではHedgeTerminal内のペアリングオーダーはもっと複雑です。それは各オーダーが最初ディールを生成し、為替トレードではそのようなディールが数多く存在するためです。一般的にトレード処理は以下のように表されます。トレーダーが注文を出し、MetaTrader 5 ターミナルによって新しポジションをオープンする。為替は1件以上のディールによってこの注文を実行します。
注文に似かよったディールには追加情報のためのフィールドがあります。そのようなフィールドの一つにはオーダーIDがあり、それを基にディールが実行されます。このフィールドには特定のディールが属するオーダー情報が入っています。逆は不可です。オーダー自体はそこにどんなディールが属しているか知りません。それが起こるのは、発注時どのディールがオーダーを実行するか、またオーダーが実行されるのかどうかさえまったく明確ではないからです。
アクションの因果関係または決定論はこのように見受けられます。ディールはオーダーを参照し、オーダーはお互いを参照しているのです。そのようなストラクチャはシングルリンクリストとして表現することができます。
実行されるオープンオーダーのディールは MetaTrader 5 で従来のポジションを生成し、終了オーダーに属するディールは逆にこのポジションをクローズします。こういったペアは以下の図に表示されています。
図4 オーダー、ディール、交換関係図
厳密に決められたトレーダーのアクション記録、すなわちHedgeTerminalのシステムを構築するためには関係の方向はひじょうに重要なものなので、この図の細かい分析に戻っていきたいと思います。
1.3. MetaTrader 5 のネットポジションとHedgeTerminalのポジションの関係
HedgeTerminalの観点からボリュームが同じで逆方向の2つのオーダーは2つの異なるポジションである可能性があります。今回の場合、そのネットポジションはゼロです。それはHedgeTerminalが MetaTrader 5 にオープンしている実際のネットポジションに関する情報を利用しないためです。このためHedgeTerminalでのポジションは MetaTrader 5のポジションとは関連性はありません。現ネットポジションが確認されるのはHedgeTerminalが起動するときのみです。逆向きのアクティブなポジションのトータルボリュームは実際のネットポジションのボリュームに等しい必要があります。
そうでなければ、HedgeTerminalの枠に警告の感嘆符が表示され、HedgeTerminalのポジションと MetaTrader 5のポジションは等しくないことを示します。さらなる正確な動作のためにそれは排除する必要がありますが、この非対称性がHedgeTerminalの効率に影響を与えることはありません。
多くの場合、ユーザーが除外されるオーダーのファイルExcludeOrders.xmlの編集を誤ったとき表示されます。サーバー上でオーダーやディールが破損してもこの警告が表示されます。いずれにしてもこういった不一致はExcludeOrders.xmlファイルに実装されている排除メカニズムによって消去することができます。
1.4. 双方向トレードを実装するアルゴリズムの条件
もっと厳格な条件は双方向トレードを実装するアルゴリズムに課されます。その条件はHedgeTerminalを作成するときに満たされるべきものです。そうでなければ、HedgeTerminalはすぐに確率的に動作するプログラムに変わることでしょう。プログラムはそれでも『同じ確率で処理を行うか行えないかというソリューションになる可能性があります。』
以下はHedgeTerminalを作成するのに特定される条件です。
- トレーダーの双方向ポジションの表現は信頼性のあるものでならない。HedgeTerminalに取り入れられる考えは抽象的であったりビジネスロジックにおいて潜在的なエラーにつながるものであってはならない。プロパティや機能がこれら条件を満たさなければ、この考えは都合がよくても要望するものであっても採用すべきではありません。
- アルゴリズムはすべてできる限り MetaTrader 5 のトレード環境に基づくものとします。ファイルにそれ以外の情報を格納することはこれが必ず必要な場合許可されます。仮想化アルゴリズムはトレード環境からの情報の大部分を受け取ります。このプロパティは信頼性の総合レベルを高めます。変更の多くはサーバーによってもたらされるため世界中のどこからでもアクセス可能であるためです。
- トレード環境変換におけるあらゆるアクションは舞台裏で行われる必要があります。複雑なコンフィギュレーションや 「API HedgeTerminal」の初期化は必要ありません。ユーザーは『難しい設定などは一切なし』でアプリケーションを起動し、期待した結果を得ることができるはずです。
- HedgeTerminalのビジュアルパネルは可能な限りスムーズに通常の MetaTrader 5 インターフェースにフィットし、MetaTrader 4 および 5 のユーザーになじみある双方向ポジションを処理するためのシンプルで解りやすいビジュアルツールを提供してくれます。すなわちビジュアルパネルあらゆるユーザーにとって 直観的に明白でシンプルでなければならないのです。
- HedgeTerminalのビジュアルパネルはアルゴリズムトレーダーの高いレベルの要求を考慮して作成する必要があります。たとえばパネルはコンフィギュレーション可能で、ユーザーが体裁を変えたりカスタムモジュールを追加したりすることができるものである必要があります。
- 外部「エキスパート」との直観的かつシンプルなプログラムインターフェース(API)を提供する必要があるのです。外部「エキスパート」とHedgeTerminalアルゴリズムの間の連携のプログラム部分はMetaTrader 4/5 システム関数によりカスタム「エキスパート」のプログラム連携の既存基準にスムーズにフィットします。実際HedgeTerminalAPI は MetaTrader 4 および MetaTrader 5 APIの混成のようです。
- HedgeTerminalは交換環境において信頼性ある動作を確実なものとします。その際為替オーダーの実行のニュアンスをすべて考慮します。HedgeTerminalは標準的な記事"Principles of Exchange Pricing through the Example of Moscow Exchange's Derivatives Market"を基に書かれています。当初この記事はHedgeTerminalに関する長編記事の一部でしたが、のちにボリュームの都合上複数の独立した記事に分割されたものです。HedgeTerminalはこの記事で述べられている考えのプログラム実装であると言えるでしょう。
これら多くの考えは必ずしも互いに関連しているわけではありません。たとえば、為替トレードに反映される為替情報が豊富ことはこの情報表現をシンプルにしにくくしています。
また初心者トレーダーが簡単に使えるパネルを作成すると同時にプロのアルゴリズムトレーダーに豊富な機会を提供するのも難しい点です。それでもなお結果を評価するとこれら相互に排他的な性質がHedgeTerminalにうまく実装されていることは明らかです。
第2章 HedgeTerminalのインストール、初回起動
2.1. HedgeTerminalのインストール
HedgeTerminalで実行されるオーダーはすべてポジションとみなされるということは知っています。ポジションは対になった2つのオーダーで構成されています。それはクローズした履歴上のポジションまたはクローズしていないオーダー、すなわちオープンしているかアクティブなポジションを作ります。
HedgeTerminalがインストールされる前にトレードアカウントになんらかのアクションがあり、トレード履歴に実行済みオーダーが数多く存在すれば、HedgeTerminalの視点からこれらオーダーはすべてお互いの間のリンクが作成されていないため、オープンポジションとなります。アカウント履歴が2~3件の実行済みオーダーを持っていても問題ではありません。何千もの実行済みオーダーがある場合、HedgeTerminalは何千ものオープンポジションを生成することとなります。それへの対処法は?こういったオーダーはHedgeTerminalによってオーダー開始へのリンクを持つ逆方向のオーダーを出すことで『クローズ』することができます。しかしこれには欠点があります。HedgeTerminal開始までにそういったオーダーが多くありすぎると、仲介手数料とスリッページを支払う必要があるためトレーダーはつぶれてしまう可能性があります。
そうならないためにもHedgeTerminalはインストールの初めに専用のインストールウィザードを起動します。ここでこの問題に対する異なる解決法が提案されます。HedgeTerminalを起動しこのウィザードを呼んでその動作詳細を記述します。そのために MetaTrader 5 マーケットからHedgeTerminalDemoをダウンロードしインストールします。
HedgeTerminalUltimate同様、それは Expert Advisor の形式をしており、起動には無料チャート向け『ナビゲータ』フォルダにあるそのアイコンをドラッグするだけです。
このアイコンをドラッグするとチャートに Expert Advisor を起動することを促す標準ウィンドウが表示されます。
図5 起動前の HedgeTerminal ウィンドウ
この段階では EA にトレードアクションを行わせる『自動トレードを許可する』のフラグを設定するだけで十分です。HedgeTerminal はみなさんの指示に従います。これはそれ自体のトレードロジックを持たないためで、トレードの実行にもみなさんの許可が必要です。
どんな Expert Advisor でもトレードを始めるには、MetaTrader 5 での個人的なトレード許可に加え、パネル上で Expert Advisors によるトレードについての一般的許可が有効になっている必要があります。
図6 自動トレードの有効化
HedgeTerminalはユーザーが長く複雑なコンフィギュレーションをしなくてよいように作成されています。
それはすべて利用可能な設定は特殊な XML テキストファイルに入っているからです。HedgeTerminalに対する唯一の明確なパラメータはこれら設定ファイルの実名です。
図7 HedgeTerminalパネルの設定ウィンドウ
これら設定の性質とそれらの変更方法は後にお話しするつもりです。
『OK』を押したら、HedgeTerminalインストールウィザードがk同し、インストール手順を開始するように促します。インストール手順は MetaTrader 4 および MetaTrader 5ターミナル用共有ディレクトリにファイルを数件作成するにおよびます。
HedgeTerminalはそのファイルをインストールする許可を依頼します。
図8 インストール開始ダイアログ
お手持ちのコンピュータにインストールしたくないファイルがあれば、『取り消し』を押します。この場合HedgeTerminalは動作を終了します。インストールを続ける場合は、『OK』を押します。
以下のダイアログ表示はHedgeTerminalを起動するアカウントによります。トレードアカウントに実行済みトレードがなければ、HedgeTerminalは動作を完了します。
すでに実行済みのトレードがあれば、HedgeTerminalは以下のダイアログを表示します。
図9 HedgeTerminalの初回起動を検出するダイアログ
上図ではHedgeTerminalは5件のアクティブなオーダーを特定しました。みなさんの場合、その数は異なることでしょう(アカウント ライフタイムの実行オーダー合計数と大きさに等しくなるようです)。これらオーダーはクローズするオーダーとついにはなりません。HedgeTerminalの考え方からそれらはアクティブなポジションであるためです。
HedgeTerminalは複数のオプションを提案します。
- これらオーダーをHedgeTerminalから除外する:『HedgeTerminalにそれらを隠すことができます。それには「はい」をクリックし、次のステップに進みます』。このオプションを選択し『はい』を押したら、HedgeTerminalはそれらを特別なリストに入れ、それ以降ネットポジションへの集計や財務実績の対象としません。これらオーダーは現在オープンしているネットポジションがひとつもない場合に限りその特別なリストに入れられます。1個または複数のシンボルについてオープンポジションがあれば、HedgeTerminalは既存ポジションをクローズすることを促す追加のダイアログを呼び出します。
- オーダーはそのままにし、必要に応じてのちにそれらをクローズします。:『のちにマニュアルでクローズすることができます。のちにマニュアルでこれらオーダーをクローズした場合は「いいえ」をクリックしてください。この場合、5件逆方向のトレードを行う必要があります』。そこで『いいえ』を押すと、HedgeTerminalは起動後これらオーダーをすべて『アクティブ』タブに反映します(すなわちアクティブなポジションとして)。のちにこれらオーダーはHedgeTerminalパネルによって他のオーダーと共にクローズされます。その後、それらはクローズ済みポジションとなり『履歴』タブ(履歴上のポジション)に転送されます。これらオーダー数が大きければ、実行済みオーダーをすべてクローズして仲介手数料を支払うよりは隠してしまった方が利口です。
- インストールを停止することも可能です。:『続行するつもりがないなら、「取り消し」を押します。この場合HedgeTerminalは動作を完了します』。このオプションを選択し『取り消し』を押すと、HedgeTerminalはその動作を停止します。
HedgeTerminalのインストールまでにアクティブなポジションがなければ、インストールはこの段階で停止します。
2番目のオプションを選択し、現在1件または複数のオープンポジションがあれば、HedgeTerminalはそれらをクローズすることを促す追加のダイアログを呼び出します。
図10 自動的にネットポジションをクローズするよう促すダイアログ
HedgeTerminalは既存ポジションをすべてクローズすることを要求します。これは実行済みオーダーは除外オーダーのリストに入いることになっているためです。ネットポジションがなければ、次の任意のオーダーが新規ネットポジションを初期化します。この場合の方向とボリュームはHedgeTerminal内と同様で、それにより確実にネットポジションがHedgeTerminal内のトータルポジションと非同期となりません。
HedgeTerminalはみなさんに代わりネットポジションをすべて自動でクローズすることができます。:『HedgeTerminalはアクティブポジションをすべて自動でクローズすることができます』。これに同意するなら『OK』を押します。この場合、それはポジションをクローズしようとし、問題なければ動作を終了します。なんらかの理由でポジションがクローズできなければ、マニュアルによるポジションクローズのダイアログに進みます。マニュアルによるポジションクローズを選択した場合 『マニュアルでポジションをクローズした場合「取り消し」をクリックし』、『取り消し』を押します。
前のダイアログウィンドウでマニュアルによるクローズタイプが選択されたとき、または自動でのポジションクローズが不可の場合、マニュアルによるポジションクローズのダイアログが呼ばれます。
図11 マニュアルでネットポジションのクローズを促すダイアログ
この時点ではアクティブなポジションはすべて MetaTrader 5 によりマニュアルでクローズされているか、『取り消し』を押してインストールがキャンセルされています。ポジションがすべてクローズされたら『再開』を押します。
2.2. 3ステップインストールインストールダイアグラムと起こりうる問題の解決
できるだけインストール手順をシンプルにしたら、3ステップに縮められます。
- HedgeTerminalインストール前に現在 MetaTrader 5 でアクティブになっているネットポジションをすべてクローズします。
- チャート上でHedgeTerminalを起動し、表示されるウィザードウィンドウで『はい』を押し、インストールを開始します。この場合HedgeTerminalは処理に必要なファイルをすべてインストールします。
- 次のウィンドウが表示されれば、そこで2番目のオプションを選択し 『はい』を押します。この場合は、HedgeTerminalが起動され前回実行されたオーダーに関する情報が ExcludeOrders.xml ファイルに転送されるとアクティブポジションは表示されません。それはクローズが必要なアクティブポジションがないためです。
それを記述するもっともシンプルな方法は次のようなものです。:HedgeTerminal起動前にポジションをすべてクローズし、HedgeTerminalインストールウィザードで『はい』を2度押します。
インストールウィザードの完全パターンは以下のダイアグラムに示しています。それは疑問に答え、インストールを正しく行うのに役立ちます。
図12 インストールウィザード
インストールが正しく行われなかったりHedgeTerminalをコンピュータから削除するよう要求さたらどうすればよいのでしょうか?インストールが正しくなかった場合はただインストールされたファイルをすべて削除します。それには MetaTrader が共有情報を格納するプログラムのフォルダ(通常これはc:\Users\<your_user_name>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\にあります)に行きます。全アカウントからのHedgeTerminalインストールに関する情報を削除したければ、このディレクトリで『HedgeTerminal』フォルダをみつけそれを削除します。特定のアカウントについてのみHedgeTerminalインストールに関する情報を削除したければ、\HedgeTerminal\Brokers ディレクトリに行き、ブローカーの名前およびアカウントナンバーを持つ『ブローカー名-アカウントナンバー』のようなフォルダを選択します。このフォルダを削除します。次回HedgeTerminalがこのアカウントについて開始されるとき、インストールウィザードが再び起動します。
すでにHedgeTerminalと連携しているアカウントに接続したターミナル上でのインストールそのHedgeTerminalがHedgeTerminalがすでに動作しているアカウントに接続したターミナル上にインストールするよう要求されることもあります。すでにご存じのように、インストール手順はシステムファイルの作成とコンフィギュレーションで構成されています。これらファイルがすべてすでに別のコンピュータに作成され、正しく構成されていれば、HedgeTerminalをインストールする必要はありません。結果、これらファイルはc:\Users\<your_user_name>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\HedgeTerminalに格納されます。このフォルダをみなさんのコンピュータの同じ場所に移動するだけです。ディレクトリをコピーしたら、ふたたびHedgeTerminalを起動します。ファイルはすべて存在し、構成されているためインストールウィザードは呼ばれません。この場合、アクティブポジションは別のターミナルやコンピュータでの表示と同様です。
HedgeTerminalAPI のインストールと検証モードでのライブラリ使用HedgeTerminalはビジュアルパネル、プログラム関数のライブラリ-HedgeTerminalAPI、として実装されました。ライブラリはHedgeTerminalAPIがリアルタイムで最初に起動するとき呼ばれるのと同様のインストールウィザードを持ちます。ライブラリ使用時のファイルインストールは同様です。どんな関数も最初の呼び出しのときは、「エキスパート」はインストール開始を促す関連した MessageBox をもたらします。その場合、ユーザーは同じことを行う必要があります。- HedgeTerminalAPI を呼ぶ前にポジションをすべてクローズし、3ステップでインストールを行います。
検証モードでライブラリを起動する際、HedgeTerminalのインストールは必要ありません。検証モードでは「エキスパート」が新規ビジュアルアカウントとの連携を始めるときに毎回、前回実行したオーダーやインストールファイルを隠す必要はありません。ライブラリのファイル Settings.xml 内の設定は関連の関数を呼ぶことで文法的に決定されます。
2.3. HedgeTerminalの開始-初回起動
動作に必要なファイルをすべてインストールしたら、HedgeTerminalはチャート上で起動しそのパネルを表示します。
図13 HedgeTerminalの初回起動、表示
既存のオーダーはすべて非表示となっているため、表示されているアクティブポジションはありません。上側のパネルには左手にHedgeTerminalメニューボタンとパネル状態を表示する専用のアイコンがあります。ボタンは以下の関数を持ちます。
-パネルのデモバージョンが起動したことを示します。これは実アカウントでのトレードはサポートしません。またシンボル AUDCAD および VTBR* のポジションのみ表示します。このモードではポジション履歴はまた最後の10個のクローズポジションに限られます。
-HedgeTerminalのポジションが MetaTrader 5 のトータルポジションと等しくないことを示します。これは需要なエラーではありませんが、除去が必要です。HedgeTerminalのインストールが正しく行われていれば、誤りを除去する方法を述べた本稿のセクションを参照します。
-このアイコンはトレードが不能であることを意味します。マウスをこのアイコンにあててポップアップのヒントから何が問題か見つけます。理由として可能性のあるもの:サーバーとの接続がない。Expert Advisor はトレードすることができない。Expert Advisors でのトレードは MetaTrader 5で許可されていない。
-トレードが許可されていることを示すアイコン;HedgeTerminalなどのようなトレード処理も行うことが可能である。
ここでHedgeTerminalが起動し、処理の準備が整えば、複数トレードを実行してそれらがどのように表示されるか確認します。HedgeTerminalが Forexについて起動すると、トレード処理が AUDCAD シンボルに関して実行されます。オープンしているポジションはないはずです。というのもHedgeTerminalのインストールはその場合のみ問題なくインストールできるからです。なんらかの理由でそうならなければ、アクティブなポジションをすべてクローズします。
HedgeTerminalがモスクワ市場に接続したアカウントで起動したら、トレードは VTBR* グループの先物のいずれかで実行する必要があります。たとえば VTBR-13.15 または VTBR-06.15です。説明にあるように、標準ウィンドウNewOrderにより現行価格で AUDCAD を0.4ロット買います。少し後、それを実行するオーダーとディールはターミナルのオーダー履歴に表示されます。
図14 履歴オーダーとMetaTrader 5 におけるそのディール
アクティブポジションタブには 0.4 ロットの対応するロングポジションがあります。
図15 MetaTrader 5 でのアクティブネットポジション
同時にHedgeTerminalは履歴オーダーをアクティブポジションとして表示します。
図16 HedgeTerminalは内のアクティブな双方向ポジションとそのディール
見てのとおり、結果は同じです。HedgeTerminal内の1ポジションが MetaTrader 5内の1ポジションに対応しています。
オーダーに加え、HedgeTerminal内ポジションはこのポジションを実行したディールを持つことにご注意ください(それを確認するには を押してポジションの文字列を最大化します)。
アクティブポジションの一部を非表示にすることが可能です。それにはただ"Vol." (ボリューム)フィールドに新しいボリューム値を入力するだけです。新しいボリュームは現ボリュームよりも小さな値となります。現ボリュームと新ボリュームの差は履歴上のポジションを形成する新オーダーによって埋められ、履歴上のポジションの対応タブに表示されます。このフィールドに値 0.2 を入力し「エンター」を押します。いくらか経過するとアクティブポジションの値が 0.2 となり、履歴上のポジションタブはボリューム 0.2 ロット(0.4 - 0.2 = 0.2)で最初の履歴トランザクションを行います。
図17 HedgeTerminal内の履歴上の双方向ポジション
別の言い方をすれば、われわれはアクティブポジションの半分をクロースしたことになります。履歴上のポジションとアクティブポジションの共通財務実績はターミナルの結果と同様となります。
これでアクティブポジションの結果をクローズします。それにはHedgeTerminalでのポジションクローズのボタンを押します。
図18 HedgeTerminal内の双方向ポジションをクローズするボタン
このボタンが押された後、残っているポジションは逆方向のオーダーによってクローズされ、履歴ポジションタブに送られます。アクティブなポジション(MetaTrader 5、HedgeTerminal共)はこのようにクローズされます。
2.4. ファイナンシャル処理のヘッジと計算
本セクションでは複数の双方向ポジションを例にとってHedgeTerminalとの連携方法についてお話しようと思います。
今アクティブなポジションはありません。AUDCADについて 0.2 ロットのボリュームでロングポジションをオープンします。それには『新規オーダー』ダイアログウィンドウを開き、対応するオーダーを出すだけです。ポジションがオープンされたら逆ポジション-MetaTrader 5 による売り 0.2 ロット、でそれをロックします。
この時点ではHedgeTerminalのトレード結果と MetaTrader 5 ターミナルウィンドウのそれとは異なります。HedgeTerminalは2種類のポジションを表示します。
図19 HedgeTerminalの双方向ポジションの逆向き( ロック)
MetaTrader 5 にはそういったものはまったく存在しません。
図20 MetaTrader 5 でのアクティブなネットポジションの不在
結果を評価します。4 件のディールが実行されました。それらは下のスクリーンショットに赤枠に入っているものです。
図21 MetaTrader 5 で実行されたディール結果
これらディールを表に入れます。
タイプ | 方向 | 価格 | ボリューム | 収益、pips |
---|---|---|---|---|
買い | イン | 0,98088 | 0,2 | |
売り | アウト | 0,98089 | 0,2 | 1 |
買い | イン | 0,98207 | 0,2 | |
売り | アウト | 0,98208 | 0,2 | 1 |
表1 MetaTrader 5 ターミナルでのディール表示
4 ディールで 2 ポイントを得たのは明白です。1 ロットをトレードするとき、各ポイントの値はおよそ 0.887 ドルです。よって財務実績はポジションにつき 0.18 ドル(0.887×0,2×1)または両ポジションに対して 34 セントです。『収益』列はこの結果が正しいことを示しています。ネット収益は 34 セントです。
そしてHedgeTerminalの結果を見ます。
図22 HedgeTerminalにおける双方向ポジションの履歴結果
最初は大幅に異なっているように見えます。われわれの 2 種類の双方向ポジション結果を計算します。
方向 | エントリー価格 | 終了価格 | 収益、pips | 収益、$ |
---|---|---|---|---|
買い | 0,98088 | 0,98208 | 0.00120 | 21,28 |
売り | 0,98089 | 0,98207 | -0.00118 | -20,92 |
表2 HedgeTerminalにおけるポジション表示
それらの差は 0.34$ (21,28$ - 20,92$)でこれはネットトレードで得た結果とまったく同じです。
2.5. ワン・クリック・トレーディング
HedgeTerminalは特殊な管理システムを取り入れています。これはアクティブポジションフィールドへの必要な値の直接入力を基にしています。代わりの管理法はありません。
たとえばアクティブなポジションに対してストップロスを出すためにはストップロス フィールドに必要な値を入力し「エンター」を押すだけです。
図23 テーブルへのストップロス レベルの直接入力
同様にこの方法でトレーダーはボリュームの変更、テイクプロフィット出しとそのレベル変更、初期コメントの変更をすることができます。
通常HedgeTerminalでのポジションラインは MetaTrader 4/5 に表示されるポジションに類似しています。ポジションを持つテーブルの列は MetaTrader ターミナルで使用されている同じ名前と値になっています。違いもあります。HedgeTerminalのポジションにはコメントが2個あり、一方 MetaTrader ではポジションのコメントは1個だけです。これはHedgeTerminalのポジションは2件のオーダーで形成され、各オーダーがおのおののコメントフィールドを持つことを意味します。HedgeTerminalは技術情報を格納するためにこういったコメントを使用することはないため、オープンとクローズのコメントを持つポジションを作成することが可能なのです。
HedgeTerminalにはデフォルトでは表示されていない列を追加する機能もあります。たとえば、ポジションをオープンした Expert Advisor 名を持つ列などです。Settings.xml ファイルの構成に特化したセクションでその方法を説明しています。
2.6. ストップロスとテイクプロフィットの設定-トレーリングストップ
HedgeTerminalではストップロスおよびテイクプロフィット レベルによってポジションをクロースすることができます。
それがどのようにおこるか確認するために、アクティブなポジションにストップロスとテイクプロフィットレベルを設定し、どちらかのレベルに到達するまで待ちます。われわれの場合はテイクプロフィットになりました。それでポジションがクローズし、ポジションは履歴トランザクション リストに移動されます。
図24 履歴の双方向ポジションおよびそのストップロスおよびテイクプロフィット レベル
テイクプロフィット レベルのグリーンのマークがテイクプロフィットになりポジションがそのレベルでクローズされたことを示しています。テイクプロフィットに加え、ポジションはアクティブのときに使用するもう一つの要素、ストップロス レベルに関する情報も持ちます。同様にストップロスレベルレベルに達すると、ストップロスセルがピンク色で強調されテイクプロフィットは色表示されません。
HedgeTerminalはトレーリングストップをサポートし、将来バージョンではストップロスを持ち越すロジックを持つ特別なカスタムモジュールを書くことができあmす。現時点ではHedgeTerminal内でのトレーリングストップ処理は MetaTrader ターミナルでの同じトレーリングストップとは異なります。それを可能にするには対応するポジションのストップロスセルにストップロスレベルを入力する必要があります。ストップロスが設定されると、続いて記号でマークされたセル内で価格オプションにフラグが立ちます。
図25 HedgeTerminal内のトレーリングストップ設定
フラグを立てたらHedgeTerminalは現在価格とストップロスレベル間の距離を固定します。それが増えると、距離が変わらないようにストップロスは価格を追いかけます。トレーリングストップはHedgeTerminalが動作しているときだけ作用し、終了時に消去されます。
HedgeTerminal内ではストップロスは「買いのストップ」および「売りのストップ」オーダーと共に実装されます。ストップロスが設定されるたびにアクティブなポジションに連結しマジックナンバーを持つ対応するオーダーも出されます。この指値注文が MetaTrader ターミナル内で削除されると、HedgeTerminal内のストップロスレベルは消えます。未決注文の価格が変更されるとHedgeTerminal内のストップロスは変わります。
テイクプロフィットはやや異なる作用をします。これは仮想でブローカーからのトリガレベルを非表示にします。HedgeTerminalはテイクプロフィットによって自律的にポジションをクローズするということです。そのため、みなさんがご自分のテイクプロフィットを作用させたいと思うなら、実行中のオーダーでHedgeTerminalを維持する必要があります。
2.7. レポート作成
HedgeTerminalにより双方向ポジションに関する情報を指定したファイルに保存することができます。それはマイクロソフト Excel など第三者の統計的解析プログラムにロードが可能です。
HedgeTerminalは点在分析および統計情報の収集システムを持たないため、この機能は特別に重要です。現時点ではレポート保存のフォーマットは1種類だけサポートされています。それは CSV(コンマ区切り値)です。 それの機能法を見てみます。CSV ファイルに双方向ポジションを保存するには、HedgeTerminal起動後、メニューで『CSV レポート保存』オプションを選択します。
図26 『CSV レポート保存』メニューによるレポート保存
メニューでそのような点を選択したら、HedgeTerminalは CSV 形式でファイルを 2 つ生成します。一つはアクティブなポジションに関する情報を、もう一つは完了ポジションの履歴情報を持ちます。2種類の異なるファイルを作成する理由はそれぞれが異なる列のセットを持つためです。またアクティブなポジション数が常に変化し、そのあtめ別々に分析する方がより便利だからです。作成されたファイルは関連するパスによって利用可能です。\HedgeTerminal\Brokers\<Broker's name - account number> \がそれです。最後にファイルが2つくる必要があります。それらはHistory.csv と Active.csvです。最初のファイルは履歴ポジション、次のファイルはアクティブなポジションについての情報を持ちます。
ファイルは分析用統計プログラムにロード可能です。マイクロソフト Excel 例にこの手順を見ていきます。このプログラムを起動し『データ』--> 『テキストから』と選択します。表示されるデータエクスポートウィザードでセパレータのあるモードを選択します。次のウィンドウでセパレータとしてセミコロンを選択します。『次へ』を押します。次のウィンドウで浮動小数点数表現の一般形式を変更します。それを行うには『詳細設定』を押します。表示されるウィンドウで整数、少数点以下部分のセパレータとしてピリオド文字を選びます。
図27 CSV 形式レポートのマイクロソフト Excel へのエクスポート
『ОК』を続いて『終了』を押します。表示されるテーブルにはアクティブなポジションに関する情報があります。
図28 Excel にエクスポートされたアクティブなポジションに関する情報
履歴ポジションのデータは同じ方法で次のシートにロードすることができます。列数はHedgeTerminalの実際の列数に対応します。列の1つがHedgeTerminalから削除されるとその列はレポートにはあがってきません。これは必要なデータのみを基にレポートを作成するには好都合です。
プログラムの後のバージョンでは XML および HTML 形式でレポートを保存することができるようになります。その上 HTML 形式で保存されたレポートは、完了した双方向ポジションで構成されていても、MetaTrader 5 内の標準的な HTML レポートに類似しています。
2.8. 通貨スワップ提示
通貨スワップは異なる評価日付を持つ同じ合計に対する2つの双方向変換ディールの組み合わせです。
簡単に言うとスワップはネットポジションを形成する2種類の通貨を保持するために支払う利子率の差が生じることについての派生的処理を言います。
MetaTrader 5 にはネットポジションの履歴は存在しません。その代り形成される履歴オーダー、ディールおよび履歴ネットポジションがあります。履歴ポジションがないため、スワップは履歴ポジションをクローズするオーダーに対して割り当てられます。
図29 独立トランザクションとしての通貨スワップ
スワップをネットポジション延長の結果として現れる独立した派生的処理として提示するとより的確かもしれません。
HedgeTerminalの現バージョンはスワップ表現をサポートしていません。後のバージョンはその処理機能を持ちます。そこではスワップは履歴ポジションタブ内に個別の履歴ポジションとして表示されます。スワップの識別子はそれが発生するネットポジションの識別子に対応しています。スワップは通貨ペア名とその財務実績を持ちます。
2.9. 一番下の行
メタトレーダー同様、HedgeTerminalはディールテーブル上の全アカウントに対して共通の特徴を持つ最終行を表示します。アクティブな履歴ポジションのテーブルに対するこれら特徴とその値は下にリストアップしています。
- 残高 -トータル残高メタトレーダーのアクティブポジションウィンドウの『収益』類似値と等しくなっています。これは浮動収益やオープンしているポジションからの損失を考慮しません。
- 浮動 P/L -浮動収益/損失。これは現在アクティブな全ポジションの収益合計です。
- マージン -パーセント表示でアカウント残高からの制約資金の配当を指します。0% ~ 100% に推移します。デポジットの負荷の度合いを示します。
- トータル P/L -にはクローズされたポジションに対する全収益および損失の合計を指します。
- Pos.:# -履歴ポジション番号を表示します。
最下行に正しく表示するためにシステムに『Arial の丸 MT 太文字』フォントを追加する必要があります。
2.10. HedgeTerminalテーブルの表示変更
前にお話ししたようにHedgeTerminalは「エキスパート」起動ウィンドウにただ一つ明確なパラメータを持つだけです。これは設定ファイルの場合は名前です。HedgeTerminalの設定は「エキスパート」設定ウィンドウでは設定できないからです。それは数多くありそれらはそのようなウィンドウにとっては特異すぎるのです。それが設定がすべて指定の構成ファイルSettings.xmlで行われる理由です。発売済みHedgeTerminalのバージョンはどれにも個々に設定ファイルが備わっています。それにより発売されているHedgeTerminalを個別に構成することが可能となります。
HedgeTerminalは現時点では設置のビジュアルウィンドウでこのファイルを編集することは許可していません。よってHedgeTerminalの動作を変更する唯一の方法はファイルをマニュアルで編集することです。設定ファイルはデフォルトで最適な方法でコンフィギュレーションされるためほとんど内容を編集する必要はありません。そのような編集が必要な状況も起こり得ます。そのようは編集はパネル表示の細かい調整およびカスタマイズに必要です。たとえばファイルが編集されると削除の必要ない列が削除されたり逆にデフォルトでは表示されない列が追加表示される可能性があります。
このファイルの内容を見て、カスタマイズ方法を確認しましょう。そのためにHedgeTerminalがファイルをインストールするディレクトリでこのファイルを検索します。このディレクトリは前にお話ししたようにアドレスc:\Users\<your user name>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\HedgeTerminalにあります。Settings.xml ファイルはこの中にあります。テキストエディタの助けを借りてこれを開きます。
<!--This settings valid for HedgeTerminal only. For settings HedgeTerminalAPI using API function and special parameters.--> <Hedge-Terminal-Settings> <!--This section defines what columns will be showed on the panel.--> <Show-Columns> <!--You can change the order of columns or comment not using columns.--> <!--You can change the value of 'Width' for a better scaling of visual table.--> <!--You can change the value of 'Name' to install your column name.--> <!--This columns for tab 'Active'--> <Active-Position> <Column ID="CollapsePosition" Name="CollapsePos." Width="20"/> <!-- Unset this comment if you want auto trading and want see name of your expert: <Column ID="Magic" Name="Magic" Width="100"/>--> <Column ID="Symbol" Name="Symbol" Width="70"/> <Column ID="EntryID" Name="Entry ID" Width="80"/> <Column ID="EntryDate" Name="Entry Date" Width="110"/> <Column ID="Type" Name="Type" Width="80"/> <Column ID="Volume" Name="Vol." Width="30"/> <Column ID="EntryPrice" Name="EntryPrice" Width="50"/> <Column ID="TralStopLoss" Name="TralSL" Width="20"/> <Column ID="StopLoss" Name="S/L" Width="50"/> <Column ID="TakeProfit" Name="T/P" Width="50"/> <Column ID="CurrentPrice" Name="Price" Width="50"/> <Column ID="Commission" Name="Comm." Width="40"/> <Column ID="Profit" Name="Profit" Width="60"/> <Column ID="EntryComment" Name="Entry Comment" Width="100"/> <Column ID="ExitComment" Name="Exit Comment" Width="100"/> </Active-Position> <!--This columns for tab 'History'--> <History-Position> <Column ID="CollapsePosition" Name="CollapsePos." Width="20"/> <!-- Unset this comment if you want auto trading and want see name of your expert: <Column ID="Magic" Name="Magic" Width="100"/>--> <Column ID="Symbol" Name="Symbol" Width="70"/> <Column ID="EntryID" Name="Entry ID" Width="80"/> <Column ID="EntryDate" Name="Entry Date" Width="110"/> <Column ID="Type" Name="Type" Width="40"/> <Column ID="EntryPrice" Name="Entry Price" Width="50"/> <Column ID="Volume" Name="Vol." Width="30"/> <Column ID="ExitPrice" Name="Exit Price" Width="50"/> <Column ID="ExitDate" Name="Exit Date" Width="110"/> <Column ID="ExitID" Name="Exit ID" Width="80"/> <Column ID="StopLoss" Name="S/L" Width="50"/> <Column ID="TakeProfit" Name="T/P" Width="50"/> <Column ID="Commission" Name="Comm." Width="40"/> <Column ID="Profit" Name="Profit" Width="50"/> <Column ID="EntryComment" Name="Entry Comment" Width="90"/> <Column ID="ExitComment" Name="Exit Comment" Width="90"/> </History-Position> </Show-Columns> <Other-Settings> <Deviation Value="30"/> <Timeout Seconds="180"/> <!-- If your computer is not fast enough - set a value 'Milliseconds' greater than 200, such as 500 or 1000. --> <RefreshRates Milliseconds="200"/> </Other-Settings> </Hedge-Terminal-Settings>
このファイルには XMLマークアップ言語で書かれた特別なドキュメントがあり、それはHedgeTerminalの動作と表示について述べています。
編集前に行う主なことがらはファイルが思いがけず破損する場合に備えてバックアップコピーを取ることです。このファイルには階層構造をしており、互いに囲い込まれた複数セクションで構成されています。主要なセクションは <Hedge-Terminal-Settings> と呼ばれ、主なサブセクションを2個持ちます。それは<Show-Columns> と <Other-Settings>です。名前から解るように最初のセクションは表示された列と条件付き幅を調整し、2番目のセクションはパネル自体とHedgeTerminalAPI ライブラリの設定を持ちます。
列サイズと名前の変更 <Show-Columns> セクションを参照しそのストラクチャを考察します。基本的にこのセクションには2セットの列があります。ひとつは『アクティブ』タブにあるアクティブポジションのテーブル用、もうひとつは『履歴』タブにある履歴ポジションのテーブル用です。セットの一つにある各列は以下のようなものです。
<Column ID="Symbol" Name="Symbol" Width="70"/>
列には列の識別子(ID="Symbol")名(Name="Symbol")および条件付き幅(Width="70")が必要です。
識別子は列のユニークな内部名を持ちます。それはHedgeTerminalにこの列をどのように表示しそこにどの値を入れるか求めます。識別子は変更できず、それはHedgeTerminalによってサポートされます。
列名によってテーブル内でその列がなんという名前で表示されるかが決まります。名前=『通貨ペア』のようにその名前が別の名前に変更されると、次にHedgeTerminalが起動される際、シンボルを表示する列名は変わります。
図30 HedgeTerminalパネル内での列名変更
まさにこのプロパティにより、たとえばロシア語など好きな言語で列それぞれの名前を表示するパネルのローカルバージョンを作成することができるのです。
図31 HedgeTerminalパネルのローカル化
次のタグには列の条件付き幅があります。問題はグラフィックエンジンは自動でパネルが起動されるウィンドウの幅と共にテーブルサイズを調整します。ウィンドウ幅が広いほど列幅もそれぞれ広くなります。細かく列幅を設定することはできませんが、列の基本幅を設定することで比率は指定可能です。基本的な幅はウィンドウ幅が1,280 ピクセルの場合のピクセル表示の列幅です。
お手持ちの画面がもっと広ければ実際の列サイズはもっと大きくなります。均等スケーリングがどのように動作するか確認するには、「シンボル」列の幅を条件付き240 ピクセル:Width="240"に設定します。そしてファイルを保存しパネルをリセットします。
図32 「シンボル」列の幅は 240 ピクセルに設定されています。
シンボルを持つ列の幅は大きく増えました。ただしその幅は別の列の幅を縮めることで広がったことに注意が必要です(『ID 入力』および 『日付入力』)。
これで別の列は見栄えが悪いものとなりました。最終値は設定可能な幅に合っていません。列サイズは各サイズにもっとも適したサイズを探し、慎重に変更する必要があります。標準設定は大多数の表示に対して正確な値であり、通常そのサイズを変更することは必要ありません。
列削除 列サイズおよびそのヘッダ変更に加え 、列の追加削除も可能です。たとえばリストから『シンボル』列を削除してみましょう。それにはSettings.xmlファイル(黄色で強調表示されています)の列のタグコメントアウトするだけです。
<Column ID="CollapsePosition" Name="CollapsePos." Width="20"/> <!-- Unset this comment if you want auto trading and want see name of your expert: <Column ID="Magic" Name="Magic" Width="100"/>--> <!--<Column ID="Symbol" Name="Symbol" Width="70"/>--> <Column ID="EntryID" Name="Entry ID" Width="80"/>
xml では指定されたタグ <!-- コメントの内容 -->がコメントの役目をします。コメントアウトされた列はタグに入れられます。ファイルの変更を保存しHedgeTerminalを再起動したら、履歴ポジションに対する列設定は変更されます。それにはシンボルを表示する列がなくなっています。
図33 アクティブポジションのテーブルからの「シンボル」列の削除
複数の列を同時に削除することが可能です。
シンボル名と収益サイズ以外の列をすべてコメントアウトし、HedgeTerminalをチャート上で再起動します。
図34 HedgeTerminalパネルからの主要列削除
見てのとおり、HedgeTerminalテーブルは大幅に減少しました。ポジション管理要素を持つこともあるので、列削除は慎重に行う必要があります。われわれの場合、ポジションをリバースすることのできる列とそのディール閲覧は削除されました。アクティブポジションテーブルの『収益』列でさえ削除可能です。ただこの列にはポジションをクローズするボタンがあります。この場合、クローズするボタンが失われたためポジションはクローズされません。
列追加および「エキスパート」の別名追加 HedgeTerminalがそれらと連携するようプログラムされていれば、列は編集によって削除、追加が可能です。 将来的にはユーザーは自身の列を作成し自身のパラメータを計算できるようになります。そのような列は外部インディケータと XML で書かれた拡張モジュールとの連携のマニフェストのインターフェースを介して接続可能です。
現時点ではそのうような機能性はなくHedgeTerminalによってサポートされている列のみ利用可能です。パネルによってサポートされているがデフォルト設定では表示されない唯一の列は「エキスパート」のマジックナンバーを持つ列です。
ポジションはマニュアルだけでなくロボットを使ってもオープン可能です。この場合、ポジションをオープンしたロボットの識別子はそれぞれのポジションに対して表示されます。Expert Advisor 番号を持つコメントアウトされた列のタグはすでに設定ファイルに提示されています。それを非コメント化します。
<Column ID="Magic" Name="Magic" Width="100"/>
変更を保存し、パネルを再起動します。
図35 HedgeTerminalテーブルへの「マジック」列の追加
上図で見られるように 『マジック』という名前の 列が表示されます。これはポジションをオープンする Expert Advisor の識別子です。ポジションはマニュアルでオープンしたため識別子はゼロです。ロボットによりオープンしたポジションには通常ゼロ以外の識別子があります。その場合、対応するエキスパートのマジックナンバーが列に表示されます。
ですが番号よりも Expert Advisors 名を確認する方が便利なものです。HedgeTerminalにはこのオプションがあります。それは ExpertAliases.xmlファイルから取得した EA の別名(名前)を取り、対応するマジックナンバーの代わりにその名前を表示します。
たとえば、"ExPro 1.1" という名前の「エキスパート」を持ち、マジックナンバー 123847の下でトレードを行う場合、次のタグを <Expert-Aliases> セクションのExpertsAliases.xml ファイルに入れるだけです。
<Expert Magic="123847" Name="ExPro 1.1"></Expert>
ここからロボットが新規ポジションをオープンするときそのポジションはその名前を持ちます。
図36 「マジック」列列での「エキスパート」名表示
ロボットおよび名前の数は無制限です。ここでの唯一の条件は番号が異なることです。
HedgeTerminalのその他設定 現在利用可能なビジュアルパネルの設定をすべてお話しました。次のセクション<その他-設定> ではターミナルの内部動作を決定づける設定についてお話します。プログラム呼び出しライブラリHedgeTerminal API はこれら設定をデフォルト値として使用することにご注意ください。ただしThe Expert Advisor は特殊関数Set... を用いてこれら設定の現在値を変更することができます。これら設定値を取得するには「エキスパート」はただ特殊な関数 Get... を呼びだすだけです。設定を持つタグについて詳しく説明していきます。
<Deviation Value="30"/>
は最小価格変動の単位で必要な価格から極端な偏差の値を持ちます。小数点第5位までクオートされる通貨ペア EURUSD に対して、それは 0.0003 ポイントとなります。RTS インデックスの将来にはこの値は 300 ポイントとなります。それは価格変動の最小ステップが 10 ポイントであるためです。価格偏差が大きいほど、オーダーのクローズまたは価格変化は実行されません。これは好ましくないスリッページから保護するためです。
<Timeout Seconds="180"/>
このタグにはサーバーからの最大許容応答値があります。HedgeTerminalは非同期モードで動作します。それはHedgeTerminalが後者からの返答を待たずにトレードシグナルをサーバーに送信することを意味します。代わりにHedgeTerminalはオーダーが正常に出されたことを指摘しイベントのシーケンスを管理します。そのイベントはまったく起こらない可能性があります。これがHedgeTerminalがサーバーの応答を待つ、待ち時間のタイムアウト期間を設定することが重要な理由です。その間サーバーからの応答がなければ、タスクは取り消されHedgeTerminalはポジションのブロックを解除し処理を実行します。
待ち時間のタイムアウト期間は縮小することも延長することもできます。デフォルトでは180秒です。
実トレードではこの制限には決して到達しないことを理解することが重要です。トレードシグナルに対する応答は迅速に返ってきます。その多くは150~200ミリ秒で処理されます。
HedgeTerminalの動作に関する詳細と非同期モードでの動作の特殊性については本稿第3節、『HedgeTerminalのボンネット下で』にあります。
<RefreshRates Milliseconds="200"/>
このタグはパネル更新頻度を設定します。そこには連続した2件のパネル更新間の時間がミリ秒で設定されています。この値が小さいほどパネル更新頻度は高く CP のリソースはより多く費やされます。お手持ちのプロセッサがあまり強力でなく200ミリ秒(デフォルト値)の頻度の更新をこなすことができなければ、タグ編集により500ミリ秒、あるいは1,000ミリ秒にも増やすことが可能です。
この場合、CP の負荷はかなり軽減します。100ミリ秒より低い値はお薦めしません。更新頻度を増やすと、CP 負荷は非線形で増大します。更新頻度はターミナルの離散性を決定することを理解するのが重要です。処理の中にはこのタイマーによって決定され特定のスピードで行われるものもあります。
2.11. 計画された未実装の機能
HedgeTerminalは柔軟性に富んだ非自明な構造をしておりそのためこのプログラムの新しい非自明な機能は実現可能となります。将来必要性があれば実装する可能性がありますが、今はまだこういった機能は実装されていません。以下が主なものです。
カラースキームとスキンの使用 HedgeTerminalはそれ自体のグラフィックエンジンを使用します。 これは長方形ラベルや通常のテキストのようなグラフィックの基本に基づいています。描画を基にしたグラフィックは全く使用されません。これにより色、サイズ、HedgeTerminalに表示されるすべてのエレメントを変更する機能を得ます。このようにフォントとスキン形式でのカラースキームを記述しヘッジの起動時表示を変えながらロードすることは簡単です。
カスタムトレーリングストップモジュールの接続 各エキスパート、HedgeTerminalは基本的にエキスパートですが、は特定のプログラムインターフェース(iCustom()関数)により任意のインディケータの計算を始めます。 それによりインディケータ計算を呼びだします。それは任意のパラメータに依存します。トレーリングストップは現在価格に応じて新規価格レベルを設定、または古い価格レベルを維持します。このアルゴリズムとその価格レベルはインディケータとして実装することができます。渡されるパラメータが同意されるとHedgeTerminalはそのインディケータを呼び必要な価格レベルを計算します。HedgeTerminalはトレーリングストップを転送するメカニズムを管理します。このようにHedgeTerminalのユーザーはトレーリングストップを管理する自身の(もっともめずらしいものでも)モジュールを書くことができるのです。
ポジションのテーブルへの新しい列の追加 それにはカスタムコラムも含まれます。HedgeTerminalのテーブルは新しい列が追加できるようにできています。 新しい列のサポートはHedgeTerminal内でプログラムされ iCustom() インターフェースによりおなじみの方法で実装されます。ポジション行のそれぞれのセルはパラメータ(たとえば始値やテイクプロフィットレベル)を表します。このパラメータはインディケータにより計算され、それは無限数のインディケータが書かれ、そのそれぞれはポジションに対するなんらかのパラメータを計算するということを意味します。パラメータを渡すのがそのようなインディケータについて統合されるなら、無限数のカスタムコラムがHedgeTerminal内のテーブルに追加することが可能となります。
拡張モジュールの連携 その他計算アルゴリズムはカスタムインディケータ呼び出しのメカニズムによって計算されます。たとえばレポートシステムには予想ペイオフや配当割合といったような計算パラメータが数多く含まれます。これらパラメータの多くはその計算ブロックをカスタムインディケータに移動することで受け取られます。
ディールのコピー、他のアカウントからのディール受け取りおよび発信 HedgeTerminalは基本的にポジション管理を行います。これは主な機能性がすでに実装されているので簡単にディールのコピー機能のベースとすることができます。そのようなコピー機能は双方向の MetaTrader 4 ポジションを MetaTrader 5 ターミナルにコピーする非自明の機能を持ちます。このコピー機能はこれらポジションを各ポジションを個別に管理する機能を持つ MetaTrader 4 内でのように双方向ポジションとして表示します。
レポートおよび統計 資本チャートと『概要』タブ 双方向ポジションをカウントすることで各戦略やトレーダの結果に対する貢献を分析することができます。統計と共にポートフォリオ分析も行うことができます。このレポートは特に MetaTrader 5 のレポートとは異なり、そこに追加することが可能です。「概要」タブレポートでは期待ペイオフ、最大ドローダウン、プロフィットファクターなどのような一般的に受け取られるパラメータに加え、その他のパラメータも含まれます。後者の名前と値はカスタム拡張モジュールから取得可能です。描画上のおなじみの残高チャートの代わりに、カスタムろうそく足為替チャートの形式で資本チャートが使用されます。
列のソート 通常、テーブルヘッダを押すとき、行は昇順または降順でソートされます(二度目に押すと)。HedgeTerminalの現在バージョンはこのオプションをサポートしていません。というのもソートはディールフィルタとカスタムコラムセットに連携するからで、それは現時点では利用可能とはなっていないからです。後のバージョンでこのオプションは装備される予定です。
Eメール ftpを介するトレードレポート送信 プッシュ送信 HedgeTerminalはEメール、ftp ファイル、プッシュ通知を送信するのにシステム関数を使用します。たとえば、それは日次で html レポートを作成し、ユーザーリストに送信します。HedgeTerminalが Expert Advisors の管理者であり、その他の EA のトレードアクションを知っているため、ユーザーに対し他の Expert Advisorsのトレードアクションについて通知することができるのです。たとえば、 EA の一つが新しくポジションをオープンしたら、HedgeTerminalはプッシュ通知を送信しユーザーに特定のエキスパートが新規ポジションに参入したことを伝えます。HedgeTerminalはまたエントリー方向、日付、時刻、ボリュームを指定します。The EA それ自体は構成される必要はありません。エイリアスファイルにその名前を追加するだけで十分です。
正規表現コンソールを用いたポジションのフィルタリング これは計画されている実装のなかで最も力強いものです。HedgeTerminalの動作をまったく新しいレベルに引き上げます。正規表現は履歴上のアクティブなポジションをフィルターにかけるために使用され、このフィルターの条件に合うポジションのみ表示します。正規表現はアクティブな履歴上のポジションテーブルの上にある専用コンソールに組合せまたエンターされます。以下はこのコンソールのHedgeTerminalの将来バージョンでの形です。
図37 HedgeTerminalの将来バージョンでのリクエストコンソール
正規表現はポジションをフィルターにかけるためのひじょうに柔軟な条件を形作ります。その条件を基に次に統計計算が行われるのです。たとえば AUDCAD シンボルによる履歴ポジションのみを表示するためには『シンボル』セルに "AUDCAD" のシンボルを入力するだけです。条件は組合せができます。たとえば、特定のロボットによって実行される AUDCAD によるポジションは期間2014.09.01~2014.10/01について表示することが可能です。そのためにすべきは対応のセルに条件を入力することだけです。フィルターが結果を表示したら、『概要』タブのレポートが新規フィルター条件に従って変更します。
正規表現は小数のシンプルな処理で構成されます。ただ一緒に使用するとそれらはひじょうに柔軟性のあるフィルターを作成することができます。
以下のオペレータがコンソール内にあれば必要かつ十分です。
Operator = -厳密な等価 If the word AUDСAD が『シンボル』フィールドに入れば、このサブストリングを持つすべてのシンボル、たとえば AUDCAD_m1 あるいは AUDCAD_1 が検索されます。それは暗黙の挿入オペレータが使用されることを意味します。厳密な等価 "=" は表現の完全な一致を要求するため AUDCAD 以外のすべてのシンボルは除外されます。AUDCAD_m1 または EURUSD は除外されます。
Operator > -指定の値よりも大きい値のみ表示します。
Operator < -指定の値よりも小さい値のみ表示します。
Operator ! -理論否定。指定の値に等しくない値のみ反映します。
Operator | -理論的"OR"。一行に一度に2個以上の条件指定を許可します。同時に基準を満たすためには少なくとも1件の規定を満たせば十分です。たとえば、表現コンソールのセル『オーダー入力』 に入力される式 "> 10106825|=10106833" は 10106825 より大きい、または 10106833に等しい着信するオーダー識別子を持つポジションすべてを表示します。
Operator & -理論的 "AND"。一行に一度に2個以上の条件指定を許可し、それぞれ満たされる必要があります。セル『オーダー入力』に入力される 式 ">10106825&<10105939" は 10106825 より大きいまたは 10105939より小さい着信する識別子を持つすべてのポジションを表示します。これら2個の数字の間の数、たとえば 10106320 の識別子を持つポジションはフィルターにかけられます。
特殊コマントを用いたポジション修正と管理 追加のシンボルをボリュームまたはストップロスとテイクプロフィットレベルを反映するセルに入力することが可能です。 これにより複雑なポジション管理が可能となります。たとえば現在のポジションボリュームを半分クローズするために 『ボリューム』フィールドでアクティブなポジションに対応する値 "50%" を入力します。
ストップロスとテイクプロフィットレベルを設定する代わりに、たとえば "1%"などの値をこれらセルに入力することが可能です。HedgeTerminalは自動でストップロスとテイクプロフィットレベルを計算し、入力価格から 1% の距離にそれを入れるようにします。これらのセルには接尾辞 "p" を持つ数字が入力可能です。たとえば "200p" はオーダー:『ポジションエントリー価格から200ポイント離してストップロスとテイクプロフィットレベルを設定する』を意味します。将来的には 『ボリューム』列のボリュームの前にマイナスが入れば、そのボリュームはその記号のあとに指定される値によってクローズされます。たとえば、ボリューム 1.0 のポジションを持っていて、そのボリュームの一部(たとえば0.3)をクローズしたければ、ボリュームセルに "-0.3" と入力すればよいだけです。
第3章HedgeTerminalのボンネットの下で処理の仕様と原則
3.1. グローバルな輪郭とローカルの輪郭情報のコンテキスト、転送、格納
HedgeTerminalの表示とトレード処理はおなじみの MetaTrader 4に似ています。これはデータ表示の仮想化と変換によって可能となっています。 そのとき MetaTrader 5 によって利用可能なトレード情報がより便利な方法でパネルによって表示されます。この章ではそのような仮想化を行うメカニズムとグループデータを処理するメカニズムについてお話します。
ご承知のようにHedgeTerminalは複数の異なるプロダクツに表されています。その主要なものはビジュアルパネルとプログラムインターフェースを持つライブラリです。後者により任意の外部l Expert Advisor で双方向ポジションの管理を実装することが可能となり、また双方向ポジションをHedgeTerminalのビジュアルパネルに統合することもできます。たとえば EA のアクティブなポジションはパネルから直接クローズすることが可能です。Expert Advisor は情報を取得し、適切にそれを処理します。
明らかにそのようなストラクチャには Expert Advisor 同士のグループ連携が必要です。基本的に Expert Advisor であるパネルは行われるトレードアクションのすべてをわかっています。逆にHedgeTerminalを使用している各 Expert Advisor はマニュアルで実行されるトレードアクション(第三者プログラムによるまたはHedgeTerminalパネルを用いた)を知っている必要があります。
一般的にトレードアクションに関する情報はトレード環境から受け取れます。たとえばユーザーが新規ポジションをオープンするとき、オーダー数は変化します。最終オーダーはどのシンボルについてポジションがオープンしたかそのボリュームはいくらかを伝えます。オーダーとディールに関する情報はサーバーに格納されます。トレードアカウントに接続しているターミナルがどれも利用可能なのはこのためです。この情報は グローバルと言えます。これはだれもが利用でき、通信のグローバルチャネルを通じて配布されるためです。トレードサーバーとの通信は『リクエスト-レスポンス』形式です。
そのような通信はグローバルコンターと言うことができます。『コンター』はグラフ理論の概念です。 解りやすく言うと、コンターとは互いに連携する数個のノードを持つ閉じた線です。この定義は十分ではないかもしれませんが、精密なところは数学者に委ねるとします。われわれにとって重要なことはトレードのプロセスをいくつかのアクションの閉じたシーケンスとすることです。
必要な情報がすべてグローバルコンターによって渡されるとは限りません。情報の一部は渡されない可能性があります。MetaTrader 5 がそのような渡し方をサポートしておらず、その上この情報は明確に存在しないためです。トレードアクションのシーケンスは次のようなものです。
- トレーダーが買うために注文を出します。
- 少しするとオーダーが実行されます。
- トレード環境が変化します。実行されたオーダーが履歴オーダーリストに入ります。シンボルの集計ポジションが変化します。
- トレーダーまたは Expert Advisor はトレード環境の変化を検出し、次の判断を行います。
1番目のアクションと4番目のアクションの間にはいくらか時間の経過があります。それは重大です。トレーダーが一人だけそのアカウントでトレードをしている場合、どのような行動をとるかわかっておりサーバーからの適切な応答を待ちます。そのアカウントで幾人かのトレーダーまたはいくつかの Expert Advisors が同時に存在すれば、管理エラーが発生する可能性があります。
たとえば、2番目のトレーダーが1番目と4番目のステップの間で既存のポジションをクローズするオーダーを出すこともあります。潜在的問題がお判りですか?2番目の注文は1番目の注文が実行されている最中に出されます。すなわちポジションをクローズすべき注文が2度送信されることになるのです。
この例はトレーダーが独りでアカウントでトレードを行っており、マニュアルで発注の同期を用いている場合はこじつけのようで起こりそうにありません。アカウントでトレードを行っているロボットが複数あり独立したトレード処理を実行していると、そのようなエラーが起こる可能性は高いものです。
HedgeTerminalは非同期的に動作し多数のエキスパートの同時並列動作を確実に行うポジション管理機能であるため、こういった誤りとは紙一重です。これを避けるためにはHedgeTerminalは ActivePositions.xmlファイルを読み出しそれを変更するマルチスレッドとして導入されているローカルコンターによって起動されているすべてのそれのコピー(これがHedgeTerminalAPI ライブラリ、ビジュアルパネルにかかわらず)の間のアクションを同期します。ActivePositions.xml ファイルとの連携はローカルコンターの中核でありHedgeTerminalの最重要部分であります。以下にこのメカニズムについて説明します。
単純化した方法ではHedgeTerminalの動作は下図にあるようにローカルおよびグローバルコンターとの協力に及びます。
図38 グローバルコンターとローカルコンター間の情報交換の単純化したスキーム
HedgeTerminal内のあらゆるトレードアクション(ダイアグラムのラベル開始 )は ActivePositions.xml に特殊なタグを書くことで開始します。それは変更されているポジションにそれ以上の変更が加えられるのを阻止します。
ポジションブロックが設定されローカルコンターが正常に渡されるとHedgeTerminalはサーバーいトレードオーダーを送信します。たとえばポジションをクローズするためのカウンターオーダーです。その後オーダーは実行されトレード環境が変化します。HedgeTerminalはこの変更を処理しグローバルコンターが正常に渡されオーダーが実行されることを検出します。それはポジションのブロックを解除し初期状態を返します(ダイアグラムのラベル終了)。
オーダーが実行されないという状況もありえます。この場合にもHedgeTerminalはポジションのブロックを解除し MetaTrader 5 ターミナルのログに失敗の理由についてレコードを作成します。
実際には情報の通信パターンはもっと複雑です。すでにお話したように、1つの MetaTrader 5 ターミナルで複数のHedgeTerminalのコピーが実行されることも可能です。それらはライブラリ、ビジュアルパネルどちらでもありえます。コピーはそれぞれ聴き手また書き手としてふるまいます。HedgeTerminalがトレードアクションを行うとき、これは書き手です。というのもそれが指定された xml タグのレコードを用いてポジションが変更されるのをブロックするためです。HedgeTerminalのその他コピーはすべて聴き手です。それらは特定周期でファイル ActivePositions.xml を読み、ブロックタグにでくわすとポジションが変更するのをブロックします。
このメカニズムは独立したスレッド間で情報が拡散することを保証します。それは複数パネルとHedgeTerminalAPIライブラリを用いるエキスパート間での並列動作を容易にします。
以下は複数スレッド協力条件でのHedgeTerminalの動作を示す現実的なダイアグラムです。
図39 HedgeTerminalコピー間での情報交換の自然なパターンに近いもの
そのようなデータ作成の効果はひじょうに高いものです。 ActivePositions.xml の読み出しと書き込みについての処理にかかるのは通常 1 ミリ秒以下で、一方オーダー送信と実行を行うグローバルコンターを渡すのには150~200ミリ秒までかかることがあります。図でこれら値のスケール差を確認します。
グリーンの長方形の幅はローカルコンターを渡す時間を示しています。ブルーはトレードオーダー実行時間を示しています。
図40 ファイルにレコードを作成する時間スケールとオーダー実行に必要な時間
ご覧のようにグリーンの長方形は縦のラインにより近く見えます。実際にはスケール間の差はもっと大きなものです。
読み出しとレコード作成を迅速に処理することでエキスパートと配布されている高頻度トレードシステム間の複雑なデータ交換が容易になります。
3.2. グローバル情報とローカル情報の格納
従来、HedgeTerminalで使用されるトレード情報はすべて2種類に分けられます。
- ローカル情報 これはコンピュータファイルに格納されローカルコンターによって排他的に渡されます。
- グローバル情報 この情報はトレードサーバーに格納されます。それはグローバルコンターによって渡され、アカウントに接続するターミナルどこからも利用可能です。
オーダー、ディール、アカウント情報はグローバル情報に属します。この情報は HistoryOrderGetInteger() または AccountInfoInteger()のような MetaTrader 5 の特定関数によって利用可能です。HedgeTerminalは主にこの情報を使用します。そのためHedgeTerminalは次のようなデータを表示します。
- HedgeTerminalのアクティブポジションおよび履歴上のポジション
- アクティブオーダーと履歴上のオーダーのストップロス
- 履歴上のポジションの処理されたテイクプロフィットレベル
- アクティブポジションの入信コメント、履歴上のポジションの入信および発信コメント
- ローカル情報リストにないアクティブなまた履歴上のポジションのその他すべてのプロパティ
これらプロパティはすべてグローバルなため、その表示は異なるコンピュータ上で実行されているHedgeTerminalのコピーすべてについてユニークなものです。たとえば、ある双方向ポジションが1つのターミナルでクローズされると、このポジションは別のHedgeTerminalでクローズされます。それはこのHedgeTerminalが別のコンピュータで起動されていたとしてもです。
グローバルデータに加え、HedgeTerminalはその動作にローカル情報を利用します。ローカル情報は1台のコンピュータでのみ利用可能です。この情報は次のプロパティに基づいています。
- アクティブポジションのテイクプロフィットレベル
- 処理はされていない履歴上のポジションのテイクプロフィットレベル
- アクティブポジションの送信コメント
- サービルフラグ、双方向ポジションの変更ブロック
処理されていないテイクプロフィットレベルは HistoryPositions.xml ファイルに格納されます。その他のローカル情報は ActivePositions.xml ファイルに格納されます。
ローカルデータ保管とはテイクプロフィットを設定すると、それはお手持ちのコンピュータで実行されているHedgeTerminalのコピーにのみ表示されることを意味します。みなさん以外はこのレベルを知りようがないのです。
3.3. ストップロスレベルとテイクプロフィットレベルオーダーシステムの問題と OCO 注文
MetaTrader 4 同様 MetaTrader 5 にもストップロスとテイクプロフィットレベルの概念があります。これらは保護的ストップです。MetaTrader 4 同様、それらは損失(ストップロス)や収益(テイクプロフィット)の特定レベルに達するとポジションをクローズします。ただし MetaTrader 4 ではそのようなストップはオープンしている注文に個別に有効となります。一方 MetaTrader 5 ではこういったストップは全体的な集計ポジションに対して作用します。
ここでの問題はネットポジションはエキスパートと特にHedgeTerminalの双方向ポジションには連携していないことです。それは標準的なストップロスとテイクプロフィットレベルは双方向ポジションに対しては使用できないことを意味します。ただこういうレベルは個別の指値注文として提示することができます。オープンしているロングのポジションがある場合、2 件の指値注文がストップロスとテイクプロフィットの機能をそれぞれエミュレートします。そのうちの一つはこのポジションの始値の上に設定される SellLimit で、もう一つはこの価格の下に設定される SellStop です。
実際オープン後の閣下うがオーダーの SellLimit に到達すると、このオーダーは収益とともにポジションをクローズし、価格が SellStop に達するとそれは損失と共にポジションをクローズします。唯一のデメリットはオーダーが1件出されると2番目のオーダーは存在せず、それから価格が方向を変えると2番目のオーダーは1番目のオーダーの後に出されることです。
その時点でポジションが存在しないため、2番目のオーダーを出すことで前のポジションをクローズせず、新しいネットポジションがオープンされてしまいます。
下図はロングポジションにおける保護的停止を用いた例でこの問題を解説しています。
図41 オーダー SellStop および SellLimit を利用したストップロスとテイクプロフィットのエミュレート
そのような矛盾を避けるため為替トレードでは OCO 注文("One Cancels the Other") が利用されます。
これらは互いに連動する 2 件の指値注文で、1 件が実行されると他方が取り消されるようになっています。われわれの例では注文が1件出されると、2番目の注文はトレードサーバーによって取り消され、そのため新しいポジションはオープンされず、それはまさに期待通りです。このタイプの注文の処理は以下の図に示されています。
図42 ストップロスとテイクプロフィットとしての OCO 注文
MetaTrader 5 は OCO 注文をサポートしていません。3件の注文のかたまりを処理できないため、ストップロスとテイクプロフィットとして同時に機能する注文は適していません。2件の注文ペアは処理可能です! そこでストップロスとテイクプロフィットのどちらかとします。
実際、新規双方向ポジションを初期化する実行された注文と連携する指値注文が出された場合(たとえばストップロス)、そのような構成は安全です。2番目の指値注文はなく、新規の双方向ポジションをオープンすることはできません。事実上、3とおりのシナリオしかありません。
- 未決注文はブローカーまたはユーザーによってなんらかの理由により取り消される。
- 未決注文が処理される。
- 未決注文が処理されない。
その他のシナリオはない。未決注文が取り消される場合、これはストップロスとテイクプロフィットを取り消すに等しいものです。未決注文が実行される場合、ポジションはクローズされます。注文が実行されない場合、双方向ポジションはストップロスの設定を持ったまま留まります。
HedgeTerminalが無効であったとしても指値注文が処理されると、そののちHedgeTerminalが起動するときその実行を処理しこの注文によってポジションがクローズされたことを理解します。マジックナンバーを伴うフィールドがクローズしている注文が正規の注文かストップロスまたはテイクプロフィットか示す特別なサービス情報を持つ場合、ポジションがストップロスまたはテイクプロフィットによってクローズされるなら、それは有用です。リンクとサービス情報がマジックナンバーを持つフィールドに格納される方法は次節で詳しく説明します。
2件の実際の保護的停止は同時には使用できないため、HedgeTerminalが作成される際、妥協策が施されました。
HedgeTerminal内の双方向ポジションはストップロスの役割をする実際の買いストップおよび売りストップ注文によって保護されます。テイクプロフィットレベルは仮想で1台のコンピュータで実行されるHedgeTerminalのコピーレベルでサポートされ、グローバルレベルで利用可能です。
ストップロスレベルが選択さます。これらレベルは高レベルの実行の信頼性を必要とするものだからです。テイクプロフィットが実行されなくても致命的ではなく、アカウントはマージンコールによってクローズされることはありません。一方実行されないストップロスはアカウントの破産につながる可能性があります。
どちらにせよ、ポジションを追跡する方法を選択するアルゴリズムのチャンスがあります。実ストップロスと仮想テイクプロフィット、または仮想ストップロスと実テイクプロフィットの間で選択が可能です。ストップロスとテイクプロフィットレベルもまた仮想です。現時点ではこの機能は実装されていませんが、必要ならば実装される可能性があります。
テイクプロフィットレベルの仮想化は大きくはなくてもその一般的な信頼性を下げます。テイクプロフィットレベルはローカルで割り当てられ、HedgeTerminalの各コピーで利用可能です。テイクプロフィットを実行するために、ライブラリまたはHedgeTerminalパネルを使用する Expert Advisor として少なくともHedgeTerminalのコピーが1件実行されているので十分です。実行されているHedgeTerminalの複数コピーが複数ある場合、テイクプロフィットを実行するのはそれらのうちの1つのみとなります。それは双方向ポジションのブロックタグを入れる最初のコピーです。この意味でHedgeTerminalののインスタンスはデータの書き込みおよび読み出しのマルチスレッドモードでお互いに競合しています。
ユーザーにとってはHedgeTerminalパネルを用いてのマニュアルのトレード、または EA の仮想化ライブラリの使用でテイクプロフィットと連動することはストップロスと連動することと違いはありません。これらレベル間の事実上の違いはすべてHedgeTerminalの背後に隠れています。トレーダーにとっては『テイクプロフィット』と『ストップロス』を入力するだけで十分です。これらレベルは同時に存在し、レベルの1つを処理することに関して警告する同じ色付き表示を持ちます。
3.4. OCO 注文は双方向のポジション保護の問題を解決することができるのか?
OCO 注文は実ストップロスおよびテイクプロフィットレベルを同時に利用することを可能にします。それらは双方向トレードを行う際、ほうとうに融通がきくのでしょうか?以下がその特徴です。すでにわれわれは OCO 注文により、一方が実行されると他方が取り消されることは理解しています。
ストップロスおよびテイクプロフィットがコンピュータでHedgeTerminalが実行されることを必要としない実オーダーである場合、それは双方向ポジションを両方向から保護するようです。問題は為替注文実行では注文の部分実行に配慮する必要があることです。このプロパティはアプリケーションのビジネス理論をうち壊す可能性があります。シンプルな例を考察します。
- ボリューム 10 のロングポジション契約が開かれます。ストップロスおよびテイクプロフィットレベルを設定した 2 件のリンク付 OCO 注文が出されます。
- テイクプロフィットレベルに到達すると SellLimit 注文は部分的に実行されます。契約 10 件中 7 件はクローズされ、残り 3 件はロングポジションとしてオープンしたままとなります。
- 連結されている SellLimit 注文が部分的に実行されたため、ストップロスレベルを設定したSellStop 注文は取り消されます。
- 3件の契約でのポジションにはもう保護的停止はありません。
下図がこのシナリオを表したものです。
図43 保護的停止の部分的実行
OCO 注文が割り当てられることで部分的実行を行えるように作成されており、またそれにより保護的停止の消去を避けることができるようになるということには異論があるかもしれません。2件の OCO 注文のボリュームは互いに連携しています。この場合部分的実行は確実予見されます。ただこれはネットトレードで利用されるオーダーシステムの十分に複雑なロジックを複雑にすることでしょう。
ここでの主な問題は、部分的実行を行ったとしても、OCO 注文は MetaTrader 4 と同等のチャンスを提供することはできないということです。たとえば、ストップロスおよびテイクプロフィットレベルを設定した指値注文を出すことは困難です。その理由は相互連携した注文は開始する注文に配慮することができないことです。
MetaTrader 4 同様にポジション管理を可能にする用途の広いアルゴリズムを書くためには、OCO 注文は以下のような特徴を持つ必要があります。
- リンクされた各オーダーは、それにリンクした注文の実行程度に応じてボリュームを調整する。たとえば、10 契約中 7 件でテイクプロフィットが実行される場合、それにリンクしたストップレスはボリュームを 10 から 3(10 - 7 = 3)に変更する必要があります。
- リンクした注文はそれぞれ注文実行開始ボリュームを考慮する必要があるのです。トレーダーが BuyLimit タイプの指値注文を出し、注文形式のストップロスおよびテイクプロフィットでその注文を保護する場合、 BuyLimit は全ボリュームの実行を必ずしも保証するものではありません。こういった場合も一対のオーダーによって要求が満たされます。
- 取り消し条件に加え、一対のオーダーには実行に対して追加条件があります。それはそこに連携した追加オーダーが実行される時のみ実行されます。それは OCO 注文は2件の注文にリンクする必要があるということです。最初のリンクは実行によって現在注文を活性化する注文に対するものです。2番目のリンクは実行によって現在注文を取り消す注文に対するものです。そのようなメカニズムにより保留中の初期化注文を持つポジションを作成することができます。
そのようなメカニズムは表示されるとしても、限られた経験しかないユーザーにとってはひじょうに複雑なものです。それらの適性については疑問があります。現在HedgeTerminalで使用されているようなクライアント側での仮想化はまだ利用しやすいものです。
OCO 注文に変わるものとして、orders, MetaQuotes は一定のトレードオーダーの保護を保証する特定のアルゴリズムのストップロスおよびテイクプロフィットレベルcを導入する可能性を考えることもできたでしょう。確かにこれは合理的なカーネルを持つものの、単なる理論です。そのようなアルゴリズムレベルはエンドユーザーにシンプルな既製の保護メカニズムを提供するトレードサーバー側で実装と構成の主要部分を隠します。
要約すると、以下が MetaTrader 5 プラットフォームで OCO 注文を統合するわれわれのささやかな見解です。
オーダーが部分的に実行されるとき、OCO 注文は効果的ではありません。それらは信頼性に欠け、プラットフォームの一般ユーザーにとっては複雑すぎます。
3.5. オーダー初期化へのリンクの格納
本節では他のオーダーへのリンクの内部格納とオーダー同士のバインディングメカニズム詳細を考察します。以前にお話したように、『オーダーマジック』フィールドには発注をした Expert Advisor の識別子が入っています。これはどんなトレーダーでも MQL5 プログラム言語を使用してこのフィールドに任意の整数値を入力することができることを意味します。その場合、新規ポジションを初期化するオーダーが既存オーダーの識別子と一致する Expert Advisor の識別子をもつとき、コリジョンの可能性があります。そうするとオーダーへの誤ったリンクが表示されます。
トレーダーが EA に対して "1"、"7"、"100"などゼロに近い識別子を使用し、オーバー番号が"10002384732"などのようにその数字より格段に大きいと、そういったコリジョンは避けることができます。トレーダーがそれを念頭に置くと信じるのはかなり甘い考えでしょう。コリジョンの可能性がひじょうに低くなり、そのアルゴリズムがあいまいさを許容せず発生した場合はコリジョンを自動的に排除すべくHedgeTerminalがオーダーへのリンクを特殊な方法で格納するのはそのためです。
リンクを格納する『オーダーマジック』フィールドは64ビットを取ります。その幅のため、このフィールドはひじょうに長い数字となりえます。実際にはオーダー識別子の動作範囲はずっと小さいものです。それによりHedgeTerminalはこのフィールドの高位の桁を必要に応じて安全に使い、特殊な方歩うでオーダーに対するリンクを形成します。HedgeTerminalが開始オーダーに対するリンクを格納する方法を示すスキームを参照します。
図44 HedgeTerminalにおける開始オーダーへのリンク格納パターン
フィールドの一番上の桁(63)はつねに 1 とマークされます。これによりオーダーすべてをひじょうに迅速に反復することができます。明らかに次の桁が1でなければ、オーダーは別のオーダーへのリンクを持たず、それはスキップされます。また、最高位の桁に値1を割り当てるとマジックナンバーはひじょうに大きくなり、それがオーダー識別子の動作範囲とHedgeTerminalのリンク範囲の距離を増やします。それがコリジョンの可能性を最小に抑えるのです。
HedgeTerminalはサービス情報により以下の3個のビットを埋めます。オーダー識別子とは異なり、HedgeTerminalはオーダー識別子をこのフィールドにあべこべに格納します。最初、それは高位の桁を埋め、それから小さい桁を埋めます。これは図44でブルーの矢印SI 方向(サービス情報)で指されています。この格納方法でサービス情報範囲とオーダー識別子は真ん中で出会うことになります。必要に応じ、その編成は変更可能です。サービス情報のサイズはオーダー識別子に対する桁によって増やすことができます。この情報によりクローズするオーダータイプを特定することができます。
重要なのはMetaTrader 4 でのアクティブなオーダーはテイクプロフィットまたはストップロスでクローズが可能であることです。これらは特定の価格レベルで、そこでオーダーが固定された収益または損失を伴いクローズされるものです。一方MetaTrader 5 では、 テイクプロフィットおよびストップロスはネットポジションに適用できるだけで、それらはペアになったオーダーには不適切です。通常の未決注文だけがテイクプロフィットおよびストップロスオーダーの役割をすることができるのです。
HedgeTerminalではそのようなオーダーはこれがテイクプロフィットおよびストップロスオーダーかどうか特定する特殊な識別子に割り当てられます。マジックナンバーがトレードサーバーに格納されるため、サービス情報はトレードアカウントにアクセス可能なトレーダー全員に利用可能となります。このように、異なるコンピュータ上で実行されている複数のHedgeTerminalコピーは実行されたオーダータプについて情報を持ち、クローズされたポジションについての情報を正確に表示します。
オーダー識別子に関して参照される情報は桁数 0~59の範囲に格納されます。これは桁を右から左に遣って標準方向で格納されます。それはブルーの矢印方向オーダーIDによって示されます。割り当てられたストレージサイズを評価するには、年間にモスクワ市場に送信された全注文範囲を格納する必要のある数量を計算します。
2013年6月13日付の私のブローカー報告書には識別子 10 789 965 471とあります。この数字は 64桁のうち33.3297 ビット (log2(10 789 965 471))または 34 を使用しています。2014年9月25日までに出されたオーダーの1件の識別子は 13 400 775 716 です。この数字は 33.6416 ビットを使っています。 26億件のオーダーが1年4か月間に出されていても、識別子のサイズはたった 0.31263 ビット増えただけで、それは1オーダーよりも小さなものです。オーダー識別子のサイズが59桁目に達する前に太陽がなくなるとは言いませんが、これが起こるには数百万年はかかると自信を持って言うことができます。
HedgeTerminalはリンクを表立っては格納しません。それには、フィールド OrderMagic を暗号化し, 上位桁はそのままにします。HedgeTerminalのコードはさまざまな長さのキーで動作する特殊な暗号化関数によって実装されている数字の可逆性再配列に基づいています。そのような暗号化後、サービス情報およびオーダー識別義はお互いに混合され、特殊なマスク下に隠されます。そうすることで終了時それらは1とゼロの分布を表すのです。暗号化が行われる理由は2つあります。まず、数字の再配列はリンクとオーダー識別子が重複する可能性を低め、それからHedgeTerminalの内部アルゴリズムを外部の意図的なまたは不特定の影響から保護します。
このプロシージャは絶対に安全であり可逆的でコリジョンが起こりにくいものです。Expert Advisors を使用してトレーダーが行う行動に関わらず、それはHedgeTerminalの内部アルゴリズムの信頼性に影響を与えないことを保証するものです。現実の状況ではこれらリンクを管理することは複雑な専用アルゴリズムがないと不可能なため、これはひじょうに重要です。
同時にリンクの管理だけに限るのであれば、ビジネスロジックの失敗は避けられません。次節ではこれらアルゴリズムの詳細記述に専念している理由を説明します。暗号化はこの失敗を避けるためにも使用されています。この制約のコインの裏側は、HedgeTerminalポジションを管理する方法はこれを使う以外にない、ということです。
3.6. HedgeTerminal処理の限界
リンク格納スト楽者の特殊性によりHedgeTerminalは9223372036854775808 から 18446744073709551615まで使う数字ごとにオーダーに対するリンクを格納します。If a 64 桁のフィールドがロングタイプの記号を持つ数字で表される場合、これらは負の値ということになります。ここれHedgeTerminalと連携するうえで3つの制約が発生します。
第1番目はHedgeTerminalと連携する売買ロボットに関する制約です。これは厳密なものではなく、推奨事項として扱う程度で結構です。
HedgeTerminalと連携している売買ロボット、または Expert Advisor は値 9223372036854775808 を越えない識別子(エキスパートのマジックナンバー)を持つ必要があります。
現実には通常の Expert Advisors はこの制限に出くわすことはありません。というのも 5~6 桁を超える識別子が使用されるのは非常に稀だからです。Expert に対するもっとも一般的な識別子は "12345" またはその類のものです。この制約は別オーダーへのリンクなどのサービス情報をそのマジックナンバーに格納するロボットに適用される可能性があります。HedgeTerminalはそのようなエキスパートとは互換性がなく、それらと共に動作することはできません。
なんらかの理由で前述の制限を超える場合、コリジョンの可能性はゼロと思われます。そのような範囲での一致は起こりにくいため、後者はひじょうに小さいのです。そのようなことがあったとしてもHedgeTerminalはそのアルゴリズムによってこのコリジョンを解決します。リンクを解読し、このリンクを既存のオーダーと比較し、別のオーダーとペアリングするための安定性に関してこのオーダーを分析することは余分な時間がかかるため、これは動作速度を遅くします。よってこれを避けるためにはマイナス記号を持つ長い数字は使わない方が無難です。
2番目の制約は厳しいものですが、ブローカーだけに関わるもので、HedgeTerminalの交換は以下に接続します。
オーダー識別子は 0 から 2^59 または 576 460 752 303 423 488までの数字を使用する必要があります。
これは、オーダー識別子の格納には64桁ではなく59桁しか使用されないため明らかです。みなさんのブローカーがこの値よりも大きなオーダー識別子を使用していれば、みなさんは作業にHedgeTerminalを使うことができません。
3番目の制約はポジション表現方法に従います。
HedgeTerminalはその他のポジション管理システムと互換性がありません。よってHedgeTerminalは、ポジションをクローズする機能を備えた外部のトレードパネルと互換性がなく、一緒に使用することはできないのです。
3.7. ペア注文のメカニズムとアクションの決定論
HedgeTerminalでのポジション表現の詳細とそのリンクのストラクチャについて考察してきました。バウンドオーダーを管理するアルゴリズム記述についてはお話しません。たとえば数ある注文の中から2種類の注文を選びそれらをリンクするとします。注文へのリンクがユニークで1件の注文が1つのリンクを持つ場合、3とおりの状況が可能です。
- その注文は他の注文によって参照されない。
- その朱蒙は別の1件の注文によって参照される。
- その注文は2件以上の注文によって参照される。
最初のグループは問題を起こさず、そのような注文はオープンしたポジションとみなされます。問題は3番目のグループでもひじょうに簡単です。一対のオーダーがポジションをクローズするためです。3番目のグループの場合に何ができるのでしょうか?あるオーダーが別の2件のオーダーによって参照されるとどうなるのでしょうか?そのうちのどちらが1番目のオーダーとリンクされるのでしょうか?また2番目のオーダーはどうなるのでしょうか?ペアリングのプロセスを連続したものとするなら、この答えは簡単です。
- 別のオーダーにリンクを持たないあるオーダーに出くわします。それはアクティブなオーダー(ポジション)のセクションに転送され、そののちオーダーについての反復が続きます。
- それから1番目のオーダーを参照する別のオーダーに出会います。参照されるオーダーはアクティブなオーダーのセクションで検索されています。参照されるオーダーがこのセクションにあれば、それは現オーダーと一対になり、それらは履歴ポジションの形式で完了トランザクションのセク損に転送されます。
- さらなる反復の間、ポイント1で述べられたオーダーへのリンクがあるオーダーにもっと出会います。参照されるオーダーはアクティブなオーダーのセクションで検索されています。今回その検索はうまくいきません。研鑚されるオーダーはこのセクションから完了トラン族ションのセクションに持ち越されたからです。現オーダーによって参照されるオーダーが見つからなかったため、現オーダーはリンクにもかかわらず、アクティブなオーダーでありアクティブなポジションのセクションに移動します。
オーダー識別子が一貫した方法で書かれ、そのリストは時間でソートされているため、連続した反復が行われます。よって初期化するオーダーは同じリンクを持つ他のオーダー数にかかわらず、リンクを持つ一番最初のオーダーと一対になります。初期化オーダーにリンクしているその他オーダーはすべてアクティブな開始ポジションリストに入ることになります。
すでに述べたように、そのような反復の実行アルゴリズムは完全に決定論的で一貫しています。HedgeTerminalは動作においてそのような反復アルゴリズムを使用します。事実上、こじれは単なる反復ではなく、最初のディールから行われるトレードアクションすべての繰り返しです。起動ごとにHedgeTerminalは一番最初から現時点まで絶え間なくトレードアクションの連鎖を構築します。そのおかげで現ポジション表現は起動時のレトロスペクティブ取引の結果です。
履歴内全オーダーについての反復が連続して実行されるため、トレーとアクションも連続して行うことが必要です。それがHedgeTerminal内のオーダー実行方法を決定します。たとえば、ストップロスに保護されたあるアクティブな双方向HedgeTerminalポジションはクローズする必要があります。そのような双方向ポジションは基本的に2件のオーダーで構成されていることはわかっています。アクティブなポジションを開始する実行済みオーダーとストップロス注文の役割をする売りストップまたは買いストップの未決注文です。そのようなポジションをクローズするためには、未決注文を削除し、アクティブな双方向ポジションを同じボリュームのカウンターオーダーによってクローズする必要があります。よって2とおりのトレードアクションを行います。HedgeTerminalは非同期的にすべてのトレードオーダーを実行します。
このようにオーダーは同時に実行されます。すなわち最初のオーダーは未決注文を取り消すために出され、次のオーダーはカウンターオーダーを実行しするために出されます。それはポジションをクローズするのです。ただしこれはアクションの決定論を混乱させ、HedgeTerminalはそれを行いません。何らかの理由で未決注文が取り消されず、ポジションがカウンターオーダーによってクローズされなければ、あいまいさが発生します。ポジションがクローズされたのにそのストップロスはまだ存在するためです。最後にストップロスを取り入れるオーダーが実行され、新規の双方向ポジションが生成されます。それはあってはいけないことです。そのため、HedgeTerminalはストップロスを取消、正常に取り消しが行われた後カウンターオーダーを出すのです。カウンターオーダーが実行されない、または2番目のステップで部分的に実行される可能性があります。その場合はあいまいさが排除されます。カウンターオーダーが部分的に実行されたとしても、アクティブなポジションの一部をクローズするためです。これが通常の状況です。
HedgeTerminalが行うもっと複雑な一連のアクションがあります。前回に似た例を使いますが、今回はポジションの一部をクローズします。それはHedgeTerminalが3段階の処理を行うということです。
- ストップロス注文の役割をした未決注文を削除する。
- 双方向ポジションのボリュームの一部をクローズするカウンターオーダーを実行する。
- 新しいボリュームを持ち、アクティブなポジションの残った部分を保護する新たなストップロスを設定する。
これらはすべて、処理の決定論を混乱させないため絶え間なく実行されます。当然予想されることは同時の発注によるオーダー実行速度を上げることで、その場合トレード処理の連続実行は保証されず、あいまいさの可能性があります。連続したオーダー処理にはあいまいさはまったくありません。
3.8. ディールの分割と連結-オーダー算術の基礎
連続的なオーダー処理は十分ではありません。ここに注意すべき2点があります。
- 1件のオーダーは複数ディールを持ち得ます。そのディール数は不特定です。
- また部分的なオーダー実行とクローズするオーダーボリュームが開始オーダーボリュームと等しくないというより一般的な場合を考慮することも重要です。
オーダーは同時に複数ディールによって実行されることもあり、部分的に実行されることもあります。それが起こる理由をご存じなければ、価格交換に特化した記事"Principles of Exchange Pricing through the Example of Moscow Exchange's Derivatives Market"を参照ください。『なぜクローズするオーダーボリュームがオープンするオーダーボリュームに等しくならないのか?』という疑問には答えが必要です。この場合なにができるのでしょうか?
実際、アクティブポジションの 部分的なクローズの可能性を推定すると、そのボリュームは等しくなりません。契約 50 のボリュームでアクティブポジションをオープンし、契約 20 のボリュームのカウンターオーダーでその一部をクローズすれば、アクティブポジションは 2 つの部分に分かれます。最初の部分は20オーダーのボリュームでカウンターオーダーのある新しい履歴ポジションを作成し、次の部分はまだオープンしているがボリュームは減っていて契約30となります。
この部分的ポジションクローズのアルゴリズムがHedgeTerminalに実装されています。新規ボリューム値がHedgeTerminalの『ボリューム』フィールドに入力されると、部分的クローズが行われます。『履歴』フォルダには新しいポジションが入り、現ポジションのボリュームは新し値に等しくなります。HedgeTerminalはクローズするオーダーのボリュームが開始ボリュームよりも大きかったとしてもその状態を処理します。そのような状況はHedgeTerminalが何らかの理由でクローズするオーダーに誤ったボリュームを設定するか、ブローカーがバックハンドで開始オーダーを含む複数ディールを取り消す場合に起こり、それで小さなものに対する実行ボリュームが変化するのです。
ボリュームの潜在的相違を考慮するには、オーダーに関連したディールすべての合計ボリュームの計算に基づく汎用的なアルゴリズムを使用することが必要です。この場合、すべてを決定するのはオーダーではなくディールです。オーダーボリュームはそのディールのボリュームなのです。実行されたオーダー価格はそのディールの平均価格です。
HedgeTerminalはオーダーをお互いにリンクする、またはオーダーを分割するアルゴリズムを用いています。それはディールの加減算を基にしています。その動作は以下の履歴ポジション形成を持つ開始オーダーと終了オーダーの間のディールを統合することに基づいています。
このアルゴリズムがどのように動作するか理解するには履歴ポジションを作成するためについになるべき2件のオーダーがあると仮定します。両オーダーは同数のディールを持ち、その実行済みボリュームも等しくなっています。説明をシンプルにするために、ディール数は3とします。
オーダーNo.1 (インオーダー) | ボリューム (10/10) |
---|---|
ディールNo.283 | 3 |
ディールNo.288 | 2 |
ディールNo.294 | 5 |
表3 オーダーNo.1 とそのディール
オーダーNo.2(アウトオーダー) | ボリューム (10/10) |
---|---|
ディールNo.871 | 1 |
ディールNo.882 | 3 |
ディールNo.921 | 6 |
表4 オーダーNo.2 とそのディール
ディールをボリュームと一緒にします。
表5 オーダーを一緒にします。
各列から最後の2件のオーダーを選択します。:No.294 と No.921。一般的にそれらは互いに同じレベルではありえません(この例のように)。
最小ボリュームのディールを選択します。これはボリューム 5 のNo.294 です。逆のディールNo.921 を二分します。最初のディールはディール No.294 (5契約)のボリュームと等しくなっています。2番目のディールは残りのボリューム1契約(6契約 – 5 契約 = 1契約 )となります。 ボリューム5のディールNo.294 を同様のボリュームのNo.921 の最初のボリューム部分と統合します。
表6 ボリュームの引き算
統合した部分を履歴ポジションのディールを持つ新しい列に送ります。
これはグリーンで強調されています。ボリューム1のディールNo.921 の残り部分をアクティブポジションの最初の列に残します。これはグレーで強調されています。
表7 ディールの分割と持ち越し
2件のオーダーを統合する第1ステップを行い、それらを履歴ポジションに持ち越しました。簡潔に一連のアクションを反映します。
表8 ディールの分割と持ち越しステップ1
ディールNo.294 のボリュームは履歴ポジションのセクションにぜんぶ持ち越されました。ディールは完全に消滅しました。よってディールは分割され、履歴オーダーセクションに持ち越されました。 これで次のステップでボリューム2の次のディールNo.288 を処理することができるのです。ディールNo.921 はまだ存在し、そのボリュームはディールの残り2番目の部分に等しくなっています。以下のステップでこのボリュームはディールNo.288 のボリュームと連携するのです。
2番目のステップではディールNo.288 とディールNo.921の手順を繰り返します。今回、ディールNo.921の残りのボリューム(1契約)は履歴オーダーの列を取得したのちディールNo.288 のボリュームと統合されます。ディールNo.288 ののこりのボリュームは1契約に相当し、アクティブポジションの列に残ります。
表9 ディールの分割と持ち越しステップ1~2
ディールNo.288 および ディールNo.882について同じ処理を繰り返します。
表10 ディールの分割と持ち越しステップ1~3
ステップ4、5を同じ方法で実行します。
表11 ディールの分割と持ち越しステップ1~5
ステップ5のあと、クローズするオーダーのボリュームはオープンするオーダーのディールボリュームと完璧に同じになります。履歴ポジションの列に持ち越されるディールは完全な履歴トランザクションを作成します。残りのアクティブポジションのディールはアクティブポジションを作成します。この場合アクティブポジションの列にはディールは残っていません。これはそのような統合のあと、アクティブポジションは存在しなくなるということです。新規履歴ポジションが発生し、アクティブポジションの全ディールを持つようになります。
ディールが持ちこされたあと、そのうちの多くは分割され複数の行に入ります。そうならないためには、ディールの統合/分割アルゴリズムにディール収集についてのオプションを追加します。単純に同じ識別子を持つディールのボリュームを以下に統合します。
表12 ディールの1レベルへの統合
統合後、ディール数とそのボリュームは完全に開始ディール数とボリュームに一致します。これはそれらのボリュームが最初に一致しているからそうなるだけです。そのボリュームが異なれば、統合手順後、ディールは異なったボリュームを持つことになります。
このアルゴリズムは汎用的です。というのもオーダーの開始とクローズに同じディール数を必要としないためです。このプロパティを基にした例がもう一つあります。それを見ていきます。
表13 異なるディール数のオーダー統合
ご覧のとおり、オーダーを1件の履歴ポジションに統語することは正常に行えました。ディール数が異なってもボリュームが再び一致したのです。
ここでは終了オーダーの集計ボリューム(12契約)が開始オーダー(22契約)のディールボリュームより小さい場合をイメージします。この場合統合はどのように行われるのでしょうか?
表14 異なるボリュームのオーダー統合
第2ステップで終了オーダーのディールボリュームはゼロ、一方開始オーダーにはボリューム4のNo.321とボリューム6のNo.344ともう2件ディールがあります。アクティブなオーダーディールを越えています。超過はアクティブな双方向ポジションのせいで存在します。ところがディールを伴いグリーンの列に持ち越された新規履歴ポジションがあります。その開始および終了ボリューム12契約は再び一致しました。
この場合、終了オーダーのボリュームが開始ボリュームより大きいときも今回はクローズオーダー側に超過があります。
表15 異なるボリュームのオーダー統合
ボリューム4の開始オーダーとボリューム6の終了オーダーはポジションを2個作成します。最初のものはボリューム4の履歴ポジションで開始オーダーのディールNo.625 と終了オーダーのNo.719、No.720 です。2番目のポジションはこれらオーダーの超過しているペアリングディールです。そこにはボリューム2のディールNo.719 が含まれます。このディールとオーダーはHedgeTerminalパネルの『アクティブ』タブにアクティブなポジションを作成します。
ディールとオーダーはアルゴリズムにより履歴ポジションとアクティブポジションに分割されます。ボリュームは異なります。重要な点は、アルゴリズムが入りと出の等しいボリュームで履歴ポジションを形成することで開始オーダーと終了オーダーのボリュームをまとめることを許可していることです。それがこれらボリュームが等しくないという状況はありえないこと、そのためポジションの非対称を生じるポジション表現のエラーIが発生しないことを保証します。
最初の例でブローカーが終了オーダーを含むディールを取り消したと仮定します。
表16 履歴からディールを削除するシミュレーション
ボリューム6契約の新規ポジションそれは取り消されたディールのボリュームに等しくなります。この場合HedgeTerminalのアルゴリズムがどのように作用するのか見ます。
表17 表現の整合性回復
ステップ2で6契約(3+2+1)の超過が見られました。この超過はアクティブポジションに転じ、そのため双方向ポジションのボリュームと方向はネットポジションのボリュームと等しくなっています。
要約すると、ディールを統合するアルゴリズムは履歴ポジションにおいて超過した結合していないディールのため、開始ボリュームと終了ボリュームの等価性を保証すると言えます。ディールの超過はアクティブな双方向ポジションを作成します。それは MetaTrader 5 のネットポジションをHedgeTerminalのアクティブポジションと等しくします。
このメカニズムはレトロスペクティブに、リアルタイムモード両方に作用し、ブローカーがトレードアクションを取り消したとしてもそれがHedgeTerminalのネットポジションを MetaTrader 5 のネットポジションとさえ共に作成することを意味します。ネットポジション変更とディールの取り消しの組合せはありえます。それらはターミナルのネットポジションとHedgeTerminalのネットポジションの間に不釣り合いを生じないためです。
部分的なポジションクローズのメカニズムはこのアルゴリズムが異なるボリュームを統合する機能に基づきます。このアルゴリズムはHedgeTerminalのもっとの重要な部分の一つだり、設定を必要としない事項適応型の安定した動作を保証するものです。
3.9. オーダーとディールの仮想化
HedgeTerminalのオーダーとディールにはそれぞれ対応する識別子を持つ実プロトタイプがあります。それでもなお、HedgeTerminalの視点から1オーダーはアクティブポジションを作成し、同時に履歴ポジションの一部でもあります。 MetaTrader 5 のディールとオーダーは不可分のエンティティです。プラットフォームのオーダーは未決オーダーまたは実行済みオーダーの可能性があります。ディールも一定ボリュームを持ち、つねに実行済みトランザクションです。
HedgeTerminalでは同一のオーダーとディールが異なる双方向ポジションい存在することがあります。そこにある同一ディールまたはオーダーはアクティブポジションおよび履歴ポジションを作成することができます。すなわち、HedgeTerminal内のオーダーとディールは複数の仮想オーダーとディールに分割されるのです。このデータ表現は MetaTrader 5内のデータ表現とは大きく異なります。ただこの表現により柔軟であり、レトロスペクティブなトレード情報の変更を採用しオーダーとディールをまとめることが可能となります。
3.10. オーダー非表示のメカニズム
HedgeTerminalのインストールについて説明したセクションでオーダーの非表示メカニズムについてお話しました。HedgeTerminalはいくつかのオーダーを無視することができます。オーダーまたはディールがHedgeTerminalに対して存在しないようにするには、指定のファイル ExcludeOrders.xmlにその識別子を入力するだけです。
1シンボルについて実行済みの複数売りまたは買いオーダーがあると仮定します。売りオーダーの集計ボリュームは買いオーダーの集計ボリュームに等しくなっています。この方法でいくつオーダーがあろうとそのトータルポジションはゼロとなります。こういったオーダーの識別子が ExcludeOrders.xmlファイルにない場合、HedgeTerminalはそれぞれを双方向ポジションとして表示します。そのトータルポジションがゼロであってもです。MetaTrader 5 内のネットポジションがゼロの場合、このオーダーセットがネットポジションに対する影響は単に無視されます。
それではそのとき シンボル S についてのネットポジションがゼロで、このときまでにこのシンボルについてオーダーセットs N が実行されていると仮定します。このシンボルに関してポジションは存在しないので、オーダーセット N のトータルボリュームは有意ではありません。実際、オーダー数とそのボリュームは無関係です。ポジションが存在しないため、オーダーはトータルネットポジションに寄与しないのです。これは、そのようなオーダーはただ無視され、それらを双方向ポジションとして表す必要はない、ということです。
これはHedgeTerminalがインストールのときに使用するまさにそのメカニズムです。インストールのとき、ネットポジションが存在しなければ、HedgeTerminalはオーダーセット N を例外リストにインクルードします。そのトータルボリュームと数はネットポジションがないため無関係です。HedgeTerminalのインストール時、ネットポジションが存在すれば、それはただネットポジションがクローズするまでインストールされません。インストール後、新規オーダーがネットポジションの状態を変更することとなります。この状態はHedgeTerminalの双方向ポジションボリュームと同期します。
どうやら、そのときまでにHedgeTerminalによる実行済みオーダーをリストの例外リストに入れることなく離れることができたようです。同時にインストールまでに数多くのオーダーがあり、HedgeTerminalの視点からそれらはすべて双方向ポジションになり、そのトータルボリュームは MetaTrader 5のネットボリュームとは異なる可能性があります。
オーダー非表示のメカニズムはアカウント履歴の破損に対して有効である可能性があります。次がその動作です。いくつかのオーダー履歴があるとします。HedgeTerminalがこのアカウントで起動されるとき、それはオーダーすべてを反復し、それらを基に双方向ポジションを構築します。全オーダーが開始時から利用かのうで、こういったオーダーに関するデータが破損していなければ、これらオーダーのネットポジションは MetaTrader 5のネットポジションに相当します。あきらかにHedgeTerminalのネットポジションはこれらおーだーの合計に等しくなります。以下の図でこれを説明します。
図45 統合履歴図
履歴の一部は失われているまたはオーダーに関する情報が正確でない可能性があります。
損失したオーダーが1件または数件であればそれは重要ではありません。また情報がアカウント履歴の冒頭や真ん中で失われていても無関係です。そのようなアカウントで実行しているHedgeTerminalのネットポジションが利用可能なオーダーすべてのネットポジションと等しくなっています。オーダーのネットポジションはターミナルの事実上のネットポジションとは等しくなりません。それは履歴上に失われた部分があるためです。この状況は図 B で示しています。
図46 部分的に破損した履歴
HedgeTerminalのネットポジションを MetaTrader 5の事実上のネットポジションと同期するためにどのオーダーが消失したとか破損したと知る必要はありません。必要なことはネットポジション同士の差を計算することだけです。上の例ではボリューム5契約の買いが MetaTrader 5 ターミナルでオープンしています。HedgeTerminalではこれは8契約のロングのトータルポジションに相当します。これら2件のポジションの差は買い3契約です。買い 8 –買い 5 = 買い 3 となるためです。
契約差が計算されたら、差に等しいボリュームを持つ対応する買いまたは売りオーダーを出すことが必要です。われわれの例では買い3契約の発注が必要です。オーダーが実行されるとき、HedgeTerminalはそれをアクティブポジションのタブに表示します。トータルのネットポジションは3契約分増加し、買い11契約になります。
The position in MetaTrader 5 内ポジションも増加し8契約となります。このオーダーの識別子はリスト ExcludeOrders.xmlに入れられ、ターミナルは再起動する必要があります。われわれのオーダーの識別子が 101162513 であれば以下のタグがファイルに書き込まれることとなります。
<Orders-Exclude> ... <Order AccountID="10052699" ID="101162513"></Order> </Orders-Exclude>
HedgeTerminalを再起動したら、この双方向ポジションは消えます。このように MetaTrader 5 内のネットポジションはHedgeTerminalのネットポジションと一致し、買い5契約となります。説明した一連のアクションは下図に示しています。
図47 データ統合復元図
消えたポジションの財務実績はHedgeTerminal統計のレコードにはありません。残念ながら非表示の双方向ポジションはトレーディング統計には含まれないのです。
実際には履歴の一部が利用不可または破損している状況はほとんどありえません。MetaTrader 5 ユーザーの多数がそれを使用する必要のあるとき決して遭遇しなくても、そのメカニズムは備えられる必要があるのです。発生可能性のあるHedgeTerminalのプログラムエラーは除外されません。この場合でもこういったエラーを解消する信頼のおけるインスツルメントがあるべきです。
3.11. 適応メカニズム
MetaTrader 5のネット環境でHedgeTerminalが双方向ポジションを表すことのできるメカニズムについて考察してきました。そのメカニズムには3とおりあります。
- ディールの連続反復
- ディールの分割、統合メカニズム
- オーダー非表示メカニズム
それぞれメカニズムは問題を提示し、そのレベルであいまいさとエラーを回避できるようになっています。こういった問題と解決法を表にまとめましょう。最初の列にはバインディングの問題と潜在的エラーと、2列目にはそれを解決するメカニズムを入れます。
双方向トレード時の問題、エラー、あいまいさ | エラー修正メカニズム |
---|---|
開始オーダーへのリンクのエラー:リンクコリジョン;エキスパートにおける長いマジックナンバー;履歴からのオーダー削除;トレード処理実行エラー | オーダーについての連続反復アクションの判断 |
ボリュームエラー;異なるボリュームとのオーダー一致;オーダーの部分的実行;履歴からのディール削除;小さいボリュームを大きいボリュームでカバー | ディールの分割、一致メカニズム |
多数の実行済みオーダーアカウントにおけるHedgeTerminalのインストール;履歴破損;オーダー処理時のHedgeTerminalのバグ | オーダー非表示メカニズム |
表18 潜在的エラーとその排除メカニズム
リンクを格納するシステムと持つ3とおりのメカニズムはすべて安定したデータ表現を保証します。基本的にこれらメカニズムは予測できないすべての可能な失敗のケースをカバーし、HedgeTerminalのネットポジションと MetaTrader 5のネットポジションの一致を保証します。
3.12. パフォーマンスとメモリ使用法
HedgeTerminalは基本的にオブジェクト指向アプリケーションです。そのアーキテクチャにある OOP 原理により、ストレージに対してターミナルは高効率で低い要件を持ちます。唯一のリソース消費タスクは、チャートでターミナルを起動するときオーダーおよびディールの履歴をコンピュータメモリ内で抽出することです。
必要なトランザクションがすべてメモリ内で抽出されたあと、ターミナルはこの処理に費やした時間とメモリ使用を通知するメッセージを画面表示します。コンピュータに 20,000件以上のディールを持つアカウントについてHedgeTerminalパネルをインテル i7 で起動したときは30秒以内で行われ、RAMの 118 Mb が必要でした。
2014.11.20 16:26:19.785 hedgeterminalultimate (EURUSD,H1) We begin. Parsing of history deals (22156) and orders (22237) completed for 28.080sec. 118MB RAM used.
HedgeTerminalAPI ライブラリは、トランザクションのグラフィカル表現が不要なためもっと速く、メモリも少なくてすみます。以下は同じアカウントで起動した結果です。
2014.11.20 16:21:46.183 TestHedgeTerminalAPI (EURUSD,H1) We are begin. Parsing of history deals (22156) and orders (22237) completed for 22.792 sec. 44MB RAM used.
シンプルな計算によると1ポジションの抽出にはプログラムによりますが 1 ~ 1.26 ミリ秒かかります。1トランザクションの格納には (22 156 ディール + 22237 オーダー) / 44 Mb = 1 Kb のRAM。1トランザクションの追加のグラフィック表現におよそ (118 Mb – 44 Mb) * 1024 / (22 156 ディール + 22237 オーダー) = 1.71 Kb のメモリです。
コードプロファイルは時間の主要部分はオーダー分析ブロックに取られていることを示しています。後者の主要部分はシステムの関数呼び出しです。将来バージョンではこのブロックは最適化され、それにより起動時の効率は 10~15%上昇することが可能となります。
おわりに
ビジュアルパネルHedgeTerminalと連携する際のキーポイントを考察してきました。それは柔軟性ある構成の可能性あるパネルの新しいクラス作成例でした。
スキームと仕様は双方向トレードを行う原理の掘り下げた考えを示してくれました。みなさんがご自身の仮想化ライブラリを作成されているなら、本稿の第2章がライブラリ設計のお役に立つことでしょう。
実行交換の文字はディールプロセスと双方向ポジションとしてのオーダー表現におけるキーポイントを考慮することを要求します。本稿ではそのような表現はディールとオーダーの仮想化なしでは不可能であることを示しました。仮想化は1オーダーが複数トランザクションの一部となるためには、実行済みディールとクローズする実オーダーのボリュームを『損なう』メカニズムです。
仮想化の際必要な情報の大部分はトレードサーバーに格納されても、トレード環境でのこういった操作はかなり勇敢なもので、そのような表現は信頼性があるとすることができます。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1297





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索