//+------------------------------------------------------------------+
//|                                                       Range.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Oleg Tsarkov"
#property link      "OlegTsarkov@yandex.ru"
//---- input parameters
extern int       MAFast=50; //ñãëàæèâàíèå äëÿ òðåíäîâîãî èíäèêàòîðà íà ìàëîì òàéìôðåéìå
extern int       IndFast=1; //òèï èíäèêàòîðà (âûáèðàåòñÿ èç ôóíêöèè TrendPMZ)  
extern int       TFFast=PERIOD_M1; //ïåðèîä ìàëîãî ÒÔ
extern int       MASlow=50; //ñãëàæèâàíèå äëÿ òðåíäîâîãî èíäèêàòîðà íà áîëüøîì òàéìôðåéìå
extern int       IndSlow=1; //òèï èíäèêàòîðà (âûáèðàåòñÿ èç ôóíêöèè TrendPMZ)
extern int       TFSlow=PERIOD_H1; //ïåðèîä áîëüøîãî ÒÔ
extern double    BasePoint=1.2; //íèæíÿÿ ãðàíèöà ñåòêè äëÿ buy
extern double    BasePointHighLevel=1.6; //âåðõíÿÿ ãðàíèöà ñåòêè äëÿ buy
extern int       Shift=100; //ñäâèã âíèç äëÿ sell
extern int       TProf=460; //òåéêïðîôèò, åñëè íå èñïîëüçóåòñÿ òðåéëèíã (íà òðåéëèíãå - 0)
extern int       Step=500;  //øàã ñåòêè
extern int       TrATR1=5;  //ïàðàìåòðû ATR äëÿ òðåéëèíãà  
extern int       TrATR2=36;
extern bool      TrailYN=false; //èñïîëüçîâàòü èëè íåò òðåéëèíã
extern int       TrendUpDn=0; //"1"-îòêðûâàòü òîëüêî buy,"-1"-òîëüêî sell,"0"-âåçäå
extern int       OnlyFastSlow=0; //0- èñïîëüçîâàòü îáà èíäèêàòîðà, 1-ìàëûé ÒÔ, 2-áîëüøîé ÒÔ, 3- áåç èíäèêàòîðîâ
extern double    BaseLot=0.01;
extern int       _MM=0; //ìàíèìåíåäæìåíò, 0- ðàçìåð ëîòà íå ìåíÿåòñÿ, 1-ëîò ïðîïîðöèîíàëåí áàëàíñó, 2-ëîò ïðîïîðöèîíàëåí êâàäðàòíîìó êîðíþ èç áàëàíñà
bool Work=true;                    // Ýêñïåðò áóäåò ðàáîòàòü.
int  Ticket; // Íîìåð îðäåðà
double CurLot;
string Komment="RangeX"; //Êîììåíòàðèé äëÿ îðäåðîâ, èñïîëüçóåòñÿ êàê ôèëüòð "ñâîé-÷óæîé"                         
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   //ðàñ÷åò ðàçìåðà ëîòà-----------------------------------------------------------------------
   CurLot=LotSize();
   //òðåéëèíã íà÷àëî------------------------------------------------------------------------
   int i;
   if (TrailYN==true)
   {
   for(i=1; i<=OrdersTotal(); i++)          // Öèêë ïåðåáîðà îðäåðîâ
      {
         if (OrderSelect(i-1,SELECT_BY_POS)==true)
            {
               if (OrderSymbol()!=Symbol())continue; //íå íàø èíñòðóìåíò
               if (OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue; //íå íàø òèï
               if (StringSubstr(OrderComment(),0,6)!=Komment)continue; // Íå íàø îðäåð
               TrailingByATR(OrderTicket(),60,TrATR1,1,TrATR2,1,1,false);
               
            }   
      }   
   }
   //òðåéëèíã êîíåö-------------------------------------------------------------------------            
   
   int MindFast=TrendPMZ(MAFast,TFFast,1); //îïðåäåëåíèå íàïðàâëåíèÿ òðåíäà íà ìàëîì ÒÔ
   int MindSlow=TrendPMZ(MASlow,TFSlow,1); //îïðåäåëåíèå íàïðàâëåíèÿ òðåíäà íà áîëüøîì ÒÔ
   int MindRez=0;
   if (OnlyFastSlow==0)
      {
      if (TrendUpDn==0)
         {
            if (MindFast==1&&MindSlow==1) MindRez=1;
            if (MindFast==-1&&MindSlow==-1) MindRez=-1;
         }
      if (TrendUpDn==1)
         {
            if (MindFast==1&&MindSlow==1) MindRez=1;
         }
      if (TrendUpDn==-1)
         {
            if (MindFast==-1&&MindSlow==-1) MindRez=-1;
         }
      }   
   if (OnlyFastSlow==1)
      {
      if (TrendUpDn==0)
         {
            if (MindFast==1) MindRez=1;
            if (MindFast==-1) MindRez=-1;
         }
      if (TrendUpDn==1)
         {
            if (MindFast==1) MindRez=1;
         }
      if (TrendUpDn==-1)
         {
            if (MindFast==-1) MindRez=-1;
         }
      }   
   if (OnlyFastSlow==2)
      {
      if (TrendUpDn==0)
         {
            if (MindSlow==1) MindRez=1;
            if (MindSlow==-1) MindRez=-1;
         }
      if (TrendUpDn==1)
         {
            if (MindSlow==1) MindRez=1;
         }
      if (TrendUpDn==-1)
         {
            if (MindSlow==-1) MindRez=-1;
         }
      }   
   if (OnlyFastSlow==3)
      {
         MindRez=TrendUpDn;
      }   
   LimOrdServ(MindRez);
//----
   return(0);
  }
