【MQLプログラミング基礎】関数は難しい?関数の使い方を理解しよう!プログラム例あり

【初級編】MQLプログラミング基礎
朝日奈りさ
朝日奈りさ

関数をマスターすると、プログラムを書くスピードがアップするよ!

関数とは?

「プログラムは、何度も同じことを書かないといけない」

と思っている方、ぜひ関数を使ってみてください。

関数とは、何度も繰り返すプログラムを、まとめた状態のものです。

事前に、まとまりを作っておくことで、同じプログラムを何度も書く必要がなくなります。

  

※「変数」と「関数」は全くの別物です。
 名前が似ていますが、注意してください。
関連記事

 

たとえば、以下のようなプログラムのまとまりを関数と呼びます。

足し算をする関数です。

//MyFunctionという関数を作成します。
int MyFunction(int number)
  {

  //numberという変数を読み込んで、suujiと足し算します。
   int suuji = 100;
   suuji = suuji + number;

  //足し算の結果を返却します。
   return  suuji
  }

 

上記の例では、MyFunctionという関数を作成しました。

ちなみに、「MyFunction」じゃなくても、関数の名前はなんでもOKです。

「朝日奈りさSpecial」とかでOKです。(ダサい)

 

さて、ここからは上記の例を参考にしながら、関数の使い方について詳しく見ていきましょう。

 

関数のプログラム例

関数は、プログラム全体で見ると以下のように書きます。

//+------------------------------------------------------------------+
//|                                           SampleMQL_function.mq4 |
//|                                    Copyright 2021, 朝日奈りさFXchannel |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, 朝日奈りさFXchannel"
#property link      "https://mql-programing.com/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   int suuji = MyFunction(10);
   Comment("\n","OnInit()という関数を実行します。",
   "suujiの結果は",suuji,"です。");

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("\n","OnDeinit()という関数を実行します。");
   

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int suuji = MyFunction(20);
   Comment("\n","OnTick()という関数を実行します。",
   "suujiの結果は",suuji,"です。");

  }
//+------------------------------------------------------------------+

//MyFunctionという関数を作成します。
int MyFunction(int number)
  {

   //numberという変数を読み込んで、suujiと足し算します。
   int suuji = 100;
   suuji = suuji + number;

   //足し算の結果を返却します。
   return  suuji;
  }
//+------------------------------------------------------------------+

 

かなり分かりにくいと思いますが、一番下に関数を書いています。46~56行目です。

このようにOnInit,OnDeinit,OnTickとは、別の関数として、新しい関数を作ることができます。

OnInit,OnDeinit,OnTickについては以下の記事を参考にしてください。

 

関数の基本的な使い方

上記のプログラムの16行目を見てください。以下のプログラムが書かれています。

int suuji = MyFunction(10);

 

MyFunctionを使っています。

細かく見ていくと、「suuji」というint型の変数を宣言しています。

その「suuji」にMyFunctionの計算結果を代入しているといったプログラムです。

関数はこのように使うことが多いので、このパターンを覚えておくと良いでしょう。

 

「あれ?MyFunction(int number)じゃないの?」と疑問に思った方は、プログラミングのセンスがあります。

なぜMyFunction(int number)ではなく、MyFunction(10)と書いているのかを、関数の構造を見ながら解説します。

 

関数の構造と書き方

関数の構造のポイントは以下の3点です。

  • 引数
  • 関数の内容
  • 戻り値(返り値)

それぞれ見ていきましょう。

 

引数とメリット

引数とは、関数の内容で使用する値を、外部から持ってくるために存在します。

どういうことかというと、関数の中で変数を宣言しなくて良くなります。

メリットは、その関数を使って同じ計算をしたいとき、値を変えてもう一度計算させることができることです。

例えば、100+10を計算させたい時、「100+10」とそのまま書いてしまうと、結果は110にしかなりません。

しかし関数を使うことで、100+10の「10」の部分を「20」に変えて、「100+20」も計算させることができます。

つまり同じMyFunctionという関数を使って、「100+10」も「100+20」も計算できるのです。

 

引数の書き方

引数は、関数名の右横に宣言します。

上記の例を抜粋すると、以下の部分です。47行目です。

int MyFunction(int number)

「MyFunction」という関数名の右横に(int number)を書いています。

このnumberを引数と言います。

ちなみにint numberという書き方は、変数の書き方と同じなので、わかりやすいと思います。

