OrderSelect関数を利用してポジション情報を確認する方法

MetaTrader 4
GogoJungle
2019/08/02 21:48
16598

ポジションに関する情報を取得する関数

MQL4にはポジションに関する情報を取得するための様々な関数が用意されています。
ポジションに関する情報を取得するには、以下のような関数があります。

OrderTicket ・・・ チケット番号。
OrderSymbol ・・・ 通貨ペア。
OrderType ・・・ 取引種別。
OrderLots ・・・ 取引数量。
OrderOpenPrice ・・・ エントリー価格。
OrderOpenTime ・・・ エントリー時刻。
OrderStopLoss ・・・ ストップロス価格。
OrderTakeProfit ・・・ テイクプロフィット価格。
OrderCloseTime ・・・ 決済時刻。未決済ポジションの場合は0。
OrderClosePrice ・・・ 決済価格。未決済ポジションの場合は現在レート。
OrderExpiration ・・・ 注文の有効期限。
OrderCommission ・・・ 取引手数料。
OrderSwap ・・・ スワップ損益。
OrderProfit ・・・ 損益。
OrderComment ・・・ コメント。OrderSend関数の第8番目の引数で指定した文字列。
OrderMagicNumber ・・・ マジックナンバー。
OrderPrint ・・・ ポジションに関する情報をログへ出力する。

これらの関数を使用してポジション情報を取得するには、まずOrderSelect関数を使用してどのポジションの情報を取得するのかを決める必要があります。

bool OrderSelect()
   int index,
   int select,
   int pool=MODE_TRADES
;

OrderSelect関数の使い方

OrderSelect関数を利用してポジション選択するには、大きく分けて3通りの方法があります。

  1. 保有中のポジション情報の中から選択する方法

第2引数のselectにSELECT_BY_POSと入力し、第3引数のpoolにMODE_TRADESを入力します。
この指定により保有中のポジション一覧の中から選択することが可能となります。

保有中のポジションには0から順に数字(インデックス)が割り振られています。
例えばポジションを3つ保有中の場合は、それぞれのポジションには0,1,2が割り振られています。
このインデックスを第1引数のindexに指定することでポジションが選択されます。

ただしポジションに割り振られたインデックス番号は事前に知ることができないため、保有中のポジションの数だけ繰り返し処理を行い、目的のポジションを探す必要があります。
現在保有中のポジションの数は、OrdersTotal関数で知ることができます。

int OrdersTotal();

OrdersTotal関数の結果の数だけOrderSelect関数を実行します。

for(int i = OrdersHistoryTotal() - 1; i >= 0; i--){
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
   
}

選択されたポジションは裁量トレードによるポジションや他のEAによるポジションの可能性があります。
このEAによるポジションであるかどうかを知るために、OrderMagicNumber関数とOrderSymbol関数を使用してチェックを行います。

for(int i = OrdersHistoryTotal() - 1; i >= 0; i--){
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
   if(OrderMagicNumber() != MagicNumber) continue;
   if(OrderSymbol() != Symbol()) continue;
   
   //目的のポジションが選択された状態
}

変数MagicNumberは外部パラメータとしておき、OrderSend時にマジックナンバーに指定したのと同じ数値を指定します。
同じEAを異なる複数の通貨ペアで使用する場合なども考えられるため、OrderSymbol関数で通貨ペアもチェックしています。

サンプル1
一度だけエントリーを行い、保有中のポジションに関する情報をOrderPrint関数でログとして出力するコードです。
ログはターミナルのエキスパートタブから確認できます。

#property copyright "Copyright 2016, gogojungle"
#property link      "http://labo.fx-on.com"
#property version   "1.00"
#property strict

extern int MagicNumber = 123;

int OnInit(){
   if(OrderSend(Symbol(), OP_BUY, 0.1, Ask, 10, 0, 0, "", MagicNumber) == false){
      return(INIT_FAILED);
   }
   
   for(int i = OrdersTotal() - 1; i >= 0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
      if(OrderMagicNumber() != MagicNumber) continue;
      if(OrderSymbol() != Symbol()) continue;
      
      // 目的のポジションが選択された状態
      // ログを出力
      OrderPrint();
   }
   
   return(INIT_SUCCEEDED);
}

void OnTick(){
}
  1. 決済済みポジション情報の中から選択する方法

保有中のポジションではなく、決済済みのポジションに関する情報を取得したい場合には、第3引数のpoolにMODE_HISTORYと入力します。
決済済みのポジションにも保有中の番号と同様、0から順に数字(インデックス)が割り振られています。
poolにMODE_HISTORYと入力したことで、インデックスを指定して決済済みポジションの中から選択することができます。

決済済みポジションの数はOrdersHistoryTotal関数で知ることができます。

int OrdersHistoryTotal();

方法1と同様にOrdersHistoryTotalの数だけ繰り返し処理を行い、目的のポジションを選択肢ます。

サンプル2
決済済みポジションの中から外部パラメータで指定したマジックナンバーのポジションを探し、ポジション情報を出力します。

#property copyright "Copyright 2016, gogojungle"
#property link      "http://labo.fx-on.com"
#property version   "1.00"
#property strict

extern int MagicNumber = 123;

int OnInit(){
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false) break;
      if(OrderMagicNumber() != MagicNumber) continue;
      if(OrderSymbol() != Symbol()) continue;
      
      // 目的のポジションが選択された状態
      // ログを出力
      OrderPrint();
   }
   
   return(INIT_SUCCEEDED);
}

void OnTick(){
}
  1. チケット番号を使って選択する方法

すでにチケット番号が分かっている場合に使用できる方法です。
OrderSelect関数のindexにチケット番号、selectにSELECT_BY_TICKETを指定します。
SELECT_BY_TICKETを指定した場合にはpoolは関係なくなるため省略できます。
成功するとindexに指定したチケット番号のポジションに関する情報が取得可能となります。

サンプル3
外部パラメータのTicketに指定したチケット番号のポジション情報を出力します。

#property copyright "Copyright 2016, gogojungle"
#property link      "http://labo.fx-on.com"
#property version   "1.00"
#property strict

extern int Ticket = 123456789;

int OnInit(){
   if(OrderSelect(Ticket, SELECT_BY_TICKET) == false){
      return(INIT_FAILED);
   }
   OrderPrint();
   
   return(INIT_SUCCEEDED);
}

void OnTick(){
}
Sample_OrderSelect.zip

コメント

2(購入用)
2020/11/29 17:46

「選択されたポジションは裁量トレードによるポジションや他のEAによるポジションの可能性があります。」
この説明にやっとたどり着きました。

関連トピックス

検索結果がありません。

ノーコードで誰でも簡単EA開発!MQL言語学習にも使える! | GogoJungle

注目トピックス

検索結果がありません。