Author: Oleg Tsarkov
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
Indicators Used
Indicator of the average true rangeForce index
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
Range_v4
//+------------------------------------------------------------------+
//|                                                       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

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 ---