单子触发止损止盈后,其注释中添加了 "sl","tp"的字符串
你要遍历历史单子,确定单子的平仓时间是在给定时间内出现的,比如几秒内,且单子的注释含有 "sl","tp"的字符串
这样把触发止损止盈的单子找出来了,然后就可以发送邮件通知,要避免重复对同一个单子发送多次邮件。
单子触发止损止盈后,其注释中添加了 "sl","tp"的字符串
你要遍历历史单子,确定单子的平仓时间是在给定时间内出现的,比如几秒内,且单子的注释含有 "sl","tp"的字符串
这样把触发止损止盈的单子找出来了,然后就可以发送邮件通知,要避免重复对同一个单子发送多次邮件。
逻辑是:在OnTrade函数里头,限制触发的几秒内,找含有sl tp的HistoryDeal,然后找到就发一个邮件。
是这么理解吗?
感谢感谢!
PS:看到你在好多帖子里回答,厉害厉害!
MT5就方便多了,直接在OnTradeTransaction()中获取deal为 DEAL_ENTRY_OUT的历史单,检查其注释是否含有sl,tp字符串
void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { //--- }
MT5就方便多了,直接在OnTradeTransaction()中获取deal为DEAL_ENTRY_OUT的历史单,检查其注释是否含有sl,tp字符串
我在MT5上写的,
昨天采用了OnTrade()
加了时间限定,然后用StringFind作匹配,再加入持仓量等别的限制,才实现只发一次邮件;
OnTradeTransaction还没搞明白,今天试一试看能否更方便地解决只发一次邮件的问题;
谢谢!
MT5就方便多了,直接在OnTradeTransaction()中获取deal为DEAL_ENTRY_OUT的历史单,检查其注释是否含有sl,tp字符串
谢谢!
解决了基本逻辑上的问题了,
但请问一般会用什么办法,使得只执行一次?
帮助文档中针对OnTradeTransanction()给了例子,直接即可以用了。
你只需要用到TRADE_TRANSACTION_DEAL_ADD的case,其他case可以删除。
要区分deal type 为 DEAL_ENTRY_OUT的情况。
case TRADE_TRANSACTION_DEAL_ADD: // adding a trade { ulong lastDealID =trans.deal; ENUM_DEAL_TYPE lastDealType =trans.deal_type; double lastDealVolume=trans.volume; //--- Trade ID in an external system - a ticket assigned by an exchange string Exchange_ticket=""; if(HistoryDealSelect(lastDealID)) Exchange_ticket=HistoryDealGetString(lastDealID,DEAL_EXTERNAL_ID); if(Exchange_ticket!="") Exchange_ticket=StringFormat("(Exchange deal=%s)",Exchange_ticket); PrintFormat("MqlTradeTransaction: %s deal #%d %s %s %.2f lot %s",EnumToString(trans_type), lastDealID,EnumToString(lastDealType),trans_symbol,lastDealVolume,Exchange_ticket); } break;
请问各位
在EA运行中,假设持仓仅有一张单,设好止盈止损;
如果触发止赢,发个邮件给我
如果出发止损,发个邮件给我
请问这个逻辑怎么写?