English Русский Español Português
preview
市場シミュレーション(第20回):SQL入門(III)

市場シミュレーション(第20回):SQL入門(III)

MetaTrader 5テスター |
19 0
Daniel Jose
Daniel Jose

はじめに

レプレイ/シミュレーションシステム構築シリーズの新しい記事へようこそ。

今回の記事では、かなり複雑なテーマを扱い始めます。しかし、これから説明する内容を理解できれば、皆さんのキャリアを大きく前進させることができるでしょう。簡単な作業ではありませんが、できる限り分かりやすく説明していきます。


スクリプトの準備

前回の「市場シミュレーション(第19回):SQL入門(II)」では、スクリプトを使用してデータベースにレコードを追加、変更、さらには削除する方法について説明しました。しかし、これから説明を進めていくためには、シンプルなデータベース構成を用意する必要があります。そうすることで、これから説明する内容を本当に理解できるようになります。

約10件のレコードを含むデータベースでも作業することは可能ですが、15,000件を超えるレコードを含むファイルを使用したほうが理解しやすくなります。つまり、そのようなデータベースを手作業で作成しようとすると、膨大な作業になってしまうということです。しかし、教育目的で利用可能な、そのようなデータベースをダウンロードできる場所を見つけるのは簡単ではありません。ですが、その必要はありません。MetaTrader 5を使えば生成できるからです。完璧ではないかもしれませんが、少なくとも大量のレコードを含むため、今回必要としている条件は満たしています。

MetaTrader 5をどのように利用してデータベースを作成し、このテーマを学習していくのかを理解するために、少しだけ過去にさかのぼる必要があります。

Excelをデータベースとして使用している個人や小規模な組織があります。信じられないと思う方もいるかもしれませんし、そのような使われ方に気づいていない方もいるかもしれません。そして、それはExcelだけではありません。同じように利用されている他のプログラムもあります。ただし、ここではExcelに限定して話を進めます。Excelをデータベースとして利用すると、設定リボンに追加のタブが表示されます。以下の画像がその例です。

このタブを表示させるためには、いくつかの作業を行う必要があります。その中でも、おそらく最も簡単な方法は、特定の形式または構造を持つファイルを開くことです。これは以下の画像に示した場所から実行します。

ここで示しているのは方法の一つに過ぎず、唯一の方法ではないことを覚えておいてください。では、ここでどのような種類のファイルを使用するのでしょうか。おそらく皆さんは、さまざまな種類のファイルを使用することになるでしょう。ここで言う「種類」とは、ファイル内部の構造のことを指しています。しかし、内容を簡潔にし、理解しやすくするために、ここでMetaTrader 5に戻りましょう。以下の画像をご覧ください。

ここでは、特定の銘柄について、ある1日に取引されたすべてのティックデータを取得するためのリクエストを取引サーバーに送信しています。上の画像に表示されているものは、まさにデータベースから得られる情報の集合です。しかし、このウィンドウでは、専用プログラムを使用する場合のようにデータを操作することはできません。それでも、この情報をファイルとしてエクスポートすることは可能です。形式はCSVにできます。

このファイルをローカルディスクに保存した後、データベースファイルを扱えるプログラムで利用できます。しかし、ここで重要なのは、ファイルの内容を処理し、それをデータテーブルとして解釈し始める前に、そのファイルをデータベースへ変換する必要があるということです。これが、このプロセスの本当の「魔法」です。そして、まさに私たちが実現したいのは、これなのです。


WorkBenchの外での最初の接触

その後、上の画像に示されている情報をファイルとして保存したあとで、まずExcelに読み込むことができます。すると、Excelは皆さんが想像しているような方法では、そのファイルを処理しなくなります。実際には、Excelはそのファイルをデータベースに相当するものへ変換します。その結果、Excelのインターフェースは変化し、次のようになります。

