OrderChase_V2





//+------------------------------------------------------------------+
//|                                                   OrderChase.mq4 |
//|                                                            Roger |
//|                                      http://www.rogersignals.com |
//+------------------------------------------------------------------+
#property copyright "Roger"
#property link      "http://www.rogersignals.com/ru/"
//Ýòîò ñîâåòíèê ïðåäíàçíà÷åí äëÿ ïîñëåäîâàòåëüíîãî îòêðûòèÿ îðäåðîâ ïî çàëîæåííîé Âàìè ïðîãðàììå.
//Ïðåäâàðèòåëüíî íåîáõîäèìî ïîäãîòîâèòü êîíôèãóðàöèîííûé ôàéë, â êîòîðîì Âû ðàñïèñûâàåòå ñöåíàðèé îòêðûòèÿ îðäåðîâ.
//Íàçâàíèå ôàéëà - Chase.csv, ëåæèò îí â ïîääèðåêòîðèè \experts\files\ è ìîæåò âûãëÿäåòü ïðèáëèçèòåëüíî òàê:
//1;SELL;0;;1.0;0;1.667;1.6285
//2;BUY;1;TP;2.2;0;1000;650
//3;SELLLIMIT;2;TP;4.0;Bid+500;0;1000
//Ïðîùå âñåãî çàïîëíÿòü ýòîò ôàéë ÷åðåç Excel, íî â ïðèíöèïå âîçìîæíî è ÷åðåç ëþáîé ðåäàêòîð
//Íàçíà÷åíèå êîëîíîê ñëåäóùåå:
//1 - ïîðÿäêîâûé íîìåð, èäåò ñòðîãî îò 1, 2,3 è äî ìàêñèìàëüíîãî;
//2 - òèï îðäåðà (BUY, SELL, BUYLIMIT, SELLLIMIT, BUYSTOP è SELLSTOP), ìîæíî öèôðàìè;
//3 - çàâèñèìîñòü îðäåðà, ò.å. åñëè Âû æåëàåòå, ÷òîáû îðäåð âûñòàâèëñÿ ïîñëå îòêðûòèÿ 1-ãî îðäåðà, ñòàâèòñÿ 1;
//4 - òèï çàâèñèìîñòè, ìîæåò áûòü OP - îòêðûòèå (èìåííî îòêðûòèå, à íå âûñòàâëåíèå) îðäåðà, SL - çàêðûòèå îðäåðà ïî ñòîïó, 
//TP - çàêðûòèå îðäåðà ïî òåéêïðîôèòó, CL - ëþáîå çàêðûòèå îðäåðà, CL- è CL+ - çàêðûòèå îðäåðà, ñîîòâåòñòâåííî, â ìèíóñ è â ïëþñ ;
//5 - ðàçìåð ëîòà;
//6 - öåíà îòêðûòèÿ îðäåðà (äëÿ BUY è SELL îðäåðîâ âñåãäà 0, ïîòîìó êàê îòêðîåòñÿ ïî ðûíêó). Äëÿ îòëîæåííûõ îðäåðîâ âîçìîæíî êîñâåííîå çàäàíèå öåíû
// íàïðèìåð, äëÿ BUYLIMIT - ASK-200;
//7 - öåíà ñòîïëîññà çàêðûòèÿ îðäåðà (åñëè ñòàâèòå 0 èëè ïóñòîå ìåñòî, çíà÷èò ñòîïà íå áóäåò). Òàêæå âîçìîæíî çàäàíèå ñòîïà â ïèïñàõ öåëûõ ÷èñëîì;
//8 - öåíà òåéêïðîôèòà çàêðûòèÿ îðäåðà (òî æå).
//Ñîâåòíèê ðàáîòàåò òîëüêî äëÿ îäíîé ïàðû âàëþò, íà ãðàôèê êîòîðîé îí óñòàíîâëåí.
//Åñëè öåíû èëè êîëè÷åñòâî ëîòîâ óñòàíîâëåíî íåïðàâèëüíî, îðäåð íå âûñòàâëÿåòñÿ è âñÿ öåïî÷êà íàðóøàåòñÿ.
//Áóäüòå âíèìàòåëüíû!!!
//Äëÿ çàïóñêà íîâîé öåïî÷êè, íåîáõîäèìî, ÷òîáû âñå îðäåðà, îòêðûòûå ýòèì ñîâåòíèêîì, áûëè çàêðûòû.
//Ïåðâûé îðäåð ìîæíî îòêðûâàòü âðó÷íóþ (â îáùåé íóìåðàöèè îí áóäåò íóëåâûì).
//Åñëè ïðè çàïóñêå òåðìèíàëà íè îäíîãî îðäåðà íå îòêðûòî (íàïðèìåð ïðè ãýïå çà âûõîäíûå çàêðîþòñÿ âñå îðäåðà), öèêë íà÷íåòñÿ ñ ïåðâîãî îðäåðà. 
//Âîçìîæíî äîïèñûâàíèå çàäàíèé, íàïðèìåð, ïîñëå îòêðûòèÿ òðåòüåãî îðäåðà äîïèñûâàåòå âåðîÿòíóþ ïîñëåäîâàòåëüíîñòü íà âîçìîæíûå çàêðûòèÿ îðäåðà è
//ïåðåçàïóñêàåòå ñîâåòíèê. Êîãäà ñðàáîòàåò ñëåäóþùèé, äîïèñûâàåòå óæå äëÿ ýòîãî îðäåðà è òàê ïîêà íå íàäîåñò.
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int trade[],num[],numfrom[],ortrade[],ortic[],ormag[];
string price[],stopl[],takep[],res[];
double lots[];
int row,flag,flag2,flag3,mag,x,ord;
int init()
  {
//----
   int handle,maghis,cnt;
   string str,typord;
   
   
   handle=FileOpen("Chase.csv",FILE_CSV|FILE_READ);//îòêðûâàåì ôàéë
   if(handle==-1)//à åñòü ëè ýòîò ôàéë âîîáùå
      {
      Alert("Ôàéë îòñóòñòâóåò!!!");
      flag=1;
      return(0); 
      }
   if(FileSize(handle)==0)//à íå ïóñòîé ëè îí
      {
      FileClose(handle);
      Alert("Ôàéë ïóñòîé!!!");
      flag=1;
      return(0); 
      }
   row=0;
   while(!FileIsEnding(handle))//íà÷èíàåì ïàðñèòü ñòðîêè
      {
      str=FileReadString(handle);
      if(StrToInteger(str)==0)
         {
         FileClose(handle);
         break;
         }
      row++;
      ArrayResize(num,row);//ðàñøèðÿåì ìàññèâû
      ArrayResize(numfrom,row);
      ArrayResize(trade,row);
      ArrayResize(res,row);
      ArrayResize(lots,row);
      ArrayResize(price,row);
      ArrayResize(stopl,row);
      ArrayResize(takep,row);
      num[row-1]=StrToInteger(str);  //ñ÷èòûâàåì ïîýëåìåíòíî, ñíà÷àëà íîìåð        
      typord=FileReadString(handle);
      if(StrToInteger(typord)==0&&typord!="0")trade[row-1]=ordtoint(typord); else trade[row-1]=StrToInteger(typord);
      numfrom[row-1]=StrToInteger(FileReadString(handle));         
      res[row-1]=FileReadString(handle);
      lots[row-1]=StrToDouble(FileReadString(handle));
      price[row-1]=FileReadString(handle);
      stopl[row-1]=FileReadString(handle);
      takep[row-1]=FileReadString(handle);// è ïîñëåäíèé
      }
   x=OrdersTotal();
   ord=0;
   if(x>0)for(cnt=0;cnt<x;cnt++)//ñîñòàâëÿåì ìàññèâ îòêðûòûõ îðäåðîâ íà òåðìèíàëå
       {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
       if(OrderSymbol()==Symbol())
         {
         ord++;
         ArrayResize(ortrade,ord);
         ArrayResize(ormag,ord);
         ArrayResize(ortic,ord);
         ortic[ord-1]=OrderTicket();
         ormag[ord-1]=OrderMagicNumber();
         ortrade[ord-1]=OrderType();
         }
       }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  int i,ii,iii,his,hisend,cnt,magic, flag1, flag11;
  string result;
//----
   if(flag==1)//åñëè ôàéë áûë ïóñòîé
      {
      Alert("Çàïîëíèòå ôàéë Chase.csv ñîãëàñíî èíñòðóêöèè è ïåðåçàïóñòèòå ñîâåòíèê!!");
      return(0);
      }   
   if(flag2==1)return(0);
   if(ord==0&&flag3==0)flag2=OpenOrders(trade[0],lots[0],price[0],stopl[0],takep[0],1);//åñëè îòêðûòûõ îðäåðîâ íåò, çàïóñêàåì ïåðâûé
   flag3=1;
   if(flag2==1)
      {
      Alert("Îøèáêà îòêðûòèÿ îðäåðà! Âñÿ öåïî÷êà íàðóøåíà! Ïåðåïðîâåðüòå ôàéë êîíôèãóðàöèè!!");
      return(0);
      }
   if(x==OrdersTotal()&&x!=0)//ïðîâåðÿåì ñðàáàòûâàíèå îòëîæåííûõ
      {         
      for(i=0;i<ord;i++)
         {
         OrderSelect(ortic[i], SELECT_BY_TICKET);
         if(ortrade[i]!=OrderType())//åñëè ñðàáîòàë
            {
            ortrade[i]=OrderType();
            magic=ormag[i];
            result="OP";
            flag1=1;
            break;
            }
         }   
      }
   if(x>OrdersTotal())//ïðîâåðÿåì, êàêèå îðäåðà çàêðûëèñü è ñ êàêèì ðåçóëüòàòîì
      {
      cnt=x-OrdersTotal();
      int nn;
      for(i=OrdersHistoryTotal()-1;i>OrdersHistoryTotal()-cnt-1;i--)
         {
         OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
         int mag1[],kol;
         string res1[];
         for(ii=0;ii<ord;ii++)
            {
            if(ormag[ii]==OrderMagicNumber()&&Symbol()==OrderSymbol())
               {
               kol++;
               ArrayResize(res1,kol);
               ArrayResize(mag1,kol);
               mag1[kol-1]=ormag[ii];
               nn=ii;
               result="CL";
               for(iii=0;iii<row;iii++)
                  {
                  if(num[iii]==mag1[kol-1])
                     {
                     if((OrderClosePrice()>=OrderOpenPrice()&&OrderType()==0)||(OrderClosePrice()<=OrderOpenPrice()&&OrderType()==1))res1[kol-1]="CL+";                     
                     if((OrderClosePrice()>=OrderTakeProfit()&&OrderTakeProfit()!=0&&OrderType()==0)||(OrderClosePrice()<=OrderTakeProfit()&&OrderType()==1))res1[kol-1]="TP";
                     if((OrderClosePrice()<OrderOpenPrice()&&OrderType()==0)||(OrderClosePrice()>OrderOpenPrice()&&OrderType()==1))res1[kol-1]="CL-";
                     if((OrderClosePrice()<=OrderStopLoss()&&OrderType()==0)||(OrderClosePrice()>=OrderStopLoss()&&OrderStopLoss()!=0&&OrderType()==1))res1[kol-1]="SL";
                     //break; 
                     }
                  }      
               if(nn>=0)//èçìåíÿåì ìàññèâ îðäåðîâ
                        {   
                        while(nn<ord)
                                 {
                                 if(ortic[nn+1]!=0)
                                          {
                                          ortic[nn]=ortic[nn+1];
                                          ormag[nn]=ormag[nn+1];
                                          ortrade[nn]=ortrade[nn+1];
                                          ortic[nn+1]=0;
                                          ormag[nn+1]=0;
                                          ortrade[nn+1]=0;
                                          }
                                 else break;
                                 nn++;
                                 }   
                        }
               ord--;
               ArrayResize(ortrade,ord);
               ArrayResize(ormag,ord);
               ArrayResize(ortic,ord);               
               }
            }
         }
      flag11=1;
      x=OrdersTotal();
      }
   if(x<OrdersTotal())//äîáàâëåì íîâûå îðäåðà ê ìàññèâó
            {
             cnt=OrdersTotal()-x;
             for(i=OrdersTotal()-1;i>OrdersTotal()-1-cnt;i--)
               {
               OrderSelect(i, SELECT_BY_POS);
               if(Symbol()==OrderSymbol())
                 {
                 ord++;
                 ArrayResize(ortrade,ord);
                 ArrayResize(ormag,ord);
                 ArrayResize(ortic,ord);               
                 ortic[ord-1]=OrderTicket();
                 ormag[ord-1]=OrderMagicNumber();
                 ortrade[ord-1]=OrderType();               
                 }
              } 
            x=OrdersTotal();
            }
   if(flag1==1)//åñëè óñëîâèÿ íàñòóïèëè îòêðûâàåì îðäåðà èç ñïèñêà
      {
      for(iii=0;iii<row;iii++)
         {
         if(numfrom[iii]==magic)
            {
            if(StringFind(result,res[iii])!=-1||(res[iii]=="CL"&&result!="OP")||(res[iii]=="CL+"&&result=="TP")||(res[iii]=="CL-"&&result=="SL"))
               {
               flag2=OpenOrders(trade[iii],lots[iii],price[iii],stopl[iii],takep[iii],num[iii]);
               if(flag2==1)
                  {
                  Alert("Îøèáêà îòêðûòèÿ îðäåðà! Âñÿ öåïî÷êà íàðóøåíà! Ïåðåïðîâåðüòå ôàéë êîíôèãóðàöèè!!");
                  return(0);
                  }
               }
            }
         }
      }
   if(flag11==1)//åñëè óñëîâèÿ íàñòóïèëè îòêðûâàåì îðäåðà èç ñïèñêà
      {
      for(i=0;i<kol;i++)
         {
         for(iii=0;iii<row;iii++)
            {
            if(numfrom[iii]==mag1[i])
               {
               if(StringFind(res1[i],res[iii])!=-1||(res[iii]=="CL"&&res1[i]!="OP")||(res[iii]=="CL+"&&res1[i]=="TP")||(res[iii]=="CL-"&&res1[i]=="SL"))
                  {
                  flag2=OpenOrders(trade[iii],lots[iii],price[iii],stopl[iii],takep[iii],num[iii]);
                  if(flag2==1)
                     {
                     Alert("Îøèáêà îòêðûòèÿ îðäåðà! Âñÿ öåïî÷êà íàðóøåíà! Ïåðåïðîâåðüòå ôàéë êîíôèãóðàöèè!!");
                     return(0);
                     }
                  }
               }
            }
         }
      }
   return(0);
  }
//+------------------------------------------------------------------+
int OpenOrders(int trad, double lot, string pr, string sl, string tp, int magc)//ôóíêöèÿ îòêðûòèÿ îðäåðîâ
   {
      double stop,take,prc;
      int cnt,ticket,err;   
      if(StrToDouble(pr)!=0)prc= NormalizeDouble(StrToDouble(pr),Digits);
      else
         {
         if(StringSubstr(StringLower(pr),0,3)=="ask")
            {
            if(StringSubstr(pr,3,1)=="+")prc=Ask+StrToInteger(StringSubstr(pr,4))*Point;
            else prc=Ask-StrToInteger(StringSubstr(pr,4))*Point;
            }
         if(StringSubstr(StringLower(pr),0,3)=="bid")
            {
            if(StringSubstr(pr,3,1)=="+")prc=Bid+StrToInteger(StringSubstr(pr,4))*Point;
            else prc=Bid-StrToInteger(StringSubstr(pr,4))*Point;
            }
         } 
      if(trad==0)prc=Ask;
      if(trad==1)prc=Bid;
      if(MathFloor(StrToDouble(sl))==StrToInteger(sl))
         {
         if(MathMod(trad,2)==0)stop=prc-StrToInteger(sl)*Point;
         else stop=prc+StrToInteger(sl)*Point;
         }
      else stop= NormalizeDouble(StrToDouble(sl),Point);
      if(StrToDouble(sl)==0)stop=0;
      if(MathFloor(StrToDouble(tp))==StrToInteger(tp))
         {
         if(MathMod(trad,2)==0)take=prc+StrToInteger(tp)*Point;
         else take=prc-StrToInteger(tp)*Point;
         }
      else take= NormalizeDouble(StrToDouble(tp),Point);
      if(StrToDouble(tp)==0)take=0;
      //Print("SL - ",stop," TP - ",take);
      if(trad==0)//áàé îðäåð
         {
         if((take==0||take-Bid>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)&&Bid-stop>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)
            {
            for(cnt=0;cnt<5;cnt++)
               {
               RefreshRates();
               ticket=OrderSend(Symbol(),OP_BUY,lot,Ask,50,stop,take,"",magc,0,CLR_NONE);
               if(ticket<0)
                  {
                  err=GetLastError();
                  Print("Îøèáêà - ",err);
                  if(StrToInteger(err)<135||StrToInteger(err)>141)return(1);
                  }
               else 
                  {
                  return(0);
                  }
               }            
            }
         else 
            {
            Print("Îðäåð Buy íå óñòàíîâëåí - íåïðàâèëüíî çàäàíû óðîâíè ñòîïîâ èëè òåéêîâ! ");
            return(1);
            }
         }
      if(trad==1)//sell îðäåð
         {
         if((stop==0||stop-Ask>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)&&Ask-take>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)
            {
            for(cnt=0;cnt<5;cnt++)
               {
               RefreshRates();
               ticket=OrderSend(Symbol(),OP_SELL,lot,Bid,50,stop,take,"",magc,0,CLR_NONE);
               if(ticket<0)
                  {
                  err=GetLastError();
                  Print("Îøèáêà - ",err);
                  if(StrToInteger(err)<135||StrToInteger(err)>141)return(1);
                  }
               else 
                  {
                  return(0);
                  }
               }            
            }
         else 
            {
            Print("Îðäåð Sell íå óñòàíîâëåí - íåïðàâèëüíî çàäàíû óðîâíè ñòîïîâ èëè òåéêîâ! ");
            return(1);
            }
         }
      if(trad==2)//áàéëèìèò îðäåð
         {
         if((take==0||take-prc>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)&&prc-stop>(MarketInfo(Symbol(),MODE_SPREAD)+MarketInfo(Symbol(),MODE_STOPLEVEL))*Point
         &&Ask-prc>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)
            {
            for(cnt=0;cnt<5;cnt++)
               {
               RefreshRates();
               ticket=OrderSend(Symbol(),OP_BUYLIMIT,lot,prc,50,stop,take,"",magc,0,CLR_NONE);
               if(ticket<0)
                  {
                  err=GetLastError();
                  Print("Îøèáêà - ",err);
                  if(StrToInteger(err)<135||StrToInteger(err)>141)return(1);
                  }
               else 
                  {
                  return(0);
                  }
               }            
            }
         else 
            {
            Print("Îðäåð BuyLimit íå óñòàíîâëåí - íåïðàâèëüíî çàäàíû óðîâíè öåí, ñòîïîâ èëè òåéêîâ! ");
            return(1);
            }
         }         
      if(trad==3)//selllimit îðäåð
         {
         if((stop==0||stop-prc>(MarketInfo(Symbol(),MODE_SPREAD)+MarketInfo(Symbol(),MODE_STOPLEVEL))*Point)&&prc-take>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point
         &&prc-Bid>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)
            {
            for(cnt=0;cnt<5;cnt++)
               {
               RefreshRates();
               ticket=OrderSend(Symbol(),OP_SELLLIMIT,lot,prc,50,stop,take,"",magc,0,CLR_NONE);
               if(ticket<0)
                  {
                  err=GetLastError();
                  Print("Îøèáêà - ",err);
                  if(StrToInteger(err)<135||StrToInteger(err)>141)return(1);
                  }
               else 
                  {
                  return(0);
                  }
               }            
            }
         else 
            {
            Print("Îðäåð SellLimit íå óñòàíîâëåí - íåïðàâèëüíî çàäàíû óðîâíè öåí, ñòîïîâ èëè òåéêîâ! ");
            return(1);
            }
         }
      if(trad==4)//áàéñòîï îðäåð
         {
         if((take==0||take-prc>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)&&prc-stop>(MarketInfo(Symbol(),MODE_SPREAD)+MarketInfo(Symbol(),MODE_STOPLEVEL))*Point
         &&prc-Ask>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)
            {
            for(cnt=0;cnt<5;cnt++)
               {
               RefreshRates();
               ticket=OrderSend(Symbol(),OP_BUYSTOP,lot,prc,50,stop,take,"",magc,0,CLR_NONE);
               if(ticket<0)
                  {
                  err=GetLastError();
                  Print("Îøèáêà - ",err);
                  if(StrToInteger(err)<135||StrToInteger(err)>141)return(1);
                  }
               else 
                  {
                  return(0);
                  }
               }            
            }
         else 
            {
            Print("Îðäåð BuyStop íå óñòàíîâëåí - íåïðàâèëüíî çàäàíû óðîâíè öåí, ñòîïîâ èëè òåéêîâ! ");
            return(1);
            }
         }         
      if(trad==5)//sellstop îðäåð
         {
         if((stop==0||stop-prc>(MarketInfo(Symbol(),MODE_SPREAD)+MarketInfo(Symbol(),MODE_STOPLEVEL))*Point)&&prc-take>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point
         &&Bid-prc>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)
            {
            for(cnt=0;cnt<5;cnt++)
               {
               RefreshRates();
               ticket=OrderSend(Symbol(),OP_SELLSTOP,lot,prc,50,stop,take,"",magc,0,CLR_NONE);
               if(ticket<0)
                  {
                  err=GetLastError();
                  Print("Îøèáêà - ",err);
                  if(StrToInteger(err)<135||StrToInteger(err)>141)return(1);
                  }
               else 
                  {
                  return(0);
                  }
               }            
            }
         else 
            {
            Print("Îðäåð SellStop íå óñòàíîâëåí - íåïðàâèëüíî çàäàíû óðîâíè öåí, ñòîïîâ èëè òåéêîâ! ");
            return(1);
            }
         }
  }
   
int ordtoint(string tip)//ïåðåâîäèì ñäåëêè íà ÿçûê ÌÒ
   {
   int type=6;
   tip=StringLower(tip);
   if(tip=="buy")type=0;
   if(tip=="sell")type=1;
   if(tip=="buy-limit"||tip=="buy limit"||tip=="buylimit")type=2;
   if(tip=="sell-limit"||tip=="sell limit"||tip=="selllimit")type=3;
   if(tip=="buy-stop"||tip=="buy stop"||tip=="buystop")type=4;
   if(tip=="sell-stop"||tip=="sell stop"||tip=="sellstop")type=5;
   return(type);
   }
string StringLower(string s) {//ïåðåâîäèì âñå â íèæíèé ðåãèñòð
  int c, i, k=StringLen(s), n;
   for (i=0; i<k; i++) {
     n=0;
     c=StringGetChar(s, i);
     if (c>64 && c<91) n=c+32;    // A-Z -> a-z
     if (n>0) s=StringSetChar(s, i, n);
   }
  return(s);
   }
   



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders
Checks for the total of closed orders
It automatically opens orders when conditions are reached

Other Features:

Uses files from the file system
It issuies visual alerts to the screen

It reads information from a file