English Русский 中文 Español Deutsch Português
preview
MQL5ストラテジーテスターを理解し、効果的に活用する

MQL5ストラテジーテスターを理解し、効果的に活用する

MetaTrader 5テスター | 26 9月 2023, 10:22
612 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

はじめに

MQL5のプログラマーや開発者は、効果的な結果を得るためには、ストラテジーテスターをよく理解して使いこなす必要があることを知っています。この貴重なツールを使用することで、作成したMQL5プログラムのパフォーマンスに関する貴重な洞察を得ることができ、これがより良い取引結果を得ることに影響します。そのため、テストをおこなう前に、重要なトピックをよく理解しておく必要があります。あらゆるタイプのエラーへの対処もその1つです。開発者にとって、間違いを犯してエラーが発生するのはごく普通のことだからです。よく理解する必要があるもう1つのトピックはデバッグです。デバッグとは、作成したプログラムをインタラクティブな方法で実行することです。そして、MetaTrader 4に比べて最も興味深い機能を使って作成したプログラムをテストし、評価するための「ストラテジーテスター」という最も重要で価値のあるツールがあります。この記事でMQL5ストラテジーテスターの使用の最も重要な側面を学ぶことは、素晴らしい学習の旅となるでしょう。 次のトピックで説明します。

プログラマーや開発者として対処しなければならないことをよく理解するために、これらの以前のトピックに関する最も一般的なポイントを取り上げてみます。ここで言及しなければならないのは、このトピックを扱うとき、読者はすでにMQL5というプログラミング言語を知っていてプログラムのコーディングの仕方も知っているべきだということです。この記事を読んで最大限のメリットを得るには、これらを事前に知っている必要があります。まず言語について学ぶ必要がある場合は、MQL5のドキュメントをご覧ください。また、MQL5プログラミングの基礎や、最も人気のあるテクニカル指標に基づいた取引システムの作成方法に関する私の他の記事も読んでいただければ、お役に立つかと思います。

エラー

このトピックでは、MQL5プログラムの作成および実行時に見つかるエラーについて学習します。このトピックを理解することが非常に重要なのは、MQL5がこれらのエラーを正しく報告しても、これらのエラーが何を意味するのか、あるいはプログラムのどの段階で発生するのかを知らなければ、エラーの意味をすでに知っている場合よりも、対処や解決に多くの時間がかかってしまうからです。

このトピックでは、MQL5プログラムの作業段階に基づいて説明します。コードを書いている間に直面する可能性のあるエラーや警告には、コンパイルエラーと警告があります。また、MQL5プログラムを実行する際にはランタイムエラーが発生し、MQL5プログラムが取引しようとすると、取引サーバーエラーである他のタイプのエラーが発生する可能性もあります。以下のようなエラーを取り上げます。

  • コンパイルエラーと警告
  • ランタイムエラー
  • 取引サーバーのエラー

これらのエラーについて説明する前に、エラーがどこに表示されるかを知っておく必要があります。MQL5 IDEでは、デフォルトで最下部にツールボックスウィンドウがあり、以下のいずれかの方法で表示することができます。

1:[表示]をクリック==>[ツールボックス]を選択

ツールボックス

2:キーボードからCtrl+Tを押す

3:メインツールボックスからツールボックスボタンをクリックする

ツールボックス2

その後、以下の図のようになります。

ツールボックス3

コンパイルエラーと警告:

プログラムのコードを書いているときに間違えることはごく普通のことです。間違った構文やタイプミスなどが、コードのコンパイルエラーにつながります。この部分では、このタイプのエラーで最も一般的で、よく直面するものを紹介します。また、最も重要なことは、エラーが解消されるか解決されるまでは、プログラムをコンパイルできないということです。ここでは、このタイプのエラーとして最も一般的なものを紹介します。

semicolon expectedエラー:

このエラーは、行末にセミコロンを書き忘れたり、セミコロンが足りなかったり、左括弧を書き忘れたりした場合に発生します。このタイプのエラーを避けるためには、これらの記号を正しく使わなければなりません。次のコードは、このエラーの例です。

エラーで間違ったコード:

int a=(2+1)

エラーは次のようになります。

セミコロン

エラーのない正しいコード:

コード行の最後にセミコロンを追加してコードを修正した後、以下のような正しいコードを見つけることができます。

int a=(2+1);

コードをコンパイルすると、以下のようにエラーが解消されてエラーなしでコンパイルされることがわかります。

semicolon expectedが解決

Unexpected tokenエラー:

これもよくあるタイプで、最終行の右括弧を忘れたり、現在の行に余分の左括弧を追加したりしたことが原因です。このタイプのエラーの例としては、次のようなものがあります。

エラーで間違ったコード:

int a=(2+1;

ツールボックスの[エラー]タブで、以下のようにエラーを確認することができます。

Unexpected token

エラーのない正しいコード:

int a=(2+1);

右括弧を追加してコードを修正すると、以下のように[エラー]タブにエラーが表示されなくなります。

Unexpected tokenの解決

Undeclared identifierエラー:

このタイプのエラーは、変数を使用したり値を代入したりする前に、新しい変数を宣言しなければならないので、最初に宣言せずに変数を使用したときに発生します。例えば整数や文字列のように、この変数に返す必要がある適切なデータ型を選んで宣言します。以下は、新しい変数を宣言せずに使用することによる、このタイプのエラーの例です。

エラーで間違ったコード:

a=5;

前のコードでは、変数aを宣言せずに5を代入して使っていました。そのため、このコードをコンパイルすると、以下のようにundeclared identifierエラーが発生します。

Undeclared identifier

エラーを報告するだけでなく、このエラーの原因である変数aを特定しているので、エラー記述の正確さが非常に役立つことがわかります。

エラーのない正しいコード:

int a=5;

この正しいコードをコンパイルした後、ツールボックスの[エラー]タブ(同じ画像)にエラーは表示されません。

Unbalanced left parenthesisエラー:

このタイプのエラーは、正しい括弧を見落としたり、余分な右括弧を使ったりした場合に発生します。このエラーは以下の例で見つけることができます。

エラーで間違ったコード:

   bool a=7;
   if (a=5
   a=5;

先のコードでは、右括弧を忘れることによって、「some operator expected」エラーに加えて、「unbalanced left parenthesis」エラーが発生することがわかりました(下図参考)。

Unbalanced left parenthesis

エラーのない正しいコード:

   bool a=7;
   if (a=5)
   a=5;
コードを修正した後、エラーなしでコンパイルされたことがわかるでしょう。


Unexpected end of programエラー:

コードの閉じ括弧がないと、Unexpected end of programエラーが発生することがあります。このエラーを解決するには、コードをチェックして、何を追加する必要があるのか、あるいはすべての開き括弧に対して閉じ括弧があることを確認する必要があります。以下はこのコードの例です。

エラーで間違ったコード:

void OnStart()
  {
   bool a=7;
   if (a=5)
   a=5;

最後の行(a=5)の後の閉じ括弧を忘れて、前のコードブロックと同じコードを書くと、「unexpected end of program」エラーに加えて「unbalanced parentheses」エラーが発生します(下図参考)。

unexpected end of program

エラーのない正しいコード:

void OnStart()
  {
   bool a=7;
   if (a=5)
   a=5;
   }

閉じ括弧を追加してコードを修正すると、エラーなしでコンパイルされることがわかります。

Expressions are not allowed on a global scopeエラー:

このエラーは、複合演算子の左括弧を外したときや、特定の関数の範囲外の文や式を書いたときに発生します。関数のスコープ内の式のみを使用する必要があるためです。次の例はこのタイプのエラーです。

エラーで間違ったコード:

   int a=(7+5);
   if (a<7)
   
   a=7;
   }

前のコードには、スコープを変更する(})オープニングがないため、「Expressions are not allowed on a global scope」というエラーが報告されました。以下は[エラー]タブに表示されるエラーです。

Expressions are not allowed on a global scope


エラーのない正しいコード:

   int a=(7+5);
   if (a<7)
   {
   a=7;
   }

前のブロックと同じようにコードを修正した後、エラーなしでコンパイルされたことがわかるでしょう。

Wrong parameters countエラー:

このタイプのコードを経験するのは、特定のパラメータを持つ特定の関数を使用していて、パラメータの指定が多すぎたり少なかったりして、パラメータを適切に指定していないときです。このエラーは、定義済みの関数や独自に作成した関数を使用した場合に発生します。以下はこのエラーの例です。

エラーで間違ったコード:

2つの整数値の和の結果を整数値で返すmyVal関数を作ったとしたら、この関数には2つのパラメータがあることになります。そのため、以下のコードのようにこの2つのパラメータとは異なるパラメータを使用してこの関数を呼び出すと、エラーが発生します。

void OnStart()
  {
   int example=myVal(10);
  }
//+------------------------------------------------------------------+
int myVal(int a, int b)
  {
   return a+b;
  }

前のコードをコンパイルすると、次のようなエラーが出ます。

Wrong parameters count

エラーなしのコード:

このコードを正しく書くには、この作成された関数の指定されたパラメータを次のように使用する必要があります。

void OnStart()
  {
   int example=myVal(10,20);
  }
//+------------------------------------------------------------------+
int myVal(int a, int b)
  {
   return a+b;
  }

この正しいコードをコンパイルすれば、エラーは見つからないでしょう。

Some operator expectedエラー:

このタイプのエラーは、操作子が完全になかったり、特定の場所に配置し忘れたりすることで起こります。以下はこのタイプのエラーの例です。

エラーで間違ったコード:

int a= 7 10;

前のコードでは、2つの数値の間に演算子を入れていなかったため、「some operator expected」エラーが発生します(下図参考)。

Some operator expected

エラーなしのコード:

int a= 7+10;

(+)を追加してコードを修正すると、エラーなしでコンパイルされることがわかります。

このタイプのコンパイルエラーとしては、前述のエラーが最も一般的なものですが、前述したようにコンパイル警告もあり、それらが何であるかを学ぶ必要があります。コンパイル警告は情報目的で示されており、エラーではありません。以下は、[エラー]タブで警告が表示されるコード例です。

int a;

前のコードをコンパイルすると、変数aが使用されていないという警告が表示されます。新しい変数aを宣言したが、その変数を使用しておらず、値も代入していないからです。以下は警告の図です。

警告

MQL5については、以下のリンクからドキュメントを確認できます。

このようなエラーが発生した場合に対処するために、非常に便利で役立つヒントがあります。

  • このエラーの原因に基づいてすべてのエラーを解決できる可能性があるため、エラーの最初から修正します。
  • ツールボックスの[エラー]タブでエラー行をダブルクリックすると、問題のあるコード行が表示されます。

これで、MQL5プログラムのコードを書く最初の段階で起こりうるエラーについて学びました。第2段階は、プログラム実行時に発生するエラー、ランタイムエラーです。

ランタイムエラー:

前述したように、ランタイムエラーとはMQL5プログラムの実行中に発生するエラーのことです。これらのエラーがあると、コードはエラーなしにコンパイルされますが、必要としたり期待したりするように実行されたり動作したりしなくなります。このようなエラーは、エラーの理由とソースコードのエラーのある行が印刷されたメッセージとしてログに記録されます。

これらのエラーの例:

エラーコード エラーの理由
4007
  配列の再配置に十分なメモリがない、または静的配列のサイズを変更しようとした
4101   誤ったチャートID
4301   市場情報としての不明銘柄
4754   注文が見つからない
5120   内部データベースエラー

お気づきかもしれませんが、MQL5ではすべてのランタイムエラーを識別しやすいようにコードで定義しているため、エラーコードが存在します。プログラムにエラー処理メソッドを追加する際にGetLastError()関数を使用すると、これらのコードを見つけることができます。これらのエラーレポートは[操作ログ]タブで確認できます。 テスト中に [エキスパート]タブをクリックするか、現在実行されるチャートにプログラムを接続している間に[エキスパート]タブをクリックすると、次のリンクからMQL5ドキュメントのすべてのコードですべてのランタイムエラーを確認できます。

https://www.mql5.com/ja/docs/constants/errorswarnings/errorcodes

ここで、例えば配列の範囲外エラーなど、実行を終了させるような重大なエラーを除いては、ランタイムエラーの後にプログラムが実行を終了することはない、ということを述べておく必要があります。

取引サーバーのエラー:

これらのタイプのエラーは、OrderSend()関数を使用した取引リクエストの構造体(MqlTradeRequest)として、取引の実行段階で発生します。また、これらのエラーは、テスト中に[操作ログ]タブで、または現在の時間に実行されるチャートにプログラムを接続しているときに[エキスパート]タブで報告されます。これらのエラーの例については、以下をご覧ください。

エラーコード
エラーの理由
10006
  リクエスト却下
10032
  操作はライブ口座でのみ可能
10033
  未決注文数が上限に達した
10034
  銘柄の注文とポジションの量が上限に達した
10041
  注文の有効化要求が拒否され、注文がキャンセルされる

このタイプのエラーのすべてのコードについては、以下のリンクからMQL5のドキュメントを参照してください。

https://www.mql5.com/ja/docs/constants/errorswarnings/enum_trade_return_codes

デバッグ

このトピックでは、MQL5デバッガツールを使用したデバッグ方法について説明します。デバッガツールを使用すると、作成したプログラムを履歴データやライブデータで実行することができます。これをおこなうには、ツールボックスのデバッガボタンで実際のデータまたは履歴データに対するデバッグの開始/再開をクリックします(下図参考)。。

デバッガボタン

1:履歴データのデバッグ開始/再開

2:実データのデバッグ開始/再開

3:デバッグの一時停止

4:デバッグの停止

履歴データでデバッグするために開始ボタンを押すと、履歴データでプログラムをデバッグするためのチャートが開かれ、プログラムが履歴データで実行されることがわかります。また、実データでのデバッグを選択した場合は、プログラムが接続され、実データのチャートが表示され、プログラムの横に[Debugging]が表示されます。

ストラテジーテスター

この部分では、MetaTrader 5の最も重要で価値あるツール、ストラテジーテスターについて学びます。ストラテジーテスターは、複数通貨のテストなど、MetaTrader 4のテスターよりも優れた新機能を備えています。このストラテジーテスターは以下のいずれかの方法で使用できます。

1. MetaTrader 5取引ターミナルを開き、キーボードからCtrl+Rを押す

2. 表示メニューからストラテジーテスターを選択する

テスター

その後、必要なものやテストのタイプを選択するために、[概要]タブでストラテジーテスターを見つけます(下図参照)。

テスター1

単純に、[概要]タブでテストする内容を選択し、それを実行すると、タブが[設定]タブに変わり、テストする内容に基づいてあらかじめ定義された設定が表示されます。

  • シグナル:視覚化モードなしでエキスパートアドバイザー(EA)でシグナルをテスト
  • 指標:指標をテスト
  • 視覚化:チャート上のテスト中に視覚化モードでテストをおこない、プログラムがその指示に基づいてデータにどのように反応するかを確認
  • ストレスと遅延:その名前からも明らかなように、ストレスと遅延をテスト
  • 最適化オプション(Complete、Genetic、Forward)
  • 市場スキャナー:市場のスキャニングをテスト
  • 数学の計算:数学の計算もテスト

また、最後の[以前の結果を表示]オプションで、以前のテスト結果を見ることもできます。また、テストオプションの下にある検索から、過去の特定のテストを検索することもできます。

[設定]タブに移動すると、以下のようになります。

テスター2

  •   1. エキスパート:テストするプログラムファイルを選択
  •   2. IDE:選択したプログラムのソースコードを開く
  •   3. 特定の設定を保存または読み込み
  •   4. 銘柄:テストする銘柄を選択
  •   5. 選択した銘柄をテストする時間枠を選択
  •   6. 選択した銘柄の仕様
  •   7. 日付:テストする期間を選択
  •   8. テスト開始期間を選択
  •   9. テスト終了期間を選択
  •  10. フォワード:最適化期間のうち、フォワードテストに必要な割合を選択
  •  11. フォワードテスト開始日を選択
  •  12. 遅延
  •  13. 実際のデータと実際の実行に近づけようとする
  •  13/2. モデリング:テストに必要なモデルを選択(ティックなど)
  •  14. ピップ単位の利益が必要ならばオンにする
  •  15. テストを開始するために必要な預金額を選択
  •  16. 預金通貨を選択
  •  17. レバレッジを選択
  •  18. 最適化をおこなうかどうかを選択(後述)
  •  19. テスト中に取引や約定を視覚化する必要がある場合はオン


また、テストされたプログラムにユーザーが挿入または編集できる入力があるかどうかをチェックするために、[入力]タブも用意されています。

設定を決定して[開始]ボタンを押すと、プログラムがテストされます。視覚化テストの場合は、チャートが表示されるのでテスト実行を監視することができます。また、このチャートの、プログラムが約定した場合に約定した取引を見るための[取引]タブ、決済またはキャンセルされた注文を監視するための[履歴]、すべての操作を見るための[操作]タブ、プログラムが出力したメッセージなどをチェックするための[操作ログ]タブを通しても監視することができます。また、ストラテジーテスターウィンドウの[グラフ]タブで、プログラムのパフォーマンスを監視することもできます。

テスト終了後、[バックテスト]タブが表示され、以下の例のように、すべてのテスト統計と洞察が表示されます。

テスター3

テスター4

テストされているプログラムによって、この[バックテスト]タブのデータは、前の例とは異なる場合があります。

ここでもう1つ言及する必要があるのは、テストプロセスで非常に重要である最適化です。これには、さまざまなパラメータと入力を幅広く選択し、これらの入力またはパラメータのあらゆる組み合わせをチェックしてどのパラメータをチェックして、どちらが最高の結果を生み出すかをテストすることが含まれます。ここでは、「概要」タブから最適化モデルを1つ選択し、以下の写真と同じように最適化の適切な設定を選択します。

テスター5

テスター6

テスト後に確認し、評価する必要のある最も重要な要素は、次の通りです。

  • 純利益:売上総利益から売上総損失を差し引くことで算出
  • ドローダウン:取引中に口座が経験する最大損失
  • 利益率:売上総利益と売上総損失の比率
  • 例外的ペイオフ:取引の平均的利益または損失
  • リカバリーファクター:テストされた戦略が損失を経験した後、どの程度回復するかを測定  


結論

MQL5プログラムを開発する際にマスターする必要がある、最も重要で貴重なツールの1つである、MetaTrader 5取引ターミナルのストラテジーテスターによるテストプロセスについて、いくつかの重要なトピックを学び、このツールを理解し効果的に使用するのに役立つ関連トピックを学びました。MQL5プログラムを開発する際に直面するエラーについて、そのタイプごとに学びました。

  • コンパイルエラーと警告
  • ランタイムエラー
  • 取引サーバーのエラー

そして、MQL5 IDEのデバッガの使い方を学び、デバッグについて学びました。また、MetaTrader 5のストラテジーテスターの使い方を学び、その様々なモデル、モデルに基づいてテストの設定をおこなうこと、MQL5プログラムをテストする際に異なるタブでのレポート内容を通してテストプロセスを監視すること、テスト後にテストのレポートを読み、確認し評価する必要がある最も重要な要素を特定すること、テストを通してMQL5プログラムから最良の結果を得るためにストラテジーを最適化する方法を学びました。

この記事とその情報が、効果的なテストとMQL5プログラムの作成を通して、読者の結果向上に役立つことを願っています。この記事がお役に立ち、私の記事を他にもご覧になりたい場合、最も人気のあるテクニカル指標に基づいて取引システムを作成する方法などを共有しているので確認なさってみてください。

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/12635

ニューラルネットワークが簡単に(第37回):スパースアテンション(Sparse Attention) ニューラルネットワークが簡単に(第37回):スパースアテンション(Sparse Attention)
前回は、アテンションメカニズムをアーキテクチャーに用いたリレーショナルモデルについて説明しました。これらのモデルの特徴の1つは、コンピューティングリソースを集中的に利用することです。今回は、セルフアテンションブロック内部の演算回数を減らす仕組みの1つについて考えてみたいと思います。これにより、モデルの一般的なパフォーマンスが向上します。
リプレイシステムの開発—市場シミュレーション(第6回):最初の改善(I) リプレイシステムの開発—市場シミュレーション(第6回):最初の改善(I)
この記事では、システム全体の安定化を開始します。安定化がなければ次のステップに進むことができない可能性があります。
RSIディープスリームーブ取引手法 RSIディープスリームーブ取引手法
MetaTrader 5でRSIディープスリームーブ取引テクニックを紹介します。この記事は、株式、通貨、商品などの証券の強さと勢いを測定するために使用されるテクニカル分析指標であるRSIに基づくいくつかの取引テクニックを紹介する新しい一連の研究に基づいています。
リプレイシステムの開発—市場シミュレーション(第5回):プレビューの追加 リプレイシステムの開発—市場シミュレーション(第5回):プレビューの追加
現実的で利用しやすい方法で市場リプレイシステムを実装する方法を開発することができたので、プロジェクトを続けて、リプレイの動作を改善するためのデータを追加してみましょう。