さて、ここでSQLコマンドを使用しているかのように作業できると思うかもしれません。しかし実際には、Excelや、データベースへのある程度のアクセス機能を提供する他のプログラムを使用した場合でも、完全にそうなるわけではありません。確かに、ここでは多くのことを実行できます。しかし、その体験は純粋なSQLを使用する場合とは大きく異なります。ですので、ここではExcelのことはいったん忘れて、別の方向へ進むことにしましょう。これから説明するコマンドを理解するためには、そのほうが必要なのです。


MetaEditorを使用してデータベースを探索する

おそらく皆さんは、大きな問題があると思っているでしょう。というのも、多くの場合、MetaTrader 5によってダウンロードされ、CSV形式で保存されたファイルは数メガバイトのサイズになるからです。そして、そのようなものを適切な形式へ変換し(つまり、ダウンロードしたデータにSQLクエリを使用できるようにし)、扱えるようにすることは、優れたコンピュータの専門家だけが解決できる非常に難しい作業に思えるかもしれません。しかし実際には、自分の手元にあるツールを理解していなければ、たとえ解決策が目の前にあったとしても、常に問題を抱えることになります。

そこで、MetaTrader 5によってダウンロードされたすべてのデータを、プログラミングを使わずに、より扱いやすい形式へ変換する最も簡単な方法がMetaEditorを使うことです。これにより、ダウンロードしたCSVファイルを実際のデータベースファイルへ変換できます。しかし、どうやっておこなうのでしょうか。MetaTrader 5が保存したCSVファイルを、MetaEditorを使ってデータベースファイルへ変換するにはどうすればよいのでしょうか?これは非常に難しそうに思えるかもしれません。しかし、そんなことはありません。重要なのは、自分がどのようなツールを手にしているかを理解することなのです。

まず、次のことを行いましょう。完全に空の新しいデータベースを作成します。MetaEditorを使用してこれをおこなう方法については、すでに説明しました。このデータベースファイルを作成したあと、次の手順を実行します。

まず、以下の画像に示されているオプションを選択します。

このオプションを使用すると、テーブルをデータベースへインポートできます。テーブルとはレコードの集合であることを思い出してください。CSVファイルもまたレコードの集合なので、テーブルとしてインポートするわけです。必要なオプションを選択すると、MetaEditorが最終的なテーブルを作成するために、データインポート設定を構成するウィンドウが開きます。そのウィンドウは以下の画像のようになります。

できるだけ簡単にするために、CSVファイルはMQL5ディレクトリ内に配置しました。しかし最終的に重要なのは、正しいファイルを選択することです。ただし、上の画像のように単にファイルを選択して、すぐに[OPEN]ボタンをクリックしても、MetaEditorは何の反応も表示しません。これは、まだファイルをインポートしておらず、単に選択しただけだからです。同じウィンドウ内で、追加の設定を構成する必要があります。これらの設定はケースによって異なり、厳密なルールはありません。

少なくとも、インポートするファイルにどのような内容が含まれているかについて、大まかな理解を持っている必要があります。MetaEditorを開き、データのインポートを要求して、ソフトウェア側がファイル内容を自動的に理解してくれることを期待しても無意味です。そのようには動作しません。したがって、まず設定しなければならないのはデータ区切り文字です。このデータはMetaTrader 5によって生成されたことを思い出してください。もしファイル形式を変更していない場合、使用されている区切り文字はタブ文字です。この設定を変更すると、以下の画像のようになります。

これが最初に設定すべき項目です。次に、もう一つ考慮すべき点があります。ファイルをダウンロードしたばかりで、それをMetaEditorにインポートしている状況だからです。それは、使用するテーブル名に関するものです。この段階で、多くの人が混乱するかもしれません。なぜなら、MetaEditor内にはまだデータベースに含まれるテーブルが存在していないからです。実際、上の画像でも、ファイルインポート要求時点ではテーブルが指定されていないことが分かります。

