ポジションを決済するには、どのポジションに対してかをOrderSelect関数を使用して決める必要があります。口座の中には裁量や他のEAによるポジションも存在する可能性は十分あります。
OrderSelect
このOrderSelect関数はこれ単体ではなく、この後の工程として決済やあるいは指値の変更,損切り利確値の修正など様々ありとても重要です。
Definition
1 2 3 4 5 |
bool OrderSelect( int index, // index or order ticket int select, // flag int pool=MODE_TRADES // mode ); |
Reference: OrderSelect – MQL4 Reference
Parameters
index:
インデックスかチケット番号を指定して注文を特定します。
- インデックス:注文が順番にインデックスが振られているもの
- チケット番号:OrderSend関数での戻り値から得られたチケット番号
注意点としては、両者ともに状況に応じて変更され固定では無いこともあり、これ以外の限定条件を設定して絞り込む必要があるかもしれません
select:
インデックスあるいはチケット番号で指定したことを明示させます。
- SELECT_BY_POS:インデックス
- SELECT_BY_TICKET:チケット番号
pool=MODE_TRADES:
オプションなのですが、注文がどの状態にあるかを指定します。大まかには現行の注文と既に決済したものもがあり、
- MODE_TRADES:order poolにあるもの
- 保有中のポジション
- 待機注文
- MODE_HISTORY:history poolにある
- 既に決済
- 取消した注文
Sample Code
チケット番号から選択する例です。
1 2 3 4 5 6 7 8 9 10 11 12 |
int Ticket = 1234; int MagicNumber = 56789; if(OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES) == true){ if(OrderMagicNumber() == MagicNumber){ // 通過ペア、売り買い、その他の条件から目的のポジションを選択する // 手仕舞い処理など } } else{ Print("OrderSelect returned the error of ",GetLastError()); } |
チケット番号は、部分決済時と待機注文のエントリー時に新しい番号に変わってしまうため固定として扱うと問題になります。MQL4のOrderSelect関数を正しく理解する
常に追いかけていくか、あるいは部分決済や指値注文をしないという選択もあります(現実的かも)
ただそれでもMT4を止めて再起動させた場合にリセットされてしまいます。VPSのセキュリティーパッチのアップデートなどで時々あります。
その場合は、マジックナンバーなどでポジションから絞り込んでチケット番号を再度振っておくなどである程度対処できます。
インデックスを使うケースではOrdersTotal()関数で待機・保持ポジションの全数を取得して条件にあうインデックスを選びます。
1 2 3 4 5 6 7 8 9 10 11 |
int MagicNumber = 56789; for(int i = 0; i < OrdersTotal(); i++){ if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true){ if(OrderMagicNumber() == MagicNumber){ if(OrderSymbol() == Symbol() && OrderType() == OP_BUY){ // 目的のポジションが選択できれば、手仕舞い処理など } } } } |
References:
OrderSelect – MQL4 Reference
OrdersTotal – MQL4 Reference
OrderMagicNumber – MQL4 Reference
MQL4のOrderSelect関数を正しく理解する