//+------------------------------------------------------------------+
//|                                              MA_TrendLine_02.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Inkov Evgeni ew123@mail.ru"
#property link      "8-918-600-11-33"
//=======================================================================
//                         ÒÎÐÃÎÂËß (ïî òðåíäîâîé ëèíèè) ÎÒËÎÆÅÍÍÛÌÈ ÎÐÄÅÐÀÌÈ
//                               òîðãîâëÿ íà ïðîáîé ÒË
// 13.11.2012 - Äîáàâëåíî óäàëåíèå îòëîæåííîãî ïðè óõîäå öåíû çà ÒË
//            - Óæåòî÷èëîñü óñëîâèå îòêðûòèÿ îòëîæåííîãî
//            - Èñïðàâîåíû íåêîòîðûå íåòî÷íîñòè
//=======================================================================
#define           Razm_Mas_Fract         500
//=======================================================================
extern double     Lot_Osn              = 0;     // 0 - äëÿ ðàñ÷åòà ëîòà èñï. Risk
extern double     Risk                 = 10;    //ïðîöåíòû îò áàëàíñà äëÿ ðàñ÷åòà íà÷. ëîòà
extern bool       Risk_from_Balance    = false; //true - ñ÷èòàåì ðèñê îò áàëàíñà, false - îò ñâîá.ñðåäñòâ
                                                // ìîæíî â ðó÷íóþ çàäàâàòü íàïðàâëåíèå îòêðûòèÿ îðäåðîâ:
