想设计一个函数,如果上个订单的多单被止损掉,5天之内不能开多单,这个应该怎么完成

 
我在写EA的过程中,开单我一般都会带上止盈止损。还有就是到达某个反向条件,我也会关闭订单。我看EA测试的历史记录里,有的能看到SL的订单,是被止损掉的订单,我想设计一个函数,如果上个订单的多单被止损掉,5天之内不能开多单,这个应该怎么完成,如何知道那些是被EA关闭,那些是被止损的。主要想得到止损的时间点,好设计间隔。不知道我说明白了么?请大神帮忙,谢谢
 

MT4止损掉的单子  注释里有[sl]

MT5止损掉的单子  在out类中   注释里为 [sl  +价格]

通过这个   判定历史中最后一个单子是不是止损掉的   

 
Wangjb #:

MT4止损掉的单子  注释里有[sl]

MT5止损掉的单子  在out类中   注释里为 [sl  +价格]

通过这个   判定历史中最后一个单子是不是止损掉的   

我用MT5,我刚开始学MQL5,对您说的不是很明白,能不再详细点说下,谢谢
 

先把你的要求提出來做分析 然後提出解決的方法


1/. 如何知道那些是被EA关闭  ==> EA設計一定要用Magic或是Command來分辨平倉單是由EA運行的

2/. 那些是被止损的                ==> 既然是止损 所以該單平倉時應該是虧損單 如果持艙單調整了止损位置 讓止损成為正數時 那就要判斷開單價格跟平倉價格

3/. 主要想得到止损的时间点   ==> 根據上面的條件 就可以過濾出符合條件最後一張的Ticket 根據Ticket獲取平倉的時間


5天之内不能开多单  ==> 1/.獲取的平倉時間 直接加上60(秒)*60(分)*24(小時)*5(天)設定不允許開單

    2/.獲取的平倉時間轉換成日期(年的天數) 加上5不允許開單 (需要注意垮年的計算)


說起來似乎很簡單 但是在實際編程的時候會有許多小細節需要注意

祝你成功 

 
我有个更好的主意,备个闹钟
 
Hung Wen Lin #:

先把你的要求提出來做分析 然後提出解決的方法


1/. 如何知道那些是被EA关闭  ==> EA設計一定要用Magic或是Command來分辨平倉單是由EA運行的

2/. 那些是被止损的                ==> 既然是止损 所以該單平倉時應該是虧損單 如果持艙單調整了止损位置 讓止损成為正數時 那就要判斷開單價格跟平倉價格

3/. 主要想得到止损的时间点   ==> 根據上面的條件 就可以過濾出符合條件最後一張的Ticket 根據Ticket獲取平倉的時間


5天之内不能开多单  ==> 1/.獲取的平倉時間 直接加上60(秒)*60(分)*24(小時)*5(天)設定不允許開單

    2/.獲取的平倉時間轉換成日期(年的天數) 加上5不允許開單 (需要注意垮年的計算)


說起來似乎很簡單 但是在實際編程的時候會有許多小細節需要注意

祝你成功 

谢谢,提示

 
下单前   获取一下历史订单   排序一下   是ea操作的   多单   获取这个关闭时间   加上5天。 当前时间与那个时间比较一下
 
datetime BUYslTime()
  {
   HistorySelect(TimeCurrent()-60*60*24*30,TimeCurrent()); // 最近30日时间的历史
   ulong    ticket;
   datetime Ltime=0,sltime=0;
   for(int i=0;i<HistoryDealsTotal();i++)
     {
      if((ticket=HistoryDealGetTicket(i))>0)
        {
         // 图表品种最后一个多向历史单且属于触及止损位出局  ( 成交OUT类型中多单的出局类型为空  即DEAL_TYPE_SELL ) 
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)==_Symbol && (HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT || HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT_BY) && HistoryDealGetInteger(ticket,DEAL_TYPE)==DEAL_TYPE_SELL)
           {
            datetime CTime=(datetime)HistoryDealGetInteger(ticket,DEAL_TIME);
            if(CTime>Ltime)  Ltime=CTime;
            if(HistoryDealGetInteger(ticket,DEAL_TIME)==Ltime && StringSubstr(HistoryDealGetString(ticket,DEAL_COMMENT),0,3)=="[sl") // 触及止损位出局的单 其注释开头三个字符为[sl 
            sltime=(datetime)HistoryDealGetInteger(ticket,DEAL_TIME);
           }
        }
     }
   return(sltime);
  }
 

或者 从后往前循环 直接查找 减少代码:

datetime BUYslTime()
  {
   HistorySelect(0,TimeCurrent());
   ulong    ticket;
   datetime sltime=0;
   for(int i=HistoryDealsTotal()-1;i>=0;i--) // 从后往前循环
     {
      if((ticket=HistoryDealGetTicket(i))>0)
        {
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)==_Symbol && (HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT || HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT_BY))
           {
            if(HistoryDealGetInteger(ticket,DEAL_TYPE)==DEAL_TYPE_SELL && StringSubstr(HistoryDealGetString(ticket,DEAL_COMMENT),0,3)=="[sl")
              {
               if(HistoryDealGetDouble(ticket,DEAL_PROFIT)+HistoryDealGetDouble(ticket,DEAL_SWAP)+HistoryDealGetDouble(ticket,DEAL_COMMISSION)/**2*/<0) // 亏损的
               sltime=(datetime)HistoryDealGetInteger(ticket,DEAL_TIME);
              }
           }
        }
     }
   return(sltime);
  }

 
Wangjb #:

或者 从后往前循环 直接查找 减少代码:

非常感谢!代码已经调试运行了

 
循环获取最后一个订单开仓时间所在的日线级别K线序号, iBarShift("EURUSD",PERIOD_D1,OrderOpentime())>=5