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);
ボリンジャーバンドのように複数のラインを表示するインジケーターから値を取得する場合は、取得したいラインのインデックスを指定することになります。
上記例では、このインデックスとして列挙型を使用しています。
また、インジケーター関数による値取得は、ある時点のみの値取得であることに注意してください。
私たちが普段インジケーターを使用する時は、そのインジケーターを線として捉え、上昇しているか下降しているかを判断材料に加えることがあります。
プログラムでそれと同じことを行わせる場合は、インジケーター関数を必要な分だけ何度でも呼び出し、値を複数取得する必要があります。
次回は、注文や決済など売買に関わる関数について解説します。