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

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

 

2010年11月01日(月)

MQL5:トレードクラスを使ったEA [MetaTrader5]



前回紹介したMQL5の標準ライブラリですが、MT5自身がまだ発展途上ということもあり、MT5のアップデートの度に増えたり、変更になったりしています。

今回は、一応ドキュメントにも掲載されているトレードに関するクラスを取り上げます。

以前の記事でMQL5で書いた簡単なEAのプログラムを紹介しました。

トレードを実行する関数はOrderSend()ですが、単に関数を呼び出すだけではなく、構造体を使って売買価格やSL、TPを指定するなど、いくつかの手続きが必要となるので、別途関数を作成してみました。

関数も一度作ってしまえば別のプログラムに流用することができますが、ここでは、独自の関数は作らないで、標準ライブラリのトレードクラスを使ってEAを作成してみることにします。

使い方は簡単で、まず、トレードクラス(CTrade)が宣言されているヘッダファイルをインクルードします。プログラムの最初に

#include <Trade¥Trade.mqh>

と書くだけです。
 
これで、[データフォルダ]¥MQL5¥Include¥Trade¥Trade.mqh というファイルを読み込んだことになります。

ここでは、このファイルの中身については触れません。このファイルをインクルードすると、CTrade というクラスが使えるようになるということだけ理解してください。

実際のCTradeクラスの使い方ですが、

CTrade Trade;

と書いて Trade という名前のCTradeクラスのオブジェクトを宣言します。これは、
int a;

と書いて、aという名前のint型の変数を宣言したというのと同じ形式です。「CTradeクラス」というのを「CTradeの型」、「オブジェクト」を「変数」と置き換えるとイメージしやすいでしょう。

このようにCTradeクラスのオブジェクトを宣言すると、成行オーダーの場合、PositionOpen()というメンバ関数を利用することができます。

メンバ関数というのは、クラスオブジェクトに関連づけられた関数です。PositionOpen()だけを単独で使うことはできず、オブジェクトとセットで利用します。

具体的には、構造体のときのメンバ変数のように、Trade というオブジェクト名の後に「.」をつけて、Trade.PositionOpen()という形で使います。

PositionOpen()というメンバ関数は、以下のような引数を取ります。
const string     symbol,         // 通貨ペア名
ENUM_ORDER_TYPE  order_type,     // オーダーの種類
double           volume,         // 売買ロット数
double           price,          // 売買価格
double           sl,             // 損切り価格
double           tp,             // 利食い価格
const string     comment=""      // コメント

ここでorder_typeは、買いの場合、ORDER_TYPE_BUY、売りの場合、ORDER_TYPE_SELLのどちらかを指定します。損切り価格、利食い価格を設定しない場合は、0を代入します。またcommentは省略可能です。

このメンバ関数を利用すると、OnTick()関数中の成行オーダーの部分は、

OrderSendMarket(ORDER_TYPE_BUY, lots);
OrderSendMarket(ORDER_TYPE_SELL, lots);

の代わりに
Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, lots, Ask, 0, 0); 
Trade.PositionOpen(_Symbol, ORDER_TYPE_SELL, lots, Bid, 0, 0); 

と書くことができます。

但し、PositionOpen()関数では、スリッページを設定する引数がありません。これは、別のメンバ関数で設定する必要があります。

スリッページは通常、トレードのたびに変化することはないので、最初に1回だけ設定しておきます。OnInit()関数中に
Trade.SetDeviationInPoints(Slippage);
 
と書いておけば、Slippageという変数の値がTradeオブジェクトで使うスリッページとして設定されます。

以上説明したCTradeというクラスを使って書き換えた全体のEAプログラムを以下に示します。

#include <Trade¥Trade.mqh>

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

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

// テクニカル指標ハンドル
int hMA;

// iMA()用配列
double BufMA[];

// CTradeクラス
CTrade Trade;

// 初期化関数
int OnInit()
{
// テクニカル指標の初期化
hMA = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE);
ArraySetAsSeries(BufMA, true);
ArraySetAsSeries(Close, true);

// スリッページの設定
int slippage = Slippage;
if(_Digits == 3 || _Digits == 5) slippage *= 10;
Trade.SetDeviationInPoints(slippage);

return(0);
}

// 終了関数
void OnDeinit(const int reason)
{
// テクニカル指標の解放
IndicatorRelease(hMA);
}

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

if(pos <= 0 && Close[2] <= BufMA[2] && Close[1] > BufMA[1])
Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, lots, Ask, 0, 0);
if(pos >= 0 && Close[2] >= BufMA[2] && Close[1] < BufMA[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;

int count = 3;
if(CopyClose(_Symbol, _Period, 0, count, Close) < count) return(false);
if(CopyBuffer(hMA, 0, 0, count, BufMA) < 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 14時04分


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

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.