今回は、MT4のEAサンプルソース(FX用)を公開します。
オンラインレッスンを受講されている方から質問があったので、記事にしています。
はじめに
ポジションを半分決済するという手法、EAを扱っているとちょいちょい見かけますよね。半分決済は利益を確保しながら残りのポジションでさらに利益アップを目指す方法なので関数化しました。
ChatGPTで作成
今回の関数はChatGPTで作成しています。
MQL4でポジションを半分利確するプログラム
と質問し、回答されたコードを見直し・修正・動作確認を行ったものとなります。
ソースコード
以下サンプルの関数になります。そのままコピペでお使いください。
//+------------------------------------------------------------------+
//|【関数】ポジション半分決済
//|
//|【引数】 買いポジション 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());
}
}
}
}
}
}
ポジションをチェックする際、マジックナンバーは考慮していません。
解説
とてもシンプルなつくりで、引数は決済したいタイプ(買い:OP_BUN、売り:OP_SELL)と半分決済する前のロット数です。
呼び出し元の例はこんな感じ。
PartialCloseHalf(OP_SELL,Lots); //売りポジション半分決済
ロット数に関しては、パラメータ設定の値をそのままセットする感じでOKです。

こんな感じでポジションの半分をクローズしてくれますね!
その他注意事項
割り切れないロット数でも半分にするようにコーディングしていますが、0.01ロット等で動かすと0.01ロットが決済され半分ではなく全決済という形になります。

上記関数をご使用の際は、動作確認等を行い自己責任でお使いください。
さいごに
以上、『ポジションを半分決済する関数』でした。
ChatGPTに質問して、回答されたコードからの修正箇所は10ヵ所程だったのでなかなか良い精度のコードを出力してくれたと思います。
※ EAのサンプルソースを一覧表にまとめました
※EA作成依頼はこちら
※オンラインレッスンやってます
コメント