//+------------------------------------------------------------------+
int Fun_Error(int Error)                        // Ô-èÿ îáðàáîò îøèáîê
  {
   switch(Error)
     {                                          // Ïðåîäîëèìûå îøèáêè            
      case  4: Alert("Òîðãîâûé ñåðâåð çàíÿò. Ïðîáóåì åù¸ ðàç..");
         Sleep(3000);                           // Ïðîñòîå ðåøåíèå
         return(1);                             // Âûõîä èç ôóíêöèè
      case 135:Alert("Öåíà èçìåíèëàñü. Ïðîáóåì åù¸ ðàç..");
         RefreshRates();                        // Îáíîâèì äàííûå
         return(1);                             // Âûõîä èç ôóíêöèè
      case 136:Alert("Íåò öåí. Æä¸ì íîâûé òèê..");
         while(RefreshRates()==false)           // Äî íîâîãî òèêà
            Sleep(1);                           // Çàäåðæêà â öèêëå
         return(1);                             // Âûõîä èç ôóíêöèè
      case 137:Alert("Áðîêåð çàíÿò. Ïðîáóåì åù¸ ðàç..");
         Sleep(3000);                           // Ïðîñòîå ðåøåíèå
         return(1);                             // Âûõîä èç ôóíêöèè
      case 146:Alert("Ïîäñèñòåìà òîðãîâëè çàíÿòà. Ïðîáóåì åù¸..");
         Sleep(500);                            // Ïðîñòîå ðåøåíèå
         return(1);                             // Âûõîä èç ôóíêöèè
         // Êðèòè÷åñêèå îøèáêè
      case  2: Alert("Îáùàÿ îøèáêà.");
         return(0);                             // Âûõîä èç ôóíêöèè
      case  5: Alert("Ñòàðàÿ âåðñèÿ òåðìèíàëà.");
         Work=false;                            // Áîëüøå íå ðàáîòàòü
         return(0);                             // Âûõîä èç ôóíêöèè
      case 64: Alert("Ñ÷åò çàáëîêèðîâàí.");
         Work=false;                            // Áîëüøå íå ðàáîòàòü
         return(0);                             // Âûõîä èç ôóíêöèè
      case 133:Alert("Òîðãîâëÿ çàïðåùåíà.");
         return(0);                             // Âûõîä èç ôóíêöèè
      case 134:Alert("Íåäîñòàòî÷íî äåíåã äëÿ ñîâåðøåíèÿ îïåðàöèè.");
         return(0);                             // Âûõîä èç ôóíêöèè
      default: Alert("Âîçíèêëà îøèáêà ",Error); // Äðóãèå âàðèàíòû   
         return(0);                             // Âûõîä èç ôóíêöèè
     }
  }
