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);
}
これを使用しようと思う人は使い方わかると思うけど
もし使い方わからない人はコミュニティで聞いてください
この記事が気に入ったらサポートをしてみませんか?