Hi, I need to add the email alert feature on my EA when a trade is opened and a trade is closed (by trailing stop/stop loss/take profit or just close the trade). I am aware of the function SendMail, but I have two issues that block my progress.
-
How to locate the most recent trade when sending the email alert? I guess I could add SendEmail after OrderSend for each position opened, but how to do that for closed trades?
-
How to set up email alerts so it would also send email alerts for closed trades via trailing stop/stop loss/take profit? I could insert SendMail after my close order condition, but that only covers one scenario, how should I deal with the rest?
My EA is as follows, please let me know how I can add the email alert feature to it, thanks very much!
#property version "1.00"
#property strict
input bool OpenBUY=True;
input bool OpenSELL=True;
input bool CloseBySignal=True;
input double StopLoss=0;
input double TakeProfit=0;
input double TrailingStop=0;
input int RSIperiod=14;
input double BuyLevel=30;
input double SellLevel=70;
input int MagicNumber=123;
input string Koment="RSIea";
input int Slippage=10;
//---
int OrderBuy,OrderSell;
int ticket;
int LotDigits;
double Trail,iTrailingStop;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double stoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
OrderBuy=0;
OrderSell=0;
for(int cnt=0; cnt<OrdersTotal(); cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderComment()==Koment)
{
if(OrderType()==OP_BUY) OrderBuy++;
if(OrderType()==OP_SELL) OrderSell++;
if(TrailingStop>0)
{
iTrailingStop=TrailingStop;
if(TrailingStop<stoplevel) iTrailingStop=stoplevel;
Trail=iTrailingStop*Point;
double tsbuy=NormalizeDouble(Bid-Trail,Digits);
double tssell=NormalizeDouble(Ask+Trail,Digits);
if(OrderType()==OP_BUY && Bid-OrderOpenPrice()>Trail && Bid-OrderStopLoss()>Trail)
{
ticket=OrderModify(OrderTicket(),OrderOpenPrice(),tsbuy,OrderTakeProfit(),0,Blue);
}
if(OrderType()==OP_SELL && OrderOpenPrice()-Ask>Trail && (OrderStopLoss()-Ask>Trail || OrderStopLoss()==0))
{
ticket=OrderModify(OrderTicket(),OrderOpenPrice(),tssell,OrderTakeProfit(),0,Blue);
}
}
}
}
double rsim1=iRSI(Symbol(),1,RSIperiod,PRICE_CLOSE,1);
double rsim5=iRSI(Symbol(),5,RSIperiod,PRICE_CLOSE,1);
double rsim15=iRSI(Symbol(),15,RSIperiod,PRICE_CLOSE,1);
double rsim30=iRSI(Symbol(),30,RSIperiod,PRICE_CLOSE,1);
double rsim60=iRSI(Symbol(),60,RSIperiod,PRICE_CLOSE,1);
double rsid1=iRSI(Symbol(),1440,RSIperiod,PRICE_CLOSE,1);
//--- open position
if(OpenSELL && OrderSell<1 && rsim30>=SellLevel && rsim60>=SellLevel && rsid1<50) OPSELL();
if(OpenBUY && OrderBuy<1 && rsim30<=BuyLevel && rsim60<=BuyLevel && rsid1>50) OPBUY();
//--- close position by signal
if(CloseBySignal)
{
if(OrderBuy>0 && rsim30>=SellLevel && rsim60>=SellLevel) CloseBuy();
if(OrderSell>0 && rsim30<=BuyLevel && rsim60<=BuyLevel) CloseSell();
}
//---
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OPBUY()
{
double StopLossLevel;
double TakeProfitLevel;
if(StopLoss>0) StopLossLevel=Bid-StopLoss*Point; else StopLossLevel=0.0;
if(TakeProfit>0) TakeProfitLevel=Ask+TakeProfit*Point; else TakeProfitLevel=0.0;
ticket=OrderSend(Symbol(),OP_BUY,1,Ask,Slippage,StopLossLevel,TakeProfitLevel,Koment,MagicNumber,0,DodgerBlue);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OPSELL()
{
double StopLossLevel;
double TakeProfitLevel;
if(StopLoss>0) StopLossLevel=Ask+StopLoss*Point; else StopLossLevel=0.0;
if(TakeProfit>0) TakeProfitLevel=Bid-TakeProfit*Point; else TakeProfitLevel=0.0;
//---
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,Slippage,StopLossLevel,TakeProfitLevel,Koment,MagicNumber,0,DeepPink);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseSell()
{
int total=OrdersTotal();
for(int y=OrdersTotal()-1; y>=0; y--)
{
if(OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber)
{
ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,Black);
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseBuy()
{
int total=OrdersTotal();
for(int y=OrdersTotal()-1; y>=0; y--)
{
if(OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==MagicNumber)
{
ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,Black);
}
}
}
//+------------------------------------------------------------------+