//----------------------------------------------------------------------
// ïðîöåäóðà òðåéëèíãà, âçÿë îòñþäà:
//http://forexsystems.ru/yazyk-programmirovaniya-mql4/8599-biblioteka-funkcii-dlya-treilinga-trailingall.html
//ñïàñèáî àâòîðó
void TrailingByATR(int ticket,int atr_timeframe,int atr1_period,int atr1_shift,int atr2_period,int atr2_shift,double coeff,bool trlinloss)
   {
      
   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   //Print("ticket: ",ticket,", atr1_period: ",atr1_period,", atr2_period: ",atr2_period,", coeff: ",coeff,", OrderSelect(ticket,SELECT_BY_TICKET): ",OrderSelect(ticket,SELECT_BY_TICKET),", atr_timeframe: ",atr_timeframe,", atr1_shift: ",atr1_shift,", atr2_shift: ",atr2_shift);
   if ((ticket==0) || (atr1_period<1) || (atr2_period<1) || (coeff==0) || (coeff<0) || (!OrderSelect(ticket,SELECT_BY_TICKET)) || 
   ((atr_timeframe!=1) && (atr_timeframe!=5) && (atr_timeframe!=15) && (atr_timeframe!=30) && (atr_timeframe!=60) && 
   (atr_timeframe!=240) && (atr_timeframe!=1440) && (atr_timeframe!=10080) && (atr_timeframe!=43200)) || (atr1_shift<0) || (atr2_shift<0))
      {
      Print("Òðåéëèíã ôóíêöèåé TrailingByATR() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      }
   
   double curr_atr1; // òåêóùåå çíà÷åíèå ATR - 1
   double curr_atr2; // òåêóùåå çíà÷åíèå ATR - 2
   double best_atr; // áîëüøåå èç çíà÷åíèé ATR
   double atrXcoeff; // ðåçóëüòàò óìíîæåíèÿ áîëüøåãî èç ATR íà êîýôôèöèåíò
   double newstop; // íîâûé ñòîïëîññ
   
   // òåêóùåå çíà÷åíèå ATR-1, ATR-2
   curr_atr1 = iATR(Symbol(),atr_timeframe,atr1_period,atr1_shift);
   curr_atr2 = iATR(Symbol(),atr_timeframe,atr2_period,atr2_shift);
   
   // áîëüøåå èç çíà÷åíèé
   best_atr = MathMax(curr_atr1,curr_atr2);
   
   // ïîñëå óìíîæåíèÿ íà êîýôôèöèåíò
   atrXcoeff = best_atr * coeff;
              
   // åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      // îòêëàäûâàåì îò òåêóùåãî êóðñà (íîâûé ñòîïëîññ)
      newstop = Bid - atrXcoeff;
      
      // åñëè trlinloss==true (ò.å. ñëåäóåò òðàëèòü â çîíå ëîññîâ), òî
      if (trlinloss==true)
         {
         // ïðîâåðÿåì, ÿâëÿåòñÿ ëè îí ëó÷øå òåêóùåãî ñòîïëîññà, åñëè äà, òî ïîñëåäíèé êîððåêòèðóåì
         if (newstop>OrderStopLoss())
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());      
         }
      else
         {
         Print("Bid: ",Bid,", atrXcoeff: ",atrXcoeff,", newstop: ",newstop);
         // èíà÷å òðàëèòü íà÷èíàåì òîëüêî òîãäà, êîãäà ñòîïëîññ ëó÷øå êóðñà îòêðûòèÿ (â ïðîôèòå)
         if ((newstop>OrderStopLoss()) && (newstop>OrderOpenPrice()))
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());         
         }
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
   if (OrderType()==OP_SELL)
      {
      // îòêëàäûâàåì îò òåêóùåãî êóðñà (íîâûé ñòîïëîññ)
      newstop = Ask + (atrXcoeff + MarketInfo(Symbol(),MODE_SPREAD)*Point);
      
      // åñëè trlinloss==true (ò.å. ñëåäóåò òðàëèòü â çîíå ëîññîâ), òî
      if (trlinloss==true)      
         {
         // åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì â ëþáîì ñëó÷àå
         if (OrderStopLoss()==0)
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()); 
         // åñëè ñòîïëîññ â óáûòêå èëè â ïðîôèòå, òðàëèì òîëüêî åñëè íîâûé ñòîï ëó÷øå ñòàðîãî
         else
            {
            if (newstop<OrderStopLoss())
            OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()); 
            }
         }
      else
         {
         // åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì, åñëè ñòîï ëó÷øå îòêðûòèÿ
         if ((OrderStopLoss()==0) && (newstop<OrderOpenPrice()-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()); 
         // åñëè ñòîï íå ðàâåí 0, òî ìåíÿåì åãî, åñëè îí ëó÷øå ïðåäûäóùåãî è êóðñà îòêðûòèÿ
         else
            {
            if ((newstop<OrderStopLoss()) && (newstop<OrderOpenPrice()-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()); 
            }
         }
      }      
   }
