「利益は確保したいけれど、まだ伸びそうだから全部は決済したくない…」
そんなEA制作者にとって便利なのが“ポジションの半分決済(部分利確)”です。
本記事では、MT4でポジションを自動的に半分決済できるMQL4関数を、コピペで使えるサンプルコード+初心者向けの丁寧な解説つきで紹介します。
以下のような用途で活用できます:
- 部分利確でリスクを抑えながら利益を伸ばしたい
- トレンド継続時に「残りポジション」を走らせたい
- 裁量トレードの “分割利確” をEAに組み込みたい
- Lot数管理ロジックと組み合わせて安全設計を強化したい
📌 ロット計算・資金管理の関連関数
- 許容損失額からロット数を計算する処理
└ 許容リスク%から最適なロット数を算出する基本ロジック - 証拠金維持率からロット数を自動調整する関数
└ 維持率〇%を割らないようにロットを自動で最適化する関数 - MT4でポジションを半分決済する関数(本記事)
└ 利益を確保しつつ残ポジションを伸ばすための分割決済ロジック
はじめに:半分決済をEAに組み込むメリット
FX自動売買EAでは、「利益を確保しつつ、トレンドが続く限りポジションを伸ばしたい」という場面が非常によくあります。 しかし、手動の部分利確をEAに組み込むには少し工夫が必要です。
今回紹介する関数では、ロット数の半分だけを自動的に決済し、残りを保有し続けるという操作を簡単に実装できます。 初心者でも扱いやすいよう、最小ロット判定・処理分岐・丸め処理など安全性に配慮した設計になっています。
ソースコード(コピペOK)
以下の関数をEAに組み込むだけで、半分決済が可能です。
//+------------------------------------------------------------------+
//|【関数】ポジション半分決済
//|
//|【引数】 買いポジション or 売りポジション(OP_BUY or OP_SELL)
//|
//|【戻値】なし
//|【備考】既に半分のポジションの場合は全決済
//|
void PartialCloseHalf(int Type,double HullLots)
{
bool result =false;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
// 現在の通貨ペア・同タイプの注文だけを対象
if (OrderSymbol() == Symbol() && OrderType() == Type)
{
double lots = OrderLots();
if(lots == HullLots){
//半分決済
double halfLots = NormalizeDouble(lots / 2.0, 2); // 小数第2位で丸める(通常は0.01単位)
if (halfLots >= MarketInfo(Symbol(), MODE_MINLOT)) // 最小ロット以上かチェック
{
result = OrderClose(OrderTicket(), halfLots, (OrderType() == OP_BUY ? Bid : Ask), 3, clrGreen);
if (result){
Print("半分利確成功:", halfLots, "ロット");
}else{
Print("利確失敗:", GetLastError());
}
}
else
{
Print("半分利確できない:ロットが小さすぎる");
}
}else{
//残り決済
result = OrderClose(OrderTicket(), OrderLots(), (OrderType() == OP_BUY ? Bid : Ask), 3, clrGreen);
if (result){
Print("残り利確成功:", OrderLots(), "ロット");
}else{
Print("利確失敗:", GetLastError());
}
}
}
}
}
}
※マジックナンバーは考慮していません。必要に応じて追加してください。
関数の使い方・解説
引数は以下の2つです:
- Type:決済したいポジションの種類(買い:
OP_BUY、売り:OP_SELL) - HullLots:半分決済する前のロット数
呼び出し例:
PartialCloseHalf(OP_SELL,Lots); //売りポジション半分決済ロット数はパラメータ設定の値をそのままセットすればOK。

この関数を使えば、残りのポジションでさらに利益を伸ばす運用が簡単に行えます。
⚠️ 実装のポイントと注意事項
- 半分に割り切れないロット数は「0.01ロット」単位で丸められる
例:0.03ロットの場合 → 半分は 0.015 → NormalizeDouble により 0.02ロットとなります。 最小ロットが 0.01 の口座では全決済に近い動きになるケースもあるため、事前に確認が必要です。割り切れないロット数でも半分にするようにコーディングしていますが、0.01ロット等で動かすと0.01ロットが決済され半分ではなく全決済という形になります。

- 最小ロット(MODE_MINLOT)の下回りに注意
0.02ロットなどの小口で運用するEAでは、半分決済が実質不可能な場合があります。 - 必ずデモ口座で挙動をテストする
口座仕様(ロット刻み、スプレッド、最小ロット)が異なるため、実運用前に必ず動作確認してください。 - マジックナンバーを使用する場合はフィルタ処理を追加
複数EAを同一口座で動かす場合には、OrderMagicNumber() による絞り込みが必須です。
📌 ロット計算・資金管理の関連関数
- 許容損失額からロット数を計算する処理
└ 許容リスク%から最適なロット数を算出する基本ロジック - 証拠金維持率からロット数を自動調整する関数
└ 維持率〇%を割らないようにロットを自動で最適化する関数 - MT4でポジションを半分決済する関数(本記事)
└ 利益を確保しつつ残ポジションを伸ばすための分割決済ロジック
さいごに:EAの共通パーツとして使い回そう
今回紹介したポジションを半分決済する関数(MT4版)は、 利益を確保しながら残りのポジションで利益を伸ばす「分割利確」の運用を、 EAに簡単に組み込める便利な機能です。
1度関数化しておけば、他のEAにもコピペで組み込めるため、 裁量トレードでよく使う分割利確の動作を自動化できるのが大きなメリットです。
👉 EAの基礎から学びたい方は FX自動売買(EA)の始め方ガイド もおすすめです。
👉 関数一覧を探したい方は MQL4 関数一覧ページ をご覧ください。
👉 EAロジックやTipsを探したい方は EAプログラミング小ネタ集 も役立ちます。
✅ 今回のロジックをベースにしたEAサンプルも多数公開中
今回紹介したようなEAの売買ロジック・考え方をベースに、
当サイトではさまざまなFX自動売買EAのサンプルコードを公開しています。
ロジックの違いや設計の考え方を比較しながら、
自分に合ったEA構成を探したい方はぜひチェックしてみてください。
📊 EA運用・検証フェーズに進みたい方へ
今回のような仕組みを理解したうえで、
「実際にどのEAが安定しているのか」、「検証データではどんな差が出ているのか」
を確認したい方は、以下の記事も参考になります。
EA開発初心者向けに、今後も実践的に使えるMQL4関数や実装例を紹介していきます。
気になる機能やロジックがあれば、用途別に整理した関連記事もぜひあわせてご覧ください。










コメント