
#property copyright ""
#property link      ""
#include <stdlib.mqh>
#include <ErrorDescription_RUS.mqh>
#property strict

extern string s1 = "====Basic settings====";
extern int    Magic = 1504;
extern bool   MM = TRUE;
extern double Risk = 2.0;
extern double Lot = 0.01;
extern bool   LotCalcOverBal = TRUE;
extern double StopLoss = 60.0;
extern double TakeProfit = 20.0;
extern string CS = "==== Custom Settings ====";
extern bool   CloseOnlyOnProfit = TRUE;
extern bool   UseCustomPair = TRUE;
extern string UseSettingsFrom = "GBPUSD_new2";
extern int    MaxOrders = 6;
extern int    PipDifMin = 4;
extern int    Trailingstop = 0;
extern bool   TickByTickTrailing = False;
extern bool   RecoveryMode = False;
extern int    RecoveryModeMulti = 2;
extern bool   Martingale = True;
extern double MartingaleMulti = 1.5;
extern int    SlipPage = 3;
extern string s2 = "====Time based filters====";
extern bool   DayFilter = False;
extern int    Day1 = 6;
extern int    Day2 = 0;
extern int    StartDayMonth = 1;
extern int    StopDayMonth = 31;
extern bool   HourFilter = False;
extern int    GMTOffset = 3;
extern int    Session1 = 1;
extern int    Session2 = 0;
extern int    Session3 = 0;
extern int    Session1OpenHour = 0;
extern int    Session1CloseHour = 0;
extern int    Session2OpenHour = 0;
extern int    Session2CloseHour = 0;
extern int    Session3OpenHour = 0;
extern int    Session3CloseHour = 0;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
string O1="==== OPTIMIZATION PARAMETERS ====";///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
string O2="=========== DISABLED IF ============";///|EURUSD|EURUSD| EUR33 |GBPUSD|GBPUSD| GBP52 |GBP52T| GBP30 |USDJPY|USDJPY|USDCHF|USDCAD|AUDUSD|NZDUSD| AUDUSD | GBPUSD | USDJPY | USDCHF | GBP30 | EUR33 | EURUSD| EURUSD|
string O3="==== <USECUSTOMPAIR> = TRUE ====";///////|------| _new |-------|------| _new |-------|------|-------|------| _new |------|------|------|------| _new   | _new2  | _new2  | _new   | _new  | _new  | _new2 | _new3 |
string O4="======= Use it only for optimization ======";///|//////|///////|//////|//////|///////|//////|///////|//////|//////|//////|//////|//////|//////|////////|////////|////////|////////|///////|///////|///////|///////|
int iMA_Period = 75;                        //   1  |  75  |  75  |  75   |  75  |  75  |  75   |  75  |  75   |  85  |  85  |  70  |  65  |  75  |  45  |   75   |   75   |   85   |  70    |  75   |  75   |  75   |  75   |
int iMA_Filter_Open_b = 39;                 //   2  |  39  |  30  |  42   |  33  |  34  |  30   |  21  |  39   |  21  |  10  |  25  |  15  |  33  |  70  |   24   |   33   |   18   |  38    |  39   |  37   |  35   |  35   |
int iWPR_Filter_OpenSignal_b = 5;           //   3  |   5  |   5  |   5   |   6  |   6  |   6   |   6  |   6   |   5  |   3  |   9  |  11  |   2  |   2  |    2   |   7    |   4    |  9     |   6   |   5   |   5   |   5   |
int iMA_Filter_Open_a = 15;                 //   4  |  15  |  17  |  42   |  12  |  12  |  12   |   3  |  13   |   5  | -14  |   8  |   5  |  13  |  14  |    8   |   12   |  -14   |  17    |  13   |  37   |  15   |  15   |
int iWPR_Filter_OpenSignal_a = 1;           //   5  |   1  |   1  |   5   |   1  |   1  |   2   |   3  |   2   |   1  |   1  |   5  |   1  |   2  |   2  |    2   |   1    |   1    |  3     |   2   |   5   |   1   |   2   |
int iWPR_Filter_Close = 19;                 //   6  |  19  |  15  |  14   |  19  |  19  |  25   |  33  |  22   |  27  |  28  |  22  |   6  |  12  |  -5  |   18   |   21   |   9    |  20    |  22   |  14   |  15   |  15   |
int MaxLossPoints = -65;                    //   7  | -65  |   0  |  -5   |-200  | -30  | -30   | -25  | -50   | -80  |-200  | -40  | -30  | -40  | -40  | -100   |  -100  |  -130  |  -25   | -50   |   2   |   0   |   0   |
int iWPR_Period = 11;                       //   8  |  11  |  11  |  10   |  12  |  12  |  12   |  12  |  22   |  12  |  12  |  12  |  16  |  18  |  15  |   18   |   12   |   13   |  11    |  22   |  10   |  11   |  11   |
int Price_Filter_Close = 14;                //   9  |  14  |  14  |  14   |  18  |  13  |  10   |  13  |  11   |  13  |  10  |  11  |  14  |   8  |  20  |   14   |   11   |   5    |  11    |  9    |  14   |  13   |  10   |
int SecureProfit_ = 1;                      //  10  |   1  |   3  |   5   |   2  |  14  |   4   |   7  |   0   |   2  |  13  |   0  |   2  |   1  |  10  |    5   |   20   |   15   |  -12   |   0   |   3   |   2   |   0   |
int SecureProfitTriger_ = 10;               //  11  |  10  |  11  |  13   |  24  |  23  |  20   |  20  |  20   |  14  |  15  |  15  |  10  |  16  |  40  |   20   |   25   |   15   |  15    |  20   |  13   |  11   |  11   |
int iWPR_Filter_Open_unknown = -1;          //  12  |  -1  |  -1  |  -2   |  -1  |  -1  |  -5   |  -3  |  -3   |  -1  |  -1  |  -2  |  -4  |  -1  |  -2  |    0   |   -5   |   -4   |  -5    |  -3   |  -4   |  -2   |  -2   |
int iWPR_Filter_Close_unknown = -1;         //  13  |  -1  |  -1  |  -5   |  -1  |   0  |   0   |   0  |   0   |  -2  |  -2  |  -1  |  -1  |  -1  |  -5  |   -2   |   -5   |   -1   |  -5    |   0   |  -4   |   0   |   0   |
int iWPR_Close_Period = 0;                  //  14  |   0  |   0  |   1   |   0  |   0  |   0   |   0  |   0   |   0  |   1  |   0  |   0  |   0  |   0  |    0   |    0   |    1   |  0     |   0   |   1   |   1   |   1   |
int FilterATR = 6;                          //  15  |   6  |   6  |   6   |   6  |   5  |   5   |   5  |   5   |   0  |   8  |   3  |   4  |   0  |   0  |    2   |    5   |    7   |  2     |   5   |   6   |   6   |   6   |
int iATR_Period = 14;                       //  16  |  14  |  14  |  14   |  14  |  14  |  14   |  14  |  14   |  14  |  36  |  14  |  14  |  14  |  14  |   14   |   14   |   36   |  14    |  14   |  14   |  14   |  14   |
int iCCI_OpenFilter = 150;                  //  17  | 150  | 155  | 190   | 290  | 250  | 240   | 160  | 240   |2000  | 190  | 170  | 130  | 140  | 120  |  140   |   270  |   180  |  250   | 240   | 300   | 155   | 150   |
int iCCI_Period = 18;                       //  18  |  18  |  18  |   5   |  12  |  11  |  10   |  12  |  10   |  12  |  12  |  14  |  12  |  18  |  18  |   18   |   12   |   18   |  14    |  10   |   5   |  18   |  17   |
int Unknown_1 = 0;                          //  19  |   0  |   0  |   0   |   0  |   0  |   0   |   0  |   0   |   0  |   0  |   0  |   0  |   0  |   0  |    0   |   0    |   0    |  0     |   0   |   0   |   0   |   0   |
int Unknown_2 = 0;                          //  20  |   0  |   0  |   0   |   0  |   0  |   0   |   0  |   0   |   0  |   0  |   0  |   0  |   0  |   0  |    0   |   0    |   0    |  0     |   0   |   0   |   0   |   0   |
int StopLoss_ = 120;                        //  21  | 120  |  80  |  33   | 120  |  95  |  52   |  52  |  30   | 130  | 120  | 120  | 150  | 150  | 130  |   65   |   60   |   120  |  120   |  30   |  33   |  85   |  75   |
int TakeProfit_ = 26;                       //  22  |  26  |  30  |  30   |  50  |  50  |  70   |  40  |  90   |  27  |  65  |  17  |  14  |  70  |  50  |   50   |   75   |   65   |  50    |  90   |  40   |  30   |  16   |
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
extern string s4 = "==== Extras ====";
extern string Comentario = "Cactus";
extern color ColorTXT = Red;
extern bool showInfo = False;
int p1 = 0;
int p2 = 0;
int p3 = 0;
int p4 = 0;
int p5 = 0;
int p6 = 0;
int p7 = 0;
int p8 = 0;
int p9 = 0;
int p10;
int p11;
int p12 = 0;
int p13 = 0;
int p14 = 0;
int p15 = 0;
int p16 = 0;
int p17 = 0;
int p18 = 0;
int p19 = 0;
int p20 = 0;
int p21;
int p22;
datetime GMT;
int time;
double Gd_412 = 0.0001;
int bandTiempo = 0;
double maxdd,maxpercentdd; 
int banderaBalance=0;
bool BanderaRecover = true;
int SumaBeneficios = 0;
int cantidadOrdenesHistorial = 0;
int Xoff = 50;
int Yoff = 120;
double Lots2=0, Lots=0;
double   myPoint;