//-----------------------------------------------------------------------------------------------
void LimOrdServ(int OrdType) //OrdType=0-óäàëèòü âñå,1- âûñò-áàé,-1- âûñò ñåëë 
   {
       //Ñîáèðàåì âñå îòëîæíèêè è ÷èñòèì
       for(int i=1; i<=OrdersTotal(); i++)          // Öèêë ïåðåáîðà îðäåðîâ
            {
               if (OrderSelect(i-1,SELECT_BY_POS)==true)
                  {
                     if (OrderSymbol()!=Symbol())continue; // Íå íàø ôèí. èíñòðóì
                     if (OrderType()==OP_BUY||OrderType()==OP_SELL) continue;//íå íàøè òèïû
                     if (StringSubstr(OrderComment(),0,6)!=Komment)continue; // Íå íàø îðäåð
                     if (OrdType==0) DelLimitOrd(OrderTicket());//óäàëèòü âñå
                     if (OrderType()==OP_SELLLIMIT&&OrdType==1) DelLimitOrd(OrderTicket());//íå òîò òèï
                     if (OrderType()==OP_BUYLIMIT&&OrdType==-1) DelLimitOrd(OrderTicket());//íå òîò òèï
                     if (OrdNetValidate(OrderTicket(),OrdType)!=true) DelLimitOrd(OrderTicket());//íå òà àäðåñíàÿ ñåòêà
                     if (OrdPriceValidate(OrderTicket(),OrdType)!=true)DelLimitOrd(OrderTicket());//äàëåêî îò òåê.öåíû
                  }
            }
       //âûñòàâëÿåì îòëîæíèêè åñëè íåîáõîäèìî
       OrdSetUp(OrdType);//âûñòàâëÿåì îòëîæåííûé îðäåð âûøå òåê öåíû åñëè òàì íåò  
       OrdSetDn(OrdType);//âûñòàâëÿåì îòëîæåííûé îðäåð íèæå òåê öåíû åñëè òàì íåò
     
   }
