English Русский 中文 Español Deutsch Português
preview
MQL5:あなたもこの言語の達人になれます

MQL5:あなたもこの言語の達人になれます

MetaTrader 5インタビュー | 28 7月 2023, 10:30
365 0
Daniel Jose
Daniel Jose

はじめに

今回は、これまでの記事とは違うことをしようと思います。基本的に、この資料はMQL5や一般的なプログラミングの知識がほとんどない人向けです。そこで今回は、MQL5をゼロから学び、プロフェッショナルになるための方法を、私自身へのインタビューのような形で少し解説していこうと思います。


ストーリーを少し

MQL5コミュニティに記事を書き始めてから、たくさんのフィードバックをいただきました。MQL5でどのようにプログラミングを学び、記事で説明したようなことができるようになったのかと、多くの方に尋ねられました。これらのほとんどは、プログラミングの第一歩を踏み出すための基本的なガイドを探している愛好家の方だったので、この記事は、MQL5プログラミングを学ぼうとしている愛好家や初心者の皆さんに捧げます。

この話題を進める前に、言っておかなければならないことがあります。この資料の目的は、やる気を失わせることではなく、逆にやる気をさらに高めることだということです。

私には長年のMQL5プログラミングの経験があるに違いないと思われるかもしれませんが、この記事を書いている時点で、MQL5言語を使い始めてまだ1年半しか経っていません。そう、MQL5プログラマーとしての経験は2年足らずです。MQL5のプログラミング経験がほとんどない人がなぜ、記事で紹介されているようなことをMetaTrader 5でできるのかと不思議に思われるかもしれません。

その理由は、MQL5プログラミング言語の開発者が、この言語を多くの面でC/C++のように見せるという素晴らしいアイデアを持っていたということです。そのため、C/C++の経験が豊富なプログラマーであれば、MQL5を習得するのは非常に簡単です。

なぜこんなことを言うのかというと、私は2000年代初頭からプロのC/C++プログラマーとして、つまり23年以上もC/C++でプログラミングをしてきたからです。MetaTrader 5で何かをするために新しい言語を学ばなければならないとしたら、おそらく最終的にあきらめたとおもいます。

多くの方は、優れたプログラマーになるにはいくつかのコースを受講する必要があると考えますが、本当にプログラミングを学ぶためには、間違いを恐れてはいけません。コードやアイデアに執着してはいけません。常に実験し、新しいことに挑戦することに目を向けるべきです。

多くの初心者は同じことを同じようにやりたがるものなので、これは少し奇妙に聞こえるかもしれませんが、偉大なプログラマーになりたいと願う人は、同じことをするにも常にさまざまな方法を探しています。また、プログラマーは常に他者から刺激を受けるということを、多くの人は理解していません。経験豊富なプログラマーが開発したソースコードを少しずつ変更し、実験し、結果を観察することができるのです。そうすることで、プログラムが実際にどのように作られているかを学ぶことができます。

MQL5を学ぶには、何か勉強を始めなければならないと思っている人がいます。実際、何の予備知識もない人に学習方法を尋ねられたら、私はいつも最も簡単なことから始めることを勧めます。言い換えれば、コマンドだけでなく、構文やプログラミングロジックを本当に知るために、Cについて少し学ぶということです。C言語の基礎を理解したら、C++の勉強を始め、同時にMQL5の練習を始めます。すでにC言語の基本的な知識を持っているという単純な事実は、MQL5でプログラミングを始める際に大いに役立つでしょう。

C言語は時代遅れだと思っている方もいらっしゃるかもしれませんが、実はC言語は非常によく文書化され、広く使われている言語です。C言語の使い方を学ぶための資料はたくさんあります。C言語を深く学べと言っているのではありません。それどころか、基本的なコマンドや構文、命令を学べば、MQL5を始めるにはそれで十分です。

MQL5で進歩する開発をするためにCを学習しなければならないのは少し残念かもしれません。おそらく、努力を惜しまず、また、誰かに教えてもらえれば、MQL5から直接始めることができるでしょう。しかし、私の最初の経験や他の人たちの意見から言えるのは、この仕事はそう簡単ではないということです。ほとんどすべての良質な資料はここ、つまりMQL5コミュニティに集中しています。それ以外のインターネットでは、資料は散在しており、質が低いこともあります。C言語とC++言語に関しては、非常にわかりやすく優れた資料が大量にあります。よって、どこから始めるかはあなた次第です。


MQL5で初めてのコード

多くの方は、私がすでにC/C++でのプログラミングを知っているから、すぐにMQL5で複雑で精巧なプロジェクトを始めたのだと考えます。そうだったらよかったのですが、現実はまったく違っていました。

解決策を見出す最初の一歩を踏み出すときはいつも、自分がすでに知っていると思うことから始めることが多いです。私の場合、MQL5を使い始めたとき、手元にあったのは言語のドキュメントだけでした。他のプログラマーを支援するコミュニティがあることさえ知りませんでした。

そこで、MetaEditorに付属しているドキュメントを調べたり、ソースコードを調べたりして、実験を始めました。以下は、私が理解したことに基づいて作成した実際の最初のコードです。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. #property version   "1.00"
04. #property description "Modify special chart properties"
05. #property script_show_inputs
06. //+------------------------------------------------------------------+
07. enum eWhat  {
08.                eScaleDate  = CHART_SHOW_DATE_SCALE,   //Time scale
09.                eScalePrice = CHART_SHOW_PRICE_SCALE   //Price scale
10.             };
11. enum eOp    {
12.                eFalse,                                //Makes hidden
13.                eTrue                                  //Makes visible
14.             };
15. //+------------------------------------------------------------------+
16. input eWhat user00 = eScaleDate;                      //Graphic property
17. input eOp   user01 = eFalse;                          //What to do?
18. //+------------------------------------------------------------------+
19. void OnStart()
20. {
21.    ChartSetInteger(0, (ENUM_CHART_PROPERTY_INTEGER) user00, user01);
22. }
23. //+------------------------------------------------------------------+

最初のMQL5プログラムのソースコード

特別なことも革新的なこともありません。これは主にコードで、私がドキュメントを正しく理解し、要素がどのように定義され使用されるかを検証することが目的でした。次のビデオはコード実行の結果を示しています。


デモ映像

これは極めて基本的なことです。しかし、MetaEditorのドキュメントとソースコード以外、誰の助けも借りずに、完全に自律的な方法でこのコードを作成できたことで、他のことができることを知りました。私がしなければならなかったのは、CとC++の既存の知識をMQL5に適応させることだけでした。ここからが本当の意味での進展でした。

もしかしたら、上のシンプルなコードを見ても、何の価値も見いだせないかもしれませんが、いつものように、プログラミング言語の初心者の最初の仕事は、HELLO WORLDと呼ばれるコードを作ることです。

私にとってHELLO WORLDは簡単すぎたのでもう少し複雑なことをやってみたのですが、MQL5が実際にどのように機能するのかについてそれほど経験も理解もなかったので、まずはスクリプトを開発することから始めました。物事が実際にどのように起こるかについての経験や知識が少なかった私にとっては、はるかに簡単なことでした。

しばらくして、MQL5が実は手続き型言語ではなく、イベント型言語であることに気づき始めました。この発見で、私のプログラミングとコード解析へのアプローチが根本的に変わりました。スキルを向上させたいと思い、ここMQL5コミュニティの記事を読んだり勉強したりし始めました。そして、少なくとも私の意見では、多くの人はコードを動作させることができても、比較的基本的な方法でMQL5を学習していることに気づきました。そこで私は、MetaTrader 5プラットフォームとMQL5言語の能力をより深く探求する、より複雑なソリューションの開発と実験を始めました。

そしてある時点で、私は自分の実験結果を共有し始めることにしました。これが私の最初の記事です。コードを構築することと、それがどのように構築され設計されたかを説明することは別のことです。経験者も初心者もこれらの記事を読むことがわかっていました。

