exp_ZZSemafor





//+------------------------------------------------------------------+
//|                                               exp_ZZ_Semafor.mq4 |
//|                        Copyright © 2009, Serg73, TradeProgrammer |
//|                        http://tradeprogrammer.narod.ru/index.htm |
//|                                 mailto:TradeProgrammer@yandex.ru |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2009, Serg73, TradeProgrammer"
#property link      "www.http://tradeprogrammer.narod.ru/index.htm"
#property link      "mailto:TradeProgrammer@yandex.ru"


#define IND "ZZ_i"

extern   int         TimeFrame               =  0;       // Ðàáî÷èé òàéìôðåéì. 0 - òàéìôðåéì ãðàôèêà èëè âûáðàííûé â òåñòåðå, èëè çíà÷åíèå òàéìôðåéìà: 1,5,15,30,60,240
extern   string      e0                      =  "=== Order ===";
extern   double      Lots                    =  0.1;     // Êîëè÷åñòâî ëîòîâ
extern   int         LotsMethod              =  3;       // 1 - ïåðåìåííàÿ Lots, 2 - äîáàâëåíèå, 3 - óìíîæåíèå
extern   double      LotsAdd                 =  0.1;     // Äîáàâêà ïðè LotsMethod=3
extern   double      LotsK                   =  2;       // Êîýôôèöèåíò óìíîæåíèÿ ïðè LotsMethod=3
extern   int         Slippage                =  3;       // Äîïóñòèìîå ïðîñêàëüçûâàíèå
extern   int         StopLoss                =  0;     // Ñòîïëîññ
extern   int         TakeProfit              =  0;      // Òåéêïðîôèò
extern   int         Magic_N                 =  777;     // Ìàãèê. åñëè íåñêîëüêî ýêñïåðòîâ ðàáîòàåò íà îäíîì ñèìâîëå ó íèõ äîëæåí áûòü ðàçíûé ìàãèê. 
                                                         // ÂÍÈÌÀÍÈÅ!!! Åñëè âêëþ÷åíî ssUse, òî çàäåéòñâîâàí åùå îäèí ìàãèê íà 1 áîëüøå ÷åì Magic_N 
extern   string      e1                      = "=== Orders Management ===";
extern   int         MaxCount                = -1;       // Ììàêñèìàëüíî äîïóñòèìîå êîëè÷åñòâî îòêðûòûõ îðäåðîâ
extern   int         MaxBuyCount             = -1;       // Ìàêñèìàëüíî äîïóñòèìîå êîëè÷åñòâî îòêðûòûõ îðäåðîâ áàé, -1 - íå îãðàíè÷åíî 
extern   int         MaxSellCount            = -1;       // Ìàêñèìàëüíî äîïóñòèìîå êîëè÷åñòâî îòêðûòûõ îðäåðîâ ñåëë, -1 - íå îãðàíè÷åíî  
extern   bool        CountSSOrders           = false;    // Ïîäñ÷èòûâàòü ïåðåâîðîòíûå îðäåðà      
extern   bool        AddIfLevel              = true;     // Äîáàâëÿòü îðäåð åñëè îí îòêðûâàåòñÿ ïî ëó÷øå öåíå ÷åì ïðåäûäóùèé íà AddLevel ïóíêòîâ
extern   int         AddLevel                = 55;       // Ñì. AddIfLevel.
extern   bool        CloseOnRev              = false;    // Çàêðûâàòü îðäåðà ïåðåä îòêðûòèåì ïðîòèâîïîëîæíîãî îðäåðà
extern   bool        CloseOnRevSSOrders      = false;    // Çàêðûâàòü ïåðâîðòíûå îðäåðà.
extern   bool        CloseSignal            =  false;    // Çàêðûâàòü ïî îòäåëüíîìó íàáîðó èíäèêàòîðîâ
extern   bool        CloseSignalSSOrders    =  false;    // Çàêðûâàòü ïåðâîðòíûå îðäåðà ïî îòäåëüíîìó íàáîðó èíäèêàòîðîâ.
extern   string      e2                      =  "=== Trailing ===";
extern   bool        TrailingStop_Use        =  false;    // Âêëþ÷åíèå ôóíêöèè òðåéëèíãà
extern   bool        TrailingStop_OnceOnBar  =  true;     // Òðåéëèíã ñðàáàòûâàåò íå ÷àùå îäíîãî ðàçà íà áàð. Èñïîëüçîâíèå òàêîãî ðåæèìà ïîçâîëÿåò ïîëó÷èòü ñîîòâåòñâèå ðåàëó è òåñòèðîâàíèþ ïî öåíàì îòêðûòèÿ, ÷òî çíà÷èòåëüíî óñêîðÿåò îïòèìèçàöèþ
extern   int         TrailingStopStart       =  35;       // Ïðèáûëü îðäåðà ïðè êîòîðîé íà÷èíàåò ðàáîòàòü òðåéëèíã
extern   int         TrailingStop            =  15;       // Óðîâåíü òðåéëèíãà 
extern   string      e3                      =  "=== BreakEven ===";
extern   bool        BreakEven_Use           =  false;    // Âêëþ÷åíèå ôóíêöèè áåçóáûòêà
extern   bool        BreakEven_OnceOnBar     =  true;     // Áåçóáûòîê ñðàáàòûâàåò ðàç íà áàð
extern   int         BreakEvenStart          =  30;       // Ïðèáûëü îðäåðà ïðè êîòîðîé ñòîïëîññ ïåðåíîñèòñÿ íà óðîâåíü BreakEvenLevel
extern   int         BreakEvenLevel          =  30;       // Óðîâåíü íà êîòîðûé óñòàíàâëèâàåòñÿ ñòîïëîññ îò öåíû ïðè êîòîðîé ïðèáûëü îðäåðà áûëà ðàâíà BreakEvenStart. Ñîõðàíÿåòñÿ BreakEvenStart-BreakEvenLevel ïóíêòîâ ïðèáûëè
extern   string      e4                      =  "=== Indicator (Open) ===";
extern   bool        ZZO_1_ON                 =  true;     // Âêëþ÷åíèå ïðîâåðêè çèãçàãà 1  
extern   bool        ZZO_2_ON                 =  false;    // ---//---//---  
extern   bool        ZZO_3_ON                 =  false;
extern   bool        ZZO_4_ON                 =  false;
extern   bool        ZZO_5_ON                 =  false;
extern   int         ZZO_1_Period             =  25;
extern   int         ZZO_1_Reverse            =  0;
extern   int         ZZO_2_Period             =  50;
extern   int         ZZO_2_Reverse            =  0;
extern   int         ZZO_3_Period             =  100;
extern   int         ZZO_3_Reverse            =  0;
extern   int         ZZO_4_Period             =  200;
extern   int         ZZO_4_Reverse            =  0;
extern   int         ZZO_5_Period             =  400;
extern   int         ZZO_5_Reverse            =  0;
extern   string      e42                      =  "=== Confirming (Open) ===";
extern   int         Indicator                =  1;      // Ïîäòâåðæäàþùèé èíäèêàòîð: 0 - íå èñïîëüçóåòñÿ, 1-ñòîõàñòèê ãëàâíàÿ/ñèãíàëüíàÿ, 2-èøèìîêó, 3-ñòîõàòèê ãëàâíàÿ/óðîâåíü
extern   string      e421                     =  "---- Stochastic ----";
extern   int         StKPeriod                =  5;
extern   int         StDPeriod                =  3;
extern   int         StSPeriod                =  3;
extern   int         StMethod                 =  0;      
extern   int         StPrice                  =  0;  
extern   int         StLevel                  =  80; // âåðõíèé óðîâåíü ñòîõàñòèêà, íèæíèé ðàññ÷èòûâàåòñÿ 100-StLevel
extern   string      e422                     =  "---- Ichimoku ----";
extern   int         TenkanPeriod             =  9;
extern   int         KijunPeriod              =  25;
extern   int         SenkouPeriod             =  52;
extern   string      e5                       =  "=== Indicator (Close) ===";
extern   bool        ZZC_1_ON                 =  true;     // Âêëþ÷åíèå ïðîâåðêè çèãçàãà 1  
extern   bool        ZZC_2_ON                 =  false;    // ---//---//---  
extern   bool        ZZC_3_ON                 =  false;
extern   bool        ZZC_4_ON                 =  false;
extern   bool        ZZC_5_ON                 =  false;
extern   int         ZZC_1_Period             =  25;
extern   int         ZZC_1_Reverse            =  0;
extern   int         ZZC_2_Period             =  50;
extern   int         ZZC_2_Reverse            =  0;
extern   int         ZZC_3_Period             =  100;
extern   int         ZZC_3_Reverse            =  0;
extern   int         ZZC_4_Period             =  200;
extern   int         ZZC_4_Reverse            =  0;
extern   int         ZZC_5_Period             =  400;
extern   int         ZZC_5_Reverse            =  0;
extern   string      e6                      =  "=== StopLoss StopOrder ===";
extern   bool        ssUse                   =  false;   // Óñòíîâêà ïðîòèâîïëîæíûõ îòëîæåííûõ ñòîïîðäåðîâ îðäåðîâ
extern   int         ssLevel                 =  50;      // Óðîâåíü óñòàíîâêè îòëîæåííîãî îò öåíû îòêðûòèÿ ðûíî÷íîãî. Èñïîëüçóåòñÿ òîëüêî åñëè îðäåðó íå óñòàíîâëåí ñòîïëîññ, åñëè ñòîïëîññ óñòàíîâëåí òî îòëîæåíûé ñòàâèòñÿ íà óðîâåíü ñòîïëîññ.
         int         ssMagic_N;
