请教各位高手 ,在MT5中如何取最后一单的平仓时间? 想在 EA 中,最后一单平仓后,隔 30~40 分钟才能再开单。
MetaTrader 5 中的订单、持仓和成交 - MQL5文章
这里有介绍如何查到订单,持仓和成交的任何信息,在客户端的历史页面里,右击鼠标,选择“订单&成交”,就可以看到在“类型”这一列有“in”和“out”,按照你的问题,应该在HistoryDealsTotal()里查询“out”的对应时间,把“out”对应的时间储存起来,再用当前的服务器时间减去“out”对应的时间,它们相减的值就大于等于间隔时间。
例如:
//---
datetime eur_M10_end=TimeCurrent();
datetime eur_M10_start=eur_M10_end-90*86400; //90天的历史数据
//============================================================//
//
HistorySelect(eur_M10_start,eur_M10_end);
int eur_M10_deals_total=HistoryDealsTotal();
for(int n6=eur_M10_deals_total-1;n6>=0;n6--)
{
ulong eur_M10_deal_ticket=HistoryDealGetTicket(n6);
if(eur_M10_deal_ticket>0)
{
string eur_M10_symbol_n=HistoryDealGetString(eur_M10_deal_ticket,DEAL_SYMBOL);
long eur_M10_deal_magic=HistoryDealGetInteger(eur_M10_deal_ticket,DEAL_MAGIC);
ENUM_DEAL_ENTRY eur_M10_entry_type=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(eur_M10_deal_ticket,DEAL_ENTRY);
long eur_M10_time_in =HistoryDealGetInteger(eur_M10_deal_ticket,DEAL_TIME);
if(eur_M10_symbol_n==_Symbol && eur_M10_deal_magic==eur_M10_EA_Magic && eur_M10_entry_type==DEAL_ENTRY_IN)
{
if(TimeCurrent()-eur_M10_time_in>601)
{
//break;//终止循环,但是还会继续运行下面所有的代码
Alert(eur_M10_time_in,"||",TimeCurrent()-eur_M10_time_in);
return;//直接返回了,不再运行下面任何代码,同时终止循环
}
}
}
}
Sleep(3000);
Alert("还会运行到下面吗?");
//============================================================//
这是入场“in”即 DEAL_ENTRY_IN的时间间隔测试模块,持仓单开仓601秒钟(10分钟)后才可以开第二单持仓单,你练习修改成你想要的模块即可。

- www.mql5.com
请教各位高手 ,在MT5中如何取最后一单的平仓时间? 想在 EA 中,最后一单平仓后,隔 30~40 分钟才能再开单。
input int PositionOpenInterval = 30; //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { if(TimeCurrent() - GetHistoryLastDealCloseTime() > PositionOpenInterval * 60) { //--- 继续交易代码 } else { //--- 停止交易时的代码 } } //+------------------------------------------------------------------+ //| 获取最后平仓时间 | //+------------------------------------------------------------------+ datetime GetHistoryLastDealCloseTime() { ulong deal_ticket; // 历史成交编号 datetime close_time = 0; // 初始化平仓时间 HistorySelect(0, TimeCurrent()); // 搜索时间范围,所有交易历史 int deal_total = HistoryDealsTotal(); // 获取所有数量 if(deal_total > 0) // 如果数量大于0 for(int i = 0; i < deal_total; i++) // 历遍所有单子 if((deal_ticket = HistoryDealGetTicket(i)) > 0) // 获取历史单子的成交编号 if(HistoryDealGetString(deal_ticket, DEAL_SYMBOL) == _Symbol && // 只选择当前加载图表的货币对名称 HistoryDealGetInteger(deal_ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) // 只取出场的成交单 close_time = (datetime)HistoryDealGetInteger(deal_ticket, DEAL_TIME); // 获取平仓时间 return(close_time); // 输出最后平仓时间 }
以上为方式一: 给出具体的平仓时间
// ---------------------
方式二: 直接判断搜索时间范围内是否有单子存在(无论单子的类型是入场和出场)
input int PositionOpenInterval = 30; //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { if(!IsPositionExist(PositionOpenInterval)) // 如果30分钟内无成交单 { //--- 继续交易代码 } else { //--- 停止交易时的代码 } } //+------------------------------------------------------------------+ //| 判断时间范围内是否存在in或out的单子 | //+------------------------------------------------------------------+ bool IsPositionExist(const int time_range) { HistorySelect(TimeCurrent() - time_range * 60, TimeCurrent()); // 搜索时间的范围 int deal_total = HistoryDealsTotal(); // 获取这个时间内的成交数量(无论单子是in还是out) return((deal_total > 0) ? true : false); // 如果有单子存在,返回true,否则返回false }