//+------------------------------------------------------------------+ //| スクリプトプログラム開始関数 | //+------------------------------------------------------------------+ 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); } } |