//-----------------------------------------------------------------------------------------------
void DelLimitOrd(int OrdTicket) //óäàëåíèå îòëîæåííîãî îðäåðà  
   {
        bool Ans;
        if (OrdTicket==0) return;
        while (true)
         {
         Alert("Ïîïûòêà çàêðûòü îòëîæåííûé îðäåð ",OrdTicket,". Îæèäàíèå îòâåòà..");
         RefreshRates();                        // Îáíîâëåíèå äàííûõ
         Alert("Íîìåð òèêåòà ",OrdTicket);
         Ans=OrderDelete(OrdTicket);      
         if (Ans==true)                         // Ïîëó÷èëîñü :)
           {
            Alert ("Çàêðûò îòëîæåííûé îðäåð ",OrdTicket);
            Sleep(60000);
            break;                              // Âûõîä èç öèêëà çàêð
           }
         if (Fun_Error(GetLastError())==1)      // Îáðàáîòêà îøèáîê
            continue;                           // Ïîâòîðíàÿ ïîïûòêà
         return;                                // Âûõîä èç start()
         }
   } 
//-----------------------------------------------------------------------------------------------
bool OrdNetValidate(int OrdTicket,int OrdType) //ïðîâåðèòü íàõîäèòñÿ ëè îðäåð â àäðåñå ñåòêè
   {
      double CurPrice;
      double x;
      if (OrderSelect(OrdTicket,SELECT_BY_TICKET)==true)
         {
            CurPrice=OrderOpenPrice();
            if (OrdType==1) //åñëè ñåòêà buy
               {
                  for (x=BasePoint;x<BasePointHighLevel;x=x+Step*Point)
                     {
                        if (NormalizeDouble(x,Digits)==NormalizeDouble(CurPrice,Digits)) return(true);
                     }
               }
            if (OrdType==-1) //åñëè ñåòêà sell
               {
                  for (x=BasePoint-Shift*Point;x<BasePointHighLevel;x=x+Step*Point)
                     {
                        if (NormalizeDouble(x,Digits)==NormalizeDouble(CurPrice,Digits)) return(true);
                     }
               }
            
         }
      
      return(false);
   }   
//-----------------------------------------------------------------------------------------------
bool OrdPriceValidate(int OrdTicket,int OrdType)//ïðîâåðèòü, íàõîäèòñÿ ëè îðäåð ðÿäîì ñ òåê öåíîé
   {
      double CurPrice;
      if (OrderSelect(OrdTicket,SELECT_BY_TICKET)==true)
         {
            CurPrice=OrderOpenPrice();
            if (OrdType==1) //åñëè ñåòêà buy
               {
                  if (CurPrice<Bid&&CurPrice+Step*Point>Bid) return(true);
                  if (CurPrice>Bid&&CurPrice-Step*Point<Bid) return(true);
               }
            if (OrdType==-1) //åñëè ñåòêà sell
               {
                  if (CurPrice<Ask&&CurPrice+Step*Point>Ask) return(true);
                  if (CurPrice>Ask&&CurPrice-Step*Point<Ask) return(true);
               }
            
         }
      
      return(false);
   }
