MQL4MQL5 EA(エキスパートアドバイザー) ポジション管理
保有中のポジション数を数えたい
結論:ポジションの一覧をループし、通貨ペア・マジックナンバー・売買の向きで絞って数えます。
考え方
OrdersTotal()(MQL4)や PositionsTotal()(MQL5)は口座全体の数なので、ほかの通貨ペアや手動の注文も含まれます。「この EA の買いポジションは何個か」を知るには、一覧をループして条件に合うものだけを数えます。ここでは買い・売りそれぞれの数を数える関数と、それをチャートに表示する EA を例にしています。
- ポジションの一覧をループする
- 通貨ペア・マジックナンバーが一致し、指定した向き(買い・売り)のものだけを数える
そのまま使えるコード
MetaEditor の「新規作成」で「エキスパートアドバイザ(テンプレート)」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Experts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4(MT4)
#property strict
// この EA の買い・売りポジション数を数えて表示する(MT4)
input int InpMagic = 1001; // マジックナンバー
// type:OP_BUY または OP_SELL
int CountPositions(int type)
{
int n = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() == _Symbol && OrderMagicNumber() == InpMagic && OrderType() == type)
n++;
}
return n;
}
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
Comment("");
}
void OnTick()
{
Comment("買い:", CountPositions(OP_BUY), " 売り:", CountPositions(OP_SELL));
}MQL5(MT5)
// この EA の買い・売りポジション数を数えて表示する(MT5)
input ulong InpMagic = 1001; // マジックナンバー
// type:POSITION_TYPE_BUY または POSITION_TYPE_SELL
int CountPositions(ENUM_POSITION_TYPE type)
{
int n = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
if(PositionGetTicket(i) == 0) continue;
if(PositionGetString(POSITION_SYMBOL) == _Symbol
&& (ulong)PositionGetInteger(POSITION_MAGIC) == InpMagic
&& PositionGetInteger(POSITION_TYPE) == type)
n++;
}
return n;
}
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
Comment("");
}
void OnTick()
{
Comment("買い:", CountPositions(POSITION_TYPE_BUY), " 売り:", CountPositions(POSITION_TYPE_SELL));
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- 待機注文も数えたいときは、MQL4 は OrderType() が OP_BUYLIMIT 以上のもの、MQL5 は OrdersTotal() と OrderGetTicket() のループで数えます。
注意点
- MQL5 の OrdersTotal() は待機注文の数で、ポジションの数ではありません。