引数は、関数の内容で使用される変数です。別の値を代入することもできます。

 

関数の内容

関数の内容は、計算させるルールを書きます。

上記の例だと、「100+引数」というルールを書いています。

何度も計算させたいことを書くと良いでしょう。

関数の内容を書くコツ
プログラムを書く順番として、関数を書くのは、完成の一歩手前です。
最初は上からプログラムを書いていって、何度も同じ計算をしている場合、関数にまとめるとスッキリします。
また、関数にしておくことで、次に作るプログラムに応用できるので、プログラムの作成がどんどん楽になっていきます。

 

戻り値(返り値)

最後に戻り値です。返り値とも呼ばれます。

戻り値は、関数の計算結果を出力する時に使います。

これによって、関数で計算させるだけでなく、計算結果を引き継ぐことができます。

少しずつ見ていきましょう。

 

まずは書き方です。

戻り値の書き方は以下のようなパターンが多いです。

//関数を作成
int MyFunction(int number)
  {

   //関数の内容を書く

   //戻り値を出力
   return  suuji;
  }

 

ポイントは2つあります。

  • 戻り値の型の宣言
  • 戻り値の値を出力

それぞれ解説します。

 

戻り値の型の宣言

まず2行目の「int MyFunction(int number)」ですが、一番左に「int」が宣言されています。

これはMyFunctionという関数が計算した結果、int型の変数を出力することを表しています。

つまり、戻り値の型は「int型」になるのです。

ちなみに変数の型であれば、なんでも設定することができます。

変数の一覧は以下が参考になります。

 

戻り値の値を出力

上記のプログラムの8行目をご覧ください。

suujiという変数を「return」しています。

return  suuji;

 

returnとは、変数や値を戻す(返す or 出力する)ために使うものです。

ほとんどの場合、プログラムの最後に書かれています。

このように書くことで、MyFunction関数は、int型のsuujiを戻すことができます。

 

「戻す」とは?

先ほどから何度も「戻す」という言葉を使っていますが、プログラミング界では一般的な言葉です。

関数を使うときに、「処理が戻ってくる」という意味から使われています。

どういうことかというと、関数を使うと、処理が関数に飛びます。

 

関数を使う時、以下のように使います。

int suuji = MyFunction(10);

 

MyFunctionに「10」を入力し、計算した結果をsuujiに代入します。

「MyFunctionに「10」を入力する」段階で、処理が一時的にMyFunctionに飛びます。

そしてMyFunctionの処理が終わった後(suujiが出力された後)、処理が戻ってきます。

 

この辺りは言葉で解説するのは難しいので、プログラム例を載せておきます。

この2つのプログラムの違いは、関数を使っているか使っていないかですが、全く同じ処理をします。

ぜひ見比べてみてください。

16~17行目あたりが違っています。

 

関数を使っていない場合

//+------------------------------------------------------------------+
//|                                           SampleMQL_function.mq4 |
//|                                    Copyright 2021, 朝日奈りさFXchannel |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, 朝日奈りさFXchannel"
#property link      "https://mql-programing.com/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   int suuji = 100;
   suuji = suuji + 10;

   Comment("\n","OnInit()という関数を実行します。",
   "suujiの結果は",suuji,"です。");

//---
   return(INIT_SUCCEEDED);
  }

 

関数を使った場合

//+------------------------------------------------------------------+
//|                                           SampleMQL_function.mq4 |
//|                                    Copyright 2021, 朝日奈りさFXchannel |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, 朝日奈りさFXchannel"
#property link      "https://mql-programing.com/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   int suuji = MyFunction(10);

   Comment("\n","OnInit()という関数を実行します。",
   "suujiの結果は",suuji,"です。");

//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+

//MyFunctionという関数を作成します。
int MyFunction(int number)
  {

   //numberという変数を読み込んで、suujiと足し算します。
   int suuji = 100;
   suuji = suuji + number;

   //足し算の結果を返却します。
   return  suuji;
  }
//+------------------------------------------------------------------+

 

まとめ

関数は計算のルールをまとめたプログラムです。

今回は足し算のルールを作ってみました。

関数には3つのポイントがあり、これをマスターすれば関数を使いこなすことができるでしょう。

  • 引数
  • 関数の内容
  • 戻り値(返り値)

関数は正直難しいです。

初心者のかたは、関数を使うことは意識せず、まずはプログラムを作ってみましょう。

 

コメント