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

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

 

2012年09月03日(月)

MT5で両建てシステム(7)〜仮想ポジションのデータ管理 [MQL5]



仮想ポジションはあくまで仮想なので、ポジション情報を参照する場合に、いちいち過去のディールから探して来ないといけません。

そこで、仮想ポジションの情報をプログラム中ですぐに取り出せるように変数に保存しておくことを考えてみます。

ポジション情報として必要なデータは、まずは仮想ポジションに対応するディールの固有IDであるディールチケット番号です。このチケット番号がわかっていると、そのディールの情報は比較的簡単に参照することができます。

他にわかっていた方が便利な情報は、ポジションの売買の種類、ロット数、売買価格でしょうか。この辺はポジションを決済するときの条件として参照することが多いでしょう。

実は、これらの情報は、OrderSend()でオーダーを送信したときに取得できる情報です。

ということで、前回に引き続いて、OrderSend()の説明を続けます。

OrderSend(request,result);

では、requestにオーダーの条件を代入するわけですが、その結果は、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 業者のコメント

retcodeには、数十種類のコードがあり、基本的に10009(TRADE_RETCODE_DONE)を返せば、注文は成功したと判断できます。それ以外の場合は失敗した原因に対応したコードがretcodeに代入されるので、それにより失敗した原因を特定することができます。

成行オーダーが約定した場合、dealというメンバーにディールチケットが格納されます。また、volumeに売買ロット数、priceに売買価格が格納されるので、これらの情報を変数に保存することにします。

データはこの3つだけですが、ここでは構造体を定義してみます。

struct MyPosition
{
ulong ticket;
double lots;
double price;
};

チケット番号、売買ロット数、売買価格がそれぞれ、ticket、lots、priceというメンバーに対応しています。

ただし、売買の種類については、売りポジションの場合、ロット数をマイナスの値にして区別することにします。

プログラム中では、この構造体を外部変数として以下のように宣言しておきます。

MyPosition MyPos;

こうすることにより、MyPos.ticketにチケット番号、MyPos.lots に売買ロット数、MyPos.priceに売買価格が保存されることになります。

これを使って、前回紹介した成行オーダー関数OrderSendMarket()を手直ししておきます。

// 成行オーダー
bool OrderSendMarket(string symbol, ENUM_ORDER_TYPE type, double volume)
{
MqlTradeRequest request={0};
MqlTradeResult result={0};

MqlTick tick;
SymbolInfoTick(symbol, tick);

if(type == ORDER_TYPE_BUY)
{
request.magic = MAGIC_B;
request.price = tick.ask;
}
else if(type == ORDER_TYPE_SELL)
{
request.magic = MAGIC_S;
request.price = tick.bid;
}
else return(false);

request.action = TRADE_ACTION_DEAL;
request.symbol = symbol;
request.volume = volume;
request.deviation = Slippage;
request.type = type;
request.type_filling = ORDER_FILLING_FOK;

OrderSend(request,result);
if(result.retcode != TRADE_RETCODE_DONE) return(false);

MyPos.ticket = result.deal;
MyPos.lots = result.volume;
MyPos.price = result.price;

if(type == ORDER_TYPE_SELL) MyPos.lots = -MyPos.lots;

return(true);
}

修正点は、以下の通りです。

result.retcode が TRADE_RETCODE_DONEだった場合に、チケット番号、売買ロット数、売買価格をMyPosという変数に代入しています。

最後に売りポジションの場合、MyPos.lotsの値の符号をマイナスにしておわりです。

これでオーダー送信と同時にポジションの情報を変数に保存することができました。

次回はポジションを決済するプログラムについて説明します。


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




Posted at 16時21分


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

Sponsor AD

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