//-----------------------------------------------------------------------------------------------
  //ïðîöåäóðà îòêðûòèÿ îðäåðîâ
  int OpenOrder(int Ticket,int OperType,double Lots,double CurPrice,double TakeProf,string Komment)
   {
      double TP;
      while(true)
      {      
         if (OperType==0)
         {
            if (TakeProf!=0) 
               {
                  TP=Ask + New_Stop(TakeProf)*Point;
                  //TP=0;
               }
            else TP=0;   
            Alert("Ïîïûòêà îòêðûòü îðäåð buy. Îæèäàíèå îòâåòà..");
            Ticket=OrderSend(Symbol(),OperType,Lots,CurPrice,3,0,TP,Komment);//Îòêðûòèå îðäåðà
            if (Ticket > 0)                        // Ïîëó÷èëîñü :)
            {
               Alert ("Îòêðûò îðäåð ïî öåíå:"+CurPrice,Ticket);
               return(1);                             // Âûõîä èç ïðîöåäóðû
            }
            if (Fun_Error(GetLastError())==1)      // Îáðàáîòêà îøèáîê
               continue;                           // Ïîâòîðíàÿ ïîïûòêà
            return(0);
         }                                // Âûõîä èç ïðîöåäóðû
         if (OperType==1)
         {
            if (TakeProf!=0) 
               {
                  TP=Ask - New_Stop(TakeProf)*Point;
                  //TP=0;
               }
            else TP=0;   
            
            Alert("Ïîïûòêà îòêðûòü îðäåð sell. Îæèäàíèå îòâåòà..");
            Ticket=OrderSend(Symbol(),OperType,Lots,CurPrice,3,0,TP,Komment);//Îòêðûòèå îðäåðà
            if (Ticket > 0)                        // Ïîëó÷èëîñü :)
            {
               Alert ("Îòêðûò îðäåð ïî öåíå:"+CurPrice,Ticket);
               return(1);                             // Âûõîä èç ïðîöåäóðû
            }
            if (Fun_Error(GetLastError())==1)      // Îáðàáîòêà îøèáîê
               continue;                           // Ïîâòîðíàÿ ïîïûòêà
            return(0);
         }                                // Âûõîä èç ïðîöåäóðû
         if (OperType==2)  //OP_BUYLIMIT
         {
            if (TakeProf!=0) 
               {
                  TP=CurPrice + New_Stop(TakeProf)*Point;
               }
            else TP=0;   
            Alert("Ïîïûòêà îòêðûòü îòëîæåííûé îðäåð BUYLIMIT. Îæèäàíèå îòâåòà..");
            Ticket=OrderSend(Symbol(),OperType,Lots,CurPrice,3,0,TP,Komment);//Îòêðûòèå îðäåðà
            if (Ticket > 0)                        // Ïîëó÷èëîñü :)
            {
               Alert ("Îòêðûò îðäåð ïî öåíå:"+CurPrice,Ticket);
               return(1);                             // Âûõîä èç ïðîöåäóðû
            }
            if (Fun_Error(GetLastError())==1)      // Îáðàáîòêà îøèáîê
               continue;                           // Ïîâòîðíàÿ ïîïûòêà
            return(0);
         }                                // Âûõîä èç ïðîöåäóðû
         if (OperType==3)  //OP_SELLLIMIT
         {
            if (TakeProf!=0) 
               {
                  TP=CurPrice - New_Stop(TakeProf)*Point;
               }
            else TP=0;   
            Alert("Ïîïûòêà îòêðûòü îòëîæåííûé îðäåð SELLLIMIT. Îæèäàíèå îòâåòà..");
            Ticket=OrderSend(Symbol(),OperType,Lots,CurPrice,3,0,TP,Komment);//Îòêðûòèå îðäåðà
            if (Ticket > 0)                        // Ïîëó÷èëîñü :)
            {
               Alert ("Îòêðûò îðäåð ïî öåíå:"+CurPrice,Ticket);
               return(1);                             // Âûõîä èç ïðîöåäóðû
            }
            if (Fun_Error(GetLastError())==1)      // Îáðàáîòêà îøèáîê
               continue;                           // Ïîâòîðíàÿ ïîïûòêà
            return(0);
         }                                // Âûõîä èç ïðîöåäóðû
         if (OperType==5)  //OP_SELLSTOP
         {
            if (TakeProf!=0) 
               {
                  TP=CurPrice - New_Stop(TakeProf)*Point;
               }
            else TP=0;   
            Alert("Ïîïûòêà îòêðûòü îòëîæåííûé îðäåð SELLSTOP. Îæèäàíèå îòâåòà..");
            Ticket=OrderSend(Symbol(),OperType,Lots,CurPrice,3,0,TP,Komment);//Îòêðûòèå îðäåðà
            if (Ticket > 0)                        // Ïîëó÷èëîñü :)
            {
               Alert ("Îòêðûò îðäåð ïî öåíå:"+CurPrice,Ticket);
               return(1);                             // Âûõîä èç ïðîöåäóðû
            }
            if (Fun_Error(GetLastError())==1)      // Îáðàáîòêà îøèáîê
               continue;                           // Ïîâòîðíàÿ ïîïûòêà
            return(0);
         }                                // Âûõîä èç ïðîöåäóðû
         if (OperType==4)  //OP_BUYSTOP
         {
            if (TakeProf!=0) 
               {
            TP=CurPrice + New_Stop(TakeProf)*Point;
               }
            else TP=0;   
            Alert("Ïîïûòêà îòêðûòü îòëîæåííûé îðäåð BUYSTOP. Îæèäàíèå îòâåòà..");
            Ticket=OrderSend(Symbol(),OperType,Lots,CurPrice,3,0,TP,Komment);//Îòêðûòèå îðäåðà
            if (Ticket > 0)                        // Ïîëó÷èëîñü :)
            {
               Alert ("Îòêðûò îðäåð ïî öåíå:"+CurPrice,Ticket);
               return(1);                             // Âûõîä èç ïðîöåäóðû
            }
            if (Fun_Error(GetLastError())==1)      // Îáðàáîòêà îøèáîê
               continue;                           // Ïîâòîðíàÿ ïîïûòêà
            return(0);
         }                                // Âûõîä èç ïðîöåäóðû
      }
   }
