MT5 共通ライブラリ その3

3.共通ライブラリを使ったEAの基本構成


EAプログラムの基本的な書き方について、前述サンプルEAを使って説明していきます。
libea_sample.mq5は、大きく以下の四つの部分に分けられます。
1.共通ライブラリの読み込み
2.EAのパラメータの宣言
3.ティック時実行関数の定義
4.仕掛けシグナル関数の定義
それぞれの部分について説明していきますね。

3-1 共通ライブラリの読み込み


プログラムの最初に共通ライブラリの読み込みを行います。

//共通ライブラリ

#include “LibEA.mqh”

すべてのEAプログラムに共通です。

“LibEA.mqh”のように記載すると同じフォルダ内でライブラリファイルを読み込みます。

のように記載するとLibEAフォルダからライブラリファイルを読み込みます。

共通ライブラリは複数のファイルで構成されていますが、EAのプログラム中で直接読み込むのは
「LibEA.mqh」だけです。ほかのファイルは、必要に応じてLibEA.mqhから読み込まれます。

3-2 EAのパラメータの宣言

EAのプログラム中で、実行時に値を変えたい変数をEAのパラメータと呼びます。通常、テクニカル指標関数の品数のうち、期間や偏差などテクニカル指標の動きに
直接関係するものをEAのパラメータとすることが多きです。EAのパラメータは、プログラム中では単なる変数です。変数を宣言する際には「input」、あるいは
「sinput」というキーワードをつけることで、実行時に値を変えられるようになります。たとえば、サンプルEAでは、次のように記述してます。

sinput double Lots = 0.1; //売買ロット数
input int FastMAPeriod = 20; //短期移動平均の期間
input int SlowMAPeriod = 50; //長期移動平均の期間

「input」と「sinput」は、実行時に変更可能なパラメータの宣言という意味では違いはありません。ただ、パラメータの最適化の設定で違いがあります。
なお、EAのプログラム中にパラメータの宣言をしなくても、EAのパラメータとしてあらかじめ宣言されている変数があります。それが「MAGIC」と
「SlippagePips」です。

「MAGIC」は、同じEAを複数のチャートで実行する際に、あるチャート上のEAがオープンするポジションと、別のチャート上のEAがオープンするポジション
がお互い鑑賞しないよう区別するための数値です。マジックナンバーと呼ばれます。ライブラリでも「MAGIC」はEAに一つ設定します、ただし、ライブラリ内部では、
さらにポジションごとに異なる数値のマジックナンバーを割り振ります。実際は、ほかのEAと重複しないように設定すればよいだけです。

「SlippagePips」は注文した売買価格と実際の約定価格のずれをどのくらいまで許容するかを指定するパラメータです。これは、MT4、MT5でEAを実行する
際に関係のあるパラメータです。

3-3 ティック時実行関数の定義

EAのプログラムでは、通常、ティックごとに呼び出される「OnTick()」関数を記述します。しかし、今回のご紹介させているライブラリのEAプログラムは「Tick()」
関数として定義します。それは、前述のようなOnTick()関数は、LibEA.mqhのなかに定義してあり、そこでMQL4互換の定義済み変数や四本値配列を設定したのちに、Tick()
関数を呼び出すようにしています。

サンプルEAでは、Tick()関数を次のように定義しています。

//ティック時実行関数
void Tick()
{
int sig_entry = EntrySignal(); //仕掛けシグナル
//成行売買
MyOrderSendPending(sig_entry, sig_entry, Lots,limit_pips);
}

ティックごとに実行されるTick()関数では、基本的に「MyOrderSendMarket」関数を実行するだけです。これは、以下のように三つの引数をとり、特に戻り値はありません。

①仕掛けシグナル
②手仕舞いシグナル
③売買ロット数

3-4 仕掛けシグナル関数の定義

仕掛けシグナル、手仕舞いシグナルは、整数値をとり、「0」の場合はシグナルがないことを意味しプラスの値の場合、買いシグナル、マイナスの値の場合、売りシグナル
を表します。手仕舞いシグナルも同様で仕掛けシグナルの逆の形となります。

サンプルEAでは、EntrySignal()を、次のようなシグナルを生成する関数として定義しています。

int EntrySignal()
{
//1本前と2本前の移動平均
double FastMA1 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double FastMA2 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
double SlowMA1 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double SlowMA2 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);

int ret = 0; //シグナルの初期化

//買いシグナル
if(FastMA2 <= SlowMA2 && FastMA1 > SlowMA1) ret = 1;
//売りシグナル
if(FastMA2 >= SlowMA2 && FastMA1 < SlowMA1) ret = -1;

return ret; //シグナルの出力
}

上記は、2本の移動平均線の交差システムにおける仕掛けシグナルの例です。1本前のバーにおける短期移動平均線を
「FastMA1」に、長期移動平均線を「SlowMA1」に求めます。また2本前のバーにおける短期移動平均を「FastMA2」に、
長期移動平均を「SlowMA2」に求めます。

移動平均の算出には、組み込みテクニカル指標関数である「iMA()」を利用します。「iMA()」は7個の引数をとり、それぞれ以下のような意味があります。

①_Symbol(チャート上の通貨ペア)
②0(チャート上の現在のタイムフレーム)
③FastMAPeriod、SlowMAPeriod(移動平均を算出する期間)
④0(移動平均のシフト)
⑤MODE_SMA(単純移動平均線)
⑥PRICE_CLOSE(終値に対する移動平均)
⑦1.2(移動平均を算出する位置)

これらの引数のうち、3番目が移動平均を算出する期間であり、あらかじめEAのパラメータとして宣言した変数を代入します。

シグナルの条件を判別する「if文」では、2本目のバーから1本目のバーにかけて、短期移動平均が長期移動平均の下から上へ変化したときに、買いシグナル
としてシグナル変数{ret」に「1」を入れて返します。売りシグナルの場合は、買いシグナルの逆となりシグナル変数「ret」に「-1」を入れて返します。

買いシグナル、売りシグナルいずれの条件もみたさない場合は”シグナルなし”としてシグナル変数「ret」は「0」のまま返します。

共通ライブラリには、EAで共通に「必要となるポジションの管理と売買の処理がすべて含まれています。EAの作成者は、どういう条件で売買シグナルを
生成すればよいか、ということだけに専念できるというわけです。

下記は、共通ライブラリダウンロードサイトです。

ダウンロード

shin3をフォローする
System trading topics
タイトルとURLをコピーしました