では、テーブル名として何を入力すればよいのでしょうか。単純に、これから作成されるテーブルに付ける名前を指定すればよいのです。そのため、完全に空のファイルを使用することを推奨しました。そうすることで、このステップを理解しやすくなります。次に、以下の画像のようにテーブル名を入力します。

名前は自由に付けることができます。その後、[OPEN]ボタンをクリックできるようになります。インポートするファイルの内容によっては、ここで追加設定が必要になる場合もあることを覚えておいてください。しかし、今回はMetaTrader 5からダウンロードしたファイルをMetaEditorにインポートしているだけなので、ここまでの設定で十分です。

[OPEN]をクリックしたら、Excelで同じファイルを使用したときに見たものは完全に忘れてください。ここでのすべては、これまでデータベースに関する記事を読む前に見ていたものとは大きく異なります。そのため、MetaEditorの画面を見ると、最初に次の画像が表示されます。

完璧です。これが表示されれば、MetaEditorがCSVファイルをMT5_Tutor.dbという名前のデータベース内のテーブルへ変換したことを意味します。おそらく、この時点では完全に混乱して、何が起こったのか分からないかもしれません。しかし、これは重要な概念なので、整理して説明しましょう。

MetaTrader 5によってダウンロードされたすべての情報(つまり、特定の日付の特定銘柄についてサーバーへ要求したデータ)は、もはや単なる無秩序なデータの集まりではありません。すべてが構造化され、テーブル形式で表現されているのです。このテーブルには、CSVファイルと同じヘッダーが含まれています。したがって、データベース内の列名を別の名前にしたい場合は、CSVからデータをインポートする前に、1行目を編集するだけで、新しい名前を列へ割り当てることができます。

ただし、自分が何をしているのか本当に理解している場合にのみおこなってください。ミスをすると、完全に使い物にならないデータベースになる可能性があります。現在の名前が気に入らなくても、後でSQLコマンドを使って変更できます。なぜなら、今扱っているのはCSVファイルではなく、データベースだからです。

「いいですが、このデータベース内の情報にはどうやってアクセスするのでしょうか。Excelや他のスプレッドシートプログラムのようなものを想像していました。しかし、MetaEditorに表示されているものは完全に役に立たず、私には価値がありません。」

もしそう思うのであれば、それはまだデータベースがどれほど強力なものかを理解しておらず、データベースを扱うには学習と努力が必要であることを実感していないからかもしれません。もちろん、皆さんを侮辱したり落胆させたりするつもりはありません。上の画像を見て、多くの人が、もっと視覚的に印象的で直感的なものを期待して失望するかもしれないことは理解しています。その観点から見れば、SQLを学ぶ努力は無意味で、価値がないように思えるかもしれません。

ですが、ここで少しだけ皆さんの視点を変えてみたいと思います。これから、学習するうえで間違いなく最も大きな努力を必要とするコマンドの一つを見ていきます。概念を明確に分けるために、新しいトピックへ進みましょう。


ついにSELECTコマンドへ

SELECTコマンドは、最も単純な形では次のような構文になります。

SELECT * FROM table;

これは、以下のアニメーションで使用されているコマンドとまったく同じであることに注意してください。

では、SELECTコマンドはどのように解釈すればよいのでしょうか。実は非常に単純です。そして、これはこのコマンドだけに限りません。SQLコマンドは、その構文が理解しやすくなるように慎重に設計されています。今述べたことを理解するために、先ほどのコマンドをどのように読むべきか見てみましょう。

このコマンドは、「tableという名前のテーブルから、すべてのデータを選択する」と読むべきです。これが、このコマンドを文字通り解釈したものです。もし本当にそのように読めるのであれば、すでにかなり興味深いことができると気づいているはずです。これは単なる文字通りの読み方の例ですが、他のSQLコマンドでも同じことを試してみてください。各コマンドは理解しやすいため、学習が非常に速く進むことにすぐ気づくでしょう。

では、今私たちにとって重要な点に戻りましょう。アニメーションの結果を見ると、非常に多くのレコードが返されています。まさに私たちが望んでいたものです。というのも、レコード数がほんのわずかなテーブルに対してSELECTコマンドを使用した場合、SQLには意味がないと思ってしまうかもしれないからです。しかし、レコード数が大きくなると、SQLを学ぶ価値ははるかに大きくなります。

では、ここで本当に直面している問題は何でしょうか。問題は、返されるデータの量です。しかし、SELECTコマンドを文字通りに読む方法を理解していれば、すでに何らかのフィルターを適用してデータ量を減らす方法を考え始めているかもしれません。もしその考えが頭をよぎったのであれば、それは非常によい兆候です。特に、アスタリスク(*)を別のものへ置き換えることを考えたのであれば、なおさらです。アスタリスクは汎用的な記号だからです。コマンドラインを使ったことがある人なら、その意味は分かるでしょう。もしそのような方向で考えていたのであれば、皆さんは正しい道を進んでいます――あとは少しガイドを受けて、考え方を洗練させるだけです。

では、少し考えてみましょう。「コマンド内のアスタリスクを別のものへ置き換えたとしたら、SQLが返す結果をフィルタリングできるのだろうか。」これは、SQLが開発されていた当時、設計者たち自身が答えなければならなかった問題でもあります。少し考えてみてください。大量のデータと多数の列を扱う場合、皆さんならどのようにフィルタリングを実現しますか。

設計者や開発者たちがこの問題をどれほど見事に解決したかを説明する前に、ここMetaEditor内に存在するもう一つの詳細へ注意を向けたいと思います。この詳細は後で重要になるかもしれません。下の画像をご覧ください。

画像内の一部分を強調表示していることに注目してください。その理由は、強調表示された領域の右端を見ると、ある数のレコードがロードされていることに気づくからです。場合によっては、より洗練されたフィルタリングを適用した際に取得されたデータを確認するために、これらのレコード間を移動する必要があります。強調表示された領域内の矢印をクリックすると、ロード済みレコードの次のブロックへ移動できます。なお、ブロックは1000件単位でロードされることを覚えておいてください。

つまり、強調表示された領域に表示されている値は、1000件単位のブロックを表しています。したがって、8000件目のブロックへ移動したい場合は、値を1から9へ変更するだけで、8000件に対応するブロックがMetaEditorに表示されます。しかし、なぜ9なのでしょうか。8ではないのでしょうか。カウントが1から始まるためです。ただし、「1」という値は「1000件までのレコード」を表しています。最初は少し混乱するかもしれませんが、少し慣れれば理解できるようになります。

MetaEditorのインターフェースを実際に操作して、どのように動作するのかを理解してみてください。私の考えでは、これはWorkBenchよりもはるかにシンプルです。それでも、特にデータベースを探索している段階では、より強力なWorkBenchを使用しなくても、かなり多くのことができます。

さて、検索結果のフィルタリングについての話へ戻りましょう。皆さんは今でも、簡単な解決策をどのように実装するか考えているかもしれません。私の意見では、設計者たちが作り出した解決策は、考え得る中で最良のものの一つです。アスタリスクは別のものへ置き換えることができます。それについてはまた別の機会に説明します。しかし、フィルタリングのために、開発者たちはSELECTコマンドへもう一つの要素を追加しました。ただし、小さな工夫があります。何を探したいのか、そしてどのように探すのかによって、SELECTコマンドの構文は少し変化します。

まず理解しなければならないのは、クエリ内で列名をどのように使用するかです。これは少し奇妙に感じるかもしれません。しかし、もしExcelで結果をフィルタリングした経験があるなら、列を選択し、その後「ある値より大きい」「小さい」「等しい」などの条件を指定してフィルタリングすることを知っているでしょう。SQLでも同じ考え方を使用します。違いは、ここではメニューをクリックするのではなく、SQLに対して実行するコマンドを送るという点です。したがって、フィルタリングは正しく実行されます。