extern bool       Trend_UP             = true;  // áóäóò îòêðûâàòüñÿ òîëüêî Buy 
extern bool       Trend_DW             = true;  // áóäóò îòêðûâàòüñÿ òîëüêî Sell
extern int        TP_prob              = 100;   // Òåéê-ïðîôèò
extern int        Otstup_pr_prob       = 7;     // äëÿ ôîðìèðîâàíèÿ îòëîæåííîãî îðäåðà îòñòóï îò High ïåðâîãî áàðà
extern int        Otstup_SL_prob       = 10;    // îòñòóï îò 1 áàðà äëÿ SL
extern bool       On_Begin_Torg        = true;  // èñïîëüçîâàòü âðåìÿ äëÿ íà÷àëî òîðãîâëè
extern int        Begin_Torg           = 480;   // âðåìÿ íà÷àëà òîðãîâëè (îòñòóï îò 00:00 â ìèíóòàõ)
extern bool       On_End_Torg          = false; // èñïîëüçîâàòü âðåìÿ äëÿ îêîí÷àíèÿ òîðãîâëè
extern int        End_Torg             = 30;    // âðåìÿ çàêðûòèå âñåõ îðäåðîâ (îòñòóï îò êîíöà äíÿ â ìèíóòàõ)
extern bool       comm                 = true;  // âûâîäèòü êîììåíòàðèè
extern bool       sound                = true;  // îçâó÷èâàòü îòêðûòèå îðäåðîâ
extern int        TF_Torg              = 15;    // òàéì-ôðåéì òîðãîâëè
extern int        MagicNumber          = 335580;
extern int        Slippage             = 5;
//....................................................
extern int        Fractal_Bars         = 3;     // ïåðåìåííàÿ äëÿ ôîðìèðîâàíèÿ ôðàêòàëîâ, ÷åì áîëüøå òåì ðåæå ôðàêòàëû
extern int        Na4_Bar_Fract        = 1;     // íîìåð áàðà, ñ êîòîðîãî íà÷èíàåòñÿ ïîèñê ôðàêòàëà
extern bool       Out_Grafic           = true;  // âûâîäèòü çèã-çàã íà ýêðàí
extern int        IndNumb              = 10;    // ïðåôèêñ äëÿ ëèíèé çèã-çàãà
extern int        kol_voln             = 20;    // êîë. âîëí âûâîäèìûõ íà ýêðàí
//+------------------------------------------------------------------+
extern bool       Open_Del_Otl         = true;  // óäàëÿòü âñòðå÷íûé îòëîæåííûé ïðè îòêðûòèè ðûíî÷íîãî îðäåðà
extern bool       On_Vstr_Otl          = false; // îòêðûâàòü âñòðå÷íûå îòëîæåííûå îðäåðà
extern bool       Trail_Stop           = true;  // èñïîëüçîâàòü òðåéëèíã-ñòîï ïî âîëíàì çèã-çàãà
extern int        Volna_Trail_Stop     = 1;     // ïî êàêîé âîëíå äâèãàòü òðåéëèíã-ñòîï
//+------------------------------------------------------------------+
extern bool       Out_MA               = true;  // âûâîäèòü MA
extern int        Kol_Bar_MA           = 100;   // ñêîëüêî áàðîâ ÌÀ ïîêàçûâàòü
extern bool       Out_Trend_Line       = true;  // âûâîäèòü Òðåíäîâóþ Ëèíèþ
extern string     Name_Trend_Line      = "TL_1";// èìÿ òðåíäîâîé ëèíèè
extern int        Proc_obraz_zwezd     = 13;    // ïðîöåíò ìåæäó (Open-Close)/(High-Low) äëÿ ïðèíÿòèÿ áàðà â êà÷åñòâå "çâåçäû"
//+------------------------------------------------------------------+
extern double     Min_Tangens_TL_prob  = 0.27; // òàíãåíñ óãëà íàêëîíà ÒË, åñëè îí ìåíüøå ýòîãî çíà÷åíèÿ, òî íå òîðãóåì
extern double     Min_Tangens_TL_clos  = 0.13; 
extern double     Min_Tangens_TL_del_otl = 0.23; 
//+------------------------------------------------------------------+
extern int        BackSteps            = 4;  // íîìåð áàðà âòîðîé êîîðä. äëÿ ôîðì. ÒË, ïåðâàÿ êîîðä. - ýòî ïåðâûé áàð ÌÀ
extern int        MA_Period            = 40; // ïàðàìåòðû ÌÀ: ïåðèîä
extern int        MA_Shift             = -8; // ñäâèã
extern int        MA_Method            = 0;
extern int        MA_Applied_Price     = 0;
//-------------------------------
//MA_Method:        MODE_SMA	   0	Ïðîñòîå ñêîëüçÿùåå ñðåäíåå
//                  MODE_EMA	   1	Ýêñïîíåíöèàëüíîå ñêîëüçÿùåå ñðåäíåå
//                  MODE_SMMA	   2	Ñãëàæåííîå ñêîëüçÿùåå ñðåäíåå
//                  MODE_LWMA	   3	Ëèíåéíî-âçâåøåííîå ñêîëüçÿùåå ñðåäíåå
//-------------------------------
//MA_Applied_Price: PRICE_CLOSE	    0	Öåíà çàêðûòèÿ
//                  PRICE_OPEN	    1	Öåíà îòêðûòèÿ
//                  PRICE_HIGH	    2	Ìàêñèìàëüíàÿ öåíà
//                  PRICE_LOW	       3	Ìèíèìàëüíàÿ öåíà
//                  PRICE_MEDIAN     4	Ñðåäíÿÿ öåíà, (high+low)/2
//                  PRICE_TYPICAL	 5	Òèïè÷íàÿ öåíà, (high+low+close)/3
//                  PRICE_WEIGHTED	 6	Âçâåøåííàÿ öåíà çàêðûòèÿ, (high+low+close+close)/4
//=======================================================================
string      otstup = "                                                                   ";
int         mas_ord[6];
int         kol_ord;
double      Lot;
int         dig_lot;
int         stop_level;
string      com,com1;
double      min_l, max_l;
double      Tick_Value;
datetime    na4_open_ord, end_open_ord, Time00,Tek_Time;
double      urov_st_UP,urov_st_DW;
double      koef,koef1;
//..........................................
double      mas_extrem  [Razm_Mas_Fract][2];   // 0 - öåíà ýêñòðåìóìà, 1 - íîìåð áàðà ýêñòðåìóìà
int         kol_mas_extr;                      // êîëè÷. èñïîëüçóåìûõ ÿ÷ååê â mas_extrem
datetime    tek_Bar_TF;
color       Color_voln=Magenta;
string      com_voln;
double      pr_Trail_Stop;
double      pr1_TL,pr2_TL;
int         n1_TL,n2_TL;
//+------------------------------------------------------------------+
int init()
{
   Tick_Value = MarketInfo(Symbol(),MODE_TICKVALUE);
   
   min_l=MarketInfo(Symbol(),MODE_MINLOT);
   max_l=MarketInfo(Symbol(),MODE_MAXLOT);
   //.............................................
   double n_lot=MarketInfo(Symbol(),MODE_LOTSTEP);
   dig_lot=0;
   while (n_lot<1)
   {
      dig_lot++;
      n_lot *=10;
   }
   del_obj(IndNumb);
   tek_Bar_TF=0;
   //.............................................
   if (IsTesting() && !IsVisualMode())
   {
      comm = false;
      sound = false;
      Out_Grafic = false;
      Out_MA = false;
      Out_Trend_Line = false;
   }
   if (IsTesting() || IsExpertEnabled()) start();  // åñëè ðåæèì Tåñòåðà èëè íàæàòà êíîïêà "Ñîâåòíèêè", òî Start
   return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
   ObjectsDeleteAll();
   Comment("");
   return(0);
}
//+------------------------------------------------------------------+
int start()
{
   //--------------------
         // ïåðåñ÷èòûâàåì âîëíû òîëüêî ïðè ñìåíå áàðà íà TF_Torg
   if (tek_Bar_TF==0 || tek_Bar_TF != iTime(Symbol(),TF_Torg,0))
   {
      Put_mas_fract_and_extr(TF_Torg, Color_voln,Color_voln,IndNumb,mas_extrem,kol_mas_extr);
      Form_TL(BackSteps);               // ñôîðìèðîâàòü TL
      if (Out_MA)ind_MA(Kol_Bar_MA);    // âûâåñòè MA íà ýêðàí
      tek_Bar_TF = iTime(Symbol(),TF_Torg,0);
   }
   //--------------------
   Tek_Time  = TimeCurrent();                            // òåêóùåå âðåìÿ
   Time00    = StrToTime(TimeToStr(Tek_Time,TIME_DATE)); // âðåìÿ íà÷àëà ñåãîäíÿøíåãî äíÿ
   na4_open_ord  = Time00 + Begin_Torg*60;               // âðåìÿ íà÷àëà îòêðûòèÿ îðäåðîâ
   end_open_ord = Time00 + (1440 - End_Torg)*60;         // âðåìÿ êîíöà òîðãîâëè
   //--------------------
   stop_level=MarketInfo(Symbol(),MODE_STOPLEVEL);
   //--------------------
                     // îïðåäåëèòüñÿ ñ íà÷àëüíûì ëîòîì
   if (Lot_Osn > 0)
      Lot=Lot_Osn;
   else
      Lot=GetLot();
   //--------------------
                        // îïðåäåëèòü, ñêîëüêî è êàêèå îðäåðà óñòàíîâëåíû
   kol_ord = put_mas_ord();
   //......................................
   if (comm)Out_Comm();                   // ñôîðìèðîâàòü êîììåíòàðèé
   if (comm)Comment(com+com1+com_voln);   // âûâåñòè êîììåíòàðèé íà ýêðàí
   //*************************************************************
                     // òðåéëèíã-ñòîï ïî âîëíàì
   if (Trail_Stop && mas_ord[OP_BUY] > 0)
   {
      pr_Trail_Stop=pr_TS_Buy(Volna_Trail_Stop);
      if (pr_Trail_Stop>0) ust_TS_Buy(pr_Trail_Stop);
   }
       
   if (Trail_Stop && mas_ord[OP_SELL] > 0)
   {
      pr_Trail_Stop=pr_TS_Sell(Volna_Trail_Stop);
      if (pr_Trail_Stop>0) ust_TS_Sell(pr_Trail_Stop);
   }
   //------------------------------------------------------------------
            // åñëè îòêðûëñÿ ðûíî÷íûé, óäàëèòü îòëîæåííûé
   if (Open_Del_Otl && mas_ord[OP_BUY]  > 0 && mas_ord[OP_SELLSTOP] > 0)Del_otlog(OP_SELLSTOP);
   if (Open_Del_Otl && mas_ord[OP_SELL] > 0 && mas_ord[OP_BUYSTOP]  > 0)Del_otlog(OP_BUYSTOP);
   //-----------------------------
            // åñëè ïîÿâèëîñü óñëîâèå çàêðûòèÿ îðäåðà, çàêðûòü
   if (mas_ord[OP_SELL] > 0)
      if (Proboi_TL_H_Close()) close_ord(OP_SELL);
   if (mas_ord[OP_BUY] > 0)
      if (Proboi_TL_L_Close()) close_ord(OP_BUY);
   //-----------------------------
            // åñëè ïîÿâèëîñü óñëîâèå óäàëåíèÿ îòëîæåííîãî, óäàëèòü
   if (mas_ord[OP_BUYSTOP] > 0)
      if (Proboi_TL_H_Del_otl())Del_otlog(OP_BUYSTOP);
   if (mas_ord[OP_SELLSTOP] > 0)
      if (Proboi_TL_L_Del_otl())Del_otlog(OP_SELLSTOP);
   //*************************************************************
            // íà÷àëî òîðãîâëè: óñòàíîâèòü îòëîæåííûé îðäåð
   kol_ord = put_mas_ord();
   if ((!On_Begin_Torg || Tek_Time >= na4_open_ord) && (!On_End_Torg || Tek_Time < end_open_ord))
      if (mas_ord[OP_BUY]==0 && mas_ord[OP_SELL] == 0)
      {
         if (Trend_UP && mas_ord[OP_BUYSTOP] == 0)
            if (Proboi_TL_H_Open(urov_st_UP,urov_st_DW))
            {
               Otkr_BuyStop (urov_st_UP,urov_st_DW,Otstup_pr_prob, TP_prob, Otstup_SL_prob);
               if (On_Vstr_Otl)
               {
                  if (mas_ord[OP_SELLSTOP]>0)Del_otlog(OP_SELLSTOP);
                  Otkr_SellStop(urov_st_UP,urov_st_DW,Otstup_pr_prob, TP_prob, Otstup_SL_prob);
               }
               kol_ord=put_mas_ord (); 
            }
         //---------------------------------------------
         if (Trend_DW && mas_ord[OP_SELLSTOP] == 0)
            if (Proboi_TL_L_Open(urov_st_UP,urov_st_DW))
            {
               Otkr_SellStop(urov_st_UP,urov_st_DW,Otstup_pr_prob, TP_prob, Otstup_SL_prob);
               if (On_Vstr_Otl)
               {
                  if (mas_ord[OP_BUYSTOP]>0)Del_otlog(OP_BUYSTOP);
                  Otkr_BuyStop (urov_st_UP,urov_st_DW,Otstup_pr_prob, TP_prob, Otstup_SL_prob);
               }
               kol_ord=put_mas_ord (); 
            }
      }
   //*************************************************************
   return(0);
}
//======================================================================
bool Proboi_TL_H_Open(double& urov_UP,double& urov_DW)
{           // èùåì áû÷èé áàð, ðàñïîëîæåííûé âûøå òðåíäîâîé ëèíèè "Í" \
   int n1,n2;
   double pr1,pr2;
   
   urov_UP=0;
   urov_DW=0;
               // åñëè áàð ìåäâåæèé è áîëüøå "çâåçäû", òî âûõîä 0
   double d1= iHigh(Symbol(),TF_Torg,1)-iLow (Symbol(),TF_Torg,1);
   double d2= iOpen(Symbol(),TF_Torg,1)-iClose(Symbol(),TF_Torg,1);
   if (d2>d1*Proc_obraz_zwezd/100.0)return(0);
         // îïðåäåëèòü êîîðäèíàòû òðåíäîâîé ëèíèè (ÒË)
   if (!opred_koord_TL(n1,n2,pr1,pr2))return(0);
         // îïðåäåëèòü íàêëîí ÒË
   koef=(pr1-pr2)/(n1-n2);
   if (koef<=Min_Tangens_TL_prob*Point)return(0);
   double pr_bar1 = pr2-koef*(n2-1);  // öåíà ïåðåñå÷åíèÿ ÒË ñ ëèíèåé áàðà 1
   double pr_bar2 = pr2-koef*(n2-2);  // öåíà ïåðåñå÷åíèÿ ÒË ñ ëèíèåé áàðà 2
   double pr_bar3 = pr2-koef*(n2-3);  // öåíà ïåðåñå÷åíèÿ ÒË ñ ëèíèåé áàðà 3
   
   if (iLow (Symbol(),TF_Torg,1) >= pr_bar1 &&  // áàð1 âûøå ÒË ?
       iLow (Symbol(),TF_Torg,2) <= pr_bar2 &&  // áàð2 è áàð3 ïðîõîäÿò ÷åðåç ÒË ?
       iLow (Symbol(),TF_Torg,3) <= pr_bar3)
   {
      urov_UP=iHigh(Symbol(),TF_Torg,1);
      urov_DW=iLow (Symbol(),TF_Torg,1);
      return(1);
   }
   return(0);
}
//----------------------------
bool Proboi_TL_L_Open(double& urov_UP,double& urov_DW)
{        // èùåì áàð, ðàñïîëîæåííûé íèæå òðåíäîâîé ëèíèè "L" /
         // òàê, ÷òîáû ïðåäûäóùèé êàñàëñÿ ÒË
   int n1,n2;
   double pr1,pr2;
   
   urov_UP=0;
   urov_DW=0;
               // åñëè áàð áû÷èé è áîëüøå "çâåçäû", òî âûõîä 0
   double d1= iHigh (Symbol(),TF_Torg,1)-iLow (Symbol(),TF_Torg,1);
   double d2= iClose(Symbol(),TF_Torg,1)-iOpen(Symbol(),TF_Torg,1);
   if (d2>d1*Proc_obraz_zwezd/100.0)return(0);
         // îïðåäåëèòü êîîðäèíàòû òðåíäîâîé ëèíèè (ÒË)
   if (!opred_koord_TL(n1,n2,pr1,pr2))return(0);
         // îïðåäåëèòü íàêëîí ÒË
   koef=(pr2-pr1)/(n1-n2);
   if (koef<=Min_Tangens_TL_prob*Point)return(0);
   double pr_bar1 = pr2+koef*(n2-1);  // öåíà ïåðåñå÷åíèÿ ÒË ñ ëèíèåé áàðà 1
   double pr_bar2 = pr2+koef*(n2-2);  // öåíà ïåðåñå÷åíèÿ ÒË ñ ëèíèåé áàðà 2
   double pr_bar3 = pr2+koef*(n2-3);  // öåíà ïåðåñå÷åíèÿ ÒË ñ ëèíèåé áàðà 3
   
   if (iHigh(Symbol(),TF_Torg,1) <= pr_bar1 && // áàð1 íèæå ÒË ?
       iHigh(Symbol(),TF_Torg,2) >= pr_bar2 && // áàð2 è áàð3 ïðîõîäèò ÷åðåç ÒË ?
       iHigh(Symbol(),TF_Torg,3) >= pr_bar3)
   {
      urov_UP=iHigh(Symbol(),TF_Torg,1);
      urov_DW=iLow (Symbol(),TF_Torg,1);
      return(1);
   }
   return(0);
}
//----------------------------
bool Proboi_TL_H_Close()
{      
          // Èùåì áàð âûøå ëèíèè òðåíäà
   int n1,n2;
   double pr1,pr2;
         // îïðåäåëèòü êîîðäèíàòû òðåíäîâîé ëèíèè (ÒË)
   if (!opred_koord_TL(n1,n2,pr1,pr2))return(0);
         // îïðåäåëèòü íàêëîí ÒË
   koef=(pr1-pr2)/(n1-n2);
   if (koef<=Min_Tangens_TL_clos*Point)return(0);
   double pr_bar=pr2-koef*(n2-1);  // öåíà ïåðåñå÷åíèÿ ÒË ñ ëèíèåé áàðà 1
   if (iLow(Symbol(),TF_Torg,1)>pr_bar)return(1);
   
   return(0);
}
//------------------------------------------------
bool Proboi_TL_L_Close()
{
            // èùåì áàð íèæå ëèíèè òðåíäà 
   int n1,n2;
   double pr1,pr2;
         // îïðåäåëèòü êîîðäèíàòû òðåíäîâîé ëèíèè (ÒË)
   if (!opred_koord_TL(n1,n2,pr1,pr2))return(0);
   koef=(pr2-pr1)/(n1-n2);      //koef - íàêëîí ÒË
   if (koef<=Min_Tangens_TL_clos*Point)return(0);
   double pr_bar=pr2+koef*(n2-1);  // pr_bar - òî÷êà ïåðåñå÷åíèÿ ÒË è ëèíèåé áàðà
   if (iHigh(Symbol(),TF_Torg,1)<pr_bar)return(1);
   return(0);
}
//----------------------------
bool Proboi_TL_H_Del_otl()
{           // èùåì áàð, ðàñïîëîæåííûé íèæå òðåíäîâîé ëèíèè "Í" \
   int n1,n2;
   double pr1,pr2;
         // îïðåäåëèòü êîîðäèíàòû òðåíäîâîé ëèíèè (ÒË)
   if (!opred_koord_TL(n1,n2,pr1,pr2))return(0);
         // îïðåäåëèòü íàêëîí ÒË
   koef=(pr1-pr2)/(n1-n2); 
   if (koef<=Min_Tangens_TL_del_otl*Point)return(0);
   double pr_bar  = pr2-koef*(n2-1);      // òî÷êà ïåðåñå÷åíèÿ ÒË è ëèíèåé áàðà
   
   if (iHigh (Symbol(),TF_Torg,1) < pr_bar)return(1); // áàð íèæå ÒË ?
      
   return(0);
}
//----------------------------
bool Proboi_TL_L_Del_otl()
{        // èùåì áàð, ðàñïîëîæåííûé âûøå òðåíäîâîé ëèíèè "L" /
   int n1,n2;
   double pr1,pr2;
         // îïðåäåëèòü êîîðäèíàòû òðåíäîâîé ëèíèè (ÒË)
   if (!opred_koord_TL(n1,n2,pr1,pr2))return(0);
         // îïðåäåëèòü íàêëîí ÒË
   koef=(pr2-pr1)/(n1-n2);
   if (koef<=Min_Tangens_TL_del_otl*Point)return(0);
   double pr_bar  = pr2+koef*(n2-1);      // òî÷êà ïåðåñå÷åíèÿ ÒË è ëèíèåé áàðà
   
   if (iLow(Symbol(),TF_Torg,1) > pr_bar)return(1); //áàð âûøå ÒË 
   return(0);
}
//-----------------------------------------------
bool opred_koord_TL(int& n1, int& n2, double& pr1,double& pr2)
{      // îïðåäåëèòü êîîðäèíàòû òðåíäîâîé ëèíèè (ÒË)
   pr1 =pr1_TL;
   pr2 =pr2_TL;
   n1=n1_TL;
   n2=n2_TL;
   
  return(1);
}
//----------------------------
double pr_TS_Buy(int n)
{
  if (mas_extrem[n][0]<mas_extrem[n-1][0])return(mas_extrem[n][0]);
  return(0);
}
//-----------------------------------------------
double pr_TS_Sell(int n)
{
  if (mas_extrem[n][0]>mas_extrem[n-1][0])return(mas_extrem[n][0]);
  return(0);
}
//-----------------------------------------------
bool ust_TS_Buy (double pr)
{
   pr=NormalizeDouble(pr,Digits);
   for(int i=0; i<OrdersTotal(); i++)
      if (OrderSelect(i,SELECT_BY_POS)==true)
      {
         if (OrderSymbol()!=Symbol()) continue;
         if (OrderMagicNumber() != MagicNumber) continue;
         if (OrderType()==OP_BUY)
         {
            RefreshRates();
            if (OrderStopLoss() < pr && pr<Bid && pr>=OrderOpenPrice())
               OrderModify(OrderTicket(),OrderOpenPrice(),pr,OrderTakeProfit(),0);
         }
      }
   return(0);
}
//-----------------------------------------------
bool ust_TS_Sell (double pr)
{
   pr=NormalizeDouble(pr,Digits);
   
   for(int i=0; i<OrdersTotal(); i++)
      if (OrderSelect(i,SELECT_BY_POS)==true)
      {
         if (OrderSymbol()!=Symbol()) continue;
         if (OrderMagicNumber() != MagicNumber) continue;
         if (OrderType()==OP_SELL)
         {
            RefreshRates();
            if ((OrderStopLoss()==0 || OrderStopLoss() > pr) && pr>Ask && pr<=OrderOpenPrice())
               OrderModify(OrderTicket(),OrderOpenPrice(),pr,OrderTakeProfit(),0);
         }
      }
   return(0);
}
//+------------------------------------------------------------------+
int put_mas_ord()
{        // ïîñ÷èòàòü êîë. îðäåðîâ
   int n;
   
   ArrayInitialize(mas_ord,0);
   
   for(int i=0; i<OrdersTotal(); i++)
      if (OrderSelect(i,SELECT_BY_POS)==true)
      {
         if (OrderSymbol() != Symbol()) continue;
         if (OrderMagicNumber() != MagicNumber) continue;
         mas_ord[OrderType()]++;
         n++;
      }
   return(n);
}
//---------------------------------------------
double GetLot()
{
   double free_magrin;
   
   if (Risk_from_Balance)
      free_magrin = AccountBalance();
   else
      free_magrin = AccountFreeMargin();
   double lot = NormalizeDouble(free_magrin * Risk/100000.0,dig_lot);
   
   return (lot);
}
//+------------------------------------------------------------------+
double Ogran_lot(double lot)
{
   if (lot < min_l)lot = min_l;
   if (lot > max_l)lot = max_l;
   return(lot);
}
//+------------------------------------------------------------------+
bool Otkr_BuyStop(double urov_UP,double urov_DW,int Otstup_pr, int TP, int Otstup_SL)
{
   double tek_pr,tek_sl,tek_tp;
   int err;
   
   tek_pr = urov_UP + Otstup_pr*Point;
   RefreshRates();
   if (Bid>=tek_pr-stop_level*Point)return(0);
   
   tek_tp = tek_pr + TP*Point;
   tek_sl = urov_DW - Otstup_SL*Point;
   err=ust_ord(OP_BUYSTOP, Lot, tek_pr, tek_sl, tek_tp, "~R1~");
   if (err<0)com=com+" OP_BUYSTOP="+GetLastError()+" pr="+DoubleToStr(tek_pr,Digits)+" sl="+DoubleToStr(tek_sl,Digits)+" tp="+DoubleToStr(tek_tp,Digits)+"\n";
   return(err>0);
}
//------------------------------------------------------------------------
bool Otkr_SellStop(double urov_UP,double urov_DW,int Otstup_pr, int TP, int Otstup_SL)
{
   double tek_pr,tek_sl,tek_tp;
   int err;
   
   tek_pr = urov_DW - Otstup_pr*Point;
   RefreshRates();
   if (Ask<=tek_pr+stop_level*Point)return(0);
   
   tek_tp = tek_pr - TP*Point;
   tek_sl = urov_UP + Otstup_SL*Point;
   err=ust_ord(OP_SELLSTOP, Lot, tek_pr, tek_sl, tek_tp, "~R1~");
   if (err<0)com=com+" OP_SELLSTOP="+GetLastError()+" pr="+DoubleToStr(tek_pr,Digits)+" sl="+DoubleToStr(tek_sl,Digits)+" tp="+DoubleToStr(tek_tp,Digits)+"\n";
   return(err>0);
}
//------------------------------------------------------------------------
int ust_ord (int tip, double lot, double pr, double sl, double tp, string com11)
{
   int err;
   double tek_lot;
   double ust_lot=lot;
      
   while (ust_lot>0)
   {
      tek_lot=Ogran_lot(ust_lot);
      err=OrderSend(Symbol(), tip, tek_lot, pr, Slippage, sl, tp, com11, MagicNumber, 0);
      if (err<0)break;
      ust_lot-=tek_lot;
   }
   return (err);
}
//------------------------------------------------------------------------
bool  Del_otlog(int tip)
{                  // Óäàëåíèå âñåõ îòëîæåííûõ îðäåðîâ (tip=-1) èëè çàäàííîãî òèïà
   bool usl=true;
   while (usl)
   {
      usl=false;
      for(int i = 0; i < OrdersTotal(); i++) //ïåðåáèðàåì âñå îðäåðà
      {
         if (!OrderSelect(i, SELECT_BY_POS))continue;
         if (OrderSymbol() != Symbol())continue;
         if (OrderMagicNumber() != MagicNumber)continue;
         if (OrderType()>1 && (tip==OrderType() || tip==-1))
         {
             OrderDelete(OrderTicket());
             usl=true;
         }
      }
   }
   return(0); 
}
//------------------------------------------------------------------------
bool close_ord(int tip)
{   
   bool usl=true;
   while (usl)
   {
      usl=false;
      for(int i=0; i<OrdersTotal(); i++)
         if (OrderSelect(i,SELECT_BY_POS)==true)
         {
            if (OrderSymbol()!=Symbol()) continue;
            if (OrderMagicNumber() != MagicNumber)continue;
            
            if(OrderType()==OP_BUY && (tip==OP_BUY || tip==-1))
            {
               RefreshRates();
               OrderClose(OrderTicket(),OrderLots(),Bid,Slippage);
               usl=true;
            }
            if (OrderType()==OP_SELL && (tip==OP_SELL || tip==-1))
            {
               RefreshRates();
               OrderClose(OrderTicket(),OrderLots(),Ask,Slippage);
               usl=true;
            }
         }
   }
   return(0);
}
//---------------------------------------------
void Out_Comm()
{
   com1 = otstup+"Òåêóùåå âðåìÿ: " + TimeToStr(Tek_Time,TIME_SECONDS)+"   ";
   if (kol_ord==0)
      if (On_Begin_Torg && Tek_Time < na4_open_ord)
         com1 = com1+"Íà÷àëî òîðãîâëè ñåãîäíÿ";
      else
         com1 = com1 + "Æäåì óñëîâèÿ äëÿ îòêðûòèÿ îðäåðà";
   else
      com1 = com1+"Èäåò òîðãîâëÿ";
   if (On_Begin_Torg)com1 = com1 + " ñ "  + StringSubstr(TimeToStr(na4_open_ord,TIME_SECONDS),0,5);
   if (On_End_Torg)com1 = com1 + " äî " + StringSubstr(TimeToStr(end_open_ord,TIME_SECONDS),0,5); 
   com1 = com1  + "\n";
   //............................  
   com1=com1+otstup+"Íà÷àëüíûé ëîò = "+DoubleToStr(Lot,dig_lot)+"  Ðèñê = "+ DoubleToStr(Risk,2)+" %";
   if (Risk_from_Balance)
      com1=com1+" îò áàëàíñà\n";
   else
      com1=com1+" îò ñâîá.ñðåäñòâ\n";
   //............................  
   com1=com1+otstup+"Stop_Level = "+stop_level+"  Òàíãåíñ ÒË = "+koef1+"\n";
}
//==========================================================================
bool Put_mas_fract_and_extr(int TF,color col_UP,color col_DW,int nom_ind, double& mas_extremum[][], int& kol_mas_extr1)
{
   int i;
   double long1 [Razm_Mas_Fract];
   double short1[Razm_Mas_Fract];
   int na4_bar,kol_bar;
   ArrayInitialize(long1,0);
   ArrayInitialize(short1,0);
//----
   
   if (Fractal_Bars<=0)Fractal_Bars=1;
   
   int HighBar = -1;
   int LowBar  = -1;
   
   //Èùåì ôðàêòàëû  
   int kol_bars=MathMin(Razm_Mas_Fract,iBars(Symbol(),TF)-1);
   
   int tek_kol_voln;
   for(i=Na4_Bar_Fract;i<=kol_bars;i++) // ïðîñìàòðèâàåì ñ òåê.âðåìåíè íàçàä
   {
      //Èùåì íèæíèé ôðàêòàë: èíäåêñ ìèí.çíà÷. îò i-Fractal_Bars íàçàä êîë.=Fractal_Bars*2+1, ò.å. i +- Fractal_Bars
      na4_bar=i-Fractal_Bars;
      if (na4_bar<0)
      {
         kol_bar=Fractal_Bars*2+1+na4_bar;
         na4_bar=0;
      }
      else
         kol_bar=Fractal_Bars*2+1;
      if (i==iLowest(Symbol(),TF,MODE_LOW,kol_bar,na4_bar))  
      {
         switch(HighLow(LowBar,HighBar))
         {
            case -1:
            {
               if (NormalizeDouble(iLow(Symbol(),TF,i),Digits)<NormalizeDouble(iLow(Symbol(),TF,LowBar),Digits))
               {
                  long1[i]=iLow(Symbol(),TF,i);
                  long1[LowBar]=0;
                  LowBar=i;
//                  tek_kol_voln++;
               }
               break;
            }
            case 1:  // íîâûé íèç
            {
               if (NormalizeDouble(iLow(Symbol(),TF,i),Digits)<NormalizeDouble(iHigh(Symbol(),TF,HighBar),Digits))
               {
                  long1[i]=iLow(Symbol(),TF,i);
                  LowBar=i;
                  tek_kol_voln++;
               }
               break;
            }
            case 0:    // ïåðâûé ìèí.
            {
               long1[i]=iLow(Symbol(),TF,i);
               LowBar=i;
               tek_kol_voln++;
               break;
            }
         }
      }
      //Èùåì âåðõíèé ôðàêòàë
      na4_bar=i-Fractal_Bars;
      if (na4_bar<0)
      {
         kol_bar=Fractal_Bars*2+1+na4_bar;
         na4_bar=0;
      }
      else
         kol_bar=Fractal_Bars*2+1;
      if (i==iHighest(Symbol(),TF,MODE_HIGH,kol_bar,na4_bar) && long1[i]==0)  
      {
         switch(HighLow(LowBar,HighBar))
         {
            case 1:  // íîâûé âåðõ 
            {
               if (NormalizeDouble(iHigh(Symbol(),TF,i),Digits)>NormalizeDouble(iHigh(Symbol(),TF,HighBar),Digits))
               {
                  short1[i]=iHigh(Symbol(),TF,i);
                  short1[HighBar]=0;
                  HighBar=i;
//                  tek_kol_voln++;
               }
               break;
            }
            case -1:
            {
               if (NormalizeDouble(iHigh(Symbol(),TF,i),Digits)>NormalizeDouble(iLow(Symbol(),TF,LowBar),Digits))
               {
                  short1[i]=iHigh(Symbol(),TF,i);
                  HighBar=i;
                  tek_kol_voln++;
               }
               break;
            }
            case 0:  // ïåðâûé ìàêñ.
            {
               short1[i]=iHigh(Symbol(),TF,i);
               HighBar=i;
               tek_kol_voln++;
               break;
            }
         }
      }
      if (tek_kol_voln>kol_voln)break;
   }
   kol_bars=i;
   if (Out_Grafic)                                          //Ðèñóåì ëîìàíóþ
      if (Period()<=TF)
      {
         del_obj(nom_ind);
         int LastExtremumBar     = -1;
         for(i=kol_bars;i>=Na4_Bar_Fract;i--)
         {
            if (long1[i]!=0 || short1[i]!=0)
            {
               if (LastExtremumBar!=-1)
               {
                  if (long1[i]!=0)
                  {
                     int Nom_Bar1= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,LastExtremumBar));
                     int Nom_Bar12= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,LastExtremumBar-1));
                     if (LastExtremumBar==0)Nom_Bar12=0;
                     int j1=Nom_Bar1;
                     if (Nom_Bar1<=MathMin(kol_bars,Bars-1))
                     {
                        for (j1=Nom_Bar1;j1>=Nom_Bar12;j1--)if (short1[LastExtremumBar]==High[j1])break;
                        if (j1<Nom_Bar12)j1=Nom_Bar1;
                     }
                  
                     int Nom_Bar2= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,i));
                     Nom_Bar12= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,i-1));
                     if (i==0)Nom_Bar12=0;
                     int j2=Nom_Bar2;
                     if (Nom_Bar2<=MathMin(kol_bars,Bars-1))
                     {
                        for (j2=Nom_Bar2;j2>=Nom_Bar12;j2--)if (long1[i]==Low[j2])break;
                        if (j2<Nom_Bar12)j2=Nom_Bar2;
                     }
                  
                     ObjectCreate(StringConcatenate("Trend_",nom_ind,"_",i),OBJ_TREND,0,
                        Time[j1],short1[LastExtremumBar],Time[j2],long1[i]);
                     ObjectSet(StringConcatenate("Trend_",nom_ind,"_",i),OBJPROP_COLOR,col_DW);
                  }
                  if (short1[i]!=0)
                  {
                     Nom_Bar1= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,LastExtremumBar));
                     Nom_Bar12= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,LastExtremumBar-1));
                     if (LastExtremumBar==0)Nom_Bar12=0;
                     j1=Nom_Bar1;
                     if (Nom_Bar1<=MathMin(kol_bars,Bars-1))
                     {
                        for (j1=Nom_Bar1;j1>=Nom_Bar12;j1--)if (long1[LastExtremumBar]==Low[j1])break;
                        if (j1<Nom_Bar12)j1=Nom_Bar1;
                     }
                     
                     Nom_Bar2= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,i));
                     Nom_Bar12= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,i-1));
                     if (i==0)Nom_Bar12=0;
                     j2=Nom_Bar2;
                     if (Nom_Bar2<=MathMin(kol_bars,Bars-1))
                     {
                        for (j2=Nom_Bar2;j2>=Nom_Bar12;j2--)if (short1[i]==High[j2])break;
                        if (j2<Nom_Bar12)j2=Nom_Bar2;
                     }
                     ObjectCreate(StringConcatenate("Trend_",nom_ind,"_",i),OBJ_TREND,0,
                        Time[j1],long1[LastExtremumBar],Time[j2],short1[i]);
                     ObjectSet(StringConcatenate("Trend_",nom_ind,"_",i),OBJPROP_COLOR,col_UP);
                  }
                  ObjectSet(StringConcatenate("Trend_",nom_ind,"_",i),OBJPROP_RAY,0);
                  ObjectSet(StringConcatenate("Trend_",nom_ind,"_",i),OBJPROP_WIDTH,2);
               }
               LastExtremumBar=i;
            }
         }
      }
   
   for(i=0;i<=Razm_Mas_Fract;i++) if (short1[i]!=0) long1[i]=short1[i];
   
   ArrayInitialize(mas_extremum,0);
   kol_mas_extr1=0;
   for(i=0;i<=Razm_Mas_Fract;i++)
      if (long1[i]!=0)
      {
         mas_extremum[kol_mas_extr1][0]=NormalizeDouble(long1[i],Digits);
         mas_extremum[kol_mas_extr1][1]=NormalizeDouble(i,0);
         kol_mas_extr1++;
      }
      
   return(0);
}
//+------------------------------------------------------------------+
int HighLow(int L, int H)
{
         // íà÷àëî ãðàôèêà
   if (L == -1 && H >=  0) return(1);  // íèçà  åù¸ íå áûëî, à âåðõ óæå áûë, ýòî íîâûé âåðõ
   if (L >=  0 && H == -1) return(-1); // âåðõà åù¸ íå áûëî, à íèç  óæå áûë, ýòî íîâûé íèç
         // ïðîäîëæåíèå ãðàôèêà
   if (L >=  0 && H >=  0)
   {
      if (L < H) return(1);   // íàéäåí âåðõ èëè íèç
      if (L > H) return(-1);  // íàéäåí âåðõ èëè íèç
   }
   return(0);  // (L==-1 è H==-1) ïåðâûé ìàõ. èëè ìèí. - íà÷àëî ãðàôèêà
}
//------------------------------------------------------------------------
void del_obj(int nom)
{
   for(int i=Razm_Mas_Fract;i>=0;i--)
      if (ObjectFind(StringConcatenate("Trend_",nom,"_",i))!=-1)
         ObjectDelete(StringConcatenate("Trend_",nom,"_",i));
}
//------------------------------------------------------------------------
string Form_TL(int Step)
  {   
   n1_TL=-MA_Shift; //íà÷àëüíàÿ êîîðäèíàòà ÒË (1 áàð MA)
   n2_TL=Step-MA_Shift;
   pr1_TL=iMA(Symbol(),TF_Torg,MA_Period,MA_Shift,MA_Method,MA_Applied_Price,n1_TL);
   pr2_TL=iMA(Symbol(),TF_Torg,MA_Period,MA_Shift,MA_Method,MA_Applied_Price,n2_TL);
   koef1=(pr1_TL-pr2_TL)/(n2_TL-n1_TL)/Point;
   if (Period()>TF_Torg)
   {
      ObjectDelete(Name_Trend_Line);
      return(0);
   }
   if (Out_Trend_Line)
   {
      if (ObjectFind(Name_Trend_Line)<0)ObjectCreate(Name_Trend_Line,OBJ_TREND,0,0,0,0,0);
   
      ObjectSet(Name_Trend_Line,OBJPROP_TIME1,iTime(Symbol(),TF_Torg,n2_TL));
      ObjectSet(Name_Trend_Line,OBJPROP_TIME2,iTime(Symbol(),TF_Torg,n1_TL));
      ObjectSet(Name_Trend_Line,OBJPROP_PRICE1,pr2_TL);
      ObjectSet(Name_Trend_Line,OBJPROP_PRICE2,pr1_TL);
      ObjectSet(Name_Trend_Line,OBJPROP_COLOR,Blue);
      ObjectSet(Name_Trend_Line,OBJPROP_WIDTH,1);
   }
   return(0);
  }
//+------------------------------------------------------------------+
void ind_MA(int end_bar)
{
   string Name, Prefix_MA="MA_";
   
   for (int indexBar = 0; indexBar < Bars; indexBar++)
   {
      Name = Prefix_MA + DoubleToStr(indexBar, 0);
      ObjectDelete(Name);
   }
   if (Period()>TF_Torg)return;
   
   int n;
   double pr1,pr2;
   color ColorMA=Green;
   
   pr1=iMA(Symbol(),TF_Torg,MA_Period,MA_Shift,MA_Method,MA_Applied_Price,-MA_Shift);
   for (indexBar = 1; indexBar < MathMin(end_bar,Bars); indexBar++)
   {
      n=indexBar-MA_Shift;
      pr2=iMA(Symbol(),TF_Torg,MA_Period,MA_Shift,MA_Method,MA_Applied_Price,n);
      
      Name = Prefix_MA + DoubleToStr(indexBar, 0);
      if (ObjectFind(Name) == -1)
      {
         ObjectCreate(Name, OBJ_TREND, 0, 0, 0, 0, 0);
         ObjectSet(Name, OBJPROP_STYLE, STYLE_SOLID);
         ObjectSet(Name, OBJPROP_WIDTH, 2);
         ObjectSet(Name, OBJPROP_RAY, false);         
      }
      ObjectSet(Name, OBJPROP_TIME1, iTime(Symbol(),TF_Torg,indexBar-MA_Shift));
      ObjectSet(Name, OBJPROP_PRICE1, pr2);
      ObjectSet(Name, OBJPROP_TIME2, iTime(Symbol(),TF_Torg,indexBar-MA_Shift - 1));
      ObjectSet(Name, OBJPROP_PRICE2, pr1);
      ObjectSet(Name, OBJPROP_COLOR, ColorMA);
      pr1=pr2;       
   }
}
//=============================================================
             
            
            
            
Comments