Работа завершена
![](https://c.mql5.com/i/avatar/avatar_na2.png)
![](https://c.mql5.com/i/avatar/avatar_na2.png)
Техническое задание
#property version "1.00" #property strict input bool OpenBUY=True; input bool OpenSELL=True; input bool CloseBySignal=True; input double StopLoss=20; input double TakeProfit=10; input double TrailingStop=20; input int RSIperiod=14; input double BuyLevel=30; input double SellLevel=80; input bool AutoLot=True; input double Risk=1; input double ManualLots=0.1; input int MagicNumber=123; input string Koment="RSIea"; input int Slippage=10; //--- int OrderBuy,OrderSell; int ticket; int LotDigits; double Trail,iTrailingStop; int k; //+------------------------------------------------------------------+ //| 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,0); 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 HTb=iCustom(Symbol(),0,"HalfTrend-1.02",0,0); //buy // double HTs=iCustom(Symbol(),0,"HalfTrend-1.02",1,0); //buy //--- open position if(OpenSELL && OrderSell<1 && rsim1>50) OPSELL(); if(OpenBUY && OrderBuy<1 && rsim1<50) OPBUY(); //--- close position by signal if(CloseBySignal) { if(OrderBuy>0 && rsim1<45) CloseBuy(); if(OrderSell>0 && rsim1>65) 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,LOT(),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,LOT(),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); } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double LOT() { double lotsi; double ilot_max =MarketInfo(Symbol(),MODE_MAXLOT); double ilot_min =MarketInfo(Symbol(),MODE_MINLOT); double tick=MarketInfo(Symbol(),MODE_TICKVALUE); //--- double myAccount=AccountBalance(); //--- if(ilot_min==0.01) LotDigits=2; if(ilot_min==0.1) LotDigits=1; if(ilot_min==1) LotDigits=0; //--- if(AutoLot) { lotsi=NormalizeDouble((myAccount*Risk)/10000,LotDigits); } else { lotsi=ManualLots; } //--- if(lotsi>=ilot_max) { lotsi=ilot_max; } //--- return(lotsi); } //+------------------------------------------------------------------+
The EA is as above, the trade logic is preposterous, solely put there for the purpose of testing the Email alerts quickly.
I would like to add Email alert features that functions with the below requirements,
1. It doesn't change my current EA syntax basic structure drastically.
2. It sends me an email alert every time a trade is opened, and each time a trade is closed via either close-trade logic, stop loss, take profit, or trailing stop, the email needs to include Symbol, order type, order size, order open time and price, order close time and price( if it is closing a trade), order final profits( for closing trades), account balance and account equity at the time of the trade open or close.
3. The email alert feature should have a stable performance, as the EA will be running 24/7, I don't want to have errors like "Mail: not enough space for ' ' " or others.
4. A detailed explanation for the feature logic so that I can understand in order to edit it according to my needs.
4. A timely delivery is a must.
Thanks for your time and let me know if you are up to the task.