記事の形式も内容も変えて、経験の浅い人でも情報を理解できるようにしました。資料で紹介されている知識をすぐにすべて吸収できなくても、時間をかけてプログラミングのスキルを向上させれば、私が特定の記事で伝えようとしていることを正しく吸収できるようになります。

知識は共有される必要があります。価値あるもの、誰かの世界観を変えるようなもの、常に頭を下げているために多くの人が気づいていない何かに目覚める可能性のあるものを残さずに、知恵を尽くして死ぬことに栄光はありません。

まあ、コードに戻りましょう。数行のコードでさえ、1000行のコードよりはるかに多くの情報と知識を含んでいることをお見せしたいとおもいます。元々、C/C++の構文、つまりMQL5にはない情報はすべて英語ではありませんでしたが、これは単なる細部に過ぎません。この小さなコードを見て、どのように機能するか、そして主に、なぜうまくいくのかを理解しましょう。


コードの分析

2行目から4行目はコードから削除できます。実際、これらはMetaTrader 5でユーザーにコードの目的を知らせるためだけに機能しています。ユーザーであるあなたは、学習コードからこれらの行を削除できます。

5行目は非常に重要です。この行がないと、MetaTrader 5は、スクリプトが何らかの入力構造(この場合は16行目と17行目に示されている「inputs」)によってユーザーによってカスタマイズできることを理解できないからです。もうすぐ説明します。

さて、ここで多くの人が理解できないことが出てきます。特に、MQL5しか勉強していなかったり、C/C++とは全く異なる他の言語から来た場合はなおさらです。7行目と11行目にある列挙のことです。

このような構文を見ると、混乱することがほとんどだと思います。自分には複雑すぎると思うかもしれません。しかし、MQL5がC/C++プログラマーを取り込むために作られたからこそ、すでにC/C ++の経験を少しでも持っている人たちにも快適に使ってもらえるのです。少なくとも表面的には列挙を理解しましょう。

列挙とは、大まかに言えば、値を割り当てるか割り当てないかを指定できるデータの並びのことです。値を代入しない場合、カウントは常に最初の可能な値(この場合はゼロ)から始まります。したがって、11行目で定義されている列挙は、値0か1と同じ原理に従っています。C/C++では、MQL5と同様、ゼロの値は偽とみなされ、1の値は真とみなされます。

したがって、eFalse値が定義されている12行目では0を示し、列挙の2番目の値である13行目では1を示すことになります。もし、もっといろいろなものが定義されていれば、次は2、3......といった具合に、順を追って定義していくことになります。これは最も単純なケースです。

もう1つ注目してほしいことがあります。12行目の最後に、C/C++ではコメントとなるものがあります。他のラインにも同じようなものがあります。ここでは12行目に焦点を当てますが、これは他のすべての場所にも当てはまります。

チャート上でスクリプトを起動すると、図01のようになります。その中で、12行目のコメントと正確に一致するものを強調しています。

図01

図01:ユーザーとの対話ウィンドウ


このようなことは、MQL5のコーディングを非常に単純化します。他の言語では、MQL5でおこなわれていることをこのようにシンプルで実用的な方法で実現するためには、いくつかのことをしなければならないでしょう。したがって、コードにコメントを書くことは、コードをより理解しやすくするだけでなく、ユーザーに表示されるメッセージをカスタマイズすることもできるため、正しい行為であることを理解する必要があります。

ここで7行目に戻って、別の列挙を見てみましょう。この列挙は今説明したものとは異なります。違いは、各要素に値を割り当てることです。つまり、コンパイラは私たちが指定した値(この場合はMQL5で定義された定数)を使用します。なぜ列挙型に代入する代わりに、定数を直接使用しないのかとお尋ねになるかもしれません。その理由は、導入のしやすさにあります。もし定数を直接使うとしたら、配列や構造体など別のものを作らなければならず、これはずっと難しくなります。私のアプローチを使えば、あらゆる位置やシーケンスにあらゆる値を挿入することができます。また、宣言するシーケンスの中に目的の定数が出現する場合、実際にはその定数を割り当てたり宣言したりする必要はありません。 列挙にさらにコンテンツを追加するだけです。そうすれば、言語が正しい値が使用され、適切に割り当てられるように処理します。