extern   int         ssStopLoss              =  50;      // Ñòîïëîññ ýòèõ îðäåðîâ   
extern   int         ssTakeProfit            =  50;      // Òåéêïðîôèò ýòèõ îðäåðîâ   
extern   bool        ssModify                =  true;    // Ïåðåìåùàòü îðäåðà çà ñòîïëîññ (åñëè òðåéëèíã âêëþ÷åí èëè áåçóáûòîê)


double gLots;               
int LastBuyTime,LastSellTime;
double bv,sv;
int LastTime;

bool ZZOON;
bool ZZCON;

double gLastBuyPrice;
double gLastBuyLots;
double gLastSellPrice;
double gLastSellLots;

int Whait;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init(){

   ssMagic_N=Magic_N+1;
   
   ZZOON=(ZZO_1_ON || ZZO_2_ON || ZZO_3_ON || ZZO_4_ON || ZZO_5_ON);
   ZZCON=(ZZC_1_ON || ZZC_2_ON || ZZC_3_ON || ZZC_4_ON || ZZC_5_ON);
   
   LastTime=0;


   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start(){

   if(LastTime==0){
      LastTime=iTime(NULL,TimeFrame,0);
      return(0);
   }
            
   static bool ft=false;
   bool trouble=false;   
   
      if(!ft){
            for(int i=0;i<OrdersTotal();i++){
               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
                  if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_N){
                     if(OrderType()==OP_BUY)LastBuyTime=MathMax(LastBuyTime,OrderOpenTime());
                     if(OrderType()==OP_SELL)LastSellTime=MathMax(LastSellTime,OrderOpenTime());                    
                  }
               }
               else{
                  return(0);
               }
            }   
    
            for(i=0;i<HistoryTotal();i++){
               if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
                  if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_N){
                     if(OrderType()==OP_BUY)LastBuyTime=MathMax(LastBuyTime,OrderOpenTime());
                     if(OrderType()==OP_SELL)LastSellTime=MathMax(LastSellTime,OrderOpenTime());                    
                  }
               }
               else{
                  return(0);
               }
            }  
            
            if(LastBuyTime>LastSellTime)LastSellTime=0; 
            if(LastSellTime>LastBuyTime)LastBuyTime=0;
            
            if(TimeFrame==0)TimeFrame=Period();

            LastBuyTime=TimeFrame*60*MathFloor(LastBuyTime/(TimeFrame*60));
            LastSellTime=TimeFrame*60*MathFloor(LastSellTime/(TimeFrame*60));
            
         ft=true;
      }

   
      if(LastTime!=iTime(NULL,TimeFrame,0)){

            bool ZZO_1_BUY=true;
            bool ZZO_1_SELL=true;
               if(ZZO_1_ON){
                  ZZO_1_BUY=(0!=iCustom(NULL,TimeFrame,IND,ZZO_1_Period,ZZO_1_Reverse,2,1));
                  ZZO_1_SELL=(0!=iCustom(NULL,TimeFrame,IND,ZZO_1_Period,ZZO_1_Reverse,1,1));
               }  
               
            bool ZZO_2_BUY=true;
            bool ZZO_2_SELL=true;
               if(ZZO_2_ON){
                  ZZO_2_BUY=(0!=iCustom(NULL,TimeFrame,IND,ZZO_2_Period,ZZO_2_Reverse,2,1));
                  ZZO_2_SELL=(0!=iCustom(NULL,TimeFrame,IND,ZZO_2_Period,ZZO_2_Reverse,1,1));
               }
               
            bool ZZO_3_BUY=true;
            bool ZZO_3_SELL=true;
               if(ZZO_3_ON){
                  ZZO_3_BUY=(0!=iCustom(NULL,TimeFrame,IND,ZZO_3_Period,ZZO_3_Reverse,2,1));
                  ZZO_3_SELL=(0!=iCustom(NULL,TimeFrame,IND,ZZO_3_Period,ZZO_3_Reverse,1,1));
               }               
               
            bool ZZO_4_BUY=true;
            bool ZZO_4_SELL=true;
               if(ZZO_4_ON){
                  ZZO_4_BUY=(0!=iCustom(NULL,TimeFrame,IND,ZZO_4_Period,ZZO_4_Reverse,2,1));
                  ZZO_4_SELL=(0!=iCustom(NULL,TimeFrame,IND,ZZO_4_Period,ZZO_4_Reverse,1,1));
               }               
               
            bool ZZO_5_BUY=true;
            bool ZZO_5_SELL=true;
               if(ZZO_5_ON){
                  ZZO_5_BUY=(0!=iCustom(NULL,TimeFrame,IND,ZZO_5_Period,ZZO_5_Reverse,2,1));
                  ZZO_5_SELL=(0!=iCustom(NULL,TimeFrame,IND,ZZO_5_Period,ZZO_5_Reverse,1,1));
               }               
               
         bool PreBuySignal=false;
         bool PreSellSignal=false;
         
         
         
            if(ZZO_1_BUY){
               if(ZZO_2_BUY){            
                  if(ZZO_3_BUY){            
                     if(ZZO_4_BUY){ 
                        if(ZZO_5_BUY){   
                           if(ZZOON){                     
                              PreBuySignal=true;
                           }
                        }
                     }
                  }
               }
            }
            
            if(ZZO_1_SELL){
               if(ZZO_2_SELL){            
                  if(ZZO_3_SELL){            
                     if(ZZO_4_SELL){            
                        if(ZZO_5_SELL){            
                           if(ZZOON){
                              PreSellSignal=true;
                           }
                        }
                     }
                  }
               }
            }
            
         bool BuySignal=false;
         bool SellSignal=false;
         
            switch(Indicator){
               case 0:
                  BuySignal=PreBuySignal;
                  SellSignal=PreSellSignal;
               break;
               case 1:
                     if(PreBuySignal){
                        Whait=1;
                     }
                     if(PreSellSignal){
                        Whait=-1;
                     }
                  double st_m_1=iStochastic(NULL,TimeFrame,StKPeriod,StDPeriod,StSPeriod,StMethod,StPrice,MODE_MAIN,1);
                  double st_s_1=iStochastic(NULL,TimeFrame,StKPeriod,StDPeriod,StSPeriod,StMethod,StPrice,MODE_SIGNAL,1);
                  double st_m_2=iStochastic(NULL,TimeFrame,StKPeriod,StDPeriod,StSPeriod,StMethod,StPrice,MODE_MAIN,2);
                  double st_s_2=iStochastic(NULL,TimeFrame,StKPeriod,StDPeriod,StSPeriod,StMethod,StPrice,MODE_SIGNAL,2);
                  double st_m_3=iStochastic(NULL,TimeFrame,StKPeriod,StDPeriod,StSPeriod,StMethod,StPrice,MODE_MAIN,3);
                  double st_s_3=iStochastic(NULL,TimeFrame,StKPeriod,StDPeriod,StSPeriod,StMethod,StPrice,MODE_SIGNAL,3);
                     switch(Whait){
                        case 1:
                           if(st_m_1>st_s_1){
                              if(st_m_2<=st_s_2){
                                 BuySignal=true;
                              }
                           }
                           if(st_m_2>st_s_2){
                              if(st_m_3<=st_s_3){
                                 Whait=0;
                              }
                           }                           
                        break;
                        case -1:
                           if(st_m_1<st_s_1){
                              if(st_m_2>=st_s_2){
                                 SellSignal=true;
                              }
                           }
                           if(st_m_2<st_s_2){
                              if(st_m_3>=st_s_3){
                                 Whait=0;
                              }
                           } 
                        break;
                     }
               break;
               case 2:
                     if(PreBuySignal){
                        Whait=1;
                     }
                     if(PreSellSignal){
                        Whait=-1;
                     }               
                  double Tenkan1=iIchimoku(NULL,0,TenkanPeriod,KijunPeriod,SenkouPeriod,MODE_TENKANSEN,1); // Red, fast
                  double Kijun1=iIchimoku(NULL,0,TenkanPeriod,KijunPeriod,SenkouPeriod,MODE_KIJUNSEN,1); // Blue, slow
                  double Tenkan2=iIchimoku(NULL,0,TenkanPeriod,KijunPeriod,SenkouPeriod,MODE_TENKANSEN,2); // Red, fast
                  double Kijun2=iIchimoku(NULL,0,TenkanPeriod,KijunPeriod,SenkouPeriod,MODE_KIJUNSEN,2); // Blue, slow
                  double Tenkan3=iIchimoku(NULL,0,TenkanPeriod,KijunPeriod,SenkouPeriod,MODE_TENKANSEN,3); // Red, fast
                  double Kijun3=iIchimoku(NULL,0,TenkanPeriod,KijunPeriod,SenkouPeriod,MODE_KIJUNSEN,3); // Blue, slow
                     switch(Whait){
                        case 1:
                           if(Tenkan1>Kijun1){
                              if(Tenkan2<=Kijun2){
                                 BuySignal=true;
                              }
                           }
                           if(Tenkan2>Kijun2){
                              if(Tenkan3<=Kijun3){
                                 Whait=0;
                              }
                           }                           
                        break;
                        case -1:
                           if(Tenkan1<Kijun1){
                              if(Tenkan2>=Kijun2){
                                 SellSignal=true;
                              }
                           }
                           if(Tenkan2<Kijun2){
                              if(Tenkan3>=Kijun3){
                                 Whait=0;
                              }
                           } 
                        break;
                     }
               break;
               case 3:
                     if(PreBuySignal){
                        Whait=1;
                     }
                     if(PreSellSignal){
                        Whait=-1;
                     }
                  st_m_1=iStochastic(NULL,TimeFrame,StKPeriod,StDPeriod,StSPeriod,StMethod,StPrice,MODE_MAIN,1);
                  st_m_2=iStochastic(NULL,TimeFrame,StKPeriod,StDPeriod,StSPeriod,StMethod,StPrice,MODE_MAIN,2);
                  st_m_3=iStochastic(NULL,TimeFrame,StKPeriod,StDPeriod,StSPeriod,StMethod,StPrice,MODE_MAIN,3);
                     switch(Whait){
                        case 1:
                           if(st_m_1>100-StLevel){
                              if(st_m_2<=100-StLevel){
                                 BuySignal=true;
                              }
                           }
                           if(st_m_2>100-StLevel){
                              if(st_m_3<=100-StLevel){
                                 Whait=0;
                              }
                           }                           
                        break;
                        case -1:
                           if(st_m_1<StLevel){
                              if(st_m_2>=StLevel){
                                 SellSignal=true;
                              }
                           }
                           if(st_m_2<StLevel){
                              if(st_m_3>=StLevel){
                                 Whait=0;
                              }
                           } 
                        break;
                     }  
            }



            if(CloseSignal || CloseSignalSSOrders){
               bool ZZC_1_BUY=true;
               bool ZZC_1_SELL=true;
                  if(ZZC_1_ON){
                     ZZC_1_BUY=(0!=iCustom(NULL,TimeFrame,IND,ZZC_1_Period,ZZC_1_Reverse,2,1));
                     ZZC_1_SELL=(0!=iCustom(NULL,TimeFrame,IND,ZZC_1_Period,ZZC_1_Reverse,1,1));
                  }  
               
               bool ZZC_2_BUY=true;
               bool ZZC_2_SELL=true;
                  if(ZZC_2_ON){
                     ZZC_2_BUY=(0!=iCustom(NULL,TimeFrame,IND,ZZC_2_Period,ZZC_2_Reverse,2,1));
                     ZZC_2_SELL=(0!=iCustom(NULL,TimeFrame,IND,ZZC_2_Period,ZZC_2_Reverse,1,1));
                  }
               
               bool ZZC_3_BUY=true;
               bool ZZC_3_SELL=true;
                  if(ZZC_3_ON){
                     ZZC_3_BUY=(0!=iCustom(NULL,TimeFrame,IND,ZZC_3_Period,ZZC_3_Reverse,2,1));
                     ZZC_3_SELL=(0!=iCustom(NULL,TimeFrame,IND,ZZC_3_Period,ZZC_3_Reverse,1,1));
                  }               
               
               bool ZZC_4_BUY=true;
               bool ZZC_4_SELL=true;
                  if(ZZC_4_ON){
                     ZZC_4_BUY=(0!=iCustom(NULL,TimeFrame,IND,ZZC_4_Period,ZZC_4_Reverse,2,1));
                     ZZC_4_SELL=(0!=iCustom(NULL,TimeFrame,IND,ZZC_4_Period,ZZC_4_Reverse,1,1));
                  }               
               
               bool ZZC_5_BUY=true;
               bool ZZC_5_SELL=true;
                  if(ZZC_5_ON){
                     ZZC_5_BUY=(0!=iCustom(NULL,TimeFrame,IND,ZZC_5_Period,ZZC_5_Reverse,2,1));
                     ZZC_5_SELL=(0!=iCustom(NULL,TimeFrame,IND,ZZC_5_Period,ZZC_5_Reverse,1,1));
                  }               
               
            bool ClBuySignal=false;
            bool ClSellSignal=false;
         
         
               if(ZZC_1_BUY){
                  if(ZZC_2_BUY){            
                     if(ZZC_3_BUY){            
                        if(ZZC_4_BUY){ 
                           if(ZZC_5_BUY){   
                              if(ZZCON){                     
                                 ClSellSignal=true;
                              }
                           }
                        }
                     }
                  }
               }
            
               if(ZZC_1_SELL){
                  if(ZZC_2_SELL){            
                     if(ZZC_3_SELL){            
                        if(ZZC_4_SELL){            
                           if(ZZC_5_SELL){            
                              if(ZZCON){
                                 ClBuySignal=true;
                              }
                           }
                        }
                     }
                  }
               }
               //Print("sssssssssssssss "+CloseBuySignal+" "+CloseSellSignal);
               if(ClBuySignal || ClSellSignal){
                  if(fOrderCloseMarket2(ClBuySignal,ClSellSignal)!=0){
                     trouble=true;
                  }               
               }
               
            }



            
            if(BuySignal || SellSignal){
                  if(CloseOnRev || CloseOnRevSSOrders){
                     if(fOrderCloseMarket(SellSignal,BuySignal)!=0){
                        trouble=true;
                     }
                  }
               int BuyCount,SellCount;
               int Total=fMarketOrdersTotal(BuyCount,SellCount);
                  if(Total!=-1){
                     if(Total<MaxCount || MaxCount==-1){
                        if(BuySignal && !SellSignal && !ClBuySignal){
                           if(BuyCount<MaxBuyCount || MaxBuyCount==-1){
                              if(LastBuyTime!=iTime(NULL,TimeFrame,0)){
                                 bool CanOpen=true;
                                    if(AddIfLevel){
                                       CanOpen=False;
                                          if(BuyCount==0){
                                             CanOpen=true;
                                          }
                                          else{
                                             if(ND(Ask)<=ND(gLastBuyPrice-Point*AddLevel)){
                                                CanOpen=true;  
                                             }
                                          }
                                    }
                                    if(CanOpen){  
                                       gLots=Lots;
                                          if(BuyCount>0){
                                                switch(LotsMethod){
                                                   case 2:
                                                      gLots=gLastBuyLots+LotsAdd;
                                                   break;
                                                   case 3:
                                                      gLots=gLastBuyLots*LotsK;
                                                   break;
                                                }
                                             gLots=fLotsNormalize(gLots);
                                          }
                                       if(fOrderOpenBuy()<1){
                                          trouble=true;
                                       }
                                    }
                              }  
                           }
                        }
                        if(SellSignal && !BuySignal && !ClSellSignal){
                           if(SellCount<MaxSellCount || MaxSellCount==-1){
                              if(LastSellTime!=iTime(NULL,TimeFrame,0)){
                                 CanOpen=true;
                                    if(AddIfLevel){
                                       CanOpen=False;
                                          if(SellCount==0){
                                             CanOpen=true;
                                          }
                                          else{
                                             if(ND(Bid)>=ND(gLastSellPrice+Point*AddLevel)){
                                                CanOpen=true;  
                                             }
                                          }
                                    }
                                    if(CanOpen){  
                                       gLots=Lots;
                                          if(SellCount>0){
                                                switch(LotsMethod){
                                                   case 2:
                                                      gLots=gLastSellLots+LotsAdd;
                                                   break;
                                                   case 3:
                                                      gLots=gLastSellLots*LotsK;
                                                   break;
                                                }
                                             gLots=fLotsNormalize(gLots);
                                          }                                                                  
                                       if(fOrderOpenSell()<1){
                                          trouble=true;                                 
                                       }
                                    }
                              }
                           }
                        }
                     }
                  }
                  else{
                     trouble=true;
                  }
                  
            }            
  
            if(TrailingStop_OnceOnBar){
               if(TrailingStop_Use){
                  if(fTrailingWithStart()!=0){
                     trouble=true;
                  }
               }
            }
            if(BreakEven_OnceOnBar){
               if(BreakEven_Use){
                  if(fBreakEvenToLevel()!=0){
                     trouble=true;                        
                  }
               }
            }
            if(!trouble){
               LastTime=iTime(NULL,TimeFrame,0);
            }
      }            

      if(!TrailingStop_OnceOnBar){
         if(TrailingStop_Use){
            if(fTrailingWithStart()!=0){
               trouble=true;
            }
         }
      }
      if(!BreakEven_OnceOnBar){
         if(BreakEven_Use){
            if(fBreakEvenToLevel()!=0){
               trouble=true;                        
            }
         }
      }   
      


            if(ssUse){
               fLinkedStopLossStopOrder();          
            }
            if(ssModify){
               fLinkedStopLossStopOrderModify();          
            }           
      
   return(0);
  }
