自動売買のアイディアは、自動売買ロボットが四六時中ノンストップで働くことが出来るという事実によって魅力的です。ロボットは、心理的な問題から完全に解放されており、疲れたり、疑問を持ったり怖がったりしません。取引ルールを定式化してアルゴリズムで実装すれば、ロボットはたゆまず努力する準備ができています。しかし、初めに次の2つの重要な条件が満たされていることを確認する必要があります。
これらの質問のすべては取引プラットフォームに内蔵されたストラテジーテスターによって答えられます。
非株式商品での全てのタイプの指値注文と利食い/損切りの注文は、BidとAsk価格で作動します。実行は作動時の現在のBidとAsk価格で行われます。
株式商品でのチャートの構築と、ストップオーダーの作動は、取引の終値(Last)で行われます。リミットオーダーの作動は、Bid/Ask価格で行われます。指値注文は注文で指定された価格(スリッページ不可能)、他の種類の注文は現在の市場のBid/Ask価格で実行されます(スリッページ可能)。
Si-6.16での例を見てみましょう。現在の価格が、Bid=72570、Ask=72572、Last=72552で、Buy Stopオーダーが72580で発注されたとします。価格変動で新しい現在価格は、以下のようになったとしましょう。
株式商品では、ストップオーダー作動のトリガーはLast価格です。従って、Last価格が72580になったことで、バイストップオーダーが有効になりました。注文(成行買い)の実行は、現在の市場価格Ask=72590で行われます。
『始値のみ』と『1分足OHLC』のテストモードでは未決注文とストップロス/テイクプロフィット注文は、これらの注文で指定された価格で実行されます。正確なモード(全ティックやリアルティック)で使用する市場価格で実行するアルゴリズムは、精度の低いモードには適していません。中間ティックは生成されない為、注文のリクエスト価格と実行時の市場価格(始値またはOHLC)との差は重要になります。『始値のみ』と『1分足OHLC』モードでのリクエスト価格による注文の実行は、正確なテスト結果を与えます。 |
取引銘柄の為のバーはストラテジーテスターではゼロ以外のLast価格のティックでのみ形成されます。また。BidとAsk価格が取得され、インディケータは計算されますが、バーは形成されません。『全ティック』モードではゼロのLast価格はあり得ません。したがって、新しいティックはそれぞれバーを変更します。
売値と買値との価格差はスプレッドと呼ばれています。テストでは、スプレッドはモデルされる代わりに履歴データからとられます。履歴データでスプレッドがゼロ以下の場合、既知の直近の(生成の瞬間での)スプレッドが使用されます。
テスタストラテジーテスターでは、スプレッドは常に浮動と考えられています。
テスト中には取引のグローバル変数もエミュレートされますが、これらは、端末で F3 ボタンでみられる、実際のプラットフォームのグローバル変数とは関係ありません。これは、テスト中の端末のグローバル変数の全ての操作は、クライアント端末の外で(テストエージェントで)行われることを意味します。
プラットフォームは、テストプロセスを開始する前に、テストに使われる銘柄の履歴を同期して取引サーバからダウンロードします。プラットフォームは、後のリクエストを避けるために、初めに使用可能な全ての銘柄履歴を順番にダウンロードします。その後は、新しいデータのみがダウンロードされます。
テストエージェントは、テスト開始の直後に、テストされる銘柄の履歴を取引プラットフォームから受け取ります。他の金融製品のデータがテストの過程で使用されている(例えば、多通貨エキスパートアドバイザー)場合、テストエージェントは、データの最初の呼び出し時に取引プラットフォームから必要な履歴を要求します。履歴データがプラットフォームで利用可能な場合、それらはすぐにテストエージェントに渡されます。データが利用可能でない場合は、プラットフォームはデータをサーバからリクエスト及びダウンロードしてからテストエージェントに渡します。
取引操作のクロスレートを計算するためには、追加的な製品データも必要です。例えば、米ドル預金通貨でのEURCHFストラテジーをテストする際、ストラテジーにはそれらを直接使用する呼び出しが含まれないにもかかわらず、テストエージェントは、最初の取引操作を処理する前に、取引プラットフォームからEURUSDとUSDCHFの履歴データをリクエストします。
MQL5アプリケーションから特定の関数を呼び出す際には追加の取引履歴のダウンロードの開始が可能です。
履歴ダウンロード |
履歴ダウンロードなし |
---|---|
SymbolInfoDoubleを以下のパラメータで呼び出す場合:
SymbolInfoIntegerを以下のパラメータで呼び出す場合:
SymbolInfoTickを呼び出す場合: |
以下を呼び出す場合:
|
多通貨ストラテジーをテストする前に、取引プラットフォームに全ての必要な履歴データをダウンロードすることをお勧めします。これは、必要なデータのダウンロードに関連したテスト/最適化の遅れを避けるために役立ちます。例えば、適切なチャートを開いて履歴先頭にスクロールすることによって、履歴をダウンロードすることが出来ます。
テストエージェントはプラットフォームからパックされた形式で履歴を受け取ります。必要なデータはテスタの前回の実行以降利用可能であるため、次のテスト中にはテスタはプラットフォームから履歴を読み込みません。
|
ストラテジーテスターは、複数シンボルの売買をするストラテジーのバックテストをすることが出来ます。以前のプラットフォームではテストは単一のシンボルに対して実施されていたので、このようなエキスパートアドバイザーは従来「多通貨エキスパートアドバイザー」と呼ばれます。プラットフォームテスターでは、利用可能な全ての製品の取引をモデル化することが出来ます。
テスタは、銘柄データの最初の呼び出し時に自動的に使用される銘柄の履歴を(取引サーバからではなく)取引プラットフォームから読み込みます。
テストエージェントはテスト開始時に指標の計算に必要で欠けている小幅な履歴データをダウンロードします。 D1以下の時間軸では、ダウンロードされた履歴の最小容量は1年です。よって、2010.11.01-2010.12.01の間隔を(各足が15分に等しい)M15期間でテストした場合、端末は2010年1年間の履歴をリクエストします。週足では、約2年(1年は52週)である100足の履歴を要求します。月足でのテストのためには、エージェントは8年の履歴(12ヶ月×8年 = 96ヶ月)を要求します。
何らかの理由で必要な足が利用できない場合、テスト前に必要な数の足を確保するためにテストの開始日が過去から現在まで自動的にシフトされます。
気配値表示 もテストでエミュレートされます。デフォルトでは、テスト開始時にストラテジーテスターの「気配値表示」にはテストが実行されている1つの銘柄のみが存在します 。アクセスに必要な銘柄の全ては自動的に(プラットフォームではなく)ストラテジーテスターの「気配値表示」に参照されます。
多通貨エキスパートアドバイザーのテストを開始する前に、プラットフォームの「気配値表示」のテストに必要な銘柄を選択して必要なデータを読み込む必要があります。「外来」銘柄の最初の呼び出し時には、その履歴が自動的にテストエージェントと取引プラットフォームの間で同期されます。「外来」銘柄とはテストが実行されている銘柄以外の銘柄です。 |
そのような銘柄の最初の呼び出しの時点で、テストプロセスが停止され、銘柄/時間軸の履歴がプラットフォームからテストエージェントにダウンロードされます。同時に、銘柄のティックシーケンスが生成されます。
銘柄ごとに個々のティックシーケンスが、選択されたティック生成モードに応じて生成されます。
これは、取引プラットフォームにおける多通貨のテストが余分な労力を必要としないことを意味します。ただ、プラットフォームで適切な銘柄のチャートを開くだけです。適切なデータが含まれていれば必要な銘柄の履歴は全て自動的に取引サーバからアップロードされます。
テスト中のローカル時刻は常にサーバ時刻と同じです。サーバ時刻は常にGMTに等しいです。
GMT、ローカル、及びストラテジーテスターでのサーバ時刻との差の欠如は、サーバへの接続がない場合には、意図的に行われます。テスト結果は接続のあるなしに関係なく同じでなければなりません。サーバ時刻に関する情報はローカル格納されておらず、サーバから取得されます。
テスト/最適化中には、グラフィックオブジェクトはプロットされません。よって、テスト/最適化の際に作成されたオブジェクトのプロパティを参照すると、エキスパートアドバイザーはゼロ値を受け取ることになります。
この制限は、ビジュアルモードでのテストには適用されません。 |
ストラテジーテスターはいわゆる「多通貨」エキスパートアドバイザーのテストを可能にします。多通貨エキスパートアドバイザーとは2つ以上の銘柄で売買をするエキスパートアドバイザーです。
複数の銘柄を売買するストラテジーのテストは、テスタにいくつかの追加的な技術要件を課しています。
ストラテジーテスターは、ティックを生成し選択された取引モードに応じて各金融製品のためにティックシーケンスを再生します。新規の足は各銘柄で、他の銘柄に対してどのように足が開かれたかと関係なく開かれます。これは、多通貨エキスパートアドバイザーのテスト時に、ある製品では新規の足が既に開かれていても他の製品では開かれていないという状態が発生する可能性がある(実際によくあります)ことを意味します。これは、リアルタイム相場でよくみられます。
テスタでのこの本格的な履歴シミュレーションは「全ティック」及び「1分足OHLC」テストモードが使用されている限り問題を発生することはありません。これらのモードでは、1つのローソク足にに生成されたティックの数は充分で、異なる銘柄の足の同期まで待つことが出来ます。しかし、金融製品の取引でのバーの同期が必須である場合、多通貨ストラテジーは「始値のみ」モードではどのようにテストされるのでしょうか。このモードでは、エキスパートアドバイザーは足のオープン時に対応する1つのティックのみで呼ばれています。
例:EURUSDのエキスパートアドバイザーのテスト中に、1時間足がEURUSDで開いたとします。この事実は簡単に認識出来ます。「始値のみ」モードでは NewTick イベントはテスト期間の足のオープン時に対応します。しかし、エキスパートアドバイザーで使用されている GBPUSD 上で新規の足が開いたとの保証はありません。
プラットフォームのテストはテストエージェントを使用して行われます。ローカルエージェントは自動的に作成されて有効にされます。ローカルオブジェクトの数は、コンピュータ内のロジカルコアの数に対応しています。
それぞれのテストエージェントはプラットフォームと関係なく独自のグローバル変数のコピーを持ちます。プラットフォーム自体は、ローカル及び遠隔エージェントにタスクを分散する管理者です。エキスパートアドバイザーのタスクが指定されたパラメータの完全な場合でテストすると、エージェントは、プラットフォームに結果を返します。単一のテストには、単一のエージェントが使用されます。
プラットフォームから受信された履歴はエージェントによって製品の名称を使用した別々のフォルダに保存されるので、EURUSDの履歴はEURUSD という名称のフォルダに保存されます。また、製品の履歴は、そのソースによって分類されています。履歴は以下のように保存されます。
tester_catalog\Agent-IPaddress-Port\bases\name_source\history\symbol_name |
例えば MetaQuotes-Demo サーバからの EURUSDの履歴は tester_catalog\Agent-127.0.0.1-3000\bases\MetaQuotes-Demo\EURUSD フォルダに保存されます。
ローカルエージェントは、テストの完了後に次の呼び出しのために立ち上げに時間を無駄にしないように、次のタスクを待って5分間スタンバイモードに入ります。待機期間が終わって初めてローカルエージェントはシャットダウンしCPUメモリからアンロードされます。
ユーザ側からテストが早期終了(「キャンセル」ボタン)された場合、またはプラットフォームが閉じられた場合、全てのローカルエージェントはすぐに作業を停止しメモリからアンロードされます。
テスト実行時に、プラットフォームはエージェントに送信するパラメータブロックをいくつか用意します。
パラメータの各ブロックで、MD5ハッシュ形式のデジタル指紋が作成されてエージェントに送信されます。MD5ハッシュは、基づいて計算された情報の量よりもはるかに小さく、セットごとに一意です。
エージェントは、ハッシュを受信し、保存されているものと比較します。与えられたパラメータブロックの指紋がエージェントに存在しない、または受信したハッシュが既存のものと異なる場合、エージェントは、このパラメータのブロックを要求します。これによって、プラットフォームとエージェント間のトラフィックが減少します。
テスト後にエージェントは「テスト結果」と「最適化の結果」タブに表示される、受信利益、約定数、シャープレシオ、OnTester() 関数の結果などの実行結果をプラットフォームに返します。
最適化中に、プラットフォームはエージェントにテスト作業を小型パッケージで渡し、それぞれのパッケージにはいくつかのタスクが含まれています(ここで、それぞれのタスクとは、入力パラメータのセットを持つ単一のテストを意味します)。これによって、プラットフォームとエージェント間のトラフィックが減少します。
エージェントは、セキュリティ上の理由のため、プラットフォームから取得したEX5ファイル(エキスパートアドバイザー、指標、ライブラリなど)をハードディスクに記録することはありません。実行中のエージェントを持つコンピュータが受信したデータを使用することが出来ないようにです。DLLを含んだ他の全てのファイルはサンドボックスに記録されます。DLLは遠隔エージェントのエキスパートアドバイザーではテストできません。
テスト結果は、必要な時に迅速にアクセス出来るように、プラットフォームによって結果の特別なキャッシュ(結果キャッシュ)に追加されます。再実行を回避するために、プラットフォームはパラメータのセットごとに以前の実行からの既に入手可能な結果を結果キャッシュ内で検索します。パラメータセットの結果が見つからない場合、エージェントにテスト実行タスクが与えられます。
プラットフォームとエージェントの間のトラフィックは全て暗号化されます。
ティックはネットワーク経由で送信されず、テストエージェント上で生成されます。 |
全てのテストエージェントは、互い及びプラットフォームから単離されています。各エージェントは、ログが記録されている独自のフォルダを持っています。また、テスト中のエージェントのファイル操作の全てはagent_name/MQL5/Files フォルダで行われます。しかし、プラットフォームの共有フォルダを介してローカルエージェントと取引プラットフォーム間の相互作用を実装することが出来ます。
最適化を速めるためには、ローカルだけではなく遠隔エージェントが利用出来ます。この場合、遠隔エージェントにはいくつかの制限がかかります。まず、ポジション開閉についてのメッセージや Print() 関数の結果は遠隔エージェントログに記録されません。エキスパートアドバイザーの誤操作による膨大な量のメッセージがコンピュータのハードドライブに書かれるのをを防ぐために、最少の情報がログに追加されます。
2番目の制限はエキスパートアドバイザーのテストでDLLが使用出来ないことです。セキュリティ上の理由から、遠隔エージェントでのDLLの呼び出しは絶対禁止となっています。ローカルエージェントでは、エキスパートアドバイザーのテストでのDLLの呼び出しは「インポートDLLを許可」が有効な時のみ許可されています。
DLL呼び出しを必要とするサードパーティーのエキスパートアドバイザー(スクリプト、指標)の使用にあたって、端末の設定でこのオプションを許可する場合にとるリスクには注意するべきです。エキスパートアドバイザーがどのように(テストまたはチャートでの実行)使用されるかには関係なくです。 |