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

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

 

2012年11月19日(月)

MQL4/MQL5のオーダー関数(5)〜OrderSend()直後の処理 [MQL5]



今回はOrderSend()関数でオーダーを送信した直後の処理についてみていきます。

まずは、MQL4の場合、

   int magic = 1000;
double lots = 0.1;
int slippage = 20;
OrderSend(Symbol(), OP_BUY, lots, Ask, slippage, 0, 0, "", magic);

double pos = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
pos = OrderLots();
break;
}
Print("pos=", pos);

のように成行買いオーダーを送信した直後に、約定したオーダーのロット数を取得するコードを実行すると、ちゃんと「pos=0.1」と表示されます。

以前はこのケースだと、オーダーが約定する前にロット数を取得しようとして、「pos=0」と表示されたような気がしたのですが、それは気のせいだったのか、今はOKのようです。

また、OrderSend()は戻り値としてオーダーのチケット番号を返すので、次のように記述すると、そのチケット番号からオーダーの情報を取得することができます。

   int magic = 1000;
double lots = 0.1;
int slippage = 20;
int ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, slippage, 0, 0, "", magic);

double pos = 0;
if(OrderSelect(ticket, SELECT_BY_TICKET)) pos = OrderLots();
Print("pos=", pos);

この場合も「pos=0.1」と表示され、約定した情報が取得できています。

一方、MQL5の場合、以下のコードのようにOrderSend()の直後にポジションのロット数を取得する関数を実行したとします。

   MqlTradeRequest request={0};
MqlTradeResult result={0};
MqlTick tick;
SymbolInfoTick(_Symbol, tick);
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = 0.1;
request.price = tick.ask;
request.deviation = 20;
request.type = ORDER_TYPE_BUY;
request.type_filling = ORDER_FILLING_FOK;

OrderSend(request,result);

double pos = 0;
if(PositionSelect(_Symbol)) pos = PositionGetDouble(POSITION_VOLUME);
Print("pos=", pos);

ここでオーダーが約定していれば「pos=0.1」と表示されるはずですが、ほとんどのケースで「pos=0」と表示されます。

ところが、OrderSend()の後に「Sleep(1000)」などを入れて時間(ここでは1秒)をおけば、「pos=0.1」と表示されるケースが増えてきます。

つまり、オーダーの約定の情報がPositionSelect()で取得できるポジションの情報に反映するまでに時間がかかっているということのようです。

ただ、1秒おけば確実かどうか保証できないので、どのくらい時間をおけばよいのか悩ましいところです。

この悩ましい判断を避けるために、OrderSend()に渡すresult というパラメータの戻り値を利用する方法があります。

resultは、MqlTradeResult型の構造体であり、以下のように定義されています。

struct MqlTradeResult
{
uint retcode;
ulong deal;
ulong order;
double volume;
double price;
double bid;
double ask;
string comment;
};

それぞれのメンバーの意味は以下の通りです。

retcode 処理結果を表すコード
deal 約定結果のチケット番号(成行注文の場合)
order 注文結果のチケット番号(待機注文の場合)
volume 売買ロット数
price 売買価格
bid 現在の売値
ask 現在の買値
comment 業者のコメント

ここで、result.retcode が 10009(TRADE_RETCODE_DONE) を返せば、注文の執行は成功したと判断できます。なので、

   OrderSend(request,result);
double pos = 0;
if(result.retcode == TRADE_RETCODE_DONE) pos = result.volume;
Print("pos=", pos);

のように記述すると、OrderSend()の直後でも「pos=0.1」と表示されます。

ただし、result.volumeは、あくまでこのオーダーの約定情報です。通貨ペア毎に合算されたポジションの情報とは違うので注意が必要です。


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




Posted at 16時39分


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

Sponsor AD

2012/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

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

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

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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