//+------------------------------------------------------------------+



void fLinkedStopLossStopOrder(){

int i,j;

   for(i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderMagicNumber()==ssMagic_N){
            if(OrderSymbol()==Symbol()){
               if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP){
                  int tTicket=OrderTicket();
                  int tType=OrderType();
                  string tComment=OrderComment();
                  bool tMainExist=false;
                     for(j=0;j<OrdersTotal();j++){
                        if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)){
                           if(OrderMagicNumber()==Magic_N){
                              if(OrderSymbol()==Symbol()){
                                 if(StringFind(tComment,"SS"+OrderTicket()+"SS",0)==0){
                                    tMainExist=true;
                                    break;
                                 }
                              }
                           }
                        }
                        else{
                           tMainExist=true;
                           break;
                        }
                     }
                     if(!tMainExist){
                        if(!IsTradeContextBusy()){
                           if(!OrderDelete(tTicket)){
                              if(tType==OP_BUYSTOP)Print("Error delete BUYSTOP "+tTicket+" "+tTicket+". "+fMyErDesc(GetLastError())); 
                              if(tType==OP_SELLSTOP)Print("Error delete SELLSTOP "+tTicket+" "+tTicket+". "+fMyErDesc(GetLastError())); 
                           }
                        }
                        else{
                           if(tType==OP_BUYSTOP)Print("Need delete BUYSTOP "+tTicket+". "+tTicket+". Trade Context Busy");
                           if(tType==OP_SELLSTOP)Print("Need delete SELLSTOP "+tTicket+". "+tTicket+". Trade Context Busy");
                        }
                     }
               }
            }
         }  
      }
   }
   for(i=0;i<OrdersTotal();i++){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderMagicNumber()==Magic_N){
            if(OrderSymbol()==Symbol()){
               if(1==1){
                  bool tExist=false;
                  int tMainTicket=OrderTicket();
                  int tMainType=OrderType();
                  double tMainStopLoss=OrderStopLoss();
                     if(ND(tMainStopLoss)==0){
                        switch(OrderType()){
                           case OP_BUY:
                              tMainStopLoss=ND(OrderOpenPrice()-Point*ssLevel);
                           break;
                           case OP_SELL:
                              tMainStopLoss=ND(OrderOpenPrice()+Point*ssLevel);
                           break;
                        }
                     }
                  double tLots=OrderLots();
                     for(j=0;j<OrdersTotal();j++){
                        if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)){
                           if(OrderMagicNumber()==ssMagic_N){
                              if(OrderSymbol()==Symbol()){
                                 if(StringFind(OrderComment(),"SS"+tMainTicket+"SS",0)==0){
                                    tExist=true;       
                                    break;                          
                                 }
                              }
                           }
                        }
                        else{
                           tExist=true;
                           break;
                        }
                     }
                     if(!tExist){
                        if(tMainType==OP_SELL){//BUYSTOP
                           double oppr=ND(tMainStopLoss); 
                           double slts=ND(oppr-Point*ssStopLoss);
                           if(ssStopLoss==0)slts=0;
                           double tpts=ND(oppr+Point*ssTakeProfit);
                           if(ssTakeProfit==0)tpts=0;
                           double mol=ND(Ask+Point*MarketInfo(Symbol(),MODE_STOPLEVEL));
                              if(oppr>=mol){
                                 int tLotsErr=0;
                                    if(AccountFreeMarginCheck(Symbol(),OP_BUY,tLots)<=0){
                                       tLotsErr=1;
                                    }  
                                    if(GetLastError()==134){
                                       tLotsErr=2;
                                    }
                                    if(tLotsErr==0){
                                       if(!IsTradeContextBusy()){
                                          int rv=OrderSend(Symbol(),OP_BUYSTOP,tLots,oppr,0,slts,tpts,"SS"+tMainTicket+"SS",ssMagic_N,0,CLR_NONE);   
                                             if(rv<=0){
                                                 Print ("Error set stoploss BUYSTOP for SELL "+tMainTicket+". "+fMyErDesc(GetLastError())); 
                                             }
                                       }
                                       else{
                                          int lt5=0;
                                             if(TimeCurrent()>lt5+20){
                                                lt5=TimeCurrent();
                                                Print("Need set stoploss BUYSYOP for SELL "+tMainTicket+". Trade Context Busy");
                                             }
                                       }
                                    }
                                    else{
                                       static int lt3=0;
                                          if(TimeCurrent()>lt3+20){
                                             lt3=TimeCurrent();
                                                if(tLotsErr==1){
                                                   Print("Need set stoploss BUYSYOP for SELL "+tMainTicket+". No money");
                                                }  
                                                if(tLotsErr==2){
                                                   Print("Need set stoploss BUYSYOP for SELL "+tMainTicket+". Wrong lots size");
                                                }
                                          }  
                                    }
                              }
                              else{
                                 static int lt1=0;
                                    if(TimeCurrent()>lt1+20){
                                       lt1=TimeCurrent();
                                       Print("Need set stoploss BUYSYOP for SELL "+tMainTicket+". Wrong price level");
                                    }     
                              }  
                        }
                        if(tMainType==OP_BUY){//SELLSTOP
                           oppr=ND(tMainStopLoss); 
                           slts=ND(oppr+Point*ssStopLoss);
                           if(ssStopLoss==0)slts=0;
                           tpts=ND(oppr-Point*ssTakeProfit);
                           if(ssTakeProfit==0)tpts=0;
                           mol=ND(Bid-Point*MarketInfo(Symbol(),MODE_STOPLEVEL));
                              if(oppr<=mol){
                                 tLotsErr=0;
                                    if(AccountFreeMarginCheck(Symbol(),OP_SELL,tLots)<=0){
                                       tLotsErr=1;
                                    }  
                                    if(GetLastError()==134){
                                       tLotsErr=2;
                                    }
                                    if(tLotsErr==0){
                                       if(!IsTradeContextBusy()){
                                          rv=OrderSend(Symbol(),OP_SELLSTOP,tLots,oppr,0,slts,tpts,"SS"+tMainTicket+"SS",ssMagic_N,0,CLR_NONE);   
                                             if(rv<=0){
                                                 Print ("Error set stoploss SELLSTOP for BUY "+tMainTicket+". "+fMyErDesc(GetLastError())); 
                                             } 
                                       }
                                       else{
                                          int lt6=0;
                                             if(TimeCurrent()>lt6+20){
                                                lt6=TimeCurrent();                                       
                                                Print("Need set stoploss SELLSTOP for BUY "+tMainTicket+". Trade Context Busy");
                                             }
                                                   
                                       }
                                    }
                                    else{
                                       static int lt4=0;
                                          if(TimeCurrent()>lt4+20){
                                             lt4=TimeCurrent();                                    
                                                if(tLotsErr==1){
                                                   Print("Need set stoploss SELLSTOP for SELL "+tMainTicket+". No money");
                                                }  
                                                if(tLotsErr==2){
                                                   Print("Need set stoploss SELLSTOP for SELL "+tMainTicket+". Wrong lots size");
                                                }
                                          }
                                    }                                      
                              }
                              else{
                                 static int lt2=0;
                                    if(TimeCurrent()>lt2+20){
                                       lt2=TimeCurrent();
                                       Print("Need set stoploss SELLSTOP for BUY "+tMainTicket+". Wrong price level");
                                    }                               
                              }                           
                        }   
                     }
               }  
            }
         }
      }
   }
}

