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

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

 

2010年09月06日(月)

MQL5でEA(2) [MetaTrader5]



今回はEAに欠かせないトレードに関する関数についてみてみましょう。

MQL4では、トレードに関して以下の4つの関数が用意されていました。

OrderSend() - 成行、指値、逆指値売買オーダーの送信
OrderClose() - オープンポジションの決済
OrderDelete() - 指値、逆指値の待機オーダーのキャンセル
OrderModify() - オーダーの変更

MQL5では、これらのトレードに関する機能は、一つの関数OrderSend()に集約されています。但し、このOrderSend()という関数は、MQL4の場合と同じ名前ですが、使い方は全く違います

まず、関数の宣言ですが、
bool  OrderSend(
MqlTradeRequest& request, // query structure
MqlTradeResult& result // structure of the answer
);

となっています。たったこれだけです。つまり、引数は二つしかないのです。

但し、引数の型は、それぞれ「MqlTradeRequest」と、「MqlTradeResult」となっています。

MqlTradeRequest、MqlTradeResultという型なんて聞いたことがないと思いますが、これはデータ型ではなく、MQL5で予め定義されている構造体の識別名なのです。

それぞれの構造体は以下のように定義されています。

struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action; // Trade operation type
ulong magic; // Expert Advisor ID (magic number)
ulong order; // Order ticket
string symbol; // Trade symbol
double volume; // Requested volume for a deal in lots
double price; // Price
double stoplimit; // StopLimit level of the order
double sl; // Stop Loss level of the order
double tp; // Take Profit level of the order
ulong deviation; // Maximal possible deviation from the requested price
ENUM_ORDER_TYPE type; // Order type
ENUM_ORDER_TYPE_FILLING type_filling; // Order execution type
ENUM_ORDER_TYPE_TIME type_time; // Order execution time
datetime expiration; // Order expiration time (for the orders of ORDER_TIME_SPECIFIED type)
string comment; // Order comment
};

struct MqlTradeResult
{
uint retcode; // Operation return code
ulong deal; // Deal ticket, if it is performed
ulong order; // Order ticket, if it is placed
double volume; // Deal volume, confirmed by broker
double price; // Deal price, confirmed by broker
double bid; // Current Bid price
double ask; // Current Ask price
string comment; // Broker comment to operation (by default it is filled by the operation description)
};

OrderSend()の仕組みは、大雑把に言うとこうです。MqlTradeRequestの構造体変数でオーダーの種類や価格、SL、TPを指定してOrderSend()に渡し、その結果がMqlTradeResultの構造体変数に格納されて返ってくるといった感じです。

ここでは、それぞれの構造体の詳しい説明は省略します。とりあえず、指値買いオーダーを送信する例についてみてみます。

まずは、MqlTradeRequest、MqlTradeResultの構造体変数を宣言します。
MqlTradeRequest request;
MqlTradeResult result;

この例では、requestresult というのが変数名ですが、必ずしもこの名前にする必要はありません。

次に request という構造体変数のそれぞれのフィールドに適切な値を代入します。

action」というフィールドで、成行、指値、修正、キャンセルなどの指示を行います。それぞれ識別子が決まっており、指値、逆指値オーダーの場合、「TRADE_ACTION_PENDING」を代入します。
request.action = TRADE_ACTION_PENDING;

symbol」というフィールドには、対象となる通貨ペアを代入します。通常は、
request.symbol = _Symbol;

と指定すれば、プログラムを挿入したチャートの通貨ペアとなります。

volume」は売買ロット数です。ここでは、0.1ロットを指定してみます。
request.volume = 0.1;

price」は指値の価格です。ここでは、USD/JPYを対象として80円に設定してみます。
request.price = 80.00;

type」というフィールドでは、買い、売りなどのオーダーの種類を指定します。指値買いの場合、「ORDER_TYPE_BUY_LIMIT」を指定します。
request.type = ORDER_TYPE_BUY_LIMIT;

これで必要最低限の設定は終わりましたので、OrderSend()を実行します。
OrderSend(request,result);

これで実際に指値オーダーが入ればOKですが、うまくいかない場合には、エラーコードを表示させると原因がつかみやすいでしょう。

OrderSend()のエラーコードは、resultのretcodeフィールドに格納されて戻ってきます。
Print("retcode = ",result.retcode);

のように表示させれば、ToolboxウィンドウのExpertsタブにエラーコードが表示されます。

画像(450x286)・拡大画像(800x510)

このように「retcode = 10009」となればOKです。10009というコードはオーダーが正常に実行されたことを意味します。

ただ、その下の行では、「retcode = 10027」となっています。これは、AutoTdradingが無効になっていて、オーダーが送信できなかったということを表します。スクリプトプログラムでも、オーダーを実行するためにはツールバーのAutoTradingのボタンを押して有効にしておく必要があります。

result.retcode は、他にも様々なエラーに対応したコードを返します。詳しくは、MQL5のレファレンスマニュアルのReturn Codes of the Trade Serverを参照してください。

最後に、今回説明したプログラムリストをつけておきます。

void OnStart()
{
MqlTradeRequest request;
MqlTradeResult result;

request.action = TRADE_ACTION_PENDING;
request.symbol = _Symbol;
request.volume = 0.1;
request.price = 80.0;
request.type = ORDER_TYPE_BUY_LIMIT;

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

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




Posted at 15時20分


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

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

相場はランダムウォーク?

相場はランダムウォーク?

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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