ExpertAdvisor_sl_tp

Author: sanyooooook
Profit factor:
0.00
16 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