//-----------------------------------------------------------------------------------------------
int New_Stop(int Parametr)                      // Ïðîâåðêà ñòîï-ïðèê.
  {
   int Min_Dist=MarketInfo(Symbol(),MODE_STOPLEVEL);// Ìèíèì. äèñòàíöèÿ
   if (Parametr<Min_Dist)                       // Åñëè ìåíüøå äîïóñò.
     {
      Parametr=Min_Dist;                        // Óñòàíîâèì äîïóñò.
      Alert("Óâåëè÷åíà äèñòàíöèÿ ñòîï-ïðèêàçà.");
     }
   return(Parametr);                            // Âîçâðàò çíà÷åíèÿ
  }
//-----------------------------------------------------------------------------------------------
//ïðîâåðêà íà íàëè÷èå îðäåðà ïî àäðåñó ñåòêè
bool OrdExist(double CurPrice) 
   {
   bool LimitOrd=false;
   for(int i=1; i<=OrdersTotal(); i++)          // Öèêë ïåðåáîðà îðäåðîâ
      {
         if (OrderSelect(i-1,SELECT_BY_POS)==true)
            {
               if (OrderSymbol()!=Symbol())continue; // Íå íàø ôèí. èíñòðóì
               if (StringSubstr(OrderComment(),0,6)!=Komment)continue; // Íå íàø îðäåð
               //if (OrderType()==OP_SELLLIMIT||OrderType()==OP_SELLSTOP||OrderType()==OP_BUYLIMIT||OrderType()==OP_BUYSTOP)
               //   {LimitOrd=true;} else {LimitOrd=false;}
               if (NormalizeDouble(OrderOpenPrice(),Digits)==NormalizeDouble(CurPrice,Digits)) return(true);
            }
      }
   return(false);   
   }
//-----------------------------------------------------------------------------------------------
void OrdSetUp(int OrdType)//âûñòàâëÿåì îòëîæåííûé îðäåð âûøå òåê öåíû åñëè òàì íåò
   {
   double CurPrice;
   double x;
   for(int i=1; i<=OrdersTotal(); i++)          // Öèêë ïåðåáîðà îðäåðîâ
      {
         if (OrderSelect(i-1,SELECT_BY_POS)==true)
            {
                 CurPrice=OrderOpenPrice();
                 if (OrdType==1)
                  {
                     if (CurPrice>Bid&&CurPrice-Step*Point<Bid) return;
                  }
                 if (OrdType==-1)
                  {
                     if (CurPrice>Ask&&CurPrice-Step*Point<Ask) return;
                  }
            
            }
      }
   if (OrdType==1)
      {
         for (x=BasePoint;x<BasePointHighLevel;x=x+Step*Point)
            {
               if (x>Bid&&OrdExist(x)==false) 
                  {OpenOrder(Ticket,OP_BUYSTOP,CurLot,x,TProf,Komment); return;}
            }
      }
   if (OrdType==-1)
      {
         for (x=BasePoint-Shift*Point;x<BasePointHighLevel;x=x+Step*Point)
            {
               if (x>Ask&&OrdExist(x)==false) 
                  {}//{OpenOrder(Ticket,OP_SELLLIMIT,CurLot,x,TProf,Komment); return;}
            }
      }
   }