int init() {
   //-1----------------------------------------EURUSD----------------------------------------------------------------------------------------------------------------------------------------------------------
   if (UseCustomPair && UseSettingsFrom == "EURUSD")     {p1=75;p2=39;p3=5; p4=15; p5=1;p6=19;p7=-65; p8=11;p9=14;p10=1; p11=10;p12=-1;p13=-1;p14=0;p15=6;p16=14;p17=150;p18=18;p19=0;p20=0;p21=120;p22=26;}
   if (UseCustomPair && UseSettingsFrom == "EURUSD_new") {p1=75;p2=30;p3=5; p4=17; p5=1;p6=15;p7=0;   p8=11;p9=14;p10=3; p11=11;p12=-1;p13=-1;p14=0;p15=6;p16=14;p17=155;p18=18;p19=0;p20=0;p21=80; p22=30;} 
   if (UseCustomPair && UseSettingsFrom == "EURUSD_new2"){p1=75;p2=35;p3=5; p4=15; p5=1;p6=15;p7=0;   p8=11;p9=13;p10=2; p11=11;p12=-2;p13=0; p14=1;p15=6;p16=14;p17=155;p18=18;p19=0;p20=0;p21=85; p22=30;}
   if (UseCustomPair && UseSettingsFrom == "EURUSD_new3"){p1=75;p2=35;p3=5; p4=15; p5=2;p6=15;p7=0;   p8=11;p9=10;p10=0; p11=11;p12=-2;p13=0; p14=1;p15=6;p16=14;p17=150;p18=17;p19=0;p20=0;p21=75; p22=16;}//last settings from 01.09.2014
   if (UseCustomPair && UseSettingsFrom == "EUR33")      {p1=75;p2=42;p3=5; p4=42; p5=5;p6=14;p7=-5;  p8=10;p9=14;p10=5; p11=13;p12=-2;p13=-5;p14=1;p15=6;p16=14;p17=190;p18=5; p19=0;p20=0;p21=33; p22=30;}
   if (UseCustomPair && UseSettingsFrom == "EUR33_new")  {p1=75;p2=37;p3=5; p4=37; p5=5;p6=14;p7=2;   p8=10;p9=14;p10=3; p11=13;p12=-4;p13=-4;p14=1;p15=6;p16=14;p17=300;p18=5; p19=0;p20=0;p21=33; p22=40;}//last settings from 14.01.2014
//-2----------------------------------------GBPUSD----------------------------------------------------------------------------------------------------------------------------------------------------------   
   if (UseCustomPair && UseSettingsFrom == "GBPUSD")     {p1=75;p2=33;p3=6; p4=12; p5=1;p6=19;p7=-200;p8=12;p9=18;p10=2; p11=24;p12=-1;p13=-1;p14=0;p15=6;p16=14;p17=290;p18=12;p19=0;p20=0;p21=120;p22=50;}
   if (UseCustomPair && UseSettingsFrom == "GBPUSD_new") {p1=75;p2=34;p3=6; p4=12; p5=1;p6=19;p7=-30; p8=12;p9=13;p10=14;p11=23;p12=-1;p13=0; p14=0;p15=5;p16=14;p17=250;p18=11;p19=0;p20=0;p21=95; p22=50;}
   if (UseCustomPair && UseSettingsFrom == "GBPUSD_new2"){p1=75;p2=33;p3=7; p4=12; p5=1;p6=21;p7=-100;p8=12;p9=11;p10=20;p11=25;p12=-5;p13=-5;p14=0;p15=5;p16=14;p17=270;p18=12;p19=0;p20=0;p21=60; p22=75;}//last settings from 01.09.2014
   if (UseCustomPair && UseSettingsFrom == "GBP52")      {p1=75;p2=30;p3=6; p4=12; p5=2;p6=25;p7=-30; p8=12;p9=10;p10=4; p11=20;p12=-5;p13=0; p14=0;p15=5;p16=14;p17=240;p18=10;p19=0;p20=0;p21=52; p22=70;}
   if (UseCustomPair && UseSettingsFrom == "GBP52T")     {p1=75;p2=21;p3=6; p4=3;  p5=3;p6=33;p7=-25; p8=12;p9=13;p10=7; p11=20;p12=-3;p13=0; p14=0;p15=5;p16=14;p17=160;p18=12;p19=0;p20=0;p21=52; p22=40;}
   if (UseCustomPair && UseSettingsFrom == "GBP30")      {p1=75;p2=39;p3=6; p4=13; p5=2;p6=22;p7=-50; p8=22;p9=11;p10=0; p11=20;p12=-3;p13=0; p14=0;p15=5;p16=14;p17=240;p18=10;p19=0;p20=0;p21=30; p22=90;}   
   if (UseCustomPair && UseSettingsFrom == "GBP30_new")  {p1=75;p2=39;p3=6; p4=13; p5=2;p6=22;p7=-50; p8=22;p9=9; p10=0; p11=20;p12=-3;p13=0; p14=0;p15=5;p16=14;p17=240;p18=10;p19=0;p20=0;p21=30; p22=90;}//last settings from 06.11.2013 
//-3----------------------------------------USDJPY----------------------------------------------------------------------------------------------------------------------------------------------------------   
   if (UseCustomPair && UseSettingsFrom == "USDJPY")     {p1=85;p2=21;p3=5; p4=5;  p5=1;p6=27;p7=-80; p8=12;p9=13;p10=2; p11=14;p12=-1;p13=-2;p14=0;p15=0;p16=14;p17=2000;p18=12;p19=0;p20=0;p21=130;p22=27;}
   if (UseCustomPair && UseSettingsFrom == "USDJPY_new") {p1=85;p2=10;p3=3; p4=-14;p5=1;p6=28;p7=-200;p8=12;p9=10;p10=13;p11=15;p12=-1;p13=-2;p14=1;p15=8;p16=36;p17=190;p18=12;p19=0;p20=0;p21=120;p22=65;}
   if (UseCustomPair && UseSettingsFrom == "USDJPY_new2"){p1=85;p2=18;p3=4; p4=-14;p5=1;p6=9; p7=-130;p8=13;p9=5; p10=15;p11=15;p12=-4;p13=-1;p14=1;p15=7;p16=36;p17=180;p18=18;p19=0;p20=0;p21=120;p22=65;}
//-4----------------------------------------USDCHF----------------------------------------------------------------------------------------------------------------------------------------------------------   
   if (UseCustomPair && UseSettingsFrom == "USDCHF")     {p1=70;p2=25;p3=9; p4=8;  p5=5;p6=22;p7=-40; p8=12;p9=11;p10=0; p11=15;p12=-2;p13=-1;p14=0;p15=3;p16=14;p17=170;p18=14;p19=0;p20=0;p21=120;p22=17;}
   if (UseCustomPair && UseSettingsFrom == "USDCHF_new") {p1=70;p2=38;p3=9; p4=17; p5=3;p6=20;p7=-25; p8=11;p9=11;p10=-12;p11=15;p12=-5;p13=-5;p14=0;p15=2;p16=14;p17=250;p18=14;p19=0;p20=0;p21=120;p22=50;}
//-5----------------------------------------USDCAD----------------------------------------------------------------------------------------------------------------------------------------------------------   
   if (UseCustomPair && UseSettingsFrom == "USDCAD")     {p1=65;p2=15;p3=11;p4=5;  p5=1;p6=6; p7=-30; p8=16;p9=14;p10=2; p11=10;p12=-4;p13=-1;p14=0;p15=4;p16=14;p17=130;p18=12;p19=0;p20=0;p21=150;p22=14;}
//------------------------------------------AUDUSD----------------------------------------------------------------------------------------------------------------------------------------------------------   
   if (UseCustomPair && UseSettingsFrom == "AUDUSD")     {p1=75;p2=33;p3=2; p4=13; p5=2;p6=12;p7=-40; p8=18;p9=8; p10=1; p11=16;p12=-1;p13=-1;p14=0;p15=0;p16=14;p17=140;p18=18;p19=0;p20=0;p21=150;p22=70;}
   if (UseCustomPair && UseSettingsFrom == "AUDUSD_new") {p1=75;p2=24;p3=2; p4=8;  p5=2;p6=18;p7=-100;p8=18;p9=14;p10=5; p11=20;p12=0; p13=-2;p14=0;p15=2;p16=14;p17=140;p18=18;p19=0;p20=0;p21=65; p22=50;}
//-6----------------------------------------NZDUSD----------------------------------------------------------------------------------------------------------------------------------------------------------   
   if (UseCustomPair && UseSettingsFrom == "NZDUSD")     {p1=45;p2=70;p3=2; p4=14; p5=2;p6=5; p7=-40; p8=15;p9=20;p10=10;p11=40;p12=-2;p13=-5;p14=0;p15=0;p16=14;p17=120;p18=18;p19=0;p20=0;p21=130;p22=50;}
//------------------------------------------END-------------------------------------------------------------------------------------------------------------------------------------------------------------
    if (!UseCustomPair ) {
      p1 = iMA_Period;
      p2 = iMA_Filter_Open_b;
      p3 = iWPR_Filter_OpenSignal_b;
      p4 = iMA_Filter_Open_a;
      p5 = iWPR_Filter_OpenSignal_a;
      p6 = iWPR_Filter_Close;
      p7 = MaxLossPoints;
      p8 = iWPR_Period;
      p9 = Price_Filter_Close;
      p10 = SecureProfit_;         
      p11 = SecureProfitTriger_;   
      p12 = iWPR_Filter_Open_unknown; 
      p13 = iWPR_Filter_Close_unknown; 
      p14 = iWPR_Close_Period;
      p15 = FilterATR;
      p16 = iATR_Period;
      p17 = iCCI_OpenFilter;
      p18 = iCCI_Period;
      p19 = Unknown_1;
      p20 = Unknown_2;
      p21 = StopLoss_;             
      p22 = TakeProfit_; 
   }
   while (Session1OpenHour<0) Session1OpenHour+=24;
   while (Session1OpenHour>24) Session1OpenHour-=24;
   if (Session1CloseHour<0) Session1CloseHour=Session1OpenHour-Session1CloseHour;
   while (Session1CloseHour>24) Session1CloseHour-=24;
   if (Session1CloseHour == 0) Session1CloseHour = 24;      
   
   while (Session2OpenHour<0) Session2OpenHour+=24;
   while (Session2OpenHour>24) Session2OpenHour-=24;
   if (Session2CloseHour<0) Session2CloseHour=Session2OpenHour-Session2CloseHour;
   while (Session2CloseHour>24) Session2CloseHour-=24;
   if (Session2CloseHour == 0) Session2CloseHour = 24;      
   
   while (Session3OpenHour<0) Session3OpenHour+=24;
   while (Session3OpenHour>24) Session3OpenHour-=24;
   if (Session3CloseHour<0) Session3CloseHour=Session3OpenHour-Session3CloseHour;
   while (Session3CloseHour>24) Session3CloseHour-=24;
   if (Session3CloseHour == 0) Session3CloseHour = 24;
   
   myPoint = SetPoint(Symbol());
   if (Digits <= 3) Gd_412 = 0.01;
      else Gd_412 = 0.0001;
   if (Digits == 5 || Digits == 3) {
   StopLoss=StopLoss*10;
   TakeProfit=TakeProfit*10;
   SlipPage=SlipPage*10;
   PipDifMin=PipDifMin*10;
   }
   
   if (!IsOptimization()){
   //BOTON CIERRE-------------------------------------------------
   ObjectCreate("CloseBtn",OBJ_LABEL,0,0,0);
   ObjectSet("CloseBtn",OBJPROP_XDISTANCE,Xoff);
   ObjectSet("CloseBtn",OBJPROP_YDISTANCE,Yoff);
   ObjectSetText("CloseBtn","Close all",12, "Arial Bold", Green);
   //-------------------------------------------------------------
   }
   
   return (0);
}