たとえば、SQLでFLAGS列の値が88に等しいすべてのレコードを表示したいとします。その場合、SELECTコマンド内には次のようなものが必要だと分かります。

FLAGS = 88

これは明白に見えますが、コマンドにはもう一つ小さな詳細を追加する必要があります。すると、先ほどのコマンドは次のようになります。

SELECT * FROM tb_Quotes WHERE "<FLAGS>" = 88;

テーブル名がtb_Quotesであることを思い出してください。このコマンドを実行すると、FLAGS列が88に等しいすべてのレコードが結果エリアに表示されます。ここでは列名をSQL側で識別子として明示するために引用符付きで表記しています。SQLで文字列を使用する場合は、必ず引用符で囲む必要があります。さらに、列名の両側に「大なり」「小なり」の記号が付いていることにも注意してください。引用符がなければ、SQLはこれらの記号を自身の内部構文の一部として解釈してしまう可能性があります。

ここで皆さんはこう思うかもしれません。「なぜSQLでこんなことをする必要があるのだろう。Excelや似たようなプログラムを使えば、もっと簡単に同じ結果を得られるのに。SQLを学ぶ意味が分からない。」確かに、今示したことはExcelでも実現できます。そして、もっと簡単にできるでしょう。しかし、皆さんは一つ重要なことを見落としています。今はまだ、SQLがどのように動作するのかを理解し始めたばかりなのです。これらの初歩的な作業の多くは、確かにより単純なツールでも実行できます。

しかし、実際のデータベースを扱う場合、関連テーブルやリンクされたクエリを使用することがよくあります。これらは、Excelや類似ツールでは効率的に扱えません。不可能ではないかもしれません。しかし、SQLを使う場合と比べて、はるかに複雑で、時間がかかり、コストも高くなるでしょう。

また、多くの経験豊富なプログラマーが、特定の機能を自分で実装しようとせず、代わりにSQLや類似技術を使うことを選ぶ理由もここにあります。ここで何が議論されているのかを理解するためには、SQLに関する最初の記事へ戻る必要があります。以前にも述べたように、すべてをゼロから構築するよりも、既存のツールを利用したほうが良い場合が多いのです。ですので、この段階、つまり、データベース内でレコードの作成、挿入、更新、削除、表示を行う方法をすでに理解した段階では、最初の記事で議論した内容をもう少し深く掘り下げることができます。

これまで学んできたことを考えてみてください。もしPythonのようなプログラミング言語を使用して同じ結果を実現しようとした場合、必要なロジックを作成し、テストし、開発するために、はるかに多くの時間が必要になります。なぜなら、SQLを使う代わりに、同じことをPythonで実現しようとしているからです。もちろん、出来ないと言っているわけではありません。ただ、これまで見てきたことを実現するためのサブルーチンを作成し、テストし、開発するには、はるかに多くの時間が必要になるということです。

そして忘れないでください。ここではまだSQLのごく基本的な部分しか扱っていません。たとえPythonに精通した優秀なプログラマーであっても、SQLがすでに効率的に実現していることと同等のものを構築するには、数日あるいは数週間かかるでしょう。この話題については、また後で戻ってきます。なぜなら、皆さんに車輪の再発明をするような無駄な時間を使ってほしくないからです。SQLの基本を学ぶだけでも、特に、それを正しく使う方法を学べば、SQLがすでに提供している機能をわざわざ作り直す意味がないことが分かるでしょう。


最後に

これまでのところ、SQLの重要な側面の一つについては、まだ実演していません。以前の記事でも触れましたが、データベースというテーマがなぜこれほど広大なのかについては、まだ十分に掘り下げていません。しかし、情報を検索するための基本コマンドを紹介したことで、SQLが優れたプロフェッショナルになるために不可欠である理由となる概念へ、さらに深く踏み込めるようになります。次回の記事では、SQLプログラミングについてもう少し詳しく説明します。というのも、まだ学習および説明されていない概念が一つ残っているからです。

