iK_ex_tay_v01.1





//+------------------------------------------------------------------+
//|                                              iK_exp_stat_v01.mq4 |
//|                                                      Ivan Katsko |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Ivan Katsko"
#property link      ""
//--------------------------------------------------------------- 1 --
#define NONE 0

extern int ShiftMode = 0;            // Çàäàâàåìûé ôëàã ñäâèãà îðäåðà: 0 - íå äâèãàòü; 1 - äâèãàòü
extern double Lots   = 0;            // Æåñòêî çàäàííîå êîëè÷. ëîòîâ ("0" - ñîâåòíèê âûáèðàåò ñàì)
extern int Level     = 10;           // Ìèíèìàëüíûé óðîâåíü áëèçîñòè ê ðûíêó
extern datetime StartDateTime = D'01.01.2009';  //Íà÷àëî ðàáîòû
extern datetime FinishDateTime = D'31.12.2009'; //Êîíåö ðàáîòû
extern double Prots  = 0.07;         // Ïðîöåíò ñâîáîäíûõ ñðåäñòâ
extern int SlipPage     = 3;         // Ïðîñêàëüçûâàíèå êîòèðîêîê - â ïóíêòàõ
 
bool 
     New_Bar=false,                  // Ôëàã íîâîãî áàðà 
     End_Bar=false,                  // Ôëàã êîíöà áàðà
     Cls=false,                      // Êðèòåðèé äëÿ çàêðûòèÿ
     Work=true,                      // Ýêñïåðò áóäåò ðàáîòàòü.
     Opn_R=false,                    // Êðèòåðèé ãîòîâíîñòè ê îòêðûòèþ îðäåðîâ
     Shift_U=false,                  // Êðèòåðèé äëÿ ñäâèãà ââåðõ
     Shift_D=false,                  // Êðèòåðèé äëÿ ñäâèãà âíèç
     Shift_I=false,                  // Êðèòåðèé äëÿ èçìåíåíèÿ index_1
     Tag_msg1=false,                 // Ôëàã ñîîáùåíèÿ 1
     Tag_msg2=false,                 // Ôëàã ñîîáùåíèÿ 2
     Tag_msg3=true;

string Symb;                         // Íàçâàíèå ôèíàíñ. èíñòðóìåíòà

static datetime New_Time;

int MaxLength    = 30;               // Ê-âî îáðàáàòûâàåìûõ âàðîâ

double TakeProfit =20,               // ÒÐ äëÿ îòêðûâàåìîãî îðäåðà
       StopLoss   =30,               // SL äëÿ îòêðûâàåìîãî îðäåðà
       algoritm      = NONE,         // Àëãîðèòì: ">0" - "ñåãîäíÿ êàê â÷åðà"; "<0" - "ñåãîäíÿ íå êàê â÷åðà"
       sum_TP,                       // Îæèäàåìàÿ àäàïòèðîâàííàÿ ñóììà äîõîäà 
       direction     = NONE,         // Íàïðàâëåíèå òåêóùåå : ">0" - êóïèòü; "<0" - ïðîäàòü
       now_direction = NONE,         // Íàïðàâëåíèå íàñòîÿùåå: ">0" - êóïèòü; "<0" - ïðîäàòü
