MT4|ポジションを半分決済する関数【コピペOK・初心者向けEAサンプル】

スーツ姿のデグーマウスがMT4 EAのコードを指しながら解説しているイラスト。ぷろぐらむFXのデフォルトアイキャッチ。
EAサンプル・ノウハウ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

「利益は確保したいけれど、まだ伸びそうだから全部は決済したくない…」
そんなEA制作者にとって便利なのが“ポジションの半分決済(部分利確)”です。

本記事では、MT4でポジションを自動的に半分決済できるMQL4関数を、コピペで使えるサンプルコード+初心者向けの丁寧な解説つきで紹介します。

以下のような用途で活用できます:

  • 部分利確でリスクを抑えながら利益を伸ばしたい
  • トレンド継続時に「残りポジション」を走らせたい
  • 裁量トレードの “分割利確” をEAに組み込みたい
  • Lot数管理ロジックと組み合わせて安全設計を強化したい

📌 ロット計算・資金管理の関連関数


はじめに:半分決済を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ロットが決済され半分ではなく全決済という形になります。

    MT4|ポジションを半分決済する関数【コピペOK・初心者向けEAサンプル】
  • 最小ロット(MODE_MINLOT)の下回りに注意
    0.02ロットなどの小口で運用するEAでは、半分決済が実質不可能な場合があります。
  • 必ずデモ口座で挙動をテストする
    口座仕様(ロット刻み、スプレッド、最小ロット)が異なるため、実運用前に必ず動作確認してください。
  • マジックナンバーを使用する場合はフィルタ処理を追加
    複数EAを同一口座で動かす場合には、OrderMagicNumber() による絞り込みが必須です。

📌 ロット計算・資金管理の関連関数

さいごに:EAの共通パーツとして使い回そう

今回紹介したポジションを半分決済する関数(MT4版)は、 利益を確保しながら残りのポジションで利益を伸ばす「分割利確」の運用を、 EAに簡単に組み込める便利な機能です。

1度関数化しておけば、他のEAにもコピペで組み込めるため、 裁量トレードでよく使う分割利確の動作を自動化できるのが大きなメリットです。

👉 EAの基礎から学びたい方は FX自動売買(EA)の始め方ガイド もおすすめです。

👉 関数一覧を探したい方は MQL4 関数一覧ページ をご覧ください。

👉 EAロジックやTipsを探したい方は EAプログラミング小ネタ集 も役立ちます。



✅ 他にも多数のEAサンプルを公開中!

今回紹介した内容以外にも、当サイトではさまざまな
FX自動売買EAのサンプルコードを提供しています。

自分に合った戦略のEAを見つけたい方は、ぜひチェックしてみてください。


📊 【2025年最新】FX自動売買EAランキングも公開中!

当サイトの「どのEA(インジ)が実際に勝っているのか?」を知りたい方はこちら👇
PF(プロフィットファクター)や勝率で徹底比較した最新ランキングから、あなたに最適なEA(インジ)を見つけましょう。


EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!

コメント

タイトルとURLをコピーしました