C/C++のような言語でしっかりとした基礎を築くことが、MQL5のコードを書く際にいかに役立つかをご覧ください。ここで紹介するものは、MQL5のコードではあまり見られないものです。実際、私は、多くの人がここで達成したのと同じことを達成するために、もっと複雑で時間のかかる構造に頼っていることに気づいています。そして、結局書いたコードはたった1行(21行目)だったことに注目してほしいとおもいます。

21行目、つまり実際に実行される唯一の行で、明示的な型変換を行います。これは、コンパイラがそれを理解し、それに応じて最終的なコードを正しく生成するために必要なことです。しかし、なぜ明示的な変換がそれほど重要なのでしょうか。その理由はコンパイラにあります。プロセッサには関係ありません。私たちは数字を使っているだけで、それがプロセッサが実際に見ているものだからです。プロセッサは型に興味はありません。ただ数字を観察するだけです。しかし、21行目の第2引数は、数値であるにもかかわらず、ChartSetInteger関数が期待するものとは正反対です。この関数は、数値ではなく、ある型を想定しています。たとえその値が期待された型、つまり使用している定数そのものであったとしても、コンパイラはこれをエラーとみなします。そこで、これを修正するために、数値がChartSetInteger関数で期待される型に変換されるように明示的に強制します。こうして、コンパイラは、私たちが関数に渡す値を認識していることを理解できるようになります。


Pythonについての考察

読者の皆さん、そして初心者プログラマーの皆さん、この会話を終える前に、私が数年にわたり様々なプログラミング言語を使ってきた経験と知識から得た最終的な考えをお話ししたいと思います。その目的は、MetaTrader 5で特定のアクションを実行しようとしたときに発生する可能性のある将来のフラストレーションを防止することです。

私たちのメイントピックはMQL5ですが、Pythonを勉強するべきかどうかという質問がよくあります。特に、金融市場で取引するためにプログラミングを学び始めた人にとって、MetaTrader 5で作業するためにPythonの知識を深める価値があるかどうかという疑問が生じます。Pythonを学ぶことは、Cを学び、C++を学び、最終的にMQL5でプロフェッショナルな仕事をするための強固で統合された基礎を得るという困難を経験するよりもはるかに簡単で速いからです。しかし、Pythonを学んだ(あるいは学ばなかった)ことで時間を無駄にしたと思わないために、心に留めておくべき点が1つあります。

Pythonプログラミング言語(スクリプト言語と呼ぶことを好む方もいますが)は、MQL5でできることとは比較になりません。おそらく、それがPythonをプログラミング言語と見なさない人がいる理由でしょうが、ここではこの議論には立ち入りません。もしあなたのゴールが、純粋に数学的な方法で何かをテスト、検証、分析するためだけにコードを生成できるようになることなら、Pythonを学ぶことが最短で最も簡単な解決策です。なぜなら、MQL5を使って同じことをしようとするよりも、Pythonでバックテストなどを実行し、MetaTrader 5と直接やり取りする方が簡単だからです。

不思議に思う方もいらっしゃるかもしれませんが、少しの訓練と献身があれば、もっと経験のあるプログラマーがMQL5でできることと同じことを、Pythonスクリプトで簡単に作ることができます。多くの場合、プログラマーは、特定のオペレーティング システム(いわゆるSETUP)が収益性があるかどうかを検証するために、ストラテジーテスターを構成することに加えて、インジケーター(エキスパートアドバイザー)を作成する必要があります。不適切な設定によってすべてを危険にさらす危険性があることは言うまでもありません。

MetaTrader 5を使えば、チャートにアクセスし、結果を美しく表示することができ、分析が容易になると思われるかもしれません。しかし、MetaTrader 5で単純なバックテストを実行するために必要なすべての関数を直接プログラムするためにどれだけの知識が必要かを考えてみてください。