//       Level,                        // Ìèíèìàëüíûé óðîâåíü SL/TP
       Discret,                      // Äèñêðåòíîñòü ïîäáîðà: 1 - êàæäàÿ ïîçèöèÿ; 2 - ÷åðåç ïîçèöèþ è ò.ä.
       New_Open,                     // Äîñòèãíóòûé óðîâåíü öåíû
       New_SL,                       // Óðîâåíü çàêðûòèÿ îðäåðà
       index_1=2,                    // Ìíîæèòåëü 1 äëÿ ñäâèãà
       index_2;                      // Ìíîæèòåëü 2 äëÿ ñäâèãà

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   Tag_msg1=true;                                  // Ôëàã ñîîáùåíèÿ 1
   New_Time=Time[0];                               // Âðåìÿ òåêóùåãî áàðà

   switch (Period())                               // Óñòàíîâêà index_2
      {
       case    5: index_2 = 0.1; break;            // Ïåðèîä 5-òè ìèíóòíûé 
       case   15: index_2 = 0.2; break;            // Ïåðèîä 15-òè ìèíóòíûé
       case   30: index_2 = 0.3; break;            // Ïåðèîä 30-òè ìèíóòíûé
       case   60: index_2 = 0.4; break;            // Ïåðèîä ÷àñîâîé
       case  240: index_2 = 0.5; break;            // Ïåðèîä 4-õ ÷àñîâîé
       case 1440: index_2 = 0.6; break;            // Ïåðèîä äíåâíîé
       default: break; //Ïåðèîä ÷àñîâîé
      }
      
      // Ó÷¸ò îðäåðîâ ïðè èíèöèàëèçàöèè
   int 
      Total,                                       // Êîëè÷åñòâî îðäåðîâ â îêíå 
      Ticket,
      Tip=-1;                                      // Òèï âûáðàí. îðäåðà (B=0,S=1)
   double 
      TP,
      SL,
      Price;                                       // Öåíà âûáðàííîãî îðäåðà
      Symb=Symbol();                               // Íàçâàíèå ôèí.èíñòð.

   for(int i=1; i<=OrdersTotal(); i++)             // Öèêë ïåðåáîðà îðäåð
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true)    // Åñëè åñòü ñëåäóþùèé
        {                                          // Àíàëèç îðäåðîâ:
         if (OrderSymbol()!=Symb)continue;         // Íå íàø ôèí. èíñòðóì
         if (OrderType()>1)                        // Ïîïàëñÿ îòëîæåííûé
           {
            Alert("Îáíàðóæåí îòëîæåííûé îðäåð. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period());
            return;                                // Âûõîä èç start()
           }
         Total++;                                  // Ñ÷¸ò÷èê ðûíî÷í. îðä
         if (Total>1)                              // Íå áîëåå îäíîãî îðä
           {
            Alert("Íåñêîëüêî ðûíî÷íûõ îðäåðîâ. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period());
            return;                                // Âûõîä èç start()
           }
         Ticket =OrderTicket();                    // Íîìåð âûáðàíí. îðä.
         Tip    =OrderType();                      // Òèï âûáðàííîãî îðä.
         Price  =OrderOpenPrice();                 // Öåíà âûáðàíí. îðä.
         SL     =OrderStopLoss();                  // SL âûáðàííîãî îðä.
         TP     =OrderTakeProfit();                // TP âûáðàííîãî îðä.
        }
     }
     
   if (Level<MarketInfo(Symb,MODE_STOPLEVEL)) 
      Level=MarketInfo(Symb,MODE_STOPLEVEL);       // Ìèíèìàëüíûé óðîâåíü SL/TP
   Discret=1;                                      // Ñàìàÿ òî÷íàÿ äèñêðåòèçàöèÿ
   
   if (Total==0) Opn_R=false;                      // â ñåðåäèíå ïåðèîäà îðäåðîâ íå îòêðûâàòü

   if (Ticket>0                                    // Åñëè åñòü îòêðûòûé îðäåð
       && ShiftMode==0)                            // È ñäâèã íå óñòàíîâëåí
     {
      New_Open=Price;                              // Âíà÷àëå óðîâåíü öåíû ðàâåí ÒÐ
      New_SL=SL;                                   // à óðîâåíü çàêðûòèÿ ðàâåí SL
      Alert("Èíèò. Îðäåð íå èçìåíåí. TP=",TP,", SL=",SL,": ",Symb,", ",Period());
     } 
   if (Ticket>0                                    // Åñëè åñòü îòêðûòûé îðäåð
       && ShiftMode==1)                            // È óñòàíîâëåí ñäâèã
     {
         // Âîññòàíîâëåíèå ÒÐ ïðè èíèöèàëèçàöèè
      if (MathAbs(Price-TP)/Point < 500
          && Tip==0)
        TP=Price + New_Stop(TakeProfit+1000)*Point;
         
      if (MathAbs(Price-TP)/Point < 500
          && Tip==1)
        TP=Price - New_Stop(TakeProfit+1000)*Point;
         
      if (OrderModify(Ticket,Price,SL,TP,0))
        {
         Alert("Èíèò. Îðäåð èçìåíåí. TP=",TP,", SL=",SL,": ",Symb,", ",Period());
        }
        else
        {
         Alert("Èíèò. Îðäåð íå èçìåíåí, îøèáêà ",GetLastError(),": ",Symb,", ",Period());
        }
        
         // Óñòàíîâêà New_Open è New_SL ïðè èíèöèàëèçàöèè
      New_Open=0;
      New_SL=0;
       
      if (Tip==0)                                           // îðäåð îòêðûò íà ïîêóïêó
        {                                                   // ðàçðåøåí ñäâèã
         New_Open=Price + New_Stop(TakeProfit)*Point;       // Âíà÷àëå óðîâåíü öåíû ðàâåí ÒÐ
         New_SL=SL;                                         // à óðîâåíü çàêðûòèÿ ðàâåí SL
         if (Bid>New_Open)                                  // íî åñëè ñäâèã óæå íà÷àëñÿ
           {
           New_Open=Bid;                                    // íîâûé äîñòèãíóòûé óðîâåíü öåíû
           New_SL=New_Open                                  // íîâûé óðîâåíü çàêðûòèÿ îðäåðà
                  -(3*MarketInfo(Symb,MODE_SPREAD)*Point    // íèæå íîâîãî óðîâíÿ íà 2 ñòîï óðîâíÿ
                  +index_2*(New_Open-(Price+(TakeProfit     // ïëþñ 0.1 (óâåëè÷èâàåòñÿ)
                  -MarketInfo(Symb, MODE_SPREAD))*Point))); // ñ ó÷åòîì ñïðåäà
           }
        }
      if (Tip==1)                                           // îðäåð îòêðûò íà ïîêóïêó
        {                                                   // ðàçðåøåí ñäâèã
         New_Open=Price - New_Stop(TakeProfit)*Point;       // Âíà÷àëå óðîâåíü öåíû ðàâåí ÒÐ
         New_SL=SL;                                         // à óðîâåíü çàêðûòèÿ ðàâåí SL
         if (Ask<New_Open)                                  // íî åñëè ñäâèã óæå íà÷àëñÿ 
           {
            New_Open=Ask;                                   // íîâûé äîñòèãíóòûé óðîâåíü öåíû
            New_SL=New_Open                                 // íîâûé óðîâåíü çàêðûòèÿ îðäåðà
                   +(3*MarketInfo(Symb,MODE_SPREAD)*Point   // âûøå íîâîãî óðîâíÿ íà 2 ñòîï óðîâíÿ
                   -index_2*(New_Open-(Price-(TakeProfit    // ïëþñ èíäåêñ (óâåëè÷èâàåòñÿ)
                   +MarketInfo(Symb, MODE_SPREAD))*Point)));// ñ ó÷åòîì ñïðåäà
           }
        }
      Alert("Ïðè èíèöèàëèçàöèè New_Open=",New_Open,", New_SL=",New_SL,": ",Symb,", ",Period());
       
            // Îòðàçèòü íîâûå óðîâíè íà ãðàôèêå 
      ObjectDelete("New_Open"); 
      ObjectCreate("New_Open", OBJ_HLINE, 0 , 0, New_Open);
      ObjectDelete("New_SL"); 
      ObjectCreate("New_SL", OBJ_HLINE, 0 , 0, New_SL);
     }                                                      // íåò îòêðûòûõ îðäåðîâ
  }
  
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
      // Ó÷¸ò îðäåðîâ ïðè äåèíèöèàëèçàöèè
   int 
      Total,                                       // Êîëè÷åñòâî îðäåðîâ â îêíå 
      Tip=-1,                                      // Òèï âûáðàí. îðäåðà (B=0,S=1)
      Ticket;
   double 
      TP,
      SL,
      Price;                                       // Öåíà âûáðàííîãî îðäåðà
      Symb=Symbol();                               // Íàçâàíèå ôèí.èíñòð.

   for(int i=1; i<=OrdersTotal(); i++)             // Öèêë ïåðåáîðà îðäåð
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true)    // Åñëè åñòü ñëåäóþùèé
        {                                          // Àíàëèç îðäåðîâ:
         if (OrderSymbol()!=Symb)continue;         // Íå íàø ôèí. èíñòðóì
         if (OrderType()>1)                        // Ïîïàëñÿ îòëîæåííûé
           {
            Alert("Îáíàðóæåí îòëîæåííûé îðäåð. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period());
            return;                                // Âûõîä èç start()
           }
         Total++;                                  // Ñ÷¸ò÷èê ðûíî÷í. îðä
         if (Total>1)                              // Íå áîëåå îäíîãî îðä
           {
            Alert("Íåñêîëüêî ðûíî÷íûõ îðäåðîâ. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period());
            return;                                // Âûõîä èç start()
           }
         Ticket =OrderTicket();                    // Íîìåð âûáðàíí. îðä.
         Tip    =OrderType();                      // Òèï âûáðàííîãî îðä.
         Price  =OrderOpenPrice();                 // Öåíà âûáðàíí. îðä.
         SL     =OrderStopLoss();                  // SL âûáðàííîãî îðä.
        }
     }
        
   if (Ticket>0                        // Åñëè åñòü îòêðûòûé îðäåð
       && ShiftMode==1)                // È óñòàíîâëåí ñäâèã
     {
      //---- ÒÐ äëÿ îòêðûòîãî íå ñäâèíóòîãî îðäåðà
      if (Tip==0                       // Åñëè îðäåð îòêðûò íà ïîêóïêó,
          && !(Shift_U||Shift_D))      // íå íà÷àò ñäâèã,
         TP=Ask + New_Stop(TakeProfit)*Point;
         
      if (Tip==1                       // Åñëè îðäåð îòêðûò íà ïðîäàæó,
          && !(Shift_U||Shift_D))      // íå íà÷àò ñäâèã,
         TP=Bid -  New_Stop(TakeProfit)*Point;
        
      //---- ÒÐ äëÿ îòêðûòîãî è ñäâèíóòîãî îðäåðà
      if (Tip==0                       // Åñëè îðäåð îòêðûò íà ïîêóïêó,
          && (Shift_U||Shift_D))       // íà÷àò ñäâèã,
        {
         TP=New_Open + New_Stop(TakeProfit)*Point;
         SL=New_SL;
        }
      if (Tip==1                       // Åñëè îðäåð îòêðûò íà ïðîäàæó,
          && (Shift_U||Shift_D))       // íà÷àò ñäâèã,
        {
         TP=New_Open -  New_Stop(TakeProfit)*Point;
         SL=New_SL;
        }
        
      //---- Óñòàíîâèòü ðåàëüíûé ÒÐ äëÿ îòêðûòîãî îðäåðà
      if (OrderModify(Ticket,Price,SL,TP,0))
        {
         Alert("Äåèíèò. Îðäåð èçìåíåí. TP=",TP,", SL=",SL,": ",Symb,", ",Period());
         return;
        }
         else
        {
         Alert("Äåèíèò. Îðäåð íå èçìåíåí, îøèáêà ",GetLastError(),": ",Symb,", ",Period());
        }
     }                                 // íåò îòêðûòûõ îðäåðîâ
   ObjectDelete("New_Open"); 
   ObjectDelete("New_SL"); 
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   Fun_New_Bar();                      // Îïðåäåëåíèå íà÷àëà íîâîãî áàðà
//----
   int
      Total,                           // Êîëè÷åñòâî îðäåðîâ â îêíå 
      Tip=-1,                          // Òèï âûáðàí. îðäåðà (B=0,S=1)
      Ticket;                          // Íîìåð îðäåðà
   datetime 
      Time_Begin,                      // Ìîìåíò íà÷àëà ðàáî÷åãî ïåðèîäà
      Op_Time;                         // Âðåìÿ îòêðûòèÿ îðäåðà
   double
      Lot,                             // Êîëè÷. ëîòîâ â âûáðàííîì îðäåðå
      Lts,                             // Êîëè÷. ëîòîâ â îòêðûâàåìîì îðäåðå
      Min_Lot,                         // Ìèíèìàëüíîå êîëè÷åñòâî ëîòîâ
      Step,                            // Øàã èçìåíåíèÿ ðàçìåðà ëîòà
      Free,                            // Òåêóùèå ñâîáîäíûå ñðåäñòâà
      One_Lot,                         // Ñòîèìîñòü îäíîãî ëîòà
      Price,                           // Öåíà âûáðàííîãî îðäåðà
      SL,                              // SL âûáðàííîãî îðäåðà 
      TP;                              // TP âûáðàííîãî îðäåðà
   bool
      Ans  =false,                     // Îòâåò ñåðâåðà ïîñëå çàêðûòèÿ
      Opn_B=false,                     // Êðèòåðèé äëÿ îòêðûòèÿ  Buy
      Opn_S=false;                     // Êðèòåðèé äëÿ îòêðûòèÿ  Sell
      
   Cls  =false;                        // Êðèòåðèé äëÿ çàêðûòèÿ
   Time_Begin=GetTickCount();          // çàñåêàåì íà÷àëî âûïîëíåíèÿ ïðîãðàììû 

//------------------- Îäèí  ðàç çà ïåðèîä --
   if (New_Bar)                        // Îäèí ðàç çà ïåðèîä âûïîëíÿåòñÿ ñëåäóþùåå
     {
      Tag_msg1=true;
      End_Bar=false;
//      Opn_R=true;
      
      // Ïðåäâàðèò.îáðàáîòêà
      if(TimeCurrent()<StartDateTime)            // Âðåìÿ ñòàðòà íå íàñòóïèëî
        { 
        Alert("Âðåìÿ ñòàðòà íå íàñòóïèëî. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period());
        return;                                  // Âûõîä èç start()
        }            
      if (TimeCurrent()>=FinishDateTime)         //Âðåìÿ ôèíèøà íàñòóïèëî
        { 
        Alert("Âðåìÿ ôèíèøà íàñòóïèëî. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period());
        return;                                  // Âûõîä èç start()
        }            
      if(Bars < MaxLength)                       // Íåäîñòàòî÷íî áàðîâ
        {
         Alert("Íåäîñòàòî÷íî áàðîâ â îêíå. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period());
         return;                                 // Âûõîä èç start()
        }
      if(Work==false)                            // Êðèòè÷åñêàÿ îøèáêà
        {
         Alert("Êðèòè÷åñêàÿ îøèáêà. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period());
         return;                                 // Âûõîä èç start()
        }
     }
//------------------- Êîíåö îäèí  ðàç çà ïåðèîä --
   
   if ((TimeCurrent()-Time[0]-50)>(Period()-1)*60 //Çà 10 ñåêóíä äî íà÷àëà ïåðèîäà
       && Tag_msg1
       ) 
     { 
      Alert("Âíèìàíèå! Íà÷èíàåòñÿ íîâûé ïåðèîä!",": ",Symb,", ",Period());
      Tag_msg1=false;
      End_Bar=true;
     }

//----------------------- Ó÷¸ò îðäåðîâ
   Symb=Symbol();                               // Íàçâàíèå ôèí.èíñòð.
   Total=0;                                     // Êîëè÷åñòâî îðäåðîâ
   for(int i=1; i<=OrdersTotal(); i++)          // Öèêë ïåðåáîðà îðäåð
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Åñëè åñòü ñëåäóþùèé
        {                                       // Àíàëèç îðäåðîâ:
         if (OrderSymbol()!=Symb)continue;      // Íå íàø ôèí. èíñòðóì
         if (OrderType()>1)                     // Ïîïàëñÿ îòëîæåííûé
           {
            Alert("Îáíàðóæåí îòëîæåííûé îðäåð. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period());
            return;                             // Âûõîä èç start()
           }
         Total++;                               // Ñ÷¸ò÷èê ðûíî÷í. îðä
         if (Total>1)                           // Íå áîëåå îäíîãî îðä
           {
            Alert("Íåñêîëüêî ðûíî÷íûõ îðäåðîâ. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period());
            return;                             // Âûõîä èç start()
           }
         Ticket =OrderTicket();                 // Íîìåð âûáðàíí. îðä.
         Op_Time=OrderOpenTime();               // Âðåìÿ îòêðûòèÿ âûáð.îðä.
         Tip    =OrderType();                   // Òèï âûáðàííîãî îðä.
         Price  =OrderOpenPrice();              // Öåíà âûáðàíí. îðä.
         SL     =OrderStopLoss();               // SL âûáðàííîãî îðä.
         TP     =OrderTakeProfit();             // TP âûáðàííîãî îðä.
         Lot    =OrderLots();                   // Êîëè÷åñòâî ëîòîâ
        }
     }
     
                     // Òîðãîâûå êðèòåðèè
   TakeProfit = iCustom(0, 0, "iK_tay_v01",Discret, Level, 0, 1)/Point;  //îïðåäåëÿåì Òåéê Ïðîôèò
   StopLoss   = iCustom(0, 0, "iK_tay_v01",Discret, Level, 1, 1)/Point;  //îïðåäåëÿåì Ñòîï Ëîññ
   algoritm   = iCustom(0, 0, "iK_tay_v01",Discret, Level, 4, 1);        //îïðåäåëÿåì àëãîðèòì 
   sum_TP     = iCustom(0, 0, "iK_tay_v01",Discret, Level, 2, 1);        
   direction  = iCustom(0, 0, "iK_tay_v01",Discret, Level, 3, 1);        //îïðåäåëÿåì òåêóùåå íàïðàâëåíèå
   now_direction = iCustom(0, 0, "iK_tay_v01",Discret, Level, 3, 0);     //îïðåäåëÿåì íàñòîÿùåå íàïðàâëåíèå
      
   if (New_Bar)                                  //  íà÷àëå íîâîãî ïåðèîäà
     {
      if (Total==0)                              // Åñëè íåò îòêðûòûõ îðäåðîâ
         Opn_R=true;                             // ðàçðåøèòü îòêðûòèå îðäåð
        else                                     // åñëè îðäåð áûë îòêðûò
         Opn_R=false;                            // çàïðåòèòü îòêðûòèå (ïðè çàêðûòèè òåðìèíàëîì)
     }
      
   if (Total==0)                                 // Åñëè íåò îòêðûòûõ îðäåðîâ
     {
      Cls=false;                                 // Åù¸ íå÷åãî çàêðûâàòü
      Shift_U=false;                             // Îáíóëÿåì êðèòåðèé äëÿ ñäâèãà ââåðõ
      Shift_D=false;                             // Îáíóëÿåì êðèòåðèé äëÿ ñäâèãà âíèç
      ObjectDelete("New_Open");                  // Îäàëÿåì ëèíèè
      ObjectDelete("New_SL"); 
     }
        
   if (direction==NONE && New_Bar)               // Íàïðàâëåíèå íå îïðåäåëåíî
     {
      Cls = true;                                // ðàçðåøèì çàêðûòèå îðäåðà
      Alert("Íàïðàâëåíèå òîðãîâëè íå îïðåäåëåíî",": ",Symb,", ",Period());
     }
   if ((direction==NONE && Total==0) ||          // Íàïðàâëåíèå íå îïðåäåëåíî èëè 
       (sum_TP<=0 && Total==0))                  // áóäåò îòðèöàòåëüíûé ðåçóëüòàò 
     { 
      Opn_R=false;                               // â ñåðåäèíå ïåðèîäà îðäåðîâ íå îòêðûâàòü
      return;                                    //Âûõîä èç start()
     }            
         // Óñëîâèÿ îòêðûòèÿ îðäåðà
   if (Total==0                                    // îòêðûòûõ îðäåðîâ íåò,
       && direction!=0                             // îïðåäåëåíî íàïðàâëåíèå,
       && Opn_R)                                   // îðäåð â ýòîì ïåðèîäå åù¸ íå îòêðûâàëñÿ
     {
      if (direction>0)                             // è íàïðàâëåíèå ââåðõ, òî
        {
         Opn_B=true;                               // íàäî îòêðûâàòü îðäåð íà Buy
        }
       else                                        // íàïðàâëåíèå âíèç -
        {                             
         Opn_S=true;                               // íà Sell
        }
     }
   
         // Óñëîâèÿ çàêðûòèÿ îðäåðà â êîíöå ïåðèîäà
   if (Total>0                                  // åñòü îòêðûòûé îðäåð,
       && End_Bar                               // â êîíöå ïåðèîäà
//       && Op_Time<Time[0]                     // îí îòêðûò â ïðåäûäóùèé ïåðèîä
       && !(Shift_U||Shift_D)                   // íå íà÷àò ñäâèã
       && ((direction!=now_direction)           // ïðåäïîëàãàåòñÿ íå òî æå íàïðàâëåíèå
         || (direction==0 && now_direction==0)))// íå øòàòíàÿ ñèòóàöèÿ
     {
      Cls = true;                               // íàäî çàêðûâàòü îðäåð
     }

         // Óñëîâèÿ ñäâèãà îðäåðà è ñîáñòâåííî ñäâèã
   if (Total>0                                  // Åñëè åñòü îòêðûòûé îðäåð,
       && ShiftMode==1)                         // óñòàíîâëåí ôëàã ñäâèãà
     {
      if (Tip==0                                // îðäåð îòêðûò íà ïîêóïêó
          && Bid>New_Open)                      // äîñòèãíóòî ÒÐ
        {                                       // òî íàäî äâèãàòü ââåðõ
         index_1=3; 
         switch (Period())                               // Óñòàíîâêà index_2
            {
             case    5: index_2 = 0.1; break;            // Ïåðèîä 5-òè ìèíóòíûé 
             case   15: index_2 = 0.2; break;            // Ïåðèîä 15-òè ìèíóòíûé
             case   30: index_2 = 0.3; break;            // Ïåðèîä 30-òè ìèíóòíûé
             case   60: index_2 = 0.4; break;            // Ïåðèîä ÷àñîâîé
             case  240: index_2 = 0.5; break;            // Ïåðèîä 4-õ ÷àñîâîé
             case 1440: index_2 = 0.6; break;            // Ïåðèîä äíåâíîé
             default: break; //Ïåðèîä ÷àñîâîé
            }
         New_Open=Bid;                          // íîâûé äîñòèãíóòûé óðîâåíü öåíû
         New_SL=New_Open                        // íîâûé óðîâåíü çàêðûòèÿ îðäåðà
               -(index_1*MarketInfo(Symb,MODE_SPREAD)*Point   // íèæå íîâîãî óðîâíÿ íà 2 ñòîï óðîâíÿ
               +index_2*(New_Open-(Price+(TakeProfit          // ïëþñ 0.1 (óâåëè÷èâàåòñÿ)
               -MarketInfo(Symb, MODE_SPREAD))*Point)));      // ñ ó÷åòîì ñïðåäà
         Shift_U=true;
         Alert("Îðäåð ñäâèíóò ââåðõ íà ",New_Open,", New_SL=",New_SL,": ",Symb,", ",Period());
        }
      if (Tip==1                               // îðäåð îòêðûò íà ïðîäàæó
          && Ask<New_Open)                     // äîñòèãíóòî ÒÐ
        {                                      // òî íàäî äâèãàòü âíèç
         index_1=3; 
         switch (Period())                               // Óñòàíîâêà index_2
            {
             case    5: index_2 = 0.1; break;            // Ïåðèîä 5-òè ìèíóòíûé 
             case   15: index_2 = 0.2; break;            // Ïåðèîä 15-òè ìèíóòíûé
             case   30: index_2 = 0.3; break;            // Ïåðèîä 30-òè ìèíóòíûé
             case   60: index_2 = 0.4; break;            // Ïåðèîä ÷àñîâîé
             case  240: index_2 = 0.5; break;            // Ïåðèîä 4-õ ÷àñîâîé
             case 1440: index_2 = 0.6; break;            // Ïåðèîä äíåâíîé
             default: break; //Ïåðèîä ÷àñîâîé
            }
         New_Open=Ask;                                        // íîâûé äîñòèãíóòûé óðîâåíü öåíû
         New_SL=New_Open                                      // íîâûé óðîâåíü çàêðûòèÿ îðäåðà
               +(index_1*MarketInfo(Symb,MODE_SPREAD)*Point   // âûøå íîâîãî óðîâíÿ íà 2 ñòîï óðîâíÿ
               -index_2*(New_Open-(Price-(TakeProfit          // ïëþñ 0.1 (óâåëè÷èâàåòñÿ)
               +MarketInfo(Symb, MODE_SPREAD))*Point)));      // ñ ó÷åòîì ñïðåäà
         Shift_D=true;
         Alert("Îðäåð ñäâèíóò âíèç íà ",New_Open,", New_SL=",New_SL,": ",Symb,", ",Period());
        }
               // Èçìåíèòü íîâûé óðîâåíü çàêðûòèÿ îðäåðà
      index_1=0.99*index_1;
      index_2=0.99*index_2;
      if (Tip==0                                           // îðäåð îòêðûò íà ïîêóïêó
          && (Shift_D || Shift_U))                         // áûë íà÷àò ñäâèã
        {                                                  // òî íàäî äâèãàòü ââåðõ
         New_SL=New_Open                                   // íîâûé óðîâåíü çàêðûòèÿ îðäåðà
               -(index_1*MarketInfo(Symb,MODE_SPREAD)*Point// íèæå íîâîãî óðîâíÿ íà 2 ñòîï óðîâíÿ
               +index_2*(New_Open-(Price+(TakeProfit       // ïëþñ 0.1 (óâåëè÷èâàåòñÿ)
               -MarketInfo(Symb, MODE_SPREAD))*Point)));   // ñ ó÷åòîì ñïðåäà
        }
      if (Tip==1                                           // îðäåð îòêðûò íà ïðîäàæó
          && (Shift_D || Shift_U))                         // áûë íà÷àò ñäâèã
        {                                                  // òî íàäî äâèãàòü âíèç
         New_SL=New_Open                                   // íîâûé óðîâåíü çàêðûòèÿ îðäåðà
               +(index_1*MarketInfo(Symb,MODE_SPREAD)*Point// âûøå íîâîãî óðîâíÿ íà 2 ñòîï óðîâíÿ
               -index_2*(New_Open-(Price-(TakeProfit       // ïëþñ 0.1 (óâåëè÷èâàåòñÿ)
               -MarketInfo(Symb, MODE_SPREAD))*Point)));   // ñ ó÷åòîì ñïðåäà
        }
        
            // Îòðàçèòü íîâûå óðîâíè íà ãðàôèêå 
      ObjectDelete("New_Open"); 
      ObjectCreate("New_Open", OBJ_HLINE, 0 , 0, New_Open);
      ObjectDelete("New_SL"); 
      ObjectCreate("New_SL", OBJ_HLINE, 0 , 0, New_SL);
     }

//--------------------------------------------------------------- 7 --
   // Ñòîèìîñòü îðäåðîâ
   RefreshRates();                              // Îáíîâëåíèå äàííûõ
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Ìèíèì. êîëè÷. ëîòîâ 
   Free   =AccountFreeMargin();                 // Ñâîáîäí ñðåäñòâà
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Ñòîèìîñòü 1 ëîòà
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Øàã èçìåíåí ðàçìåðà
 
   if (Lots > 0)                                // Åñëè çàäàíû ëîòû,òî 
      Lts =Lots;                                // ñ íèìè è ðàáîòàåì 
   else                                         // % ñâîáîäíûõ ñðåäñòâ
      Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Äëÿ îòêðûòèÿ
 
   if(Lts < Min_Lot) Lts=Min_Lot;               // Íå ìåíüøå ìèíèìàëüí
   
   if (Lts*One_Lot > Free &&                    // Ëîò äîðîæå ñâîáîäí.
      TimeCurrent()<(Time[0] + 2*60) &&         // íå ïðîøëî åù¸ áîëåå 2-õ ìèíóò
      Total==0)                                 // è îðäåð íå îòêðûò
     {
      Alert(" Íå õâàòàåò äåíåã íà ", Lts," ëîò",": ",Symb,", ",Period());
      return;                                   // Âûõîä èç start()
     }

   // Óñëîâèÿ çàêðûòèÿ îðäåðîâ ïðè ñäâèãå
   if (((Tip==0)                                // Åñëè ïðè äâèæåíèè ââåðõ
       && Shift_U                               // íà÷àò ñäâèã ââåðõ
       && (Bid<New_SL)) ||                      // óðîâåíü íèæå íîâîãî óðîâíÿ çàêðûòèÿ îðäåðà èëè
       ((Tip==1)                                // Åñëè ïðè äâèæåíèè âíèç
       && Shift_D                               // íà÷àò ñäâèã âíèç
       && (Ask>New_SL)))                        // óðîâåíü âûøå íîâîãî óðîâíÿ çàêðûòèÿ îðäåðà
     {                                          
      Cls = true;                               // íàäî çàêðûâàòü îðäåð
      Opn_R=false;                              // äî íà÷àëà íîâîãî ïåðèîäà îðäåðîâ íå îòêðûâàòü
     }

//--------------------------------------------------------------- 6 --
   // Çàêðûòèå îðäåðîâ
   while(Ticket>0)                              // Öèêë çàêðûòèÿ îðä.
     {
      if (Tip==0 && Cls==true)                  // Îòêðûò îðäåð Buy..
        {                                       // è åñòü êðèòåðèé çàêð
         Alert("Ïîïûòêà çàêðûòü Buy ",Ticket,". Îæèäàíèå îòâåòà..",": ",Symb,", ",Period());
         RefreshRates();                        // Îáíîâëåíèå äàííûõ
         Ans=OrderClose(Ticket,Lot,Bid,2);      // Çàêðûòèå Buy
         if (Ans==true)                         // Ïîëó÷èëîñü :)
           {
            Alert ("Çàêðûò îðäåð Buy ",Ticket,": ",Symb,", ",Period());
            break;                              // Âûõîä èç öèêëà çàêð
           }
         if (Fun_Error(GetLastError())==1)      // Îáðàáîòêà îøèáîê
           {
            Opn_R=false;                        // äî íà÷àëà íîâîãî ïåðèîäà îðäåðîâ íå îòêðûâàòü
            continue;                           // Ïîâòîðíàÿ ïîïûòêà
           }
         return;                                // Âûõîä èç start()
        }
 
      if (Tip==1 && Cls==true)                  // Îòêðûò îðäåð Sell..
        {                                       // è åñòü êðèòåðèé çàêð
         Alert("Ïîïûòêà çàêðûòü Sell ",Ticket,". Îæèäàíèå îòâåòà..",": ",Symb,", ",Period());
         RefreshRates();                        // Îáíîâëåíèå äàííûõ
         Ans=OrderClose(Ticket,Lot,Ask,2);      // Çàêðûòèå Sell
         if (Ans==true)                         // Ïîëó÷èëîñü :)
           {
            Alert ("Çàêðûò îðäåð Sell ",Ticket,": ",Symb,", ",Period());
            break;                              // Âûõîä èç öèêëà çàêð
           }
         if (Fun_Error(GetLastError())==1)      // Îáðàáîòêà îøèáîê
           {
            Opn_R=false;                        // äî íà÷àëà íîâîãî ïåðèîäà îðäåðîâ íå îòêðûâàòü
            continue;                           // Ïîâòîðíàÿ ïîïûòêà
           }
         return;                                // Âûõîä èç start()
        }
      break;                                    // Âûõîä èç while
     }
   
//--------------------------------------------------------------- 8 --
   // Îòêðûòèå îðäåðîâ
   while(Opn_R)                                 // Öèêë îòêðûòèÿ îðä.
     {
      if (Total==0 && Opn_B==true)              // Îòêðûòûõ îðä. íåò +
        {                                       // êðèòåðèé îòêð. Buy
         RefreshRates();                        // Îáíîâëåíèå äàííûõ
         SL=Ask - New_Stop(StopLoss)*Point;     // Âû÷èñëåíèå SL îòêð.
         if (ShiftMode==0)                      // Âû÷èñëåíèå TP îòêð.
           {TP=Ask + New_Stop(TakeProfit)*Point;}
           else
           {TP=Ask + New_Stop(TakeProfit+1000)*Point;}
         Alert("Ïîïûòêà îòêðûòü Buy. Îæèäàíèå îòâåòà..",": ",Symb,", ",Period());
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Îòêðûòèå Buy
         if (Ticket > 0)                        // Ïîëó÷èëîñü :)
           {
            New_Open=Ask + New_Stop(TakeProfit)*Point; // Äîñòèãíóòûé óðîâåíü öåíû
            New_SL=SL;                          // Óðîâåíü çàêðûòèÿ îðäåðà
            Opn_R=false;                        // Áîëüøå îðäåðîâ â ýòîì ïåðèîäå íå îòêðûâàòü
            Alert ("Îòêðûò îðäåð Buy ",Ticket,": ",Symb,", ",Period());
            return;                             // Âûõîä èç start()
           }
         if (Fun_Error(GetLastError())==1)      // Îáðàáîòêà îøèáîê
            continue;                           // Ïîâòîðíàÿ ïîïûòêà
         return;                                // Âûõîä èç start()
        }
      if (Total==0 && Opn_S==true)              // Îòêðûòûõ îðä. íåò +
        {                                       // êðèòåðèé îòêð. Sell
         RefreshRates();                        // Îáíîâëåíèå äàííûõ
         SL=Bid + New_Stop(StopLoss)*Point;     // Âû÷èñëåíèå SL îòêð.
         if (ShiftMode==0)                      // Âû÷èñëåíèå TP îòêð.
           {TP=Bid -  New_Stop(TakeProfit)*Point;}
           else
           {TP=Bid -  New_Stop(TakeProfit+1000)*Point;}
         Alert("Ïîïûòêà îòêðûòü Sell. Îæèäàíèå îòâåòà..",": ",Symb,", ",Period());
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Îòêðûòèå Sel
         if (Ticket > 0)                        // Ïîëó÷èëîñü :)
           {
            New_Open=Bid -  New_Stop(TakeProfit)*Point; // Äîñòèãíóòûé óðîâåíü öåíû
            New_SL=SL;                          // Óðîâåíü çàêðûòèÿ îðäåðà
            Opn_R=false;                        // Áîëüøå îðäåðîâ â ýòîì ïåðèîäå íå îòêðûâàòü
            Alert ("Îòêðûò îðäåð Sell ",Ticket,": ",Symb,", ",Period());
            return;                             // Âûõîä èç start()
           }
         if (Fun_Error(GetLastError())==1)      // Îáðàáîòêà îøèáîê
            continue;                           // Ïîâòîðíàÿ ïîïûòêà
         return;                                // Âûõîä èç start()
        }
      break;                                    // Âûõîä èç while
     }   
//----
   return;                                      // Âûõîä èç start()
  }
//-------------------------------------------------------------- 10 --
int Fun_Error(int Error)                        // Ô-èÿ îáðàáîò îøèáîê
  {
   switch(Error)
     {                                          // Ïðåîäîëèìûå îøèáêè            
      case  4: Alert("Òîðãîâûé ñåðâåð çàíÿò. Ïðîáóåì åù¸ ðàç..",": ",Symb,", ",Period());
         Sleep(3000);                           // Ïðîñòîå ðåøåíèå
         return(1);                             // Âûõîä èç ôóíêöèè
      case 130:Alert("Ñëèøêîì áëèçêî ñòîïû",": ",Symb,", ",Period());
         Level++;                               // Ïðèðàñòèòü ìèíèìàëüíûé óðîâåíü SL/TP
         Opn_R=false;                           // Îðäåðîâ â ýòîì ïåðèîäå íå îòêðûâàòü
//         Sleep(5000);                           // Ïðîñòîå ðåøåíèå
         return(1);                             // Âûõîä èç ôóíêöèè
      case 135:Alert("Öåíà èçìåíèëàñü. Ïðîáóåì åù¸ ðàç..",": ",Symb,", ",Period());
         RefreshRates();                        // Îáíîâèì äàííûå
         return(1);                             // Âûõîä èç ôóíêöèè
      case 136:Alert("Íåò öåí. Æä¸ì íîâûé òèê..",": ",Symb,", ",Period());
         while(RefreshRates()==false)           // Äî íîâîãî òèêà
            Sleep(1);                           // Çàäåðæêà â öèêëå
         return(1);                             // Âûõîä èç ôóíêöèè
      case 137:Alert("Áðîêåð çàíÿò. Ïðîáóåì åù¸ ðàç..",": ",Symb,", ",Period());
         Sleep(3000);                           // Ïðîñòîå ðåøåíèå
         return(1);                             // Âûõîä èç ôóíêöèè
      case 138:Alert("Çàïðîøåííàÿ öåíà óñòàðåëà..",": ",Symb,", ",Period());
         return(1);                             // Âûõîä èç ôóíêöèè
      case 145:Alert("Îðäåð ñëèøêîì áëèçîê ê ðûíêó . Ïðîáóåì ÷åðåç 15ñåê.",": ",Symb,", ",Period());
         Cls = false;
//         Sleep(15000);                        // Ïðîñòîå ðåøåíèå
         return(1);                             // Âûõîä èç ôóíêöèè
      case 146:Alert("Ïîäñèñòåìà òîðãîâëè çàíÿòà. Ïðîáóåì åù¸..",": ",Symb,", ",Period());
         Sleep(500);                            // Ïðîñòîå ðåøåíèå
         return(1);                             // Âûõîä èç ôóíêöèè
         // Êðèòè÷åñêèå îøèáêè
      case  2: Alert("Îáùàÿ îøèáêà.",": ",Symb,", ",Period());
         return(0);                             // Âûõîä èç ôóíêöèè
      case  5: Alert("Ñòàðàÿ âåðñèÿ òåðìèíàëà.",": ",Symb,", ",Period());
         Work=false;                            // Áîëüøå íå ðàáîòàòü
         return(0);                             // Âûõîä èç ôóíêöèè
      case 64: Alert("Ñ÷åò çàáëîêèðîâàí.",": ",Symb,", ",Period());
         Work=false;                            // Áîëüøå íå ðàáîòàòü
         return(0);                             // Âûõîä èç ôóíêöèè
      case 133:Alert("Òîðãîâëÿ çàïðåùåíà.",": ",Symb,", ",Period());
         return(0);                             // Âûõîä èç ôóíêöèè
      case 134:Alert("Íåäîñòàòî÷íî äåíåã äëÿ ñîâåðøåíèÿ îïåðàöèè.",": ",Symb,", ",Period());
         return(0);                             // Âûõîä èç ôóíêöèè
      default: Alert("Âîçíèêëà îøèáêà ",Error,": ",Symb,", ",Period()); // Äðóãèå âàðèàíòû   
         return(0);                             // Âûõîä èç ôóíêöèè
     }
  }
//-------------------------------------------------------------- 11 --
int New_Stop(int Parametr)                      // Ïðîâåðêà ñòîï-ïðèê.
  {
   int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Ìèíèì. äèñòàíöèÿ
   if (Parametr < Min_Dist)                     // Åñëè ìåíüøå äîïóñò.
     {
      Parametr=Min_Dist;                        // Óñòàíîâèì äîïóñò.
     }
   return(Parametr);                            // Âîçâðàò çíà÷åíèÿ
  }
//+------------------------------------------------------------------+
void Fun_New_Bar()                              // Ô-èÿ îáíàðóæåíèÿ íîâîãî áàðà
  {                                             
   New_Bar=false;                               // Íîâîãî áàðà íåò
   if(New_Time!=Time[0])                        // Ñðàâíèâàåì âðåìÿ
     {
      New_Time=Time[0];                         // Òåïåðü âðåìÿ òàêîå
      New_Bar=true;                             // Ïîéìàëñÿ íîâûé áàð  
     }
  }
//-------------------------------------------------------------- 12 --





Sample





Analysis



Market Information Used:

Series array that contains open time of each bar


Indicator Curves created:


Indicators Used:




Custom Indicators Used:
iK_tay_v01

Order Management characteristics:
Checks for the total of open orders

It can change open orders parameters, due to possible stepping strategy
It Closes Orders by itself
It automatically opens orders when conditions are reached

Other Features:

It issuies visual alerts to the screen