その概念とは、主キーと外部キーです。これは、関連テーブルのシステムを構築する際に非常に重要になります。関連テーブルを利用する能力は極めて重要です。主な理由は、データベース検索において非常に役立つからですが、それだけではありません。関連テーブルによって、そうでなければ不可能だったことを実現したり、新しい仕組みを構築したりできるようになります。ですので、もし皆さんが本当にデータベースというテーマに興味を持っているのであれば、次回の記事を見逃さないでください。内容は少し本格的になっていきます。

ファイル 説明
Experts\Expert Advisor.mq5
Chart TradeとEA間の相互作用をデモンストレーションする(相互作用にはMouse Studyが必要)
Indicators\Chart Trade.mq5 送信する注文を設定するウィンドウを作成する(Mouse Studyが必要)
Indicators\Market Replay.mq5 リプレイ/シミュレーションサービスと対話するためのコントロールを作成する(Mouse Studyが必要)
Indicators\Mouse Study.mq5 グラフィカルコントロールとユーザー間のインタラクションを提供する(リプレイ/シミュレーションシステムと実市場での運用の両方に必要)
Services\Market Replay.mq5 市場リプレイ/シミュレーションサービス(システム全体のメインファイル)を作成および維持する
Code VS C++\Servidor.cpp C++で開発されたサーバーソケット(ミニチャット版)を作成および維持する
Code in Python\Server.py MetaTrader 5とExcel間の通信用のPythonソケットを作成および維持する
Indicators\Mini Chat.mq5 インジケーターを介してミニチャットを実装する(動作にはサーバーが必要)
Experts\Mini Chat.mq5 EAを介してミニチャットを実装する(動作にはサーバーが必要)
Scripts\SQLite.mq5 MQL5でSQLスクリプトを使用する方法を示す
Files\Script 01.sql 外部キーを持つシンプルなテーブルの作成方法を示す
Files\Script 02.sql テーブルに値を追加する方法を示す

MetaQuotes Ltdによりポルトガル語から翻訳されました。
元の記事: https://www.mql5.com/pt/articles/12928

添付されたファイル |
Anexo.zip (571.71 KB)
価格変動:数理モデルとテクニカル分析 価格変動:数理モデルとテクニカル分析
為替通貨ペアの価格変動を予測することは、トレーディング成功における重要な要素です。本記事では、さまざまな価格変動モデルを検討し、それぞれの利点と欠点を分析するとともに、実際のトレード戦略への応用可能性を探ります。また、隠れたパターンを特定し、予測精度を向上させるためのアプローチについても考察します。
初級から中級まで:継承 初級から中級まで:継承
間違いなく、本記事の内容を理解し、それがどのように、そしてなぜ機能するのかを把握するためには、かなりの時間を要するでしょう。というのも、ここで示されている内容はすべて、一見するとオブジェクト指向的に見えますが、実際には構造化プログラミングの原理に基づいているためです。
マルコフ連鎖に基づく行列予測モデル マルコフ連鎖に基づく行列予測モデル
マルコフ連鎖に基づいた行列予測モデルを作成します。マルコフ連鎖とは何でしょうか。また、マルコフ連鎖を外国為替取引にどのように活用できるのでしょうか。
MQL5における取引へのコンピュータビジョンの統合(第2回):アーキテクチャを2D RGB画像解析に拡張する MQL5における取引へのコンピュータビジョンの統合(第2回):アーキテクチャを2D RGB画像解析に拡張する
取引におけるコンピュータビジョン:仕組みと開発手順本記事では、RGB画像として価格チャートを認識するアルゴリズムを構築し、アテンション機構と双方向LSTM層を用いる方法について説明します。結果として、EURUSDの価格を予測する動作モデルを構築し、検証セクションにおいて最大55%の正解率を得ます。