デバッグとテスト P309
全てのプログラマーは間違いを犯し、ほとんどすべてのプログラムにはエラーが含まれています。関数の入力ミスによるコンパイルエラーであろうと、プログラムロジックのエラーであろうと、プログラムのテストとデバッグの方法を学ぶ必要があります。この章では、エラーとプログラムのデバッグとテストの手順について説明します。また、ストラテジーテスターを使用してプログラムのパフォーマンスを評価する方法も学びます。
エラー P309
MQL5プログラムに関連するエラーには3つのタイプがあります。コンパイルエラーは無効なソースコードがコンパイルされると、MetaEditorで発生します。ランタイムエラーは、プログラムがMetaTraderで実行されるときに発生するロジック(論理)またはソフトウェアのエラーです。トレードサーバーエラーは取引リクエストが失敗したときに発生します。
コンパイルエラー P309
コーディング時の関数呼び出しのタイプミス、セミコロンまたは閉じ括弧を省略したり、構文エラーを起こすことはよくあることです。プログラムをコンパイルすると、MetaEditorの【エラー】タブにエラーのリストが表示されます。初めてこれが起こると、困惑するかもしれませんが、心配する必要はありません。発生する最も一般的な構文エラーのいくつかについて説明します。
コンパイルエラーのリストに直面した時に覚えておくべき最初のことは、常にリストの最初のエラーから始めることです。多くの場合、単一の構文エラーが原因エラーのリスト全体が表示されます。最初のエラーを修正すると、残りエラーは消えます。
図22.1-MetaEditorのツールボックスウィンドウの下にある【エラー】タブ。これらのエラーはすべて、右括弧が1つ欠けていることが原因であることに注意してください。
【エラー】タブでエラーをダブルクリックすると、プログラム内でエラーが発生した場所に移動します。おそらく、エラーはカーソルのすぐ下か、前の行にあります。セミコロン、括弧、またはブラケットが欠落していると、誤解を招くコンパイルエラーが発生する可能性があるため、正しいように見える行でエラーが発生した場合は、前の行を確認してください。
以下は、MetaEditorで最も一般的な構文エラーと、その原因のリストです。
- Semicolon expected -前の行にセミコロンまたは左括弧がありません。
- Unexpected token -前の行に右括弧が無いか、現在の行に余分な左括弧があります。
- Unbalanced right parenthesis-余分な右括弧が存在するか、現在の行に左括弧がありません。
- Expressions are not allowed on a global scope-複数演算子の左括弧が欠落している可能性があります。
- Some operator expected -指定された場所にオペレータがありません。
- Wrong parameters count -関数呼び出しのパラメータが多すぎるか、十分ではありません
- Undeclared indentifier -変数またはオブジェクト名が最初に宣言されずに使用されています。変数のスペルト大文字と
小文字を確認し、必要に応じて宣言してください。
- Unexpected end of program -プログラムに閉じ括弧がありません。エラーはプログラムの終わりを参照しているためこれ
には注意が必要です。最近編集したコードを調べて、欠落している閉じ括弧を探します。
ランタイム(実行時)エラー P310
ランタイム(実行時)エラーとは、プログラムの実行中に発生するエラーのことです。多くはロジック(論理)エラーであり、つまり、プログラムはコンパイルされますが、期待通りに動作しません。ランタイムエラーが発生すると、ログにエラーメッセージが出力されます。エラーメッセージには、エラーの原因と、ソースコードのどの行でエラーが発生したかが示されます。
ランタイムエラーに対するエラーハンドリングをプログラムに追加したい場合は、GetLastError()関数を使用して、最後に発生したランタイムエラーのエラーコードを取得することができます。最後のエラーコードにアクセスした後は、ResetLastError()関数を使用してエラーコードをゼロにリセットしてください。
ランタイムエラーが発生しても、プログラムは引き続き実行されますが、いくつかの致命的なエラーがあり、プログラムの実行をすぐに終了させることがあります。0による除算エラーは、除算演算の際に除数に0を使用される場合に発生します。配列の範囲外エラーは、プログラムが存在しない配列要素にアクセスしようとしたときに発生します。通常、配列のサイズを超えた配列要素にアクセスしようとした場合に発生します。無効なポインタにアクセスしようとすると、致命的なエラーが発生することもあります。
実行時エラーの完全なリストは、MQL5リファレンスの標準定数… > エラーと警告のコード > 実行時エラーにあります。
トレードサーバーエラー P311
取引アクションを実行しようとすると、ObjectSend()関数によって取引サーバーエラーが返されます。ObjectSend()関数に渡されるMqlTradeResultオブジェクトのretcode変数には、サーバーからの戻りコードが含まれています。当社の注文発注および変更機能には、取引サーバーのエラーを処理するためのコードが既に含まれています。OrderSend()関数を使用するクラスまたは関数を記述する必要がある場合は、取引サーバーエラーを処理するコードを必ず追加してください。
デバッグ P311
MetaEditor5には、プログラムをインタラクティブに実行するために使用できるデバッガが備わっています。MetaEditorツールバーには、デバッグを開始するための2つのボタンがあります。最初のボタンは、メタトレーダストラテジーテスターでEAを実行し、視覚化された履歴データを使用します。2番目のボタンは、リアルタイムデータを使用して、MetaTraderのチャートウィンドウでEAを起動します。【停止】または【一時停止】ボタンをクリックして、デバッグプロセスを停止または一時停止できます。
図22.2-デバッグボタン。左から、開始(履歴)、開始(ライブ)、一時停止、およびデバッグの停止ボタンがあります。
ブレークポイントに到達すると、デバッグプロセスに入ります。ブレークポイントは、F9キーを押して現在の行のブレークポイントを切り替えることにより、MetaEditorで定義できます。DebugBreak()関数を使用することもできます。ブレークポイントを定義します。プログラムの実行中にブレークポイントに到達すると、プログラムが一時停止し、制御がプログラマーに渡されます。プログラマーは、ツールバーの【ステップイン】、【ステップオーバー】および【ステップアウト】ボタンを使用して、プログラムの実行を1行ずつ観察できます。
図22.3-MeteEditorの現在の行にブレークポイントが設定されています。
【ステップイン】ボタンは、実行をプログラムの次の行に移動します。ステップオーバーは、実行中に検出されたすべての関数をスキップします。ステップアウトは、現在の関数を終了し、それを呼び出した関数に制御を返します(または現在のイベントを終了します)。
図22.4-ステップボタン。左から右に、【ステップイン】、【ステップオーバー】、【ストップアウト】ボタンがあります。
MetaEditorツールボックスウィンドウの【デバッグ】タブ内の【ウォッチ】ウィンドウを使用して、デバッグ中に変数の値を監視できます。【ウォッチ】ウィンドウには、監視されている変数と式の現在の値が表示されます。変数または式をウォッチウィンドウに追加するには、マウスカーソルを変数名の上に置くか、クリックアンドドラッグしてウォッチウィンドウに追加する式を選択します。右クリックして、ポップアップメニューから【ウォッチの追加】を選択するか、キーボードのshift+F9を押します。
図22.5-ウォッチウインドウ
ロギング P312
デバッガーが利用できない場合、ライブまたはデモ取引中にエラーが発生することがあります。または、ストラテジーテスターで一度に複数の取引シナリオをテストする必要がある場合もあります。Print()関数を使用して、プログラムの状態に関する情報をMetaTraderのログファイルに記録できます。Alert()関数は自動的にアラート文字列をログに出力するため、アラートもログに表示されます。
Print()関数は、取引操作とエラー状態をログに記録する関数と取引クラス全体に既に追加されています。CTradeクラスでは、トラブルシューティングのためにリクエストと結果の値をログに出力するLogTradeRequest()という名前の関数を追加しました。
2018.03.01 04:00:00 MqlTradeRequest – action:10, comment:, deviation:0,
expirtion:1970.01.01 00:00:00, magic:0, order:0, position:10, position_by:11, price:0.0,
ls:0.0, stoplimit:0.0, symbol:, tp:0.0, type:0, type_filling:0, type_time:0, volume:0.0
特に取引操作を実行したり、新しいコードをテストしたりする場合は常にこの種のログ機能をプログラムに組み込む必要があります。
Print()関数を使用したデバッグは、デバッガーを使用するよりもインタラクティブではありませんが、プログラマは多くの出力を一度に調べることができます。ストラテジーテスターウィンドウの【ジャーナル】タブで、ストラテジーテスターログを表示できます。ジャーナルウィンドウを右クリックしポップアップメニューから【開く】を選択してログフォルダを開き、テキストエディタでファイルを表示します。または、JournalViewer(右クリックメニューから【Viewer】を選択)を使用して、ログを日付別にフィルター処理して表示することもできます。
図22.6-Journal Viewerウィンドウ。
ライブチャートでEAと取引する場合、MetaTraderは出力用に2つの異なるログフォルダ―を使用します。\Logsフォルダーにあるターミナルログには、基本的な取引とターミナルの情報が表示されます。このログは、ツールボックスウィンドウの【ジャーナル】タブで表示できます。\Experts\Logsにあるエキスパートログには、Print()およびAlert()関数の出力と、詳細な取引情報が含まれています。【ツールボックス】ウィンドウの【エキスパート】タブでエキスパートログを表示できます。【Journal】または【Experts】タブ内を右クリックし、ポップアップメニューから【Open】を選択してログフォルダを開くか、ポップアップメニューから【Viewer】を選択して【Journal Viewer】でログフォルダを表示できます。
図22.7-ツールボックスウィンドウの【エキスパート】タブ。すべてのPrint()およびAlert()出力は、ここで表示できます。
ストラテジーテスターの使用 P313
ストラテジーテスターは、トレーディングシステムをテスト及び評価するための最も重要なツールです。MetaTrader5は、マルチ通貨テスト、改善されたレポート、フォワードテストなど新機能をストラテジーテスターに導入します。StrategyTesterにアクセスするには、標準ツールバーからMetaTraderのStrategyTesterウィンドウを開くか、キーボードのCtrl+Rを押します。
図22.8-ストラテジーテスターの【設定】タブ
ストラテジーテスターウィンドウの【設定】タブは、テスト用の設定を入力する場所です。設定のほとんどは自明であり、MetaTrader4ストラテジーテスターを使用したことがある場合はおなじみのはずです。言及する価値のある新しい設定がいくつかあります。実行ドロップダウンボックスでは、注文操作をテストするときにランダムな遅延を組み込むことができます。これは、実際の取引における自然な遅延を模倣します。
【実行】ドロップダウンボックスの右側には、ティック生成モードがあります。「Every tick」は、サーバーからのすべての受信ティックをモデル化しようとします。これは最も遅いモードですが、最も正確です。「1分OHLC」は、テスト期間中の各M1バーの始値、高値、安値、および終値を使用して、バー内の価格変化の大まかな概算を提供します。Every tickよりも高速ですが、精度は低くなります。「Open price」は、選択したチャート期間の各バーのOHLCのみを使用します。これは最も高速なモードですが、精度も最も低くなります。これは、新しいバーの開始時にのみ注文を開くEAを素早くテストしたい場合に役立ちます。
【※OHLC = 始値(Open)高値(High)安値(Low)終値(Close)】
【視覚化】チェックボックスをオンにすると、テストの開始時に別の資格化ウィンドウが表示されます。視覚化ウィンドウには、ティックごとのテストが表示されます。すべてのインジケータが描写され、チャートで注文の開始と終了を確認できます。図22.9は、視覚化ウィンドウを示しています。視覚化の速度も調整可能です。過去のデータに対してMetaEditorからEAをデバッグすると、デバッグプロセス中に可視化ウィンドウが表示されます。
【設定】タブの残りの設定は、最適化のためのものです。最適化については後程説明します。
図22.9-ストラテジーテスターの視覚化ウィンドウ
入力タブは、EAの入力パラメータを調整するために使用されます。【値】列は、現在のテストの値を設定するために使用されます。Start、Step、およびStop列は最適化のためのものであり、すぐに対処されます。現在の設定をファイルに保存したり、ファイルから設定をロードしたり、右クリックメニューを使用してすべてのパラメータをデフォルトに設定したりできます。
図22.10-ストラテジーテスターの【入力】タブ
テスト設定と入力設定を構成したら、【設定】タブの【開始】ボタンを押します。テストが完了すると、グラフが開き、【結果】タブには、利益、ドローダウン、プロフィットファクター、およびパフォーマンスのその他の統計的尺度を示すテストレポートが表示されます。【結果】タブを下にスクロールすると、追加の取引統計とグラフがあります。
図22.11-ストラテジーテスターの【結果】タブ
取引の詳細を表示するには、【結果】タブを右クリックします。ポップアップメニューから【取引】、【注文】、または【注文と取引】を選択できます。取引レポートは実際の取引結果を反映するため、最も役立ちます。取引レポートの【方向】列に注意してください。インの方向は、取引が現在のポジションに追加されていることを意味します。アウトの方向は、取引がポジションの一部または全部を決済していることを意味します。イン/アウト方向とは、位置の反転を指します。
図22.12-ストラテジーテスターの【結果】タブの取引レポート
レポートには、ポジションに設定されたストップロスやテイクプロフィットは表示されないことに注意してください。この情報が必要な場合は、【ジャーナル】タブでログを確認し、注文/取引番号を検索してください。ポジションがストップロスまたはテイクプロフィットで決済された場合、それは【コメント】列のエントリ、【価格】列の赤または緑の背景、アウト方向の取引レポートに反映されます。ポジションが決済されると、別の取引としてリストされることに注意してください。【結果】タブ内を右クリックし、【レポート】サブメニューから【XMLまたはHTMLを開く】を選択すると、【結果】タブの内容をレポートファイルに保存できます。
【グラフ】タブには、経時的(時間の経過とともに伴う変化のこと)な収益性のグラフが表示されます。【エージェント】タブでは、テスト用のマルチコアプロセッサを管理したり、リモートコンピュータやMQL5クラウドネットワークを利用してリソース集約型の最適化を実行したりできます。最後に、【Journal】タブには、\Tester\Logsフォルダにあるテストログが表示されます。すべてのログエントリとエラーを含むテストの結果は、このログに表示されます。
最適化 P317
EAで最適化を実行するには、入力パラメータを選択して最適化し、可能なパラメータセットのすべての組み合わせをテストして、どのパラメータが最も収益性が高いかを判断する必要があります。通常、これに続いて、標本外データの最適化結果をテストするフォワードテストが行われます。最適化とフォワードテストは、EAの収益性を評価するプロセスです。
【入力】タブから始めましょう。Start、Step、およびStop列は、最適化パラメータの設定に使用されます。パラメータを最適化するには、【変数】列のパラメータ名の左側にあるチェックボックスを選択します。開始値は、パラメータの開始値です。Step値は指定した量だけパラメータを増分し、Stop値はパラメータの終了値です。たとえば、Start値が10、Step値が5、Stop値が50の場合、パラメータは10、15、20から始まり、合計で50まで最適化されます。たとえば、Start値が10、Step値が5、Stop値が50の場合、パラメータは10、15、20から始まり、50まで、合計10ステップで最適化されます。
最適化する各パラメータを選択し、それぞれの開始、ステップ、停止の値を設定します。テストするパラメータの数と、各パラメータのステップ値を制限したい場合があります。テストするパラメータ/ステップが多いほど、最適化にかかる時間が長くなります。
図22.13-ストラテジーテスタの【入力】タブ。最適化のために【開始】、【ステップ】、および【停止】列を使用しています。
最適化設定は【設定】タブの一番下にあります。最適化が実行されていない場合、最適化ドロップダウンは【無効】に設定されます。最適化を実行したい場合について、パラメータが多い場合は長時間のものを選択してください。完全なアルゴリズムは、可能なパラメータのすべての組み合わせをテストするので、非常に長い時間がかかる可能性があります。FastGeneticBasedAlgorithmは、遺伝的アルゴリズムを使用して、テストするパラメータの範囲を絞り込みます。結果は、完全なアルゴリズムを使用した場合と同等であり、デフォルトの選択となります。MarketWatch(気配値表示)で選択されたすべての銘柄は、気配値表示ウィンドウのすべての銘柄をテストします。【気配値表示】ウィンドウ内の右クリックメニューを使用して、【気配値表示】ウィンドウからシンボルを追加および削除できます。
図22.14ーストラテジーテスターの【設定】タブの最適化設定
最適化の左にあるドロップダウンボックスは、遺伝的アルゴリズムの最適化基準です。デフォルトでは最大残高で並べ替えますが、プロフィットファクター、ドローダウン、期待ペイオフなどのほかの基準と組み合わせて最大残高で並べ替えることができます。
【フォワード】ドロップダウンでは、フォワードテスト期間を選択します。ForwardがNo以外に設定されている場合、選択された最適化期間の一部がフォワードテスト用に確保されます。【カスタム】を選択し、右側の日付入力ボックスに開始日を設定することで、フォワードテスト期間の独自の開始日を選択できます。フォワードテストが有効になっている場合は、各最適化結果がフォワードテスト期間に個別にテストされます。
最適化の結果は、【最適化の結果】タブで確認できます。最適化の結果をフォワードテストの結果と比較して、最適化の結果がどの程度維持されているかを確認します。フォワードテストの結果が最適化の結果と同等である場合、システムは取引でうまく機能する可能性があります。2つの結果セットが比較できない場合は、最適化パラメータ、取引システムまたはその両方を調整する必要があるかもしれません。
図22.15-ストラテジーテスタの【最適化結果】タブ。フォワードテストとバックテストの両方の結果が表示されます。
【最適化の結果】タブを右クリックして、該当する場合は【バックテストの結果】と【フォワードテスト結果】を選択します。プロフィットファクター、ドローダウン、予想ペイオフ、最適化パラメータなど、レポート内の追加の列を有効にすることもできます。最適化の結果は、右クリックメニューから【XMLにエクスポート】を選択して、任意のスプレッドシートプログラムで開くことができる。XMLファイルに保存できます。【最適化グラフ】タブには、最適化結果の散布図が表示されます。右クリックメニューから2Dまたは3Dグラフを選択できます。X軸とY軸に使用するパラメータを設定します。
テスト結果の評価 P319
【結果】タブと【最適化結果】タブには、取引システムの収益性と安定性を評価するための様々な統計的尺度が表示されます。MetaTrader5は、多くの新しい統計をStrategyTraderレポートに追加しました。このセクションでは、取引および最適化レポートに表示される最も重要な統計を調べます。
- Net Prtofit ー 純利益は、総利益から総損失を引いたものとして計算されます。これはおそらくもっとも重要な統計であり、他
の統計との関連で常に考慮する必要があります。明らかに、純利益が高いほど良いです。
- Drawdown ー ドローダウンは、テスト期間中のピークから谷までの最大損失です。絶対ドローダウン(Absolute
drawdown)は、元の開始残高を下回るバランスまたはエクイティの最大ドローダウンです。最大および相対
ドローダウンは、最大利益から最大損失までのエクイティまたはバランスの最大ドローダウンです。相対ドロー
ダウンが最も重要な値で、値が小さいほど良い結果となります。
- Profit Factor ー プロフィットファクターは、総利益と総損失の単純な比率です。利益がゼロのシステムのプロフィットファクタ
ーは1です。プロフィットファクターが1未満の場合、システムは損失を被っています。プロフィットファクター
は高いほど良い。
- Expected Payoff ー 予想ペイオフは、1回の取引の平均/利益または損失です。値が大きいほど優れています。
- Recovery Factor ー 回復係数は、取引戦略のリスクと、損失からどれだけ回復するかを決定します。これは、最大ドローダウ
ンに対する利益の比率です。値が大きいほど優れています。
- Sharpe Ratio ー シャープレシオは、取引システムのリスクと安定性も決定します。洗練されたアルゴリズムを使用して、システ
ムの収益とリスクのない収益方法(国債など)を比較します。値が大きいほど優れています。
※エクイティ(Equity)は、トレードアカウントの現在の価値を示す用語で、アカウントの残高に加え、オープンポジションの評価損益も含めた資産価値を表します。つまり、残高に加えてオープンポジションの利益や損失も考慮に入れた、アカウントの実際の価値を表す指標です。トレードアカウントのパフォーマンスを分析する際に良く用いられます。