見出し画像

【超初心者向け】プログラミング入門【FX自動売買(EA)/MQL4/MQL5】

こんにちは、ゆみねです。
フリーランスのエンジニアをやっています。


皆さんはプログラミングと聞くとどのようなイメージが浮かぶでしょうか?

「難しそう」

「黒い画面に謎のアルファベットがたくさん」

「なんか頭良い人がやるやつ」

こんなとっつきにくそうなイメージをお持ちの方も多いと思います。

でも、そんな事はありません

今回はこれまでと趣向を変えて、プログラミングに触れた事が無い方々へ向けて、「プログラミングってこんな感じ」というフワッとしたイメージをお伝えする記事を書いてみようと思います。

この記事を読み終わる頃には「ちょっとプログラミングやってみようかな」と思う方もきっといらっしゃるはず…。

既にプログラミングを勉強しはじめている人にはあまり参考にならない内容になりますので、次回の記事をお待ちください。

いきなり大量のソースコードが出てきても混乱するかと思いますので、今回は極力ソースコードを少なく、説明多めで書きます。

あくまでもフワッとしたイメージだけお伝えすることを目指して、触り部分だけ書いてみます。

これまでずっとFXに関する記事ばかり投稿してきてますので、今回も一応FXの自動売買プログラム(EA)と関連付けながら書いていこうと思います。


※ある程度プログラムがわかる方へ
あくまでもフワッとしたイメージを伝える事を優先しますので、「そうじゃない」と思われるような表現も出てくるかと思いますが、ご了承ください。



そもそもプログラム(プログラミング言語)って何?

一言で言えば「コンピュータが理解できる言語」の事です。

日本人なら日本語は理解できますが、フィンランド語は理解できません。

コンピュータも同じで、プログラムは理解できるけど人間の言葉は理解できません。

実はコンピュータはものすごく単純な言葉しか理解できないので、プログラムは人間の言語とは比べ物にならないくらい単純な構造(文法)になっています。


どうしてプログラムを書く必要があるの?

人間は自分で考えて自分で行動できますが、コンピュータは命令されないと動きません

逆に言えば、命令された通りにしか動きません

命令されていない事を勝手に実行したりすることは絶対にありません

※ここ地味に重要です。


コンピュータって何がすごいの?

人間だと「命令された通りにしか動かない」のは良くないとされるケースが多いですね。

ドラマなんかで新入社員が「少しは自分で考えて動け!」って怒られているのをイメージできます…。

でもコンピュータは命令された通りにしか動きません

ここだけ切り取ると、わざわざプログラムを書いてコンピュータに命令する事は非常に非効率でメリットを感じられません。

…が、今やコンピュータを利用しない日なんて無いんじゃないかと思うくらい、どこにでもコンピュータが使われています。
(広義では家電製品やスマホもコンピュータです)

もちろん有り余る程のメリットがあるため世界中で使われているのですが、いくつか具体的なメリットを挙げるとすると、「計算速度」「計算精度」「稼働時間」等が挙げられます。

とにかく計算速度が早く、しかも正確で、それを(電源がある限り)24時間続ける事ができるのです。
(「正確」には若干語弊がありますが、一般的には十分「正確」です)

一方、24時間ずっと正確に仕事をテキパキこなし続ける人間なんて存在しませんが、人間は自分で考えて行動する事ができますね。

人間には人間の良さ、コンピュータにはコンピュータの良さがそれぞれあり、お互いに弱点もあるのです。


プログラミングって英語?みたいなの覚えないといけないよね?

プログラミングに触れたことの無い方の全員が

「なんか英語みたいなアルファベットをたくさん書くんだよね」

と思っているのではないでしょうか。

また、「エンジニアの人達はこれが読めるんでしょ…私には無理」と思ってる方も多いと思います。

しかし、これは正しくもあり間違いでもあります。

まず、我々エンジニアはあの大量のアルファベットを見てすぐに全て理解できるわけではありません

エンジニアの経験や知識により個人差はありますが、エンジニアでも時間をかけて解読してようやく理解できるようになるのです。

学生時代に英語の長文読解がテストに出た時、成績の良い人でもしっかり時間をかけて読み込んで回答してましたよね?

国語の問題でも、何度も長文を読み返して回答してましたよね?

プログラムも全く同じで、どんなにベテランのエンジニアでもプログラムを読むのには必ず時間がかかります。一瞬で読める人なんていません。

「わからない」→「解読する」→「わからない」→「解読する」…

これを繰り返して読んでいくのがプログラムです。

経験上、「わからない」が無い(全てすぐにわかる)プログラムの方が圧倒的に少ないです。

どんなベテランエンジニアでも1度は「ん?なんだこれ…」となるのですが、時間をかければ必ず解読できる事を知っているから、プログラムを読む事ができるのです。

わからなくて良いんです。調べれば良いだけなので。


そして当たり前ですが、あの大量のアルファベットは全てプログラミング言語です。

人間の言葉、例えば英語なんかよりも遥かに簡単な言語です。
(人間の言語と比べる事自体がナンセンスですが…)

少し前でも書いた通り、プログラミング言語は非常に単純な構造(文法)になっており、それを組み合わせて書いているだけなのです。

凄く複雑に書かれているように見えるかもしれませんが、単純な構造(文法)を組み合わせているだけなので、この構造(文法)さえ覚えてしまえば突然プログラムが読めるようになります

プログラミング言語によってこの構造や文法も若干変わってくるのですが、今回は、FX自動売買プログラム(以下EA)を開発する際に使うMQL4/5言語を例に取って、構造や文法がどのようなものなのか、触り部分だけご紹介します。


MQL4/5について

MT4/5上で動作するインジケータやEAの開発をする際に用いるプログラミング言語です。

MT4上で用いるものがMQL4、MT5上で用いるものがMQL5で、それぞれ似ていますが厳密には互換性がありません。

そのため、MT4向けインジケータ/EAがMT5では使えない事と同様に、MQL4のソースコードはMQL5のソースコードとして利用する事はほとんどの場合できません。

「ほとんどの場合」と書いたのは、実は「インジケータ/EA」と「ソースコード」は全く別もので、「インジケータ/EA」はMT4とMT5とで同じものが使えませんが、「ソースコード」は同じものが使える場合があります。
…が、今回はそのあたりの説明は省略させて頂きます。
MQL4とMQL5は別もの、とだけ覚えて頂ければOKです。


構文(文法)について

ものすごく簡単に書きますが、以下の4つだけ知っていればなんとなくプログラムのイメージをフワッとつかめるようになると思います。
(構文以外にも概念等も書きます)

正確な構文(文法)の定義は書きません。

正確な定義はネット上にいくらでも情報が転がってますので、私の記事では割愛させて頂きます。

一応サンプルとしてソースコードを載せますが、日本語で書かれている説明文の方を中心に読んで頂き、「何をしてるのか」だけご理解頂ければOKです。

なんならソースコードは一切読まなくても良いです。
(ただし薄い字で書かれてるコメントは読んでください…)


変数

プログラムでは、変数に値を代入してその値を保持させることができます。

色々と小物類を収納しておける空箱を用意できる、そんなイメージです。

ただ、箱ごとに中に何を収納するのかを予め決めておく必要があり、それ以外のものは収納できない決まりがあります。

int count; // 整数(int)を収納するcountって名前の箱を用意して!
count = 10; // countって名前の箱に整数の「10」をしまって!

string str; // 文字列(string)を収納するstrって名前の箱を用意して!
str = "USD/JPY"; // strって名前の箱に"USD/JPY"って文字列をしまって!

// "=" は "イコール" ではなく、"代入する" という意味で使われます。
// プログラム(処理)の最後は必ずセミコロン(;)を書きます。

※ "//"より後ろ側(薄い色で見にくい部分)はただのコメント(説明、落書き)として認識され、「プログラム」としては認識されません。"//"より前の部分を「プログラム」としてご認識ください。
(今回はプログラム部分よりもコメント部分に集中にして読んでください)


「○○をしまっておく箱」が変数です。

「これが何?どう使うの?え?」

…となるかと思いますが、わからなくて当然ですので、今はそれでOKです。


条件分岐

条件に応じて処理を分岐させる事ができます。

信号が青なら進む、赤なら止まる、のように、条件に応じて処理を変える事ができます。

変数よりちょっと構文(文法)っぽくなります。

int count; // 整数(int)を収納するcountって名前の箱を用意して!
count = 0; // countって名前の箱に整数の「0」をしまって!

if (count == 0) count = 1; // countが0ならcountに「1」をしまって!(上書き)

// "==" は "代入" ではなく、"イコール" という意味で使われます

if の後ろのカッコ()の中の条件が正しければ、カッコ()の後ろの処理を実行します。(上の例だと、count が 0 であれば count = 1 を実行します)

ちょっとプログラムが横に長くなって読みにくくなりそうなので、改行して見やすくします。

int count; // 整数(int)を収納するcountって名前の箱を用意して!
count = 0; // countって名前の箱に整数の「0」をしまって!

if (count == 0) // ここで改行する
  count = 1; // 先頭にスペースを入れて更に見やすく!
  
// 見やすくするために改行したりスペースを入れたりします
// 「見やすい?どこが?」と思うかもしれませんが、今はそれで良いです。

カッコ()の中の条件が正しくない場合にも何か別の処理をさせたい場合は、以下のように書きます。

int count; // 整数(int)を収納するcountって名前の箱を用意して!
count = 10; // countって名前の箱に整数の「10」をしまって!

if (count == 0) 
  count = 1; // 今回はここは実行されない(countは10なので)
else  // ifの条件が正しく無かった時はこっちが実行される
  count = 11; // 今回はこっちが実行される

else を if の後ろに書くと、条件が正しくない時に実行される処理を記述できます。

…ややこしくなってきましたが、ぼんやりとプログラムで「何をしているのか(条件分岐ができるんだ)」のイメージだけ掴んで頂ければOKです。


繰り返し構文(for)

同じ処理を繰り返す事ができます。

if より少し書く量が多いですが、動作はシンプルです。

int i; // 整数(int)を収納する i って名前の箱を用意して!
int count; // 整数(int)を収納するcountって名前の箱を用意して!
count = 0; // countって名前の箱に整数の「0」をしまって!

for (i = 1; i <= 5; i++) { // iって箱に1を入れて、iを1ずつ増やしながら5になるまで繰り返す
    count = count + i; // i が1,2,3...と1ずつ増えながら5回実行される
}

複雑に見えますが、やっている事は「countにcount+iを代入」を5回繰り返しているだけです。(コメント部分をしっかり読んでください)

for部分と全く同じ処理をforを使わずに書き直すと以下のようになります。

count = count + 1;
count = count + 2;
count = count + 3;
count = count + 4;
count = count + 5;

for が実行し終わると、countには15が入っている状態になります。

ここは正確な定義も見ないと理解しにくいと思いますが、今は理解できなくて良いです。

「繰り返し処理」ができる、という事だけフワッとイメージできればOKです。

あと、さらっと出てましたが、中括弧(波括弧)→{} でブロック(かたまり)を表現し、四則演算もできます。


関数

複数の処理を一つにまとめる事ができます。

学生の頃、数学の授業でも関数が出てきましたが、同じような概念です。

関数は引数を受け取り、戻り値(返り値)を返します。
(何も受け取らず、何も返さない場合もあります)

関数を定義し、その関数を処理の中で呼び出す事で利用します。

// 整数(int)を2つ(a,b)受け取って、整数(int)を返すfunc_add関数を定義!
// (定義しているだけで、呼び出されるまで実行されない)
int func_add(int a, int b)
{ // ブロックはじまり
    return a + b; // 受け取ったaとbを足し算して返す!(四則演算)
} // ブロックおわり(関数定義ここまで)

int c;
c = func_add(1, 2); // 上で定義したfunc_add関数に1と2を渡して、戻り値をcに入れる!

難しいかもしれませんが、何かしらの複雑な処理を一つにまとめているもの、という認識でとりあえずOKです。

上で説明した if と for 以外で、アルファベットの後ろにカッコ()がついていたら、それ全部関数です。(他にも関数じゃないものもありますが、ほぼ全部関数です)

つまり、どこかで関数が定義されていて、それを呼び出して使っているのです。

「なんかよくわからないアルファベットが出てきたけど後ろに()が付いてるからきっと関数だ!どこかで定義されてるはずだから、それを見つければ何をしているのかわかるはず!定義を探そう!」

と考えられるようになればもう初心者脱出です。

MQL4/5に限って言えば、プログラムの大部分がこの「関数」の組み合わせで構成されているので、この「関数」をどれだけ知っているかでプログラムの読解スピードが変わると思います。

でも知らなくて良いです。調べれば良いだけなので。

とにかくカッコ()が付いてればほぼ全部関数なので、同じファイル内で定義箇所を探すか、ググってみるかすればOKです。
※ほとんど場合、関数は別のファイル(見えないところ)に定義されているので、ググって公式リファレンスを見ないとわからないと思います。


これだけ?

以上です。

おそらく、ここに挙げたものだけ「ふーん」程度に思ってもらえればMQL4/5のプログラムをなんとなく読めるようになると思います。

もちろん、説明していない事の方が遥かに多いのですが、プログラムをなんとなく読むだけならこれだけの知識で十分だと思います。

あくまで「なんとなく」ですが…。

上記のプログラム自体を理解できなくとも、「変数」「条件分岐」「繰り返し処理」「関数」の4つだけ概念を知ってればなんとなくMQL4/5のプログラムを読める、と考えると少しだけハードルが下がりませんか?

実際のプログラムも、この4つの概念の組み合わせだけで成り立っていると言っても過言ではありません。

今回はここまでにしますが、次回は実際のEAのプログラムを見ながら解説をしてみようと思います。


雑記

今回はプログラミングに触れたことのない超初心者さん向けに記事を書いてみました。

本当はちゃんと体系立てて基礎からしっかり学習していく必要があるのですが、ほとんどの人はプログラミングの漠然とした「難しそう」というイメージだけで「勉強してみよう」という気すら湧かないのではないかと思い、少しでもプログラミング学習のきっかけになればという思いから執筆をはじめました。

これまで私が書いたインジケータやEAの紹介記事を見て、「プログラミングって自分にもできるのかな…」と思った方は少なからずいらっしゃるかと思います。

そういった方々の背中を押せる記事になっていれば幸いです。

次回の記事では実際のEAのソースコードを見ながら解説をしてみようと思っていますが、いきなりレベルが上がってしまうかと思いますので、ネット上のMQL4/5の学習記事を探して予習しておくと良いかもしれません。

↓次回の記事


自作インジケータの配布や億トレーダーの手法の検証記事なんかを書いておりますので、これまで私の記事を読んだ事の無い方は以下のリンクからご覧頂けますと幸いです。


以上、最後までご覧頂きありがとうございました!



この記事が気に入ったらサポートをしてみませんか?