ExpertAdvisor_sl_tp

Author: sanyooooook
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
Indicators Used
MACD Histogram
0 Views
0 Downloads
0 Favorites
ExpertAdvisor_sl_tp
//+------------------------------------------------------------------+
//|                                                ExpertAdvisor.mq4 |
//|                                                      sanyooooook |
//|                                                 http://sn-bot.ru |
//+------------------------------------------------------------------+
#property copyright "sanyooooook"
#property link      "http://sn-bot.ru"
#property version   "1.01"
#property strict

extern int Magik=12345;//magic number
extern double TakeProfit=30;
extern double StopLoss=30;
extern double TrailingStop=15;
extern double Lot=0.1;
extern int PeriodMA_Fast=6,//the period fast MA
PeriodMA_Slow=24,//the period slow MA
Sig_Period=5;//period of the signal MA
extern int Slp=3;//Slippage
int Slippage=0;
datetime ti=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Slippage=Slp;
   if(_Digits==3 || _Digits==5)
     {
      Slippage=Slippage*10;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int total=0;//tBuy=0,tSell=0;//,tBS=0,tSS=0,tBL=0,tSL=0;
   int Signal=Signal_();//ïðîâåðÿåì ñèãíàë

                        //áëîê ïðîâåðêè ñèòóàöèè ïî îðäåðàì
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol && OrderMagicNumber()==Magik)
        {
         total++;
         int cmd=OrderType();
         switch(cmd)
           {
            case OP_BUY://åñëè âûáðàëè îðäåð íà ïîêóïêó
              {
               if(Signal==(-1))//åñëè åñòü ïðîòèâîïîëîæíèé ñèãíàë äëÿ òåêóùåãî îðäåðà, òî çàêðûâàåì
                 {
                  if(OrderClose(OrderTicket(),OrderLots(),n(Bid,_Symbol),Slippage))
                    {
                     total--;
                     break;
                    }
                 }
               if(TrailingStop>0)//ñþäà âñòàâèë êóñîê êîäà îòâå÷àþùåãî çà òðåéëèíã ïîêóïêè
                 {
                  if(Bid-OrderOpenPrice()>Point*TrailingStop)
                    {
                     if(OrderStopLoss()<Bid-Point*TrailingStop)
                       {
                        //--- modify order and exit
                        if(OrderStopLoss()!=n(Bid-Point*TrailingStop,_Symbol))
                        {
                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),n(Bid-Point*TrailingStop,_Symbol),OrderTakeProfit(),0,Green))
                              Print("OrderModify error ",GetLastError());
                        }
                        break;
                       }
                    }
                 }
               break;
              }
            case OP_SELL://åñëè ûâáðàëè îðäåðà íà ïðîäàæó
              {
               if(Signal==1)//åñëè åñòü ïðîòèâîïîëîæíèé ñèãíàë äëÿ òåêóùåãî îðäåðà, òî çàêðûâàåì
                 {
                  if(OrderClose(OrderTicket(),OrderLots(),n(Ask,_Symbol),Slippage))
                    {
                     total--;
                     break;
                    }
                 }
               if(TrailingStop>0)//ñþäà âñòàâèë êóñîê êîäà îòâå÷àþùåãî çà òðåéëèíã ïðîäàæè
                 {
                  if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                    {
                     if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                       {
                        //--- modify order and exit
                        if(OrderStopLoss()!=n(Ask+Point*TrailingStop,_Symbol))
                        {
                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),n(Ask+Point*TrailingStop,_Symbol),OrderTakeProfit(),0,Red))
                              Print("OrderModify error ",GetLastError());
                        }
                        break;
                       }
                    }
                 }
               break;
              }
            default: break;
           }
        }
     } //ÊÎÍÅÖ  áëîê ïðîâåðêè ñèòóàöèè ïî îðäåðàì

