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

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

 

2010年09月13日(月)

MQL5でEA(3) [MetaTrader5]



前回はトレード関数OrderSend()の簡単な使い方について説明しました。

今回は、EAに組み込む際に使いやすいように、OrderSend()を実行する手続きをまとめて関数の形にしてみます。

その前にMQL5というかMT5になってオープンポジションの扱いが大きく変わったので、それについて説明しておきましょう。

MQL4では、OrderSend()で送信した成行や指値、逆指値などのオーダーは、個別にチケット番号が振られ、別々に扱われていました。

オープンポジションについても同じで、次のように同じ通貨ペアで複数のポジションを個別に見ることができました。また買いポジションと売りポジションを同時に取る両建ても可能でした。

MQL4のオープンポジション
ポジション1:USD/JPY 0.1 ロット 買いポジション
ポジション2:USD/JPY 0.1 ロット 買いポジション
ポジション3:USD/JPY 0.1 ロット 買いポジション
ポジション4:USD/JPY 0.1 ロット 売りポジション


ところが、MQL5では、指値や逆指値の待機オーダーは別々に扱われますが、一旦約定してオープンポジションになってしまうと、それらは通貨ペア毎にまとめて扱われます。

つまり、上の4ポジションは、売りポジションと買いポジションが相殺され、さらに残りの2つの買いポジションもまとめられて1つのポジション
MQL5のオープンポジション
ポジション:USD/JPY 0.2 ロット 買いポジション

だけになってしまいます。

ここでは、MQL5特有のポジションの扱いを頭において、売買システムを考えていくことにします。

まずは成行でポジションを建てる関数を作ってみます。リストを以下に示します。

// 成行オーダー
void OrderSendMarket(ENUM_ORDER_TYPE type, double lots)
{
MqlTradeRequest request;
MqlTradeResult result;

request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
if(type == ORDER_TYPE_BUY) request.price = Ask;
else if(type == ORDER_TYPE_SELL) request.price = Bid;
request.deviation = Slippage;
request.volume = lots;
request.type = type;

OrderSend(request,result);
Print("OrderSendRetCode = ", result.retcode);
}

MQL4のOrderSend()のように引数を何個もとってもよいのですが、ここでは簡単のため、買いか売りかを指定する「type」と、売買ロット数「lots」だけを引数としてみます。

OrderSend()の使い方は前回の記事とだいたい同じです。違うところだけ説明します。

成行オーダーの場合、 request.action に、「TRADE_ACTION_DEAL」を代入します。

引数の「type」は、ENUM_ORDER_TYPEという型になっていますが、この引数はそのまま、request.typeに代入されます。ここでは、成行買いと成行売りのみを指定できるようにしますが、その識別子はそれぞれ、ORDER_TYPE_BUYORDER_TYPE_SELLとなっています。

request.priceは、売りと買いで異なるので、typeがORDER_TYPE_BUYの場合、買いなので、Askを、typeがORDER_TYPE_SELLの場合、売りなので、Bidを代入するようにします。

もう1つ、EAを作成する際に利用する関数として、オープンポジションのロット数を求める関数を作っておきます。ここでは、買いポジションの場合、プラス売りポジションの場合、マイナスの値としてロット数を返す関数にしてみます。

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

まず、PositionSelect(_Symbol)は、挿入したチャートの通貨ペアでオープンポジションがあるかどうかを判別する関数で、オープンポジションがあれば trueを返し、なければfalse を返します。

オープンポジションがある場合、PositionGetDouble(POSITION_VOLUME)でロット数を求めます。

ただし、売りポジションの場合、マイナスの値として返すために、PositionGetInteger(POSITION_TYPE)でポジションのタイプを求め、それが、POSITION_TYPE_SELL(売りポジション)の場合、lotsをマイナスにします。

以上、二つの関数を作ってみましたが、これらをテストするための簡単なスクリプトプログラムを次に示します。

input double Lots = 0.1;
input int Slippage = 2;
double Bid, Ask;

void OnStart()
{
if(!RefreshRates()) return;

Print("Open Lots = ", OpenLots());

int ret = MessageBox("Buy at market", "TradeTest", MB_OKCANCEL);
if(ret == IDOK) OrderSendMarket(ORDER_TYPE_BUY, Lots);

ret = MessageBox("Sell at market", "TradeTest", MB_OKCANCEL);
if(ret == IDOK) OrderSendMarket(ORDER_TYPE_SELL, Lots);
}

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

// 成行オーダー
void OrderSendMarket(ENUM_ORDER_TYPE type, double lots)
{
MqlTradeRequest request;
MqlTradeResult result;

request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
if(type == ORDER_TYPE_BUY) request.price = Ask;
else if(type == ORDER_TYPE_SELL) request.price = Bid;
request.deviation = Slippage;
request.volume = lots;
request.type = type;

OrderSend(request,result);
Print("OrderSendRetCode = ", result.retcode);
}

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

まず、以前の記事で説明したRefreshRates()でBid、Askを更新します。

次に、OpenLots()でオープンポジションのロット数を表示します。

そして、

OrderSendMarket(ORDER_TYPE_BUY, Lots);
OrderSendMarket(ORDER_TYPE_SELL, Lots);

成行き買いオーダーと、成行き売りオーダーを実行しますが、実行するかどうかはユーザーが選択できるように、MessageBox()関数でメッセージボックスを表示します。ここで、Okボタンを押すと、実際にオーダーが実行されるようになっています。

このプログラムで実際に売買を行ってみて、それぞれの関数の動きを確認してみてください。但し、言うまでもないことですが、このプログラムは必ずデモ口座で行ってくださいね。

これでようやくEAを作成する準備ができました。次回は簡単なEAを作成してみます。


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




Posted at 11時54分


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

Sponsor AD

2010/9

      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

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

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

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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