HistorySelectByPosition

指定されたポジション識別子を有する取引や注文履歴を取得します。

bool  HistorySelectByPosition(
  ulong   position_id    // ポジション識別子 - POSITION_IDENTIFIER
  );

パラメータ

position_id

[in]  全ての実行された注文と約定に設定されるポジション識別子

戻り値

成功の場合は true、それ以外の場合は false

注意事項

取引履歴の注文を「ツールボックス」バーの「取引」タブに表示される未決注文 と混乱してはいけません。取り消されたまたはトランザクションにつながった 注文のリストはクライアント端末の「ツールボックス」バーの「履歴」タブで見られます。

HistorySelectByPosition() は MQL5 プログラムに指定されたポジション識別子 を持った注文リストと約定リストを作成し、対応する関数での要素参照を可能にします。約定リストのサイズは HistoryDealsTotal() 関数、注文リストのサイズは HistoryOrdersTotal() 関数を使用して取得することが出来ます。注文リストの要素を全部参照するには HistoryOrderGetTicket()、約定リストの要素を全部参照するには HistoryDealGetTicket() が使用されるべきです。

MQL5 プログラムで使用可能な注文履歴のリストは HistoryOrderSelect() の使用後にリセットされ チケットによる注文の検索が成功した場合、見つかった注文で書き入れられます。MQL5 プログラムで使用可能な取引履歴のリストについても同じことが言えます。それは HistoryDealSelect() にリセットされ、チケットによる取引が受け取られた場合、それで書き込まれます。

例:

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
 {
  long pos_id_array[];         // array for storing position IDs
 
//--- 履歴全部をリクエストする
  if(!HistorySelect(0, TimeCurrent()))
    {
    Print("HistorySelect() failed. Error ", GetLastError());
    return;
    }
   
//--- 配列内の未決注文からすべてのポジションIDを収集する
  int total=HistoryOrdersTotal();
  for(int i=0; i<total; i++)
    {
    ulong ticket=HistoryOrderGetTicket(i);
    if(ticket==0)
        continue;
    ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)HistoryOrderGetInteger(ticket, ORDER_TYPE);
    long pos_id=HistoryOrderGetInteger(ticket, ORDER_POSITION_ID);
    if(type<=ORDER_TYPE_SELL || pos_id==0)
        continue;
     
    int size=ArraySize(pos_id_array);
    if(ArrayResize(pos_id_array, size+1)==size+1)
        pos_id_array[size]=pos_id;
    }
 
//--- 配列内のポジションIDのリストによる
  total=ArraySize(pos_id_array);
  for(int i=0; i<total; i++)
    {
    //--- ヘッダーとポジション、注文、取引のリストを表示する
    long position_id=pos_id_array[i];
    Print("List of orders and deals for position with ID: ", position_id);
    HistorySelectByPositionProcess(position_id);
    }
  /*
  結果:
  List of orders and deals for position with ID: 1819629924
    [0] Order Sell Limit #1819629924
    [1] Order Buy #1819633194
    [0] Entry In Deal Sell #1794972472
    [1] Entry Out Deal Buy #1794975589
  List of orders and deals for position with ID: 1841753970
    [0] Order Sell Stop #1841753970
    [1] Order Buy #1842322160
    [0] Entry In Deal Sell #1817242142
    [1] Entry Out Deal Buy #1817765341
  */
 }
//+------------------------------------------------------------------+
//| ポジションIDによって注文と取引の履歴を選択し、                                |
//| ポジションの注文と取引のリストを操作ログに表示する                              |
//+------------------------------------------------------------------+
bool HistorySelectByPositionProcess(const long position_id)
 {
//--- 指定されたポジションIDを持つ取引と注文の履歴をリクエストする
  if(!HistorySelectByPosition(position_id))
    {
    PrintFormat("HistorySelectByPosition(%I64d) failed. Error %d", position_id, GetLastError());
    return(false);
    }
   
//--- ポジション注文のリストを表示する
  int orders_total=HistoryOrdersTotal();
  for(int i=0; i<orders_total; i++)
    {
    ulong ticket=HistoryOrderGetTicket(i);
    if(ticket==0)
        continue;
    ENUM_ORDER_TYPE order_type=(ENUM_ORDER_TYPE)HistoryOrderGetInteger(ticket, ORDER_TYPE);
    PrintFormat("  [%d] Order %s #%I64u", i, OrderTypeDescription(order_type), ticket);
    }
   
//--- 操作ログにポジション取引のリストを表示する
  int deals_total =HistoryDealsTotal();
  for(int i=0; i<deals_total; i++)
    {
    ulong ticket=HistoryDealGetTicket(i);
    if(ticket==0)
        continue;
    ENUM_DEAL_ENTRY deal_entry=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket, DEAL_ENTRY);
    ENUM_DEAL_TYPE deal_type= (ENUM_DEAL_TYPE)HistoryDealGetInteger(ticket, DEAL_TYPE);
    if(deal_type!=DEAL_TYPE_BUY && deal_type!=DEAL_TYPE_SELL)
        continue;
    PrintFormat("  [%d] Entry %s Deal %s #%I64u", i, DealEntryDescription(deal_entry), DealTypeDescription(deal_type), ticket);
    }
  return(true);
 }
//+------------------------------------------------------------------+
//| 注文タイプの説明を返す                                                 |
//+------------------------------------------------------------------+
string OrderTypeDescription(const ENUM_ORDER_TYPE type)
 {
  switch(type)
    {
    case ORDER_TYPE_BUY              : return("Buy");
    case ORDER_TYPE_SELL             : return("Sell");
    case ORDER_TYPE_BUY_LIMIT        : return("Buy Limit");
    case ORDER_TYPE_SELL_LIMIT       : return("Sell Limit");
    case ORDER_TYPE_BUY_STOP         : return("Buy Stop");
    case ORDER_TYPE_SELL_STOP        : return("Sell Stop");
    case ORDER_TYPE_BUY_STOP_LIMIT   : return("Buy Stop Limit");
    case ORDER_TYPE_SELL_STOP_LIMIT  : return("Sell Stop Limit");
    default                          : return("Unknown order type: "+(string)type);
    }
 }
//+------------------------------------------------------------------+
//| ポジション取引のタイプ説明を返す                                          |  
//+------------------------------------------------------------------+
string DealTypeDescription(const ENUM_DEAL_TYPE type)
 {
  switch(type)
    {
    //--- BuyおよびSellの取引の説明のみを返す
    //--- (他のすべてのタイプはポジションに適用されないため)
    case DEAL_TYPE_BUY   : return("Buy");
    case DEAL_TYPE_SELL  : return("Sell");
    default              : return("Unknown deal type: "+(string)type);
    }
 }
//+------------------------------------------------------------------+
//| ポジション変更法を返す                                                 |
//+------------------------------------------------------------------+
string DealEntryDescription(const ENUM_DEAL_ENTRY entry)
 {
  switch(entry)
    {
    case DEAL_ENTRY_IN      : return("In");
    case DEAL_ENTRY_OUT     : return("Out");
    case DEAL_ENTRY_INOUT   : return("InOut");
    case DEAL_ENTRY_OUT_BY  : return("Out by");
    case DEAL_ENTRY_STATE   : return("Status record");
    default                 : return("Unknown deal entry: "+(string)entry);
    }
 }

参照

HistorySelect()HistoryOrderGetTicket()注文プロパティ