EA触发止损后,发个邮件怎么写?

 

请问各位


在EA运行中,假设持仓仅有一张单,设好止盈止损;

如果触发止赢,发个邮件给我

如果出发止损,发个邮件给我

请问这个逻辑怎么写?

 

单子触发止损止盈后,其注释中添加了 "sl","tp"的字符串

你要遍历历史单子,确定单子的平仓时间是在给定时间内出现的,比如几秒内,且单子的注释含有 "sl","tp"的字符串

这样把触发止损止盈的单子找出来了,然后就可以发送邮件通知,要避免重复对同一个单子发送多次邮件。

 
Ziheng Zhuang:

单子触发止损止盈后,其注释中添加了 "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)
  {
    //---
   }
 
Ziheng Zhuang:

MT5就方便多了,直接在OnTradeTransaction()中获取deal为DEAL_ENTRY_OUT的历史单,检查其注释是否含有sl,tp字符串

我在MT5上写的,

昨天采用了OnTrade()

加了时间限定,然后用StringFind作匹配,再加入持仓量等别的限制,才实现只发一次邮件;

OnTradeTransaction还没搞明白,今天试一试看能否更方便地解决只发一次邮件的问题;

谢谢!

 
 
Ziheng Zhuang:

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;
 
或者用其他笨方法,每次执行发送email后,把deal ticket No. 保存到一个数组中,

下次执行前先查询数组中有没有这个deal ticket No.

如果没有才发送邮件并把ticket No.保存到数组中

如果有,则说明已经发送过了,则无需重复发送。
 
检查最后一个平的单子,如果是盈利发a邮件,如果是亏损发b邮件,设置一个临时值为单子的tick,只有下一个单子不等于此tick时再发送新的邮件。