MT4止损掉的单子 注释里有[sl]
MT5止损掉的单子 在out类中 注释里为 [sl +价格]
通过这个 判定历史中最后一个单子是不是止损掉的
先把你的要求提出來做分析 然後提出解決的方法
1/. 如何知道那些是被EA关闭 ==> EA設計一定要用Magic或是Command來分辨平倉單是由EA運行的
2/. 那些是被止损的 ==> 既然是止损 所以該單平倉時應該是虧損單 如果持艙單調整了止损位置 讓止损成為正數時 那就要判斷開單價格跟平倉價格
3/. 主要想得到止损的时间点 ==> 根據上面的條件 就可以過濾出符合條件最後一張的Ticket 根據Ticket獲取平倉的時間
5天之内不能开多单 ==> 1/.獲取的平倉時間 直接加上60(秒)*60(分)*24(小時)*5(天)設定不允許開單
2/.獲取的平倉時間轉換成日期(年的天數) 加上5不允許開單 (需要注意垮年的計算)
說起來似乎很簡單 但是在實際編程的時候會有許多小細節需要注意
祝你成功
先把你的要求提出來做分析 然後提出解決的方法
1/. 如何知道那些是被EA关闭 ==> EA設計一定要用Magic或是Command來分辨平倉單是由EA運行的
2/. 那些是被止损的 ==> 既然是止损 所以該單平倉時應該是虧損單 如果持艙單調整了止损位置 讓止损成為正數時 那就要判斷開單價格跟平倉價格
3/. 主要想得到止损的时间点 ==> 根據上面的條件 就可以過濾出符合條件最後一張的Ticket 根據Ticket獲取平倉的時間
5天之内不能开多单 ==> 1/.獲取的平倉時間 直接加上60(秒)*60(分)*24(小時)*5(天)設定不允許開單
2/.獲取的平倉時間轉換成日期(年的天數) 加上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); }