Pythonを使用して、MetaTrader 5のデータにアクセスするためにパッケージを使用することができます。Pythonでできることをすべて使えば、MQL5のプログラマーがおこなうのと同じ研究を簡単におこなうことができます。調査が完了したら、MetaTrader 5で可能なすべてのグラフ表示をおこなうために、Excelまたは他のプログラムにデータをエクスポートすることもできます。

ここで簡単な説明を加える必要があります。結果はExcelでプロットされるはずなのに、なぜExcelの代わりにPythonを使うのでしょうか。理由は簡単です。VBA(Visual Basic for Application)では、MetaTrader 5のデータを使用するため、Pythonを使用するのと同じデータに直接アクセスすることはできません。Excelでこれをおこなうには、このようなことをサポートするDLLを作成するか、同じデータを得るためにCVS形式でたくさんのファイルをエクスポートする必要があります。

Excelの中に入れば、Pythonでれるような計算をすべておこなうために、さらに多くの作業が必要になるでしょう。欠点としては、データベースを変更することになった場合、Excelですべての作業をやり直さなければならないことです。しかし、Pythonを使用している場合、Pythonにデータベースを変更するよう指示するだけでよく、Pythonは余計な手間をかけることなくMetaTrader 5に直接これを提供します。

それぞれのツールには長所と短所があります。Pythonは非常に便利ですが、チャート上に表示するインジケーターや、取引を支援するEAを作成することはできません。これはMQL5でしか実現できません。したがって、ツールに優劣はありません。互いに補い合い、異なる目的を果たします。いずれにせよ、両方のことを勉強しておくことです。いつどちらかを使う必要があるかわからないからです。


結論

簡単なことですが、次のことを常に覚えておく必要があります。あなたはまだ駆け出しです。すぐに複雑なことをしようとせずに、機能するものを作ろうとしてください。一見まったく役に立たないように見えても、簡単なことから始めてみましょう。

少しずつ機能を試してみましょう。C/C++言語を勉強して、MQL5のプログラミング能力を伸ばしましょう。どんなに複雑に見える仕事でも、もっとうまくできる方法が必ずあるからです。

コードを単純化し、忍耐強く、根気強くいることを学びます。自分の知識を少し超える問題が見つかっても、あきらめないでください。そのような状況では、さらに勉強し、すでに知っていることに基づいて解決策を考えます。すでに問題を解決しているのであれば、それに対するより良い解決策を探します。あなたの最終的な報酬は、膨大で深い知識であり、誰もあなたから奪うことのできない富です。知識は借りることはできても、決して盗むことはできません。

謙虚になり、自分の知識を他の人と分かち合おうとしてください。そうすることで、新たなことを学び、また別の解決策に集中する人々に新たな可能性を示すことができます。今日はここまでです。


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

リプレイシステムの開発—市場シミュレーション(第1回):最初の実験(I) リプレイシステムの開発—市場シミュレーション(第1回):最初の実験(I)
市場がしまっているときに研究したり、市場の状況をシミュレーションしたりできるシステムを作成してはどうでしょうか。ここで、このトピックを扱う新しい連載を開始します。
モスクワ取引所(MOEX)におけるストップ注文を利用した取引所グリッド取引の自動化 モスクワ取引所(MOEX)におけるストップ注文を利用した取引所グリッド取引の自動化
本稿では、MQL5エキスパートアドバイザー(EA)に実装されたストップ指値注文に基づくグリッド取引についてモスクワ取引所(MOEX)で考察します。市場で取引する場合、最も単純な戦略の1つは、市場価格を「キャッチ」するように設計された注文のグリッドです。
リプレイシステムの開発—市場シミュレーション(第2回):最初の実験(II) リプレイシステムの開発—市場シミュレーション(第2回):最初の実験(II)
今回は、1分という目標を達成するために、別の方法を試してみましょう。ただし、このタスクは思っているほど単純ではありません。
知っておくべきMQL5ウィザードのテクニック(第06回):フーリエ変換 知っておくべきMQL5ウィザードのテクニック(第06回):フーリエ変換
ジョセフ・フーリエによって導入されたフーリエ変換は、複雑なデータの波動点を単純な構成波に分解する手段です。この記事では、トレーダーにとって有益なこの機能を見ていきます。