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

シストレ徹底攻略シストレマスターへの道ワールド・トレーディング・エッジ基礎から学ぶシステムトレードシストレニュースシストレツールシストレナビ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分 パーマリンク


2012年11月12日(月)

MQL4/MQL5のオーダー関数(4)〜注文の有効期限 [MQL5]

一般に指値や逆指値などのペンディングオーダーでは、注文の有効期限を指定することができます。

MQL4では、OrderSend()関数に「expiration」というパラメータがあり、ここに有効期限の日時データを代入します。

」を代入すると、有効期限なし(GTC:Good Till Cancel キャンセルするまで有効)ということになります。

一方、MQL5では有効期限に関してもう少しバリエーションがあります。

struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action;
ulong magic;
ulong order;
string symbol;
double volume;
double price;
double stoplimit;
double sl;
double tp;
ulong deviation;
ENUM_ORDER_TYPE type;
ENUM_ORDER_TYPE_FILLING type_filling;
ENUM_ORDER_TYPE_TIME type_time;
datetime expiration;
string comment;
};

上記のMqlTradeRequest型構造体のメンバーのうち、「type_time」と「expiration」が注文の有効期限に関するものです。

まず、type_timeは以下の4種類の定数の中から選びます。

ORDER_TIME_GTC:キャンセルするまで有効
ORDER_TIME_DAY:オーダーを送信した日の終わりまで有効
ORDER_TIME_SPECIFIED:指定した日時まで有効
ORDER_TIME_SPECIFIED_DAY:指定した日の終わりまで有効

有効期限を指定しない場合は、「ORDER_TIME_GTC」を指定します。GTCということで、キャンセルするまで有効となります。

その他の場合は、何らかの有効期限があります。「ORDER_TIME_DAY」を指定すると、その日の終わりまで約定しなければ自動的にキャンセルされます。

ORDER_TIME_SPECIFIED」と「ORDER_TIME_SPECIFIED_DAY」の場合は、さらに「expiration」で具体的な日時を指定します。

ORDER_TIME_SPECIFIEDの場合、 その日時までが有効期限、 ORDER_TIME_SPECIFIED_DAYの場合、その日時で指定した日の終わりまでが有効期限となります。

但し、MQL5でペンディングオーダーの有効期限を指定したEAを作成する場合、注意点があります。

ペンディングオーダーの状態は、有効期限中であれば

OrderGetInteger(ORDER_STATE)

有効期限以降であれば、

HistoryOrderGetInteger(order, ORDER_STATE)

という関数で取得できます。状態の種類は以下の7種類です。

ORDER_STATE_STARTED:注文処理開始
ORDER_STATE_PLACED:注文受理
ORDER_STATE_CANCELED:注文キャンセル
ORDER_STATE_PARTIAL:注文部分約定
ORDER_STATE_FILLED:注文約定
ORDER_STATE_REJECTED:注文拒否
ORDER_STATE_EXPIRED:注文期限切れ

有効期限切れで注文がキャンセルされた場合、ORDER_STATE_CANCELEDあるいは、ORDER_STATE_EXPIREDを返すはずですが、ストラテジーテスターでバックテストを行った場合、オーダーが受理されたままの状態ORDER_STATE_PLACEDを返すようです。

現状のテスターのバグなのかもしれませんが、テスト結果と実際のEAの動作が異なる可能性があるので注意が必要です。

Posted at 16時03分 パーマリンク


2012年11月05日(月)

MQL4/MQL5のオーダー関数(3)〜注文執行の種類 [MQL5]

以前の記事で紹介したように、MQL5のOrderSend()関数は、MQL4とは使い方が全然違うのですが、MQL4のパラメータに対応しているものであれば、なんとなく類推できます。

しかし、MQL4にないパラメータの場合、どう設定すべきかわからないこともあります。

今回は、その一つである「注文執行の種類」について説明します。

MQL5のOrderSend()のパラメータとして渡すMqlTradeRequest型の構造体は次のように定義されています。

struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action;
ulong magic;
ulong order;
string symbol;
double volume;
double price;
double stoplimit;
double sl;
double tp;
ulong deviation;
ENUM_ORDER_TYPE type;
ENUM_ORDER_TYPE_FILLING type_filling;
ENUM_ORDER_TYPE_TIME type_time;
datetime expiration;
string comment;
};

この中の「type_filling」というメンバーが注文執行の種類を表します。

選択できる種類は以下の3つです。

ORDER_FILLING_FOK
ORDER_FILLING_IOC
ORDER_FILLING_RETURN

ここでは簡単に「FOK」「IOC」「RETURN」と呼ぶことにします。

それぞれ

Fill or Kill
Immediate or Cancel
Return

の略ですが、それではよくわからないと思いますので、簡単に説明すると、以下のようになります。

FOK:指定したロット数が約定しない場合、キャンセル
IOC:指定したロット数の一部しか約定しない場合、残りはキャンセル
RETURN:指定したロット数の一部しか約定しない場合でも残りはキャンセルしない

つまり、「FOK」は、指定したロット数が約定するか、しない場合キャンセルということなので、ロット数の一部だけ約定するということはありません。これは、MT4での注文執行と同じです。

「IOC」と「RETURN」の場合、ロット数の一部だけ約定することがあり、その場合、残りのロット数のオーダーをどうするかが異なります。「IOC」の場合、約定しなかったロット数のオーダーはキャンセルされますが、「RETURN」の場合、キャンセルせずに再度オーダーの執行を試みることになります。

ただ、部分約定というのは、株式や先物のトレードにも対応させるためであり、FXの場合、基本的にはFOKで問題ないと思います。

ちなみにお使いのMT5で、どの執行種類に対応しているかを調べるのは、

SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE)

です。この関数は0から7までの値を返します。つまり2進数3ビットと考えて、

FOKに対応している場合、最下位ビット(1の位)が1に、
IOCに対応している場合、2番目のビット(2の位)が1に、
RETURNに対応している場合、3番目のビット(4の位)が1になります。

複数の種類に対応している場合、それぞれのビットの値を足したものになり、すべて対応していれば、1+2+4=7となるわけです。

この値が1,3,5,7、つまり2で割った余りが1であれば、FOKに対応しているということになるのです。

もし、type_filling でエラーが出る場合があれば、この値を確認してみてください。

Posted at 16時29分 パーマリンク


過去の記事へ

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

Sponsor AD

シストレナビモバイル

シストレナビモバイル
ケータイでバーコードを読み取りアクセス(詳細はこちら

プロフィール

豊嶋久道

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

活動状況・Website

ToyolabFX
Toyolab FX-手ぶらで為替取引
FXトレーディング研究所。
FXメタトレーダー入門
FXメタトレーダー入門
最先端システムトレードソフト使いこなし術。
FXメタトレーダー実践プログラミング
FXメタトレーダー実践プログラミング
システム開発過程を段階的に学ぶ。

2017/5

  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 31      

PHOTO

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

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

カテゴリーリスト

最近の記事

スポンサードリンク

検索


上記の検索結果のRSS情報です RSS1.0

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

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

RSS1.0

[Login]


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