void fLinkedStopLossStopOrderModify(){

int i,j;

   for(i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderMagicNumber()==ssMagic_N){
            if(OrderSymbol()==Symbol()){
               if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP){
                  int tTicket=OrderTicket();
                  int tType=OrderType();
                  string tComment=OrderComment();
                  double tOpenPrice=OrderOpenPrice();
                     for(j=0;j<OrdersTotal();j++){
                        if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)){
                           if(OrderMagicNumber()==Magic_N){
                              if(OrderSymbol()==Symbol()){
                                 if(StringFind(tComment,"SS"+OrderTicket()+"SS",0)==0){
                                    double oppr=ND(OrderStopLoss());
                                    if(oppr!=0){
                                       if(oppr!=ND(tOpenPrice)){
                                             if(tType==OP_BUYSTOP){
                                                double mol=ND(Ask+Point*MarketInfo(Symbol(),MODE_STOPLEVEL));
                                                   if(oppr>=mol){
                                                      if(!IsTradeContextBusy()){
                                                         double slts=ND(oppr-Point*ssStopLoss);
                                                         if(ssStopLoss==0)slts=0;
                                                         double tpts=ND(oppr+Point*ssTakeProfit);
                                                         if(ssTakeProfit==0)tpts=0;                                                      
                                                            if(!OrderModify(tTicket,oppr,slts,tpts,OrderExpiration(),CLR_NONE)){
                                                               Print ("Error modify BUYSTOPSTOP "+tTicket+" for SELL "+OrderTicket()+". "+fMyErDesc(GetLastError()));
                                                            }
                                                      }
                                                      else{
                                                         static int lt2=0;
                                                            if(TimeCurrent()>lt2+20){
                                                               lt2=TimeCurrent();
                                                               Print("Need modify BUYSTOP "+tTicket+". Trade Context Busy");
                                                            }
                                                      }
                                                   }
                                                   else{
                                                      static int lt1=0;
                                                         if(TimeCurrent()>lt1+20){
                                                            lt1=TimeCurrent();
                                                            Print("Need modify BUYSTOP "+tTicket+". Wrong price level");
                                                         }
                                                   }
                                             }
                                             if(tType==OP_SELLSTOP){
                                                mol=ND(Bid-Point*MarketInfo(Symbol(),MODE_STOPLEVEL));
                                                   if(oppr<=mol){
                                                      if(!IsTradeContextBusy()){
                                                         slts=ND(oppr+Point*ssStopLoss);
                                                         if(ssStopLoss==0)slts=0;
                                                         tpts=ND(oppr-Point*ssTakeProfit);
                                                         if(ssTakeProfit==0)tpts=0;                                                      
                                                            if(!OrderModify(tTicket,oppr,slts,tpts,OrderExpiration(),CLR_NONE)){
                                                               Print ("Error modify SELLSTOP "+tTicket+" for BUY "+OrderTicket()+". "+fMyErDesc(GetLastError()));
                                                            }
                                                      }
                                                      else{
                                                         static int lt4=0;
                                                            if(TimeCurrent()>lt4+20){
                                                               lt4=TimeCurrent();
                                                               Print("Need modify SELLSTOP "+tTicket+". Trade Context Busy");
                                                            }
                                                      }
                                                   }
                                                   else{
                                                      static int lt3=0;
                                                         if(TimeCurrent()>lt3+20){
                                                            lt3=TimeCurrent();
                                                            Print("Need modify SELLSTOP "+tTicket+". Wrong price level");
                                                         }
                                                   }                                             
                                             }
                                          break;
                                       }
                                    }   
                                 }
                              }
                           }
                        }
                        else{
                           break;
                        }
                     }
               }
            }
         }  
      }
   }
}


double fLotsNormalize(double aLots){
   aLots-=MarketInfo(Symbol(),MODE_MINLOT);
   aLots/=MarketInfo(Symbol(),MODE_LOTSTEP);
   aLots=MathRound(aLots);
   aLots*=MarketInfo(Symbol(),MODE_LOTSTEP);
   aLots+=MarketInfo(Symbol(),MODE_MINLOT);
   aLots=NormalizeDouble(aLots,2);
   return(aLots);
}

int fTrailingWithStart(){
   int RetErr=0;
   double slts;
      for(int i=0;i<OrdersTotal();i++){
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_N){
               if(OrderType()==OP_BUY){
                  RefreshRates();
                     if(ND(Bid-OrderOpenPrice())>=ND(Point*TrailingStopStart)){
                        slts=ND(Bid-Point*TrailingStop);
                           if(ND(OrderStopLoss())<slts){
                              if(!IsTradeContextBusy()){
                                 if(!OrderModify(OrderTicket(),OrderOpenPrice(),slts,OrderTakeProfit(),0,CLR_NONE)){
                                    int tCheck=GetLastError();
                                    Print("Error trailingstop BUY "+OrderTicket()+" "+fMyErDesc(tCheck));
                                    RetErr=-1;
                                 }
                              }
                              else{
                                 RetErr=-2;
                                 static int lt1=0;
                                    if(lt1+15<TimeCurrent()){
                                       lt1=TimeCurrent();
                                       Print("Need trailingstop BUY "+OrderTicket()+". Trade Context Busy");
                                    }            
                              }
                           }
                     }
               }
               if(OrderType()==OP_SELL){
                  RefreshRates();
                     if(ND(OrderOpenPrice()-Ask)>=ND(Point*TrailingStopStart)){
                        slts=ND(Ask+Point*TrailingStop);
                           if(!IsTradeContextBusy()){                           
                              if(ND(OrderStopLoss())>slts || ND(OrderStopLoss())==0){
                                 if(!OrderModify(OrderTicket(),OrderOpenPrice(),slts,OrderTakeProfit(),0,CLR_NONE)){
                                    tCheck=GetLastError();
                                    Print("Error trailingstop SELL "+OrderTicket()+" "+fMyErDesc(tCheck));
                                    RetErr=-1;
                                 }
                              }
                           }
                           else{
                                 RetErr=-2;
                                 static int lt2=0;
                                    if(lt2+15<TimeCurrent()){
                                       lt2=TimeCurrent();
                                       Print("Need trailingstop SELL "+OrderTicket()+". Trade Context Busy");
                                    } 
                           }
                     } 
               }
            }
         }
      }
   return(RetErr);      
}

int fBreakEvenToLevel(){
   int RetErr=0;
   double slts;
      for(int i=0;i<OrdersTotal();i++){
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_N){
               if(OrderType()==OP_BUY){
                  RefreshRates();
                     if(ND(Bid-OrderOpenPrice())>=ND(Point*BreakEvenStart)){
                        slts=ND(OrderOpenPrice()+Point*(BreakEvenStart-BreakEvenLevel));
                           if(ND(OrderStopLoss())<slts){
                              if(!IsTradeContextBusy()){                           
                                 if(ND(OrderStopLoss())<slts){
                                    if(!OrderModify(OrderTicket(),OrderOpenPrice(),slts,OrderTakeProfit(),0,CLR_NONE)){
                                       int tCheck=GetLastError();
                                       Print("Error breakeven BUY "+OrderTicket()+" "+fMyErDesc(tCheck));
                                       RetErr=-1;
                                    }
                                 }
                              }
                              else{
                                 RetErr=-2;
                                 static int lt1=0;
                                    if(lt1+15<TimeCurrent()){
                                       lt1=TimeCurrent();
                                       Print("Need breakeven BUY "+OrderTicket()+". Trade Context Busy");
                                    } 
                              }                           
                           }
                     }
               }
               if(OrderType()==OP_SELL){
                  RefreshRates();
                     if(ND(OrderOpenPrice()-Ask)>=ND(Point*BreakEvenStart)){
                        slts=ND(OrderOpenPrice()-Point*(BreakEvenStart-BreakEvenLevel));
                           if(ND(OrderStopLoss())>slts || ND(OrderStopLoss())==0){
                              if(!IsTradeContextBusy()){                           
                                 if(ND(OrderStopLoss())>slts || ND(OrderStopLoss())==0){
                                    if(!OrderModify(OrderTicket(),OrderOpenPrice(),slts,OrderTakeProfit(),0,CLR_NONE)){
                                       tCheck=GetLastError();
                                       Print("Error breakeven SELL "+OrderTicket()+" "+fMyErDesc(tCheck));
                                       RetErr=-1;
                                    }
                                 }
                              }
                              else{
                                 RetErr=-2;
                                 static int lt2=0;
                                    if(lt2+15<TimeCurrent()){
                                       lt2=TimeCurrent();
                                       Print("Need breakeven SELL "+OrderTicket()+". Trade Context Busy");
                                    } 
                              } 
                           }
                     } 
               }
            }
         }
      }
   return(RetErr);
}