//Íà îñíîâàíèè ïîñëåäíåãî ñèãíàëà è òåêóùåé ñèòóàöèè ïî îðäåðàì ïðèíèìàåì ðåøåíèå: 
//îòêðûâàòü, çàêðûâàòü, ìîäèôèöèðîâàòü èëè îñòàâèòü áåç èçìåíåíèé îðäåð.
   if(ti!=Time[0])//åñëè âðåìÿ òåêóùåãî áàðà íå ðàâíî çàïîìíåííîìó, ïðîáóåì îòêðûòü îðäåð åñëè åñòü ñèãíàë
     {
      if(total==0)//åñëè íåò îòêðûòûõ îäåðîâ
        {
         switch(Signal)
           {
            case 1://åñëè ñèãíàë íà ïîêóïêó
              {
               if(OpenOrders(_Symbol,OP_BUY,Ask,Lot,Slippage,StopLoss,TakeProfit,Magik,"","",true)>0)
               //åñëè îðäåð îòêðûò óñïåøíî, íî çàïîìèíàåì âðåìÿ òåêóùåãî áàðà
                 {
                  ti=Time[0];
                 }
               break;
              }
            case(-1)://åñëè ñèãíàë íà ïðîäàæó
              {
               if(OpenOrders(_Symbol,OP_SELL,Bid,Lot,Slippage,StopLoss,TakeProfit,Magik,"","",true)>0)
               //åñëè îðäåð îòêðûò óñïåøíî, íî çàïîìèíàåì âðåìÿ òåêóùåãî áàðà
                 {
                  ti=Time[0];
                 }
               break;
              }
           }
        }
     }
  }//ÊÎÍÅÖ    //Íà îñíîâàíèè ïîñëåäíåãî ñèãíàëà è òåêóùåé ñèòóàöèè ïî îðäåðàì ïðèíèìàåì ðåøåíèå: 
//îòêðûâàòü, çàêðûâàòü, ìîäèôèöèðîâàòü èëè îñòàâèòü áåç èçìåíåíèé îðäåð.

//+------------------------------------------------------------------+
int Signal_()
  {
   double MACD1=iMACD(NULL,0,PeriodMA_Fast,PeriodMA_Slow,Sig_Period,0,MODE_MAIN,1);
   double MACD2=iMACD(NULL,0,PeriodMA_Fast,PeriodMA_Slow,Sig_Period,0,MODE_MAIN,2);
   if(MACD1>=0 && MACD2<=0)return(1);//ïåðåñå÷åíèå ÌÀ ñíèçó ââåðõ
   if(MACD1<=0 && MACD2>=0)return(-1);//ïåðåñå÷åíèå ÌÀ ñâåðõó âíèç
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OpenOrders(string Symb,//Symbol
               int cmd,//Type
               double OpenPrice,
               double lot,
               int slip,//Slippage
               double SL,//StopLoss
               double TP,//TakeProfit
               int MG,//Magik
               string PP,//Comment Log
               string coment,//CommentOrder
               bool OpenStops=true)//ECN - false
  {
   Print("Send: ","Symb=",Symb,", cmd=",cmd,", OpenPrice=",OpenPrice,", lot=",lot,", slip=",slip,", SL=",SL,", TP=",TP,", MG=",MG,", PP=",PP,", coment=",coment,", OpenStops=",OpenStops);
   double PriceSL=0;
   double PriceTP=0;
   int ticket=-1;
   lot=NL(Symb,lot);//NormalizeLot
   double Point_=MarketInfo(Symb,MODE_POINT);
   if(lot>MarketInfo(Symb,MODE_MAXLOT))
     {
      Print("lot > MAXLOT!");return(-1);
     }
   if(lot<MarketInfo(Symb,MODE_MINLOT))
     {
      Print("lot < MINLOT!");return(-1);
     }
   if(FreeEquity(Symb,lot)==(-1))return(-1);//check the availability of the free margin for opening an order
   int err=0;
   RefreshRates();
   int StopLevel=int(MarketInfo(Symb,MODE_STOPLEVEL));
   if(SL<StopLevel&&SL!=0)SL=StopLevel+1;
   if(TP<StopLevel&&TP!=0)TP=StopLevel+1;
   double Ask_=n(MarketInfo(Symb,MODE_ASK),Symb),Bid_=n(MarketInfo(Symb,MODE_BID),Symb);
   Print("Ask=",Ask_,", Bid=",Bid_,", STOPLEVEL=",StopLevel);
   switch(cmd)
     {
      case OP_SELL:
        {
         TP=TP*(-1);
         if(SL>0||SL<0)PriceSL=n(Bid_+SL*Point_,Symb);else PriceSL=0;
         if(TP>0||TP<0)PriceTP=n(Bid_+TP*Point_,Symb);else PriceTP=0;
         if(OpenStops)
           {
            ticket=OrderSend(Symb,cmd,lot,Bid_,slip,PriceSL,PriceTP,coment,MG);err=GetLastError();
            if(ticket>=0)
              {
               Print("Open SELL "+string(ticket));return(ticket);
              }
              } else {ticket=OrderSend(Symb,cmd,lot,Bid_,slip,0,0,coment,MG);err=GetLastError();if(ticket>=0)Print("Open SELL "+string(ticket));
           }
         break;
        }
      case OP_BUY:
        {
         SL=SL*(-1);
         if(SL>0||SL<0)PriceSL=n(Ask_+SL*Point_,Symb); else PriceSL=0;
         if(TP>0||TP<0)PriceTP=n(Ask_+TP*Point_,Symb); else PriceTP=0;
         if(OpenStops)
           {
            ticket=OrderSend(Symb,cmd,lot,Ask_,slip,PriceSL,PriceTP,coment,MG);err=GetLastError();
            if(ticket>=0)
              {
               Print("Open BUY "+string(ticket));return(ticket);
              }
              } else {ticket=OrderSend(Symb,cmd,lot,Ask_,slip,0,0,coment,MG);err=GetLastError();if(ticket>=0)Print("Open BUY "+string(ticket));
           }
         break;
        }
      case OP_BUYLIMIT:
        {
         SL=SL*(-1);
         if(SL>0||SL<0)PriceSL=n(OpenPrice+SL*Point_,Symb); else PriceSL=0;
         if(TP>0||TP<0)PriceTP=n(OpenPrice+TP*Point_,Symb); else PriceTP=0;
         if(OpenStops)
           {
            ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,PriceSL,PriceTP,coment,MG);err=GetLastError();
            if(ticket>=0)
              {
               Print("Open BUYLIMIT "+string(ticket));return(ticket);
              }
              } else {ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,0,0,coment,MG);err=GetLastError();if(ticket>=0)Print("Open BUYLIMIT "+string(ticket));
           }
         break;
        }
      case OP_BUYSTOP:
        {
         SL=SL*(-1);
         if(SL>0||SL<0)PriceSL=n(OpenPrice+SL*Point_,Symb); else PriceSL=0;
         if(TP>0||TP<0)PriceTP=n(OpenPrice+TP*Point_,Symb); else PriceTP=0;
         if(OpenStops)
           {
            ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,PriceSL,PriceTP,coment,MG);err=GetLastError();
            if(ticket>=0)
              {
               Print("Open BUYSTOP "+string(ticket));return(ticket);
              }
              } else {ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,0,0,coment,MG);err=GetLastError();if(ticket>=0)Print("Open BUYSTOP "+string(ticket));
           }
         break;
        }
      case OP_SELLLIMIT:
        {
         TP=TP*(-1);
         if(SL>0||SL<0)PriceSL=n(OpenPrice+SL*Point_,Symb); else PriceSL=0;
         if(TP>0||TP<0)PriceTP=n(OpenPrice+TP*Point_,Symb); else PriceTP=0;
         if(OpenStops)
           {
            ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,PriceSL,PriceTP,coment,MG);err=GetLastError();
            if(ticket>=0)
              {
               Print("Open SELLLIMIT "+string(ticket));return(ticket);
              }
              } else {ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,0,0,coment,MG);err=GetLastError();if(ticket>=0)Print("Open SELLLIMIT "+string(ticket));
           }
         break;
        }
      case OP_SELLSTOP:
        {
         TP=TP*(-1);
         if(SL>0||SL<0)PriceSL=n(OpenPrice+SL*Point_,Symb); else PriceSL=0;
         if(TP>0||TP<0)PriceTP=n(OpenPrice+TP*Point_,Symb); else PriceTP=0;
         if(OpenStops)
           {
            ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,PriceSL,PriceTP,coment,MG);err=GetLastError();
            if(ticket>=0)
              {
               Print("Open SELLSTOP "+string(ticket));return(ticket);
              }
              } else {ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,0,0,coment,MG);err=GetLastError();if(ticket>=0)Print("Open SELLSTOP "+string(ticket));
           }
         break;
        }
     }
   if(ticket<=0)
     {
      Print("error open #",err,PP);
     }
   else
     {
      if(TP==0&&SL==0)return(ticket);
      if(OrderSelect(ticket,SELECT_BY_TICKET))
        {
         RefreshRates();
         if(PriceTP==OrderTakeProfit()&&PriceSL==OrderStopLoss()) return(ticket);
         else
           {
            if(OrderModify(OrderTicket(),OrderOpenPrice(),PriceSL,PriceTP,0)==false)
              {
               Print("error modify#",GetLastError(),PP);
              }
            else Print("Order #",OrderTicket(),", successfully modified.");
           }
        }
     }
   return(ticket);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int FreeEquity(string Symb,double lot)
  {
   int res=0;
   if(MarketInfo(Symb,MODE_MARGINREQUIRED)*lot<AccountFreeMargin())
     {
      Print(MarketInfo(Symb,MODE_MARGINREQUIRED)*lot," ",AccountEquity());
     }
   else
     {
      Print("Insufficient funds for the opening position of the volume");
      res=(-1);
     }
   return(res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double NL(string Sym,double lots)
  {
   double step=MarketInfo(Sym,MODE_LOTSTEP);
   return (MathRound(lots/step)*step);
  }
//+------------------------------------------------------------------+
double n(double v,string S)
  {return(NormalizeDouble(v,int(MarketInfo(S,MODE_DIGITS))));}
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---