———————————————–
前回は、
OnTick関数がどのように作用するのか?という点について解説しました。↓
改めて前回の内容をおさらいしておくと、
という事をお話ししました。
これで今までに、OnInit関数、OnDeinit関数、OnTick関数という3つのイベントハンドラーについて解説してきたことになります。
※「EA作ろう講座」の記事ではないですが、↓でOnStart関数というイベントハンドラーについても書いていますのでよろしければご覧ください。
以前、講座記事の第2回で↓
イベントハンドラー=自動売買プログラムを動かす時に、重要な役割を果たす関数のこと。
という説明をしましたが、そう考えると今までに説明してきた3つのイベントハンドラーのうち、
値動きの変化のたびに処理をするOnTick関数が、その中でも自動売買プログラムにおいてもっと重要であり、大半の記述はこのOnTick関数の{}の中に書いていけば良い・・・という事が何となく想像がつきますでしょうか?
今回の記事からは、OnTick関数に具体的に、何を、どのように記述していけばよいか?
という話をしていきたいと思います。
これからEAを作っていく上での核心に徐々に迫っていきますので、是非楽しみながらお読みいただければと思います。
※MQL5で自動売買プログラムを作るにあたっては、メタトレーダー5(MT5)・メタエディター5がお使いのパソコンにインストールされている必要があります。
もし、まだメタトレーダー5(MT5)のダウンロードが完了していない方は、
こちらからデモ口座の開設とメタトレーダー5のダウンロード・インストールを完了して頂ければと思います。
変数(Variable)とは何か?
今回は、変数という概念についてお話していきたいと思います。
どのプログラミング言語を勉強していても、この変数という概念は必ず最初に出てきます。
で、大体において以下のような説明がなされます。↓
変数は、データを入れておける箱のようなものです。データを保存できる便利な仕組みです。
・・・と。
で、これは大事な概念だから、しっかりと理解しよう・・・と続くわけです。
なるほど、わかりました(`・ω・´)ゞ・・・でもこうは思いませんでしょうか?
「データを保存できる箱があることが、なぜそんなに重要なんですか?」
と。(自分は思いました。・・・そしてしばらくプログラミングの勉強を投げ出しました(-_-;))
従って、今回の講座では変数の概念をわかりやすく説明する事はもちろんの事、変数という概念がなぜ重要なのか?という事もプログラム未経験の方が理解できるような構成を心掛けました。
そして、最終的には「変数という概念がなぜ重要なのか?」という事が具体的にわかるような
サンプルコードを作っていきます。
その前にまずは、変数をどうやって使うのか?というところから見ていきたいと思います。
変数の使い方
変数は以下の工程を踏んで使います。
- データ型を決める(=箱に入れる材料の種類を決める)
- 変数の名前を決める(=箱にラベルを張る)
それぞれの工程を順番にみていきましょう。
1:データ型を決める(=箱に入れる材料の種類を決める)
先ほど、変数はデータを保存できる箱のようなものだ、という説明が一般にされているとお伝えしました。
その例に従うのであれば、まずは変数という箱を用意しなくてはいけません。
データ型を決める、というのは「変数という箱を用意する」作業に当たります。
箱に何か物を入れる以上、特定の目的がある訳で、なんでもぶち込んでいいわけではないですよね。
例えば、生魚と野球のグローブを一緒の箱にいれたりしたら、どちらも本来の役割を果たせなくなるの明らかです。(部屋を片付けられない人の中には、そんな人もいるかもしれませんが・・・)
データ型には「この変数に入れるデータの種類はこれだけだよ!」というルールを決める、という意味があります。
データ型を決めるには、例えば↓のような記述をします。
//↓整数型の変数を使う
int
※復習:スラッシュを2つ記述した後に書かれた文字列は、コンピューターが命令として認識しないようになります。これをコメントアウトと言います。
詳しくは↓をご覧ください。
「int」と書くと、
という事を意味しています。(intというのは英語で整数を意味する単語、Integerの略です)
※整数は1・2・3・4・・・と続く数の総称です。-1 -2 -3 -4・・・というマイナスの連なりも含みます。
データ型には整数型を表すint型の他にも、複数あります。
なお、「データ型」については次回の講座記事で解説しています。
「先に内容を確認したい!」
という方は↓の記事をご覧ください。
データ型をint型(整数型)に決定したところで、今度は変数名を決めましょう。
2:変数の名前を決める(=箱にラベルを張る)
例えば、箱に入れたものを宅配便でどこかに送る時も、送り状を貼り付けますよね。そうしたないと、宅配業者さんが、たくさんある荷物の区別がつかないですから。
それと同じノリで、変数にも
「この箱は、あの箱とは違うんだ」
という区別をつける必要があります。変数に名前を付けるという行為は、データを入れる箱の区別をつける作業に他なりません。
変数の名前は以下のルールに従っていれば、自由に付けられます。
- 使える文字はアルファベットと数字、_(アンダースコア)のみ。
- アルファベットの大文字と小文字は「違う文字」として認識される。
- 文字の先頭に数字を使うことはできない。
- 予約語を使うことはできない。※1
- 変数の名前は63文字まで
予約語とは?
※1 予約語というのは、MQL5側であらかじめ、プログラム上この言葉を書いたらこういう処理をするよー」という役割が決まっている言葉のことを言います。
例えば、それこそintは「これを書くことで、整数型の変数を使うという宣言をする」役割を事前に与えられているので、予約語となり変数として使うことはできません。
void OnTick()
{
//↓整数型の変数を使う。変数の名前は[variable(英語で変数を意味する)]に決める
int variable;
//先頭が小文字の「variable」と、大文字の「Variable」は違う変数である。
int Variable;
//intは予約語なので、コンパイルエラーになる
int int;
//使える文字はアルファベットと数字、_(アンダースコア)のみなのでエラーになる
int variable%;
//先頭に数字は使えないのでエラーになる
int 1variable;
//文字の長さが64文字なのでエラーになる
int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
}
変数の名前に関するルールを踏まえてコードを書いてみました。
上記のような記述は全てコンパイルエラーにつながります。
※文末にセミコロン(;)がついているのは、
日本語の「。」
や
英語の. (ピリオド)
みたいなもので、MQL5においては、セミコロン(;)がついていると、いったん記述に一区切りがついたことを意味します。
セミコロン(;)がついていないと、これもコンパイルエラーになってしまうので忘れないようにしましょう。
コンパイルって何?という方は↓をご覧ください。
3:変数にデータを代入する(=箱に材料を詰める)
ここまでで、
変数の名前を決める(箱にラベルを貼る)、
という所までやってきました。
次は変数にデータを入れる(=箱に材料を詰める)作業を見ていきましょう。
この変数にデータを入れる作業のことを代入(subsutitution)といいます。
//↓整数型の変数を使う。変数の名前は[variable(英語で変数を意味する)]に決める
int variable;
//変数variableに「1」を代入する。
variable=1;
変数にデータを入れる、すなわち代入をするときは「=(イコール)」を使います。
この時、必ずデータを入れられる側の変数は左辺に、代入する値は右辺に置かれます。
逆はいけません。
//↓整数型の変数を使う。変数の名前は[variable(英語で変数を意味する)]に決める
int variable;
//左辺に値、右辺に変数がきているためにコンパイルエラーになる。
1=variable;
※変数のデータ型を決めるのに使った、intはもう使う必要がありません。(・・・というか、再び使おうとすると「変数名already defined(すでにその変数は定義済みです)」というコンパイルエラーになります↓)
注意したいのが、「variable=1」→「variableと1は等しい」という意味ではない、ということです。
「variableと1は等しい」という意味にしたい場合は、
「variable==1」
とイコールを2つ続けて書く必要があります。
イコール1つ→代入
イコール2つ→等しい
という違いを押さえておきましょう。
※このあたりの詳しい事は講座記事第32回で改めて解説予定ですのでご心配なく↓
//変数variableに「1」を代入する。
variable=1;
//↓変数variableと1は等しいとい意味
variable==1;
//逆ではだめ。エラーになる
1=variable;
実際に、「variable=1;」によって、変数が1という数字を格納することができたのか見てみましょう。
//↓整数型の変数を使う。変数の名前は[variable(英語で変数を意味する)]に決める
int variable;
//変数variableに「0」を代入する。
variable=0;
Print(variable);
//変数variableに「1」を代入する。
variable=1;
Print(variable);
変数「variable」に最初「0」を代入し、次に「1」を代入しました。
順次進行について
プログラムには順次進行という原則があります。要は
「プログラムは記述されている内容が、上から下に向かって順番に処理される」
ということです。
順次進行の原則に従うのであれば、
↓
変数「variable」に「0」というデータを入れた
↓
変数「variable」に「1」というデータを入れた(0というデータが1に上書きされた)
という処理が順番になされているはずです。
Print関数でMT5のエキスパートタブに変数「variable」の値がログに残るような記述をしました。
確認してみましょう。↓
予想通りの結果になりました。
変数というものの、概要がおわかりいただけましたでしょうか?
「いやいや、だからそれのなにがそんなに便利なのよ!?」
という所に話を戻したいと思います。
確かに変数という箱に0や1が格納されることの重要性と言われてもピンときません。
でも、例えば変数「variable」に代入される値が以下のようなものだとしたどうでしょう?
variable=NormalizeDouble(
((double)CalAddLotsByATR(AtrStopMulti,MaxLossPer)/Division_N),
2);
何が書かれているのか、わからなくてもちろん大丈夫です。
何かを計算しているデータだと思ってください。
これを別に「variable」という変数に格納しなくても、右辺に書いてある式を必要な時に書き直せばいいともいえますが、それって大変そうだな・・・というのはお分かりいただけるかと思います。
その点、
変数に一度代入しておけば、ややこしい数式を再び書き直さなくても、その変数を使いまわすだけで同じ結果が得られるのです。
野球ボール1個程度なら、べつに箱に入れなくても持ち運びできますが、その個数が30個とかになったら話は別ですよね。
プログラムというのは、
大半がこれの繰り返しなわけです。
これができればプログラムは恐れるに足りない、という訳です。
まとめ
今回は、変数について解説しました。
今回の記事では以下のことをお伝えしました。
- 変数は、データを入れておける箱のようなものである。
- 変数は1データ型を決める(=箱に入れる材料の種類を決める)、2変数の名前を決める(=箱にラベルを張る)3変数にデータを代入する(=箱に材料を詰める)というプロセスを経て利用する。
- プログラムには「プログラムは記述されている内容が、上から下に向かって順番に処理される」という、順次進行の原則がある。
今回は以上となります。
最後までお読みいただきありがとうございました<(_ _)>
MQL5講座 第8回「OnTick関数」← →MQL5講座 第10回「データ型」
※変数については今後、以下の講座記事でも解説を予定しております。
コメント