void OrdSetDn(int OrdType)//âûñòàâëÿåì îòëîæåííûé îðäåð íèæå òåê öåíû åñëè òàì íåò
   {
   double CurPrice;
   double x;
   for(int i=1; i<=OrdersTotal(); i++)          // Öèêë ïåðåáîðà îðäåðîâ
      {
         if (OrderSelect(i-1,SELECT_BY_POS)==true)
            {
                 CurPrice=OrderOpenPrice();
                 if (OrdType==1)
                  {
                     if (CurPrice<Bid&&CurPrice+Step*Point>Bid) return;
                  }
                 if (OrdType==-1)
                  {
                     if (CurPrice<Ask&&CurPrice+Step*Point>Ask) return;
                  }
            
            }
      }
   if (OrdType==1)
      {
         for (x=BasePoint;x<BasePointHighLevel;x=x+Step*Point)
            {
               if (x<Bid&&x+Step*Point>Bid&&OrdExist(x)==false) 
                  {}//{OpenOrder(Ticket,OP_BUYLIMIT,CurLot,x,TProf,Komment); return;}
            }
      }
   if (OrdType==-1)
      {
         for (x=BasePoint-Shift*Point;x<BasePointHighLevel;x=x+Step*Point)
            {
               if (x<Ask&&x+Step*Point>Ask&&OrdExist(x)==false) 
                  {OpenOrder(Ticket,OP_SELLSTOP,CurLot,x,TProf,Komment); return;}
            }
      }
   
   }
   //ðàñ÷åò ðàçìåðà ëîòà ñïàñèáî àâòîðó http://articles.mql4.com/ru/601
   double LotSize() 
   {
   double size;
   double lot;
   switch( _MM )
   {
      case 0:  size = BaseLot;  
               break;
      case 1:  size = BaseLot * AccountBalance() / 1000; 
               break;
      case 2:  size = BaseLot * MathSqrt( AccountBalance() / 1000 ); 
               //size = 1. * MathSqrt( AccountBalance() / 10000 ); 
               break;
      default: size = BaseLot;  break;
   }  
   if( size < BaseLot )          // äîñòàòî÷íî ëè äåíåã äëÿ îòêðûòèÿ BaseLot ëîòà?
      if( ( AccountFreeMarginCheck( Symbol(), OP_BUY,  BaseLot ) < 10. ) || 
          ( AccountFreeMarginCheck( Symbol(), OP_SELL, BaseLot ) < 10. ) || 
          ( GetLastError() == 134 ) )
                  lot = 0.0; // íåò, íå õâàòèò
      else        lot = BaseLot; // õâàòèëî; îòêðûâàåìñÿ 0.1
   else           lot = NormalizeDouble( size, 2 ); 
   
   return( lot ); 
   }
   //òðåíäîâûå èíäèêàòîðû   
   int TrendPMZ(int Usredn,int CurPeriod,int IndicatorType) //1-WATR, 2-CFP
      {
         if (IndicatorType==1) 
            {
               double WatrUp=iCustom(NULL,CurPeriod,"WATR",10,4,Usredn,0,1);
               double WatrDn=iCustom(NULL,CurPeriod,"WATR",10,4,Usredn,1,1);
               if (WatrUp<100000) return(1);
               if (WatrDn<100000) return(-1);
               return(0);
            }   
         if (IndicatorType==2) 
            {
               double Force=iForce(NULL,CurPeriod,Usredn,MODE_SMA,PRICE_CLOSE,1);
               if (Force>0) return(1);
               if (Force<0) return(-1);
               return(0);
            }   
      }
      
      
             
            
            
Comments