MQL4MQL5 EA(エキスパートアドバイザー) ポジション管理
一定時間たったポジションを決済したい
結論:現在のサーバー時刻 TimeCurrent() から約定時刻を引いて保有時間(秒)を求め、上限を超えたら決済します。
考え方
「エントリーから N 時間たっても利確・損切りにかからなければ決済する」というタイムストップの例です。保有時間は TimeCurrent() − 約定時刻で、秒単位で求められます。
- この EA のポジションの約定時刻を取得する
- 現在時刻との差(秒)が上限を超えていれば決済する
そのまま使えるコード
MetaEditor の「新規作成」で「エキスパートアドバイザ(テンプレート)」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Experts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4(MT4)
#property strict
// 指定時間を超えて保有しているポジションを決済する EA(MT4)
input int InpHours = 24; // 最大保有時間(時間)
input int InpMagic = 1001; // 対象のマジックナンバー
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnTick()
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() != _Symbol || OrderMagicNumber() != InpMagic || OrderType() > OP_SELL) continue;
if(TimeCurrent() - OrderOpenTime() >= InpHours * 3600)
if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 30))
Print("時間決済 失敗 error=", GetLastError());
}
}MQL5(MT5)
// 指定時間を超えて保有しているポジションを決済する EA(MT5)
#include <Trade\Trade.mqh>
input int InpHours = 24; // 最大保有時間(時間)
input ulong InpMagic = 1001; // 対象のマジックナンバー
CTrade trade;
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnTick()
{
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(ticket == 0) continue;
if(PositionGetString(POSITION_SYMBOL) != _Symbol || (ulong)PositionGetInteger(POSITION_MAGIC) != InpMagic) continue;
datetime opened = (datetime)PositionGetInteger(POSITION_TIME);
if(TimeCurrent() - opened >= InpHours * 3600)
if(!trade.PositionClose(ticket))
Print("時間決済 失敗 ", trade.ResultRetcodeDescription());
}
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- 足の本数で数えたいときは、iBarShift(_Symbol, PERIOD_CURRENT, 約定時刻) で約定した足の位置(何本前か)を求めます。
注意点
- 週末をまたぐと、市場が閉まっている時間も保有時間に含まれます。












