基礎から学ぶシステムトレード
シストレブログ人気ランキング  

シストレ徹底攻略シストレマスターへの道ワールド・トレーディング・エッジ基礎から学ぶシステムトレードシストレニュースシストレツールシストレナビTOPへ

 

2010年08月30日(月)

MQL5でEA(1) [MetaTrader5]



さて、今回からMQL5でEAを作成してみます。

「EA」は「Expert Advisor」の略で、日本語に直訳すれば「専門の相談員」となります。でも、これでは意味がわからないので、「EA」という言葉は普及しないかなと思っていたのですが、今ではメタトレーダーの自動売買プログラムという意味ですっかり定着したようです。

MQL5のEAも他のプログラム同様、MQL4とは互換性がないので、何回かにわけて説明していきます。

まず、メタエディターからFile - Newを選んでExpert Advisorを選択すると、以下のような新規プログラムが作成されます。

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---

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

ここで、OnInit()、OnDeinit()、OnTick()の3つの関数があります。OnInit()、OnDeinit()はカスタム指標プログラムで出てきたものと同じで、それぞれプログラムの最初と最後に呼ばれる関数です。

OnTick()というのは初めて出てきましたが、これは MQL4での start()と同じものです。ティック毎に実行される関数です。

今回はまず準備として、MQL4で定義済み変数としてすぐに使えたものをMQL5用に用意しておきましょう。

最初にBidとAskです。BidとAskはプログラム全体で使えるように外部変数として宣言しておきます。

そして、以前の記事のように構造体MqlTickSymbolInfoTick()という関数を使って取得します。

ただ、これらを書く場所ですが、レートの更新はティック毎だけでなく、トレードの直前に行うこともあるので、RefreshRates()という関数(これはMQL4では組込み関数でした)を作って、そこに書いておくことにします。

以下のリストは、ティック毎にBid、Askを表示させるだけのEAです。

double Bid, Ask;

// 初期化関数
int OnInit()
{
return(0);
}

// 終了関数
void OnDeinit(const int reason)
{
}

// ティック関数
void OnTick()
{
if(!RefreshRates()) return;
Print("Bid=", Bid);
Print("Ask=", Ask);
}

// レートの更新
bool RefreshRates()
{
MqlTick tick;
if(!SymbolInfoTick(_Symbol, tick)) return(false);
Bid = tick.bid;
Ask = tick.ask;
return(true);
}

いくつかif文が出てきますが、これらは「念のため」といったところです。

SymbolInfoTick()は、正常にレートが取得できなかった場合にfalseを返すので、その場合RefreshRates()もfalseを返すようにしています。なお、

if(!SymbolInfoTick(_Symbol, tick)) return(false);

は、
if(SymbolInfoTick(_Symbol, tick) == false) return(false);

と同じ意味です。

同じく
if(!RefreshRates()) return;


if(RefreshRates() == false) return;

と同じ意味です。

ここで、return に戻り値がついていないのは、Ontick()void(戻り値なし)として宣言されているからです。

RefreshRates()でレート更新ができなかった場合は、それ以降のプログラムをスキップしてOnTick()関数を終了します。

次にチャートの4本値です。カスタム指標プログラムでは、OnCalculate()関数の引数としてOpen[]、High[]、Low[]、Close[]などの配列が使えたのですが、EAの場合、そのままでは使えません。

EAで4本値を使う方法について、Close[]を例にとって説明します。

まずは、Close[]を外部変数として宣言します。
double Close[];

そして、OnInit()中に、
ArraySetAsSeries(Close, true);

と書き、Close[]を時系列配列(最新のデータがClose[0]、1本前のデータがClose[1]・・・)に設定します。

そして、RefreshRates()関数中に、CopyClose()という関数を使い、終値配列をClose[]配列にコピーします。このCopyClose()関数は、前回CopyBuffer()関数と同じような使い方をします。
CopyClose(_Symbol, _Period, 0, count, Close)

と書くと、挿入したチャートの通貨ペア、タイムフレームにおける終値配列の最新の位置(0)からcount個分をClose[]配列にコピーします。

同様にOpen[]、Low[]、High[]の場合、CopyOpen()、CopyLow()、CopyHigh()という関数を使います。

以下のリストは、countを10とし、10個分の終値を表示させるプログラムです。

double Bid, Ask;
double Close[];

// 初期化関数
int OnInit()
{
ArraySetAsSeries(Close, true);
return(0);
}

// 終了関数
void OnDeinit(const int reason)
{
}

// ティック関数
void OnTick()
{
if(!RefreshRates()) return;
Print("Bid=", Bid);
Print("Ask=", Ask);
for(int i=0; i<10; i++) Print("Close[", i, "]=", Close[i]);
}

// レートの更新
bool RefreshRates()
{
MqlTick tick;
if(!SymbolInfoTick(_Symbol, tick)) return(false);
Bid = tick.bid;
Ask = tick.ask;

int count = 10;
if(CopyClose(_Symbol, _Period, 0, count, Close) < count) return(false);
return(true);
}

CopClose()もCopyBuffer()と同様、実際にコピーしたデータの個数を返すので、それがcountより少ない場合、エラーとしてfalseを返しています。

これで、プログラム中で終値をClose[0]、Close[1]などと参照することができるようになりました。

次回はトレードに関する関数について見ていきます。


>>“基礎から学ぶシステムトレード”全記事バックナンバーはこちらから




Posted at 14時58分


ページのトップへ ページのトップへ

Sponsor AD

2010/8

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

プロフィール

豊嶋久道

2003年よりFX取引を始め、システムトレードの道へ。最近ではFXオプション取引も含めたトレーディングシステムの研究を行っている。システムトレードを基礎から正しく理解するための情報を発信する予定。

PHOTO

ランダムウォークとランダムトレード(4)

ランダムウォークとランダムトレード(4)

カテゴリーリスト

最近の記事

検索


当サイトコメントについて

当コメントは情報提供のみを目的として作成されたものであり、投資に関してはご自身でご判断くださいますようお願い致します。また、当資料は著作物であり著作権法により保護されております。無断で全文または一部を転載することはできません。

RSS1.0

[Login]


powered by a-blog
Copyright (C) 2008 PhiConcept,Inc. All rights reserved.