【MQL4】プリプロセッサdefineのサンプル#01

量からしか数は生まれないと話ているのを聞いて、それって同じことを言っているよねと思ったセレブパンダだお。(本当は量からしか質は生まれないと言いたかったはず)

C言語と似ているMQL4では、C言語の同じようにプリプロセッサが使えます。
記号定数のdefine、関数マクロ、条件付き取込について解説します。

こんな人が対象です。

  • マジックナンバーを直接コードに書き込みたくない人。
  • 実行速度を少しでも早くしたい人。

記号定数のdefine

定数と同じ使い方で利用できます。

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#define KIRIBAN 100.0

void OnStart()
{
   Print("購入価格は", KIRIBAN ,"です。");
}

ソース上に、意味のある数値を直接書くことはあまりよくないです。数値のみの記述では、その値がどんな意味を持った値なのかわからないからです。

また、その数値が何か所もソース上に存在した場合、修正が発生すると、全ての箇所を書き直す必要があります。

これを避ける目的でdefineを使うことがあります。例えば、RSIの閾値の上限、下限を記号定数として定義しておけば、後からソースをみても意味がわかります。
保守性もあがります。

#define RSI_UPPER 70
#define RSI_LOWER 30

では、定数と何が違うのって思いますよね。
定数で宣言した例は以下。

const int RSI_UPPER 70;
const int RSI_LOWER 30

定数の使い方だけみると、どちらを使ってもよいとなります。

#defineはプリプロセッサと呼ばれ、コンパイルを開始する前に行われる処理(プリプロセス)を表します。

なので、#defineで定義したものは、実際にはコンパイルする直前に以下のようになっています。

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


void OnStart()
{
   Print("購入価格は", 100.0 ,"です。");
}

コードの該当箇所を直接置き換えることになります。

多少実行速度があがると思いますが、記号定数とつかう場合は、どちらでもよいということになります。

では、まただお。

Twitterでフォローしよう

おすすめの記事