mql5用ポジション取得コード

mql5用に作ったポジション取得コード
構造体と関数を使用して作ったけどクラスで書き直すことに
捨てるのも勿体ないので誰かの参考になれば

struct pos_st
 {
  datetime          time;       //オープン時間
  string            symbol;     //シンボル
  long              ticket;     //チケットナンバー
  long              magic;      //マジックナンバー
  string            type;       //ポジションタイプ
  double            price;      //オープン価格
  double            volume;     //ロット
  double            sl;         //ストップロス値
  double            tp;         //テイクプロフィット値
  double            profit;     //損益
  double            swap;       //スワップ
  double            commission; //手数料
  string            comment;    //コメント
 };

//ポジション取得関数   
//引数説明 [magno]NULL or 個別 [side]NULL or "LONG" or "SHORT" [symbol]NULL or "個別" "ALL" [mode]"EA" or "EAALL" or "MANUAL" or "ALL"
void getposition(pos_st &pos[], long magno = NULL, string side = NULL, string symbol = NULL, string mode = "EA")
 {

//使い方---------------------------------------------------------------
//magno=NULL&mode="EA" →EA注文ポジション(MagicNumberポジションのみ)
//mode="EAALL"         →EA注文ポジション(MagicNumber関係なし)
//mode="MANUAL"        →裁量ポジションのみ
//mode="ALL"           →EA、裁量全ポジション
//side="BUY"→LONGのみ || "SELL"→SHORTのみ NULL→全ポジ
//symbol=NULL→チャートシンボルのみ || "ALL"→全シンボル || "EURUSD"のように個別指定可
//[1]が最新注文
//--------------------------------------------------------------------

  if(symbol == NULL)
     symbol = _Symbol;
  if(mode == "EA" && magno == NULL)
     magno = MagicNumber;

  pos_init_exe(pos);
  if(PositionsTotal() == 0)
     return;

  for(int i = PositionsTotal() - 1 ; i >= 0 ; i--)
    {

     ulong position_ticket=PositionGetTicket(i);

     string pos_type = PositionTypeToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE));

     if(symbol != "ALL")
       {
        if(PositionGetString(POSITION_SYMBOL) != symbol)
           continue;
       }

     if(side == "BUY")
       {
        if(pos_type != "BUY")
           continue;
       }
     else
        if(side == "SELL")
          {
           if(pos_type != "SELL")
              continue;
          }
        else
           if(side != NULL)
              continue;

     if(mode == "EA")
       {
        if(PositionGetInteger(POSITION_MAGIC) == 0)
           continue;
        if(PositionGetInteger(POSITION_MAGIC) != magno)
           continue;
       }

     else
        if(mode == "MANUAL")
          {
           if(PositionGetInteger(POSITION_MAGIC) != 0)
              continue;
          }

        else
           if(mode == "EAALL")
             {
              if(PositionGetInteger(POSITION_MAGIC) == 0)
                 continue;
             }
           else
              if(mode != "ALL")
                 continue;
     pos_st_sub(pos,ArraySize(pos));
    }
 }

//ポジション情報構造体配列の初期化
void pos_init_exe(pos_st &pos_n[])
 {
  ArrayResize(pos_n,1);
  pos_n[0].time       = start_time;
  pos_n[0].symbol     = "";
  pos_n[0].ticket     = 0;
  pos_n[0].magic      = 0;
  pos_n[0].type       = "";
  pos_n[0].price      = 0;
  pos_n[0].volume     = 0;
  pos_n[0].sl         = 0;
  pos_n[0].tp         = 0;
  pos_n[0].profit     = 0;
  pos_n[0].swap       = 0;
  pos_n[0].commission = 0;
  pos_n[0].comment    = "";
 }

//構造体に代入 最初に配列の長さを1個増やす
void pos_st_sub(pos_st &pos_n[], int i)
 {
  ArrayResize(pos_n,i+1);
  pos_n[i].time       = (datetime)PositionGetInteger(POSITION_TIME);
  pos_n[i].symbol     = PositionGetString(POSITION_SYMBOL);
  pos_n[i].ticket     = PositionGetInteger(POSITION_TICKET);
  pos_n[i].magic      = PositionGetInteger(POSITION_MAGIC);
  pos_n[i].type       = PositionTypeToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE));
  pos_n[i].price      = PositionGetDouble(POSITION_PRICE_OPEN);
  pos_n[i].volume     = PositionGetDouble(POSITION_VOLUME);
  pos_n[i].sl         = PositionGetDouble(POSITION_SL);
  pos_n[i].tp         = PositionGetDouble(POSITION_TP);
  pos_n[i].profit     = PositionGetDouble(POSITION_PROFIT);
  pos_n[i].swap       = PositionGetDouble(POSITION_SWAP);
  pos_n[i].commission = PositionGetDouble(POSITION_COMMISSION);
  pos_n[i].comment    = PositionGetString(POSITION_COMMENT);

//[0]に各種合計数値を入れる
//※※複数通貨ペアの場合平均エントリー価格は使用できない
  double totalprice = (pos_n[0].price*pos_n[0].volume) + (PositionGetDouble(POSITION_PRICE_OPEN)*PositionGetDouble(POSITION_VOLUME));
  pos_n[0].volume  += PositionGetDouble(POSITION_VOLUME);                                                                               //合計ロット
  pos_n[0].profit  += (PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP) + PositionGetDouble(POSITION_COMMISSION)); //合計損益(ポジション損益+手数料+スワップ)
  pos_n[0].price    = totalprice / pos_n[0].volume;                                                                                     //平均エントリー価格 →使用時桁数合わせる
  pos_n[0].ticket   = i;                                                                                                                //合計ポジション数
 }

//ポジションタイプをBUY、SELLのstr型に変換する
string PositionTypeToString(int position_type)
 {
  string str="";
  if(position_type == 0)
     str = "BUY";
  if(position_type == 1)
     str = "SELL";
  return(str);
 }

これを使用しようと思う人は使い方わかると思うけど
もし使い方わからない人はコミュニティで聞いてください

この記事が気に入ったらサポートをしてみませんか?