12.インジケーター関数

EAの第一の目的はトレードです。
今回と次回で、トレードを行うための関数について解説します。

インジケーターの値を取得する関数

トレードを行うための環境認識や売買注文のトリガーとしてインジケーターを使用する場合は、EAの中でその値を取得する必要があります。
MQL4では、自作したカスタムインジケーターでなければ、基本的にそのインジケーターの値を取得するための専用の関数が用意されています。

下記URLはMQL4のリファレンスページです。

Technical Indicators – MQL4 Reference

MT4/5には沢山のインジケーターがありますので、その値を取得するための関数も沢山ありますが、その使い方は基本的に同じです。

インジケーター関数には多くの引数を渡す必要がありますが、チャートにインジケーターを表示する時に設定する期間や適用価格がそのまま引数になっているような形です。
ボリンジャーバンドやMACDなど複数の線が描画されるようなインジケーターは、どの線の値を取得したいかを意識する必要があります。

また値取得が目的ですので、MQL4のインジケーター関数は戻り値があり、そのほとんどがdouble型の数値になっています。

前述のリファレンスページから、移動平均(Moving Average)を取得する「iMA」関数を見てみましょう。
iMA – Technical Indicators – MQL4 Reference
下記はiMA関数の定義です。

double iMA(
   string       symbol,           // symbol
   int          timeframe,        // timeframe
   int          ma_period,        // MA averaging period
   int          ma_shift,         // MA shift
   int          ma_method,        // averaging method
   int          applied_price,    // applied price
   int          shift             // shift
);
戻り値のデータ型 関数名(
   引数のデータ型   引数名,
   ...
);

という形で書かれています。

移動平均はレートの平均値なので、戻り値はdouble型となります。
引数は下記の7つです。

引数のデータ型 / 名前 意味 渡すデータの例
string / symbol 通貨ペア名の指定です。
EAを稼働させているチャートの通貨ペアを指定したければ、Symbol関数の戻り値を利用します。
“USDJPY”
Symbol()
int / timeframe タイムフレームの指定です。
タイムフレームは何分かを表す整数で指定します。EAを稼働させているチャートで表示しているタイムフレームを指定したければ、Period関数の戻り値を利用します。
5
60
Period()
int / ma_period 移動平均の期間の指定です。 20
200
int / ma_shift 表示シフトの指定です。 5
-10
int / ma_method 移動平均の種別の指定です。
列挙型ENUM_MA_METHODを使用します。
MODE_SMA
MODE_EMA
MODE_LWMA
MODE_SMMA
int / applied_price 移動平均の適用価格の指定です。
列挙型ENUM_APPLIED_PRICEを使用します。
PRICE_CLOSE
PRICE_OPEN
PRICE_HIGH
PRICE_LOW
int / shift 現在時刻のバーを0として、何本前のバー時点での値を取得するかの指定です。 0
1

下記は、現在のチャートの終値の20期間単純移動平均(20SMA)を取得する記述です。

double ma = iMA(Symbol(),Period(),20,0,MODE_SMA,PRICE_CLOSE,0);

列挙型(ENUM)について少し詳しく触れておきます。
上記のiMAの引数として、ma_methodやapplied_priceに使用していますが、この引数のデータ型はintとなっています。
これは、MODE_SMAやPRICE_CLOSEの実体がint型の数値であることを示しています。

MODE_SMAやPRICE_CLOSEをPrint関数で表示してみると、その中身が確認できます。
(どちらも0が表示されます。)
MODE_SMAと書いても0と書いても同じ意味になるということです。

上記のiMAの呼び出しは、下記のように書き換えられることになります。

double ma = iMA(Symbol(),Period(),20,0,0,0);

書き換え前とどちらが読みやすいかは明らかで、数値がそのまま書いてあるとそれが何を意味するのかパッと見ではわかりにくくなります。

列挙型を使用すると、ソースコードの可読性を向上させ、より安全にコーディングすることができます。

続いて、ボリンジャーバンドを取得する「iBands」関数を見てみます。
iBands – Technical Indicators – MQL4 Reference
下記はiBands関数の定義です。

double iBands(
   string       symbol,           // symbol
   int          timeframe,        // timeframe
   int          period,           // averaging period
   double       deviation,        // standard deviations
   int          bands_shift,      // bands shift
   int          applied_price,    // applied price
   int          mode,             // line index
   int          shift             // shift
);

引数は下記の7つです。

引数のデータ型/名前 意味 渡すデータの例
string / symbol 通貨ペア名の指定です。
EAを稼働させているチャートの通貨ペアを指定したければ、Symbol関数の戻り値を利用します。
“USDJPY”
Symbol()
int / timeframe タイムフレームの指定です。
タイムフレームは何分かを表す整数で指定します。EAを稼働させているチャートで表示しているタイムフレームを指定したければ、Period関数の戻り値を利用します。
5
60
Period()
int / period ボリンジャーバンドの期間の指定です。 20
double / deviation ボリンジャーバンドの偏差の指定です。 2.0
3.0
int / bands_shift 表示シフトの指定です。 5
-10
int / applied_price ボリンジャーバンドの適用価格の指定です。
列挙型ENUM_APPLIED_PRICEを使用します。
PRICE_CLOSE
PRICE_OPEN
PRICE_HIGH
PRICE_LOW
int / mode ボリンジャーバンドのどのラインを取得するかの指定です。 MODE_MAIN
MODE_UPPER
MODE_LOWER
int / shift 現在時刻のバーを0として、何本前のバー時点での値を取得するかの指定です。 0
1

下記は、ボリンジャーバンドの現在足での”上のライン”を取得する記述です。

double upper_line = iBands(Symbol(),Period(),20,2.0,0,PRICE_CLOSE,MODE_UPPER,0);

ボリンジャーバンドのように複数のラインを表示するインジケーターから値を取得する場合は、取得したいラインのインデックスを指定することになります。
上記例では、このインデックスとして列挙型を使用しています。

また、インジケーター関数による値取得は、ある時点のみの値取得であることに注意してください。
私たちが普段インジケーターを使用する時は、そのインジケーターを線として捉え、上昇しているか下降しているかを判断材料に加えることがあります。
プログラムでそれと同じことを行わせる場合は、インジケーター関数を必要な分だけ何度でも呼び出し、値を複数取得する必要があります。

次回は、注文や決済など売買に関わる関数について解説します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントする