MQL4MQL5 EA(エキスパートアドバイザー) ポジション管理
含み損益の合計を計算したい
結論:ポジションをループして、損益にスワップと手数料を足して合計します。
考え方
複数のポジションをまとめて管理するとき、含み損益の合計が一定に達したら全決済する、といった使い方をします。損益(OrderProfit・POSITION_PROFIT)にはスワップと手数料が含まれないため、足し合わせて計算します。ここでは合計を表示し、目標利益・許容損失に達したらアラートを出す EA を例にしています。
- この EA のポジションをループする
- 損益+スワップ(+手数料)を足し合わせる
- 合計を目標・許容値と比べる
そのまま使えるコード
MetaEditor の「新規作成」で「エキスパートアドバイザ(テンプレート)」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Experts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4(MT4)
#property strict
// この EA の含み損益の合計を表示し、目標・許容値でアラートを出す(MT4)
input int InpMagic = 1001; // マジックナンバー
input double InpTarget = 5000; // 目標利益(口座通貨)
input double InpMaxDD = -3000; // 許容損失(口座通貨・マイナス)
double TotalProfit()
{
double sum = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == _Symbol
&& OrderMagicNumber() == InpMagic && OrderType() <= OP_SELL)
sum += OrderProfit() + OrderSwap() + OrderCommission();
return sum;
}
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
Comment("");
}
void OnTick()
{
static bool notified = false;
double p = TotalProfit();
Comment("含み損益の合計:", DoubleToString(p, 0), " ", AccountCurrency());
if(!notified && (p >= InpTarget || p <= InpMaxDD))
{
Alert(_Symbol, " 含み損益の合計が ", DoubleToString(p, 0), " になりました");
notified = true;
}
if(p < InpTarget && p > InpMaxDD) notified = false;
}MQL5(MT5)
// この EA の含み損益の合計を表示し、目標・許容値でアラートを出す(MT5)
input ulong InpMagic = 1001; // マジックナンバー
input double InpTarget = 5000; // 目標利益(口座通貨)
input double InpMaxDD = -3000; // 許容損失(口座通貨・マイナス)
double TotalProfit()
{
double sum = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
if(PositionGetTicket(i) > 0 && PositionGetString(POSITION_SYMBOL) == _Symbol
&& (ulong)PositionGetInteger(POSITION_MAGIC) == InpMagic)
sum += PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP);
return sum;
}
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
Comment("");
}
void OnTick()
{
static bool notified = false;
double p = TotalProfit();
Comment("含み損益の合計:", DoubleToString(p, 0), " ", AccountInfoString(ACCOUNT_CURRENCY));
if(!notified && (p >= InpTarget || p <= InpMaxDD))
{
Alert(_Symbol, " 含み損益の合計が ", DoubleToString(p, 0), " になりました");
notified = true;
}
if(p < InpTarget && p > InpMaxDD) notified = false;
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- アラートの代わりに全決済したいときは、「全ポジションを決済する」レシピの処理を呼びます。
- 口座全体の含み損益なら、AccountInfoDouble(ACCOUNT_PROFIT) で一度に取得できます。
注意点
- MT5 の手数料は約定ごと(ディール)に記録されるため、保有中のポジションの情報からは取得できません。