int deinit() {
Print("MaxDD: ",maxdd);
Print("MaxPercDD: ",maxpercentdd);
Comment("");
ObjectDelete("CloseBtn");
return(0);
}
//+------------------------------------------------------------------+
//|               Закрытие позиции по рынку                          |
//+------------------------------------------------------------------+
void CloseOrders(int MagicNbr)
{
      int cnt,total=0,ticket=0,err=0,c=0,slip=7,tries=5;
      bool slct = false;
      bool clb = false;
      bool cls = false;
      if (IsTradeAllowed() == true)
      { 
       total = OrdersTotal();
       for(cnt=total-1;cnt>=0;cnt--)
       {
         slct = OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

          if(OrderMagicNumber()==MagicNbr && OrderSymbol()==Symbol())
          {
             switch(OrderType())
             {
                case OP_BUY      :
                   for(c=0;c<tries;c++)
                   {
                      RefreshRates();
                      waitForContext();
                     clb = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slip,Yellow);
                      if (clb) break;
                      else
                      {
                         err = GetLastError();
                         if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
                         Print("Ошибка Закрытия BUY ордера");
                         Print(ErrorDescription_RUS(err),", ошибка ",err);
                         if(err==0 || err==4 || err==136 || err==137 || err==138) //Busy errors
                         { Sleep(5000); continue; }  
                      }
                   }   
                   break;
               
                case OP_SELL     :
                   for(c=0;c<tries;c++)
                   {
                      RefreshRates();
                      waitForContext();
                     cls = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slip,Yellow);
                      if (cls) break;
                      else
                      {
                         err = GetLastError();
                         if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
                         Print("Ошибка Закрытия SELL ордера");
                         Print(ErrorDescription_RUS(err),", ошибка ",err);
                         if(err==0 || err==4 || err==136 || err==137 || err==138) //Busy errors
                         { Sleep(5000); continue; } 
                      }
                   }   
                   break;
             } // end of switch
          } // end of if
       } // end of for
    }       
}
//+------------------------------------------------------------------+
//|               Открытие позиции по рынку                          |
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy,int op,double ll,double sl=0,double tp=0,int mn=0,string coomment="")
  {
   color    clOpen;
   datetime ot;
   double   pp,pa,pb;
   int      dg,err,it,ticket=0;
   string   lsComm="";
   if(sy=="" || sy=="0") sy=Symbol();
   if(op==OP_BUY) clOpen=Green; else clOpen=Red;
   
   for(it=1;it<=3;it++)
     {
      if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while(!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      dg= (int)MarketInfo(sy, MODE_DIGITS);
      pa=MarketInfo(sy, MODE_ASK);
      pb=MarketInfo(sy, MODE_BID);
               if(pa==0 && pb==0) Alert("Проверьте в Обзоре рынка наличие символа "+sy);

      if(op==OP_BUY) pp=pa; else pp=pb;
      pp=NormalizeDouble(pp, dg);
      ot=TimeCurrent();
      if (AccountFreeMarginCheck(sy,op,ll) <= 0.0 || err == 134/* NOT_ENOUGH_MONEY */) {
      Print("Объём средств на счете не позволяет открыть позицию требуемого объёма (", ll, ")");
      return (-1);
      }
      ticket=OrderSend(sy,op,ll,pp,SlipPage,0,0,coomment,mn,0,clOpen);
      if(ticket>0)
          {
         break;
           } else {
         err=GetLastError();
         if(err==128 || err==142 || err==143)
           {
            Sleep(1000*66.666);
           }
         // Вывод сообщения об ошибке
         Print("Ошибка(",err,") открытия ордера: ",ErrorDescription_RUS(err),", try ",it);
         Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",op,
               " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
         if(pa==0 && pb==0) Alert("Проверьте в Обзоре рынка наличие символа "+sy);
         // Блокировка работы советника
         if(err == 2 || err == 5 || err == 6 || err == 64 || err==65 
          || err == 132 || err == 133 || err == 149)
           {
            break;
           }
         // Длительная пауза
         if(err==4 || err==131 || err==132)
           {
            Sleep(1000*300); break;
           }
         if(err==140 || err==148 || err==4110 || err==4111) break;
         if(err==141) Sleep(1000*100);
         if(err==145) Sleep(1000*17);
         if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) while(IsTradeContextBusy()) Sleep(1000*11);
         if(err!=135) Sleep(1000*7.7);
        }
     }
      Sleep(5000);
      if(SBT(ticket)) ModifyOrder(-1,sl,tp);
   return(ticket);
  }
//+------------------------------------------------------------------+
//|               Возвращает флаг удачного выбора позиции по тикету  |
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ti - наименование тикета                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+


bool SBT(int ti,string sy="",int op=-1,int mn=-1)
  {
   int i,k=OrdersTotal();
   if(sy=="0") sy=Symbol();
   for(i=0;i<k;i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
           {
            if((mn<0 || OrderMagicNumber()==mn) && OrderTicket()==ti) return(True);
           }
        }
     }
   return(False);
  }
  
 //+------------------------------------------------------------------+
//|                              Модификация позиций/ордеров         |
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                
//|    pp - Цена модификация (для отложенных ордеров)  
//|                                                    
//|    sl - Стоплосс - или 0                                     
//|    tp - Тейкпрофит - или 0               
//|    ex - Дата истечения отложенного ордера или 0
//+----------------------------------------------------------------------------+

void ModifyOrder(double pp=-1,double sl=0,double tp=0,datetime ex=0)
  {
   bool   fm;
   double op,pa,pb,os,ot;
   int    dg=(int)MarketInfo(OrderSymbol(),MODE_DIGITS),err,it;
   
   
   if(pp<=0) pp=OrderOpenPrice();
   if(sl<0 ) sl=OrderStopLoss();
   if(tp<0 ) tp=OrderTakeProfit();
   

   pp=NormalizeDouble(pp, dg);
   sl=NormalizeDouble(sl, dg);
   tp=NormalizeDouble(tp, dg);
   op=NormalizeDouble(OrderOpenPrice() , dg);
   os=NormalizeDouble(OrderStopLoss()  , dg);
   ot=NormalizeDouble(OrderTakeProfit(), dg);
   
   if (OrderType()==OP_BUY){
   tp=NormalizeDouble(pp + tp * myPoint, dg);
   sl=NormalizeDouble(pp - sl * myPoint, dg);
   }
   if (OrderType()==OP_SELL){
   tp=NormalizeDouble(pp - tp * myPoint, dg);
   sl=NormalizeDouble(pp + sl * myPoint, dg);
   }

   if(pp!=op || sl!=os || tp!=ot)
     {
      for(it=1; it<=3; it++)
        {
         if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
         while(!IsTradeAllowed()) Sleep(5000);
         RefreshRates();
         fm=OrderModify(OrderTicket(),pp,sl,tp,ex);
         if(fm)
           {
            break;
              } else {
            err=GetLastError();
            pa=MarketInfo(OrderSymbol(), MODE_ASK);
            pb=MarketInfo(OrderSymbol(), MODE_BID);
            Print("Ошибка(",err,") модификации ордера: ",ErrorDescription_RUS(err),", try ",it);
            Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
                   "  op="+(string)OrderType(),"  pp=",pp,"  sl=",sl,"  tp=",tp);
            Sleep(1000*10);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                              Трал позиций/ордеров                |
//+------------------------------------------------------------------+
void Trailing() {

      bool slct = false;
      double Ask1 = GetAsk() + Trailingstop * myPoint;
      double Bid1 = GetBid() - Trailingstop * myPoint;
      if (OrdersTotal() > 0) {
         for (int i = 0; i < OrdersTotal(); i++) {
           slct = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
               if (GetAsk() < OrderOpenPrice() - Trailingstop * myPoint && Ask1 < OrderStopLoss()) {
                  waitForContext();
                 ModifyOrder(-1,Ask1,-1);
                 //OrderModify(OrderTicket(), OrderOpenPrice(), Ask1, OrderTakeProfit(), 0, Green);
                  //return (0);
               }
            }
            if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
               if (GetBid() > OrderOpenPrice() + Trailingstop * myPoint && Bid1 > OrderStopLoss()) {
                  waitForContext();
                 ModifyOrder(-1,Bid1,-1);
                 //OrderModify(OrderTicket(), OrderOpenPrice(), Bid1, OrderTakeProfit(), 0, Green);
                 // return (0);
               }
            }
         }
      }
   }
double GetBid() {
   return (NormalizeDouble(MarketInfo(Symbol(), MODE_BID), Digits));
}

double GetAsk() {
   return (NormalizeDouble(MarketInfo(Symbol(), MODE_ASK), Digits));   
} 


//-----------------------------------------------------СТАРТ----------------------------------------     
int start() {
info();
if (!IsOptimization()){
if (ObjectFind("CloseBtn")<0)
   {
      CloseOrders(Magic);
      ObjectCreate("CloseBtn",OBJ_LABEL,0,0,0);
      ObjectSet("CloseBtn",OBJPROP_XDISTANCE,Xoff);
      ObjectSet("CloseBtn",OBJPROP_YDISTANCE,Yoff);
      ObjectSetText("CloseBtn","Close all",12, "Arial Bold", Green);
   }
}
   if (CloseOnlyOnProfit) p7 = FALSE;
   if (!IsTesting() || !IsOptimization()) { 
   SumaBeneficios = 0;
   if (BanderaRecover) {
      BanderaRecover = false;
      cantidadOrdenesHistorial = RecuperarOrdenes();
      banderaBalance = SumaBeneficios;
      Print("Ordenes en el historial: ", cantidadOrdenesHistorial, " beneficios: ", DoubleToStr(SumaBeneficios, 2));
   }
   }
      
   GMT = TimeCurrent() - (GMTOffset * 3600); 
   time = (int)GMT;    


if (TickByTickTrailing){
   //&&&&& TRAILING &&&&&&&&&&&&&&&&&&&&&&&&&      
   if(Trailingstop>0){Trailing();}
   //&&&&& TRAILING &&&&&&&&&&&&&&&&&&&&&&&&&    
  }
   
double OpenProfit = AccountEquity()-AccountBalance();
   
   if (OpenProfit<maxdd){ maxdd = OpenProfit;}
   if ((OpenProfit/AccountBalance()*100)<maxpercentdd)
   { maxpercentdd = (OpenProfit/AccountBalance()*100);}

  
   int ticket1;
   if (Time[0] == bandTiempo) return (0);
   bandTiempo = (int)Time[0];
   double puntos = Point;
   bool Trading=true;
   if (TimeDay(TimeCurrent())==Day1 && DayFilter) Trading=false;
   if (TimeDay(TimeCurrent())==Day2 && DayFilter) Trading=false;
   
   if (!TickByTickTrailing){
   //&&&&& TRAILING &&&&&&&&&&&&&&&&&&&&&&&&&      
   if(Trailingstop>0){Trailing();}
   //&&&&& TRAILING &&&&&&&&&&&&&&&&&&&&&&&&&    
  }
   

   
   if (MM) Lots=MMLots(Risk, AccountFreeMargin());
   else Lots = Lot;
   if (LotCalcOverBal && MM) Lots=MMLots(Risk, AccountBalance());
   else Lots = Lot;
   if (RecoveryMode){Lots=RecoveryLot(Lots);Lots2=Lots;}


//##############################################################################################
//##########CONTROLO LA PERDIDA MAXIMA Y EL PORCENTAJE DE PERDIDA###############################

if (!IsOptimization()){
   if (showInfo){
   ObjectCreate( "B/E", OBJ_LABEL,0,0,0,0,0,0);
   ObjectSet(    "B/E", OBJPROP_CORNER,3);
   ObjectSet(    "B/E", OBJPROP_XDISTANCE, 3);
   ObjectSet(    "B/E", OBJPROP_YDISTANCE, 30);
   ObjectSetText("B/E", "B/E: $"+DoubleToStr(NormalizeDouble(AccountBalance(),2),1)+"/"+DoubleToStr(NormalizeDouble(AccountEquity(),2),1),24,"Impact",ColorTXT);
   
   ObjectCreate( "MaxDD", OBJ_LABEL,0,0,0,0,0,0);
   ObjectSet(    "MaxDD", OBJPROP_CORNER,3);
   ObjectSet(    "MaxDD", OBJPROP_XDISTANCE, 3);
   ObjectSet(    "MaxDD", OBJPROP_YDISTANCE, 2);
   ObjectSetText("MaxDD", "RDD Mбx: $"+DoubleToStr(NormalizeDouble(maxdd,2),1)+"/"+DoubleToStr(NormalizeDouble(maxpercentdd,2),1)+"%",24,"Impact",ColorTXT);
   }
   
   if (showInfo && Lots<Lots2 && RecoveryMode){
   ObjectCreate( "Recover", OBJ_LABEL,0,0,0,0,0,0);
   ObjectSet(    "Recover", OBJPROP_CORNER,1);
   ObjectSet(    "Recover", OBJPROP_XDISTANCE, 3);
   ObjectSet(    "Recover", OBJPROP_YDISTANCE, 2);
   ObjectSetText("Recover", "Recovery Mode Activated",24,"Impact",ColorTXT);
   }
   if (showInfo && (Lots>=Lots2 || !RecoveryMode) && ObjectFind("Recover")!=-1) ObjectDelete("Recover");
   
   
   if (HourFilter && showInfo){
   if (((IsTradeTime(1)!=1 || IsTradeTime(2)!=1 || IsTradeTime(3)!=1))) {
   
   ObjectCreate( "Notrade", OBJ_LABEL,0,0,0,0,0,0);
   ObjectSet(    "Notrade", OBJPROP_CORNER,0);
   ObjectSet(    "Notrade", OBJPROP_XDISTANCE, 15);
   ObjectSet(    "Notrade", OBJPROP_YDISTANCE, 2);
   ObjectSetText("Notrade", "No trading session, its "+(string)TimeHour(TimeCurrent())+":"+(string)TimeMinute(TimeCurrent()),24,"Impact",ColorTXT);
   }
   if (((IsTradeTime(1) || IsTradeTime(2) || IsTradeTime(3)))) ObjectDelete("Notrade");  
   //}
 }
 }
//------------------------------------------------------------------------------------------------------
//======================================================================================================
      
   HideTestIndicators(TRUE);
   double iclose_100 = iClose(NULL, PERIOD_M15, 1);
   double ima_108 = iMA(NULL, PERIOD_M15, p1, 0, MODE_SMMA, PRICE_CLOSE, 1);
   double iwpr_116 = iWPR(NULL, PERIOD_M15, p8, 1);
   double iatr_124 = iATR(NULL, PERIOD_M15, p16, 1);
   double icci_132 = iCCI(NULL, PERIOD_M15, p18, PRICE_TYPICAL, 1);
   HideTestIndicators(FALSE);
   int OpenOrders = 0;
   double OrderOpenPrice1 = 0;
   for (int i = 0; i < OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderMagicNumber() == Magic) {
            if (StringFind(OrderSymbol(), Symbol(), 0) != -1) {
               OpenOrders++;
               OrderOpenPrice1 = OrderOpenPrice();
               if (OrderType() == OP_BUY && (f0_10(OrderOpenPrice(), iwpr_116, iclose_100, iOpen(NULL, PERIOD_M1,
                     1), iClose(NULL, PERIOD_M1, 1)) && TimeCurrent() - OrderOpenTime() > 180)) {
                  waitForContext();
                  CloseOrders(Magic);
                  //OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), SlipPage, Violet);
                  return (0);
               }
               if (OrderType() == OP_SELL && (f0_11(OrderOpenPrice(), iwpr_116, iclose_100, iOpen(NULL, PERIOD_M1,
                  1), iClose(NULL, PERIOD_M1, 1)) && TimeCurrent() - OrderOpenTime() > 180)) {
                  waitForContext();
                  CloseOrders(Magic);
                  //OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), SlipPage, Violet);
                  return (0);
               }
            }
         }
      }
   }
   if (OpenOrders < MaxOrders && TimeDay(TimeCurrent())<StopDayMonth && TimeDay(TimeCurrent())>StartDayMonth && (!HourFilter || IsTradeTime(1) || IsTradeTime(2) || IsTradeTime(3))) {
      
if (Martingale){for (int k=1;k<OpenOrders;k++){Lots=NormalizeLots(Lots*MartingaleMulti);}}
      
      ticket1 = -10;
      if (f0_9(iclose_100, ima_108, iwpr_116, icci_132) &&
         (OrderOpenPrice1 == 0.0 || Ask - OrderOpenPrice1 < (-PipDifMin) * myPoint) && Trading) {
         ticket1 = OpenPosition(Symbol(), OP_BUY, Lots,  StopLoss,  TakeProfit, Magic, "BUY " + UseSettingsFrom);
         
      }
      if (f0_4(iclose_100, ima_108, iwpr_116, icci_132) &&
         (OrderOpenPrice1 == 0.0 || Bid - OrderOpenPrice1 > PipDifMin * myPoint) && Trading) {
         ticket1 = OpenPosition(Symbol(), OP_SELL, Lots, StopLoss, TakeProfit, Magic, "SELL " + UseSettingsFrom);
         
      }
   }
   
   return (0);
}

int IsTradeTime(int Session) {
   if (Session == 1 && Session1==1){
   if ((Session1OpenHour < Session1CloseHour && TimeHour(time) < Session1OpenHour) || (TimeHour(time) >= Session1CloseHour)) return (0);
   if (Session1OpenHour > Session1CloseHour && (TimeHour(time) < Session1OpenHour && TimeHour(time) >= Session1CloseHour)) return (0);
   if (Session1CloseHour == 0) Session1CloseHour = 24;
   if (TimeHour(time) == Session1CloseHour - 1 && TimeMinute(time) >= 55) return (0);
   return (1);
   }
   if (Session == 2 && Session2==1){
   if ((Session2OpenHour < Session2CloseHour && TimeHour(time) < Session2OpenHour) || (TimeHour(time) >= Session2CloseHour)) return (0);
   if (Session2OpenHour > Session2CloseHour && (TimeHour(time) < Session2OpenHour && TimeHour(time) >= Session2CloseHour)) return (0);
   if (Session2CloseHour == 0) Session2CloseHour = 24;
   if (TimeHour(time) == Session2CloseHour - 1 && TimeMinute(time) >= 55) return (0);
   return (1);
   }
   if (Session == 3 && Session3==1){
   if ((Session3OpenHour < Session3CloseHour && TimeHour(time) < Session3OpenHour) || (TimeHour(time) >= Session3CloseHour)) return (0);
   if (Session3OpenHour > Session3CloseHour && (TimeHour(time) < Session3OpenHour && TimeHour(time) >= Session3CloseHour)) return (0);
   if (Session3CloseHour == 0) Session3CloseHour = 24;
   if (TimeHour(time) == Session3CloseHour - 1 && TimeMinute(time) >= 55) return (0);
   return (1);
   }
   return (0);
   
}


double SetPoint(string mySymbol)
{
   double mPoint = 0;
   double myDigits;
   
   myDigits = MarketInfo (mySymbol, MODE_DIGITS);
   if (myDigits == 2) mPoint = 0.01;
   if (myDigits == 3) mPoint = 0.001;
   if (myDigits == 4) mPoint = 0.0001;
   if (myDigits == 5) mPoint = 0.00001;
   
   return(mPoint);
}

int RecuperarOrdenes() {
   int contador = 0;
   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber() != Magic || OrderSymbol()!=Symbol()) continue;
         ContarBalance((int)OrderProfit());
         contador++;
      }
   }
   return (contador);
}

void ContarBalance(int aux1) {
   SumaBeneficios += aux1;
}

double RecoveryLot(double PreLot) {
   if (IsTesting() || IsOptimization()) SumaBeneficios = (int)AccountBalance();
   if (!IsOptimization() || !IsTesting()) RecuperarOrdenes();
   
   if (banderaBalance < SumaBeneficios) banderaBalance = SumaBeneficios;
   if (banderaBalance > SumaBeneficios) return (NormalizeLots(RecoveryModeMulti * PreLot));
   return (PreLot);
}

double NormalizeLots(double PreLot) {
   double LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   double MinLot = MarketInfo(Symbol(), MODE_MINLOT);
   double MaxLot = MarketInfo(Symbol(), MODE_MAXLOT);
   double valor = MathCeil(PreLot / LotStep) * LotStep;
   if (valor < MinLot) {
      valor = MinLot;
   }
   if (valor > MaxLot) {
      valor = MaxLot;
   }
   return (valor);
}
double MMLots(double risk, double margin) {
   return(NormalizeLots(margin / 100000 * risk));
}

int waitForContext() {
int contador;
   for (contador = 0; IsTradeContextBusy() && contador < 20; contador++) Sleep(15);
   if (contador >= 20) Print("El contexto de trading estuvo ocupado por mas de ", DoubleToStr(15 * contador / 1000, 2), " segundos");
   else
      if (contador > 0) Print("El contexto de trading estuvo ocupado por ", DoubleToStr(15 * contador / 1000, 2), " segundos");
   return (contador);
}


int f0_10(double Ad_0, double Ad_8, double Ad_16, double Ad_24, double Ad_32) {
   bool Li_40 = FALSE;
//   Li_40 = CheckCloseLong(Gi_352, Ad_0, Ad_8, Ad_16, Ad_24, Ad_32, p7, Bid, Ask, Gd_412);
   if ((-p6 < Ad_8 && p13 * Gd_412 + Ad_16 < Bid && p7 * Gd_412 < Bid - Ad_0)
     || (Bid - Ad_0 > p9 * Gd_412 && p14 * Gd_412 + Ad_32 < Ad_24)) Li_40 = TRUE;
   return (Li_40);
}

int f0_11(double Ad_0, double Ad_8, double Ad_16, double Ad_24, double Ad_32) {
   bool Li_40 = FALSE;
//   Li_40 = CheckCloseShort(Gi_352, Ad_0, Ad_8, Ad_16, Ad_24, Ad_32, p7, Bid, Ask, Gd_412);
   if ((p6 - 100 > Ad_8 && (Ad_16 - p13 * Gd_412) > Bid && p7 * Gd_412 < Ad_0 - Ask)
     || (Ad_0 - Ask > p9 * Gd_412 && Ad_32 - p14 * Gd_412 > Ad_24)) Li_40 = TRUE;
   return (Li_40);
}

int f0_9(double Ad_0, double Ad_8, double Ad_16, double Ad_24) {
   bool Li_32 = FALSE;
//   Li_32 = CheckOpenLong(Gi_352, Ad_0, Ad_8, Ad_16, Ad_24, p17, Bid, Ask, Gd_412);
   if (p2 * Gd_412 + Ad_8 >= Ad_0 || ((p3 - 100) <= Ad_16 && -p17 <= Ad_24) || Ad_0 - p12 * Gd_412 <= Bid) {
   if ( p4 * Gd_412 + Ad_8 < Ad_0 && (p5 - 100) > Ad_16 && Ad_0 - p12 * Gd_412 > Bid )Li_32 = TRUE;}
   else Li_32 = TRUE;
   return (Li_32);
}

int f0_4(double Ad_0, double Ad_8, double Ad_16, double Ad_24) {
   bool Li_32 = FALSE;
//   Li_32 = CheckOpenShort(Gi_352, Ad_0, Ad_8, Ad_16, Ad_24, p17, Bid, Ask, Gd_412);
   if (Ad_8 - p2 * Gd_412 <= Ad_0 ||( -p3 >= Ad_16 && Ad_24 <= p17) || p12 * Gd_412 + Ad_0 >= Bid) {
   if ( Ad_8 - p4 * Gd_412 > Ad_0 && -p5 < Ad_16 && p12 * Gd_412 + Ad_0 < Bid )Li_32 = TRUE;}
   else Li_32 = TRUE; 
   return (Li_32);
}

void info() {
   Comment("Account Server:", AccountServer(), 
      "\n", "Magic: " + DoubleToStr (Magic,0),
      "\n", "Account Leverage: 1:", AccountLeverage(),
      "\n", "Risk : " + DoubleToStr(Risk, 1),
      "\n", "Lots:  " + DoubleToStr (Lots, 2), 
      "\n", "Symbol: ", Symbol(), 
      "\n", "Price:  ", NormalizeDouble(Bid, 4), 
      "\n", "Date: ", Month(), "-", Day(), "-", Year(), " Server Time: ", Hour(), ":", Minute(), ":", Seconds(), 
   "\n");
}