int fOrderCloseMarket(bool aCloseBuy=true,bool aCloseSell=true){
   int tErr=0;
      for(int i=OrdersTotal()-1;i>=0;i--){
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
            if(OrderSymbol()==Symbol()){
               if((OrderMagicNumber()==Magic_N && CloseOnRev) || (CloseOnRevSSOrders && OrderMagicNumber()==ssMagic_N)){
                  if(OrderType()==OP_BUY && aCloseBuy){
                     RefreshRates();
                        if(!IsTradeContextBusy()){
                           if(!OrderClose(OrderTicket(),OrderLots(),ND(Bid),Slippage,CLR_NONE)){
                              int tCheck=GetLastError();
                              Print("Error close BUY "+OrderTicket()+" "+fMyErDesc(tCheck)); 
                              tErr=-1;
                           }
                        }
                        else{
                           static int lt1=0;
                              if(lt1!=iTime(NULL,TimeFrame,0)){
                                 lt1=iTime(NULL,TimeFrame,0);
                                 Print("Need close BUY "+OrderTicket()+". Trade Context Busy");
                              }            
                           return(-2);
                        }   
                  }
                  if(OrderType()==OP_SELL && aCloseSell){
                     RefreshRates();
                        if(!IsTradeContextBusy()){                        
                           if(!OrderClose(OrderTicket(),OrderLots(),ND(Ask),Slippage,CLR_NONE)){
                              tCheck=GetLastError();
                              Print("Error close SELL "+OrderTicket()+" "+fMyErDesc(tCheck)); 
                              tErr=-1;
                           }  
                        }
                        else{
                           static int lt2=0;
                              if(lt2!=iTime(NULL,TimeFrame,0)){
                                 lt2=iTime(NULL,TimeFrame,0);
                                 Print("Need close SELL "+OrderTicket()+". Trade Context Busy");
                              }            
                           return(-2);
                        }          
                  }
               }
            }
         }
      }
   return(tErr);
}  

int fOrderCloseMarket2(bool aCloseBuy=true,bool aCloseSell=true){
   int tErr=0;
      for(int i=OrdersTotal()-1;i>=0;i--){
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
            if(OrderSymbol()==Symbol()){
               if((OrderMagicNumber()==Magic_N && CloseSignal) || (CloseSignalSSOrders && OrderMagicNumber()==ssMagic_N)){
                  if(OrderType()==OP_BUY && aCloseBuy){
                     RefreshRates();
                        if(!IsTradeContextBusy()){
                           if(!OrderClose(OrderTicket(),OrderLots(),ND(Bid),Slippage,CLR_NONE)){
                              int tCheck=GetLastError();
                              Print("Error close BUY "+OrderTicket()+" "+fMyErDesc(tCheck)); 
                              tErr=-1;
                           }
                        }
                        else{
                           static int lt1=0;
                              if(lt1!=iTime(NULL,TimeFrame,0)){
                                 lt1=iTime(NULL,TimeFrame,0);
                                 Print("Need close BUY "+OrderTicket()+". Trade Context Busy");
                              }            
                           return(-2);
                        }   
                  }
                  if(OrderType()==OP_SELL && aCloseSell){
                     RefreshRates();
                        if(!IsTradeContextBusy()){                        
                           if(!OrderClose(OrderTicket(),OrderLots(),ND(Ask),Slippage,CLR_NONE)){
                              tCheck=GetLastError();
                              Print("Error close SELL "+OrderTicket()+" "+fMyErDesc(tCheck)); 
                              tErr=-1;
                           }  
                        }
                        else{
                           static int lt2=0;
                              if(lt2!=iTime(NULL,TimeFrame,0)){
                                 lt2=iTime(NULL,TimeFrame,0);
                                 Print("Need close SELL "+OrderTicket()+". Trade Context Busy");
                              }            
                           return(-2);
                        }          
                  }
               }
            }
         }
      }
   return(tErr);
}  


double fGetLotsSimple(int aTradeType){

   // fGetLotsSimple(OP_BUY);
   // fGetLotsSimple(OP_SELL);   

   if(AccountFreeMarginCheck(Symbol(),aTradeType,gLots)<=0){
      return(-1);
   }
   if(GetLastError()==134){
      return(-2);
   }
   return(gLots);  
}


double ND(double v){return(NormalizeDouble(v,Digits));}

int fMarketOrdersTotal(int & aBuyCount,int & aSellCount){
      for(int i=0;i<OrdersTotal();i++){
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
            if(OrderSymbol()==Symbol()){
               if(OrderMagicNumber()==Magic_N || (CountSSOrders && OrderMagicNumber()==ssMagic_N)){
                  switch (OrderType()){
                     case OP_BUY:
                        aBuyCount++;
                        gLastBuyPrice=OrderOpenPrice();
                        gLastBuyLots=OrderLots();
                        break;
                     case OP_SELL:
                        aSellCount++;
                        gLastSellPrice=OrderOpenPrice();
                        gLastSellLots=OrderLots();
                        break;    
                  }
               }
            }
         }
         else{
            return(-1);
         }
      }
   return(aBuyCount+aSellCount);
}


int fOrderOpenBuy(){

   // fOrderOpenBuy();

   RefreshRates();
   double lts=fGetLotsSimple(OP_BUY);
      if(lts>0){      
         if(!IsTradeContextBusy()){
            double slts=ND(Ask-Point*StopLoss);
            if(StopLoss==0)slts=0;
            double tpts=ND(Ask+Point*TakeProfit);
            if(TakeProfit==0)tpts=0;
            int irv=OrderSend(Symbol(),OP_BUY,lts,ND(Ask),Slippage,slts,tpts,NULL,Magic_N,0,CLR_NONE);
               if(irv>0){
                  LastBuyTime=iTime(NULL,TimeFrame,0);
                  LastSellTime=0;
                  return(irv);
               }
               else{
                  int tCheck=GetLastError();
                  Print ("Error open BUY. "+fMyErDesc(tCheck)); 
                  return(-1);
               }
         }
         else{
            static int lt2=0;
               if(lt2!=iTime(NULL,TimeFrame,0)){
                  lt2=iTime(NULL,TimeFrame,0);
                  Print("Need open buy. Trade Context Busy");
               }            
            return(-2);
         }
      }
      else{
         static int lt3=0;
            if(lt3!=iTime(NULL,TimeFrame,0)){
               lt3=iTime(NULL,TimeFrame,0);
               if(lts==-1)Print("Need open buy. No money");
               if(lts==-2)Print("Need open buy. Wrong lots size");                  
            }
         return(-3);                  
      }
}  


int fOrderOpenSell(){

   // fOrderOpenSell();

   RefreshRates();
   double lts=fGetLotsSimple(OP_SELL);
      if(lts>0){      
         if(!IsTradeContextBusy()){
            double slts;
            slts=ND(Bid+Point*StopLoss);
            if(StopLoss==0)slts=0;               
            double tpts=ND(Bid-Point*TakeProfit);
            if(TakeProfit==0)tpts=0;
            int irv=OrderSend(Symbol(),OP_SELL,lts,ND(Bid),Slippage,slts,tpts,NULL,Magic_N,0,CLR_NONE);
               if(irv>0){
                  LastSellTime=iTime(NULL,TimeFrame,0);
                  LastBuyTime=0;
                  return(irv);
               }
               else{
                  int tCheck=GetLastError();
                  Print ("Error open SELL. "+fMyErDesc(tCheck)); 
                  return(-1);
               }
         }
         else{
            static int lt2=0;
               if(lt2!=iTime(NULL,TimeFrame,0)){
                  lt2=iTime(NULL,TimeFrame,0);
                  Print("Need open sell. Trade Context Busy");
               }            
            return(-2);
         }
      }
      else{
         static int lt3=0;
            if(lt3!=iTime(NULL,TimeFrame,0)){
               lt3=iTime(NULL,TimeFrame,0);
               if(lts==-1)Print("Need open sell. No money");
               if(lts==-2)Print("Need open sell. Wrong lots size");      
            }
         return(-3);                  
      }
}  

string fMyErDesc(int aErrNum){
   
   // fMyErDesc(GetLastError());
   
   string pref="Err Num: "+aErrNum+" - ";
   switch(aErrNum){
      case 0: return(pref+"NO ERROR");
      case 1: return(pref+"NO RESULT");                                 
      case 2: return(pref+"COMMON ERROR");                              
      case 3: return(pref+"INVALID TRADE PARAMETERS");                  
      case 4: return(pref+"SERVER BUSY");                               
      case 5: return(pref+"OLD VERSION");                               
      case 6: return(pref+"NO CONNECTION");                             
      case 7: return(pref+"NOT ENOUGH RIGHTS");                         
      case 8: return(pref+"TOO FREQUENT REQUESTS");                     
      case 9: return(pref+"MALFUNCTIONAL TRADE");                       
      case 64: return(pref+"ACCOUNT DISABLED");                         
      case 65: return(pref+"INVALID ACCOUNT");                          
      case 128: return(pref+"TRADE TIMEOUT");                           
      case 129: return(pref+"INVALID PRICE");                           
      case 130: return(pref+"INVALID STOPS");                           
      case 131: return(pref+"INVALID TRADE VOLUME");                    
      case 132: return(pref+"MARKET CLOSED");                           
      case 133: return(pref+"TRADE DISABLED");                          
      case 134: return(pref+"NOT ENOUGH MONEY");                        
      case 135: return(pref+"PRICE CHANGED");                           
      case 136: return(pref+"OFF QUOTES");                              
      case 137: return(pref+"BROKER BUSY");                             
      case 138: return(pref+"REQUOTE");                                 
      case 139: return(pref+"ORDER LOCKED");                            
      case 140: return(pref+"LONG POSITIONS ONLY ALLOWED");             
      case 141: return(pref+"TOO MANY REQUESTS");                       
      case 145: return(pref+"TRADE MODIFY DENIED");                     
      case 146: return(pref+"TRADE CONTEXT BUSY");                      
      case 147: return(pref+"TRADE EXPIRATION DENIED");                 
      case 148: return(pref+"TRADE TOO MANY ORDERS");                   
      //---- mql4 run time errors
      case 4000: return(pref+"NO MQLERROR");                            
      case 4001: return(pref+"WRONG FUNCTION POINTER");                 
      case 4002: return(pref+"ARRAY INDEX OUT OF RANGE");               
      case 4003: return(pref+"NO MEMORY FOR FUNCTION CALL STACK");      
      case 4004: return(pref+"RECURSIVE STACK OVERFLOW");               
      case 4005: return(pref+"NOT ENOUGH STACK FOR PARAMETER");         
      case 4006: return(pref+"NO MEMORY FOR PARAMETER STRING");         
      case 4007: return(pref+"NO MEMORY FOR TEMP STRING");              
      case 4008: return(pref+"NOT INITIALIZED STRING");                 
      case 4009: return(pref+"NOT INITIALIZED ARRAYSTRING");            
      case 4010: return(pref+"NO MEMORY FOR ARRAYSTRING");              
      case 4011: return(pref+"TOO LONG STRING");                        
      case 4012: return(pref+"REMAINDER FROM ZERO DIVIDE");             
      case 4013: return(pref+"ZERO DIVIDE");                            
      case 4014: return(pref+"UNKNOWN COMMAND");                        
      case 4015: return(pref+"WRONG JUMP");                             
      case 4016: return(pref+"NOT INITIALIZED ARRAY");                  
      case 4017: return(pref+"DLL CALLS NOT ALLOWED");                  
      case 4018: return(pref+"CANNOT LOAD LIBRARY");                    
      case 4019: return(pref+"CANNOT CALL FUNCTION");                   
      case 4020: return(pref+"EXTERNAL EXPERT CALLS NOT ALLOWED");      
      case 4021: return(pref+"NOT ENOUGH MEMORY FOR RETURNED STRING");  
      case 4022: return(pref+"SYSTEM BUSY");                            
      case 4050: return(pref+"INVALID FUNCTION PARAMETERS COUNT");      
      case 4051: return(pref+"INVALID FUNCTION PARAMETER VALUE");       
      case 4052: return(pref+"STRING FUNCTION INTERNAL ERROR");         
      case 4053: return(pref+"SOME ARRAY ERROR");                       
      case 4054: return(pref+"INCORRECT SERIES ARRAY USING");           
      case 4055: return(pref+"CUSTOM INDICATOR ERROR");                 
      case 4056: return(pref+"INCOMPATIBLE ARRAYS");                    
      case 4057: return(pref+"GLOBAL VARIABLES PROCESSING ERROR");      
      case 4058: return(pref+"GLOBAL VARIABLE NOT FOUND");              
      case 4059: return(pref+"FUNCTION NOT ALLOWED IN TESTING MODE");   
      case 4060: return(pref+"FUNCTION NOT CONFIRMED");                 
      case 4061: return(pref+"SEND MAIL ERROR");                        
      case 4062: return(pref+"STRING PARAMETER EXPECTED");              
      case 4063: return(pref+"INTEGER PARAMETER EXPECTED");             
      case 4064: return(pref+"DOUBLE PARAMETER EXPECTED");              
      case 4065: return(pref+"ARRAY AS PARAMETER EXPECTED");            
      case 4066: return(pref+"HISTORY WILL UPDATED");                   
      case 4067: return(pref+"TRADE ERROR");                            
      case 4099: return(pref+"END OF FILE");                            
      case 4100: return(pref+"SOME FILE ERROR");                        
      case 4101: return(pref+"WRONG FILE NAME");                        
      case 4102: return(pref+"TOO MANY OPENED FILES");                  
      case 4103: return(pref+"CANNOT OPEN FILE");                       
      case 4104: return(pref+"INCOMPATIBLE ACCESS TO FILE");            
      case 4105: return(pref+"NO ORDER SELECTED");                      
      case 4106: return(pref+"UNKNOWN SYMBOL");                         
      case 4107: return(pref+"INVALID PRICE PARAM");                    
      case 4108: return(pref+"INVALID TICKET");                         
      case 4109: return(pref+"TRADE NOT ALLOWED");                      
      case 4110: return(pref+"LONGS  NOT ALLOWED");                     
      case 4111: return(pref+"SHORTS NOT ALLOWED");                     
      case 4200: return(pref+"OBJECT ALREADY EXISTS");                  
      case 4201: return(pref+"UNKNOWN OBJECT PROPERTY");                
      case 4202: return(pref+"OBJECT DOES NOT EXIST");                  
      case 4203: return(pref+"UNKNOWN OBJECT TYPE");                    
      case 4204: return(pref+"NO OBJECT NAME");                         
      case 4205: return(pref+"OBJECT COORDINATES ERROR");               
      case 4206: return(pref+"NO SPECIFIED SUBWINDOW");                 
      case 4207: return(pref+"SOME OBJECT ERROR");    
      default: return(pref+"WRONG ERR NUM");                
   }
}  






Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:


Stochastic oscillator
Ichimoku Kinko Hyo


Custom Indicators Used:
IND

Order Management characteristics:
Checks for the total of open orders

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

Other Features:

BackTest : EURUSD on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCHF on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCAD on H1

From 2009-01-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-03-01 to 2010-03-27 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-05-01 to 2010-05-31 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:0.00 Total Net Profit:0.00

Request Backtest for exp_ZZSemafor


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: