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

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

 

2010年11月08日(月)

MQL5:テクニカル指標クラスを使ったEA [MetaTrader5]



前回、MQL5の標準ライブラリのうち、「トレードクラス」を紹介しました。トレードクラスを使うと、トレードに関する独自の関数を作成する必要がなくなるので、プログラムが若干シンプルになりました。

そういうプログラムをシンプルにするという観点で、今回はテクニカル指標の部分で利用できる「テクニカル指標クラス」を取り上げてみます。

EAでテクニカル指標を利用する場合、指標毎にハンドルや配列を宣言して初期化し、さらにティック毎に指標データを配列にコピーするという手順を踏まなくてはなりませんでした。

このあたりを簡略化できるように、標準ライブラリの中にテクニカル指標クラスが用意されています。ドキュメントはこちらです。

テクニカル指標には、移動平均やRSI、MACDなどたくさんの種類があるのですが、クラスはそれぞれのテクニカル指標毎に用意されています。

例えば、移動平均であれば、「CiMA」RSIであれば、「CiRSI」 というクラスです。これらのクラスの宣言されているヘッダファイルは、大きくトレンド系、オシレータ系などと分かれています。CiMAは 「Indicators¥Trend.mqh」、CiRSIは、「Indicators¥Oscilators.mqh」 というファイルの中で宣言されています。

前回紹介したEAでは、移動平均を使いましたので、ここでも移動平均のクラス、CiMAを使ってEAを作成してみます。

まずは、ヘッダファイルをインクルードします。

#include <Indicators¥Trend.mqh>

そして、トレードクラスのときと同様に
CiMA MA;

と書いて、MAという名前のCiMAクラスのオブジェクトを宣言します。

続いてOnInit()関数中で、MAの初期化を行います。ここでは、Create()というメンバ関数を使って移動平均を計算するチャートや期間、移動平均の種類などを指定します。
MA.Create(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE);

Create()の引数はiMA()の引数と同じで、EAを挿入したチャート上で終値に対して、期間MAPeriodの単純移動平均を取るという意味です。この初期化で移動平均の値を格納する配列も内部的に確保されます。

実際に移動平均の値を参照するためには、Refresh()というメンバ関数を呼び出す必要があります。これは、移動平均の値をMAのメンバ配列にコピーする関数で、RefreshRates()関数中に
MA.Refresh(-1);

と書いておきます。Refresh()関数の引数は、タイムフレーム更新フラグということですが、更新するタイムフレームを指定する必要がない場合は、-1を代入すればよいようです。

これで移動平均の値が更新されれば、実際の値はMain()というメンバ関数で参照されます。

MA.Main(0) と書くと、最新のバーにおける移動平均の値、MA.Main(1)と書くと、1本前のバーにおける移動平均の値となります。これまでのEAプログラム中のOnTick()関数の中の BufMA[2]をMA.Main(2)に、BufMA[1]をMA.Main(1)に置き換えるだけでOKです。
if(pos <= 0 && Close[2] <= MA.Main(2) && Close[1] > MA.Main(1))
Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, lots, Ask, 0, 0, "");
if(pos >= 0 && Close[2] >= MA.Main(2) && Close[1] < MA.Main(1))
Trade.PositionOpen(_Symbol, ORDER_TYPE_SELL, lots, Bid, 0, 0, "");

全体のプログラムは次のようになります。なお、CiMAクラスを使うと、MA用に確保されていた配列は自動的に解放されるので、OnDeinit()でMAの解放を明記する必要はありません。


#include <Trade¥Trade.mqh>
#include <Indicators¥Trend.mqh>

// パラメータ
input int MAPeriod = 20;
input double Lots = 0.1;
input uint Slippage = 2;

// レート
double Bid, Ask;
double Close[];

// トレードクラス
CTrade Trade;

// MAクラス
CiMA MA;

// 初期化関数
int OnInit()
{
// MAの初期化
MA.Create(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE);

ArraySetAsSeries(Close, true);

uint slippage = Slippage;
if(_Digits == 3 || _Digits == 5) slippage *= 10;
Trade.SetDeviationInPoints(slippage);

return(0);
}

// ティック関数
void OnTick()
{
if(!RefreshRates()) return;
double pos = OpenLots();
double lots = MathAbs(pos) + Lots;

if(pos <= 0 && Close[2] <= MA.Main(2) && Close[1] > MA.Main(1))
Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, lots, Ask, 0, 0, "");
if(pos >= 0 && Close[2] >= MA.Main(2) && Close[1] < MA.Main(1))
Trade.PositionOpen(_Symbol, ORDER_TYPE_SELL, lots, Bid, 0, 0, "");
}

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

// MAの更新
MA.Refresh(-1);

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

// オープンポジションのロット数
double OpenLots()
{
double lots = 0.0;
if(PositionSelect(_Symbol))
{
lots = PositionGetDouble(POSITION_VOLUME);
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) lots = -lots;
}
return(lots);
}

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




Posted at 15時21分


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

Sponsor AD

2010/11

  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        

プロフィール

豊嶋久道

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

PHOTO

実際の相場におけるランダムウォーク

実際の相場におけるランダムウォーク

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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