请教 MT5 如何取最后一单的平仓时间

 
请教各位高手 ,在MT5中如何取最后一单的平仓时间? 想在 EA 中,最后一单平仓后,隔 30~40 分钟才能再开单。
 
有高人回复吗
 
bingru:
请教各位高手 ,在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分钟)后才可以开第二单持仓单,你练习修改成你想要的模块即可。

MetaTrader 5 中的订单、持仓和成交
MetaTrader 5 中的订单、持仓和成交
  • www.mql5.com
不理解 MetaTrader 5 交易系统的机制,就不能创建一个强大的交易机器人。客户端从交易服务器接收有关持仓、订单和成交的信息。要使用 MQL5 正确处理这些数据,必须充分理解 MQL5程序和客户端之间的相互作用。
 
bingru:
请教各位高手 ,在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
  }
原因: