「OriginalCpending.mqh」ファイルの全体記述は以下の通りです。
//+------------------------------------------------------------------+
//| OriginalCpending.mqh |
//| MQL5ssei |
//| https://mqlinvestmentlab.com/ |
//+------------------------------------------------------------------+
#property copyright "MQL5ssei"
#property link "https://mqlinvestmentlab.com/"
#property version "1.00"
class OriginalCpending
{
private:
void OrderCount(string parSymbol);
int CountBuyLimit, CountSellLimit, CountBuyStop, CountSellStop, CountBuyStopLimit, CountSellStopLimit, CountTotalPending;
ulong TicketsPending[];
public:
int BuyLimitNum(string parSymbol);
int SellLimitNum(string parSymbol);
int BuyStopNum(string parSymbol);
int SellStopNum(string parSymbol);
int BuyStopLimitNum(string parSymbol);
int SellStopLimitNum(string parSymbol);
int TotalPendingNum(string parSymbol);
void GetOrderTickets(string parSymbol, ulong &parTickets[]);
};
void OriginalCpending::OrderCount(string parSymbol)
{
//ポジション数を格納する変数の初期化
CountBuyLimit = 0;
CountSellLimit = 0;
CountBuyStop = 0;
CountSellStop = 0;
CountBuyStopLimit = 0;
CountSellStopLimit = 0;
CountTotalPending = 0;
//オーダー番号を格納する配列の初期化とリサイズ
ArrayResize(TicketsPending, 1);
ArrayInitialize(TicketsPending, 0);
for(int i = 0; i < OrdersTotal(); i++)//注文数分チェック
{
ulong ticket = OrderGetTicket(i);
if(OrderGetString(ORDER_SYMBOL) == parSymbol)
{
long type = OrderGetInteger(ORDER_TYPE);
switch((int)type)
{
case ORDER_TYPE_BUY_STOP://ストップ買い待機注文なら
CountBuyStop++;//インクリメント
break;
case ORDER_TYPE_SELL_STOP://ストップ売り待機注文なら
CountSellStop++;//インクリメント
break;
case ORDER_TYPE_BUY_LIMIT://リミット買い待機注文なら
CountBuyLimit++;//インクリメント
break;
case ORDER_TYPE_SELL_LIMIT://リミット売り待機注文なら
CountSellLimit++; //インクリメント
break;
case ORDER_TYPE_BUY_STOP_LIMIT://ストップリミット買い待機注文なら
CountBuyStopLimit++;//インクリメント
break;
case ORDER_TYPE_SELL_STOP_LIMIT://ストップリミット売り待機注文なら
CountSellStopLimit++; //インクリメント
break;
}//switch文の終わり
//全体の待機注文数をインクリメント
CountTotalPending++;
ArrayResize(TicketsPending,CountTotalPending);
TicketsPending[ArraySize(TicketsPending)-1] = ticket;
}//if文の終わり
}//for文の終わり
}//処理実装記述の終わり
// 買いのリミット注文数を取得する
int OriginalCpending::BuyLimitNum(string parSymbol)
{
OrderCount(parSymbol);
return(CountBuyLimit);
}
// 売りのリミット注文数を取得する
int OriginalCpending::SellLimitNum(string parSymbol)
{
OrderCount(parSymbol);
return(CountSellLimit);
}
// 買いのストップト注文数を取得する
int OriginalCpending::BuyStopNum(string parSymbol)
{
OrderCount(parSymbol);
return(CountBuyStop);
}
// 売りのストップト注文数を取得する
int OriginalCpending::SellStopNum(string parSymbol)
{
OrderCount(parSymbol);
return(CountSellStop);
}
// 買いのストップトリミット注文数を取得する
int OriginalCpending::BuyStopLimitNum(string parSymbol)
{
OrderCount(parSymbol);
return(CountBuyStopLimit);
}
// 売りのストップトリミット注文数を取得する
int OriginalCpending::SellStopLimitNum(string parSymbol)
{
OrderCount(parSymbol);
return(CountSellStopLimit);
}
//待機注文全体の数を取得する
int OriginalCpending::TotalPendingNum(string parSymbol)
{
OrderCount(parSymbol);
return(CountTotalPending);
}
//オーダー番号を取得する
void OriginalCpending::GetOrderTickets(string parSymbol,ulong &parTickets[])
{
OrderCount(parSymbol);//注文種別の振り分けと、各種配列各種格納配列へのオーダー番号代入を行う
ArrayCopy(parTickets,TicketsPending);//メインプラグラムで用意した待機注文格納配列にオーダー番号をコピー
return;
}