Martingail_breakdowning_v1





//+------------------------------------------------------------------+
//|               Breakdowning martingail™ v 1.0.2.mq4               | 
//|                  Copyright © 2006, B@ss & Steve                  | 
//|                        albass@mail333.com                        | 
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, B@ss & Steve"
#property link      "albass@mail333.com, http://forum.alpari-idc.ru"
//----
#include <stdlib.mqh>
// åñëè false, òî ïðè çàêðûòèè òåêóùåé ñåðèè, íîâûå îðäåðà íå áóäóò îòêðûâàòüñÿ
extern bool   TradeAllowed        = true;
//øàã â ïóíêòàõ óðîâíåé
extern int    Step                = 18;
extern string _                   = "Ïàðàìåòðû MoneyManagement";
// ðàçìåð òîðãóåìîãî ëîòà, ïðè âûêëþ÷åííîì ÌÌ
extern double startLots           = 0.1;
// âêëþ÷åíèå MoneyManagement
extern bool   MoneyManagement     = true;
// ëîãàðèôìè÷åñêèé MoneyManagement
extern bool   LogariphmicMM       = true;
// ðàçìåð ëîòà â ïðîöåíòàõ îò äåïîçèòà
extern double Riskfactor          = 6;
// ðàçìåð íóæíîãî ïðîôèòà â ïðîöåíòàõ îò äåïîçèòà
extern double ProfitPercent       = 2;
// âêëþ÷åíèå îïòèìàëüíîãî çàêðûòèÿ îðäåðîâ (ïîâûøàåò äîõîäíîñòü)
extern bool   OptimalTakeProfit   = true;
extern string __                  = "Ïàðàìåòðû ðàáîòû ýêñïåðòà";
// ðåæèì ðàáîòû ýêñïåðòà (0 - ïðîáîéíûé ñ âîçìîæíîñòüþ ñòàâèòü èíâåðñíûå îðäåðà, 
// 1 - îòáîéíûé, ñ ïåðåìåùåíèåì îòëîæåííûõ ëèìèòíûõ îðäåðîâ)
extern int    mode_work           = 0;
// òðåéëèíã-ñòîï äëÿ ïëå÷à, âûøåäøåãî â ïðèáûëü (åñëè 0, òîãäà îòñóòñòâóåò)                                           
extern int    TrailingStop        = 30;
//íå òîðãîâàòü ïîñëå çàêðûòèÿ ñåðèè äî ñëåäóþùåãî äíÿ
extern bool   NoTradeBeforeNewDay = true;
// Ðåæèì èçìåíåíèÿ øàãà Step
//   0 - âñåãäà ðàâåí Step
//   1 - ïåðâûé øàã 15, âñå îñòàëüíûå 40
//   2 - ïëàâíî ìåíÿåòñÿ ñ óìåíüøåíèåì FreeMargin îò 15 äî 40
extern int    MinMaxStepMode      = 0;
//ïîêàçûâàòü ñëóæåáíóþ èíôîðìàöèþ ïî îðäåðàì â æóðíàëå òåðìèíàëà                                                
extern bool   ShowLog             = false;
//----
int    timeOut      = 5000;
int    maxLevel     = 9;     //ìàêñèìàëüíûé îòêðûòûé óðîâåíü
double LotsLevel_2  = 1;     //øàã ïðèðàùåíèÿ ëîòîâ ñ óâåëè÷åíèåì óðîâíÿ
double LotsLevel_3  = 2;
double LotsLevel_4  = 4;
double LotsLevel_5  = 6;
double LotsLevel_6  = 10;
double LotsLevel_7  = 16;
double LotsLevel_8  = 26;
double LotsLevel_9  = 42;
double LotsLevel_10 = 64;
double LotsLevel_11 = 100;
double LotsLevel_12 = 168;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+        
int init()
  {
   ObjectCreate("label_object", OBJ_LABEL, 0, 0, 0);  
   ObjectCreate("label_object1", OBJ_LABEL, 0, 0, 0);
   ObjectCreate("label_object2", OBJ_LABEL, 0, 0, 0); 
   ObjectSet("label_object", OBJPROP_XDISTANCE, 11);  
   ObjectSet("label_object", OBJPROP_YDISTANCE, 14);
   ObjectSet("label_object1", OBJPROP_XDISTANCE, 400);
   ObjectSet("label_object1", OBJPROP_YDISTANCE, 20);
   ObjectSet("label_object2", OBJPROP_XDISTANCE, 400);  
   ObjectSet("label_object2", OBJPROP_YDISTANCE, 35);
   ObjectSetText("label_object", "Breakdowning Martingail™  version 1.0.2",
                 11, "Verdana", White);
   return(0);
  }
//+------------------------------------------------------------------+
//|  Ôóíêöèÿ ïðîâåðÿåò íàëè÷èå îðäåðà ñ äàííûì ìàãè÷åñêèì íîìåðîì    |
//+------------------------------------------------------------------+
bool isMgNum(int num) 
  {
   int t, cnt1;
   t = OrdersTotal();
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(OrderMagicNumber() == num && OrderSymbol() == Symbol())
         {
           return(True);// âîçâðàùàåìîå çíà÷åíèå
         }
     }  
   return (False);   
  }
//+------------------------------------------------------------------+
//|  Ôóíêöèÿ óäàëåíèÿ îðäåðà ïî ìàãè÷åñêîìó íîìåðó                   |
//+------------------------------------------------------------------+
bool deleteOrderNum(int num) 
  {       
   int t, cnt1, err;     
   bool tic;
   t = OrdersTotal();
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(OrderSymbol() == Symbol())
         {
           //òîëüêî äëÿ äàííîãî èíñòðóìåíòà      
           if(OrderMagicNumber() == num && (OrderType() == OP_BUYSTOP || 
              OrderType() == OP_SELLSTOP || OrderType() == OP_SELLLIMIT || 
              OrderType() == OP_BUYLIMIT))            
             {
               int start = GetTickCount();
               tic = OrderDelete(OrderTicket());               
               if(ShowLog)
                 {
                   Print("Âðåìÿ óäàëåíèÿ ", (GetTickCount() - start) / 1000, " ñåêóíä.");
                 }
               if(tic) 
                   PlaySound("timeout.wav");
               if(!tic) 
                 {
                   err = GetLastError();
                   Print("Îøèáêà = ", err, " (", ErrorDescription(err), ")");
                 } 
               return(True); // âîçâðàùàåìîå çíà÷åíèå
             }
         }   
     }  
   return (False);   
  }     
//+------------------------------------------------------------------+
//|  Ôóíêöèÿ, ïðîâåðÿþùàÿ, àêòèâèðîâàí ëè äàííûé îðäåð â îòêðûòóþ    |
//|  ïîçèöèþ                                                         |
//+------------------------------------------------------------------+
bool isOrderActive(int num)  // èìÿ ôóíêöèè è ñïèñîê ïàðàìåòðîâ
  {       
   int t, cnt1;     
   t = OrdersTotal();
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(OrderSymbol() == Symbol())
         {       
           if(OrderMagicNumber() == num) 
             {     
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                   return(True);// âîçâðàùàåìîå çíà÷åíèå
                 }
             }
         }
     }  
   return (False);   
  } 
//+------------------------------------------------------------------+
//|  Îïðåäåëåíèå ìàñèìàëüíîãî óðîâíÿ äëÿ äëèííûõ èëè êîðîòêèõ ïîçèöèé|
//+------------------------------------------------------------------+
int getTopLevel(int mode)  // èìÿ ôóíêöèè è ñïèñîê ïàðàìåòðîâ
  {       
   int t, cnt1, tLev, cLev;
   t = OrdersTotal();
   cLev = 0;
   tLev = 0;
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(OrderSymbol() == Symbol())
         {
           if(OrderType() == OP_BUY || OrderType() == OP_SELL)
             { 
               //òîëüêî àêòèâèðîâàííûå ïîçèöèè
               if(mode == 1)
                 {  
                   //ïðîâåðêà óðîâíÿ äëÿ ëîíãîâ
                   if(OrderMagicNumber() == 881) 
                       cLev = 12;
                   if(OrderMagicNumber() == 871) 
                       cLev = 11;
                   if(OrderMagicNumber() == 861) 
                       cLev = 10;
                   if(OrderMagicNumber() == 851) 
                       cLev = 9;
                   if(OrderMagicNumber() == 841) 
                       cLev = 8;
                   if(OrderMagicNumber() == 831) 
                       cLev = 7;
                   if(OrderMagicNumber() == 821) 
                       cLev = 6;
                   if(OrderMagicNumber() == 811) 
                       cLev = 5;
                   if(OrderMagicNumber() == 801) 
                       cLev = 4;
                   if(OrderMagicNumber() == 791) 
                       cLev = 3;
                   if(OrderMagicNumber() == 781) 
                       cLev = 2;
                   if(OrderMagicNumber() == 771) 
                       cLev = 1;
                 } 
               else 
                 {  
                   //ïðîâåðêà óðîâíÿ äëÿ øîðòîâ
                   if(OrderMagicNumber() == 882) 
                       cLev = 12;
                   if(OrderMagicNumber() == 872) 
                       cLev = 11;
                   if(OrderMagicNumber() == 862) 
                       cLev = 10;
                   if(OrderMagicNumber() == 852) 
                       cLev = 9;
                   if(OrderMagicNumber() == 842) 
                       cLev = 8;
                   if(OrderMagicNumber() == 832) 
                       cLev = 7;                                             
                   if(OrderMagicNumber() == 822) 
                       cLev = 6;
                   if(OrderMagicNumber() == 812) 
                       cLev = 5;
                   if(OrderMagicNumber() == 802) 
                       cLev = 4;
                   if(OrderMagicNumber() == 792) 
                       cLev = 3;
                   if(OrderMagicNumber() == 782) 
                       cLev = 2;
                   if(OrderMagicNumber() == 772) 
                       cLev = 1;             
                 }
             }   
         }
       if(cLev > tLev) 
           tLev = cLev;   
     }  
   return(tLev);   
  }
//+------------------------------------------------------------------+
//|  Îïðåäåëåíèå, ñêîëüêî ëîòîâ îòêðûâàòü ïî çàäàííîìó íîìåðó óðîâíÿ |
//+------------------------------------------------------------------+
double getLotByLevel(int level) // ôóíêöèÿ äëÿ âû÷èñëåíèÿ ëîòà ïî óðîâíþ
  {       
    double lot1;
    lot1 = startLots;  // çíà÷åíèå ïî óìîë÷àíèþ 
    if(level == 1) 
        // ïåðâûå îðäåðà - òîëüêî äëÿ îòñ÷åòà óðîâíåé, ïîçèöèè ðàçìåðîì 0,1 ëîòà
        lot1 = 0.1; 
    if(level == 2) 
        lot1 = NormalizeDouble(startLots*LotsLevel_2, 1);
    if(level == 3) 
        lot1 = NormalizeDouble(startLots*LotsLevel_3, 1);
    if(level == 4) 
        lot1 = NormalizeDouble(startLots*LotsLevel_4, 1);
    if(level == 5) 
        lot1 = NormalizeDouble(startLots*LotsLevel_5, 1);
    if(level == 6) 
        lot1 = NormalizeDouble(startLots*LotsLevel_6, 1);
    if(level == 7) 
        lot1 = NormalizeDouble(startLots*LotsLevel_7, 1);
    if(level == 8) 
        lot1 = NormalizeDouble(startLots*LotsLevel_8, 1);
    if(level == 9) 
        lot1 = NormalizeDouble(startLots*LotsLevel_9, 1);         
    if(level == 10) 
        lot1 = NormalizeDouble(startLots*LotsLevel_10, 1);         
    if(level == 11) 
        lot1 = NormalizeDouble(startLots*LotsLevel_11, 1);
    if(level == 12) 
        lot1 = NormalizeDouble(startLots*LotsLevel_12, 1);
   return(lot1);   
  }
//+------------------------------------------------------------------+
//|  Ôóíêöèÿ ïîëó÷åíèÿ öåíû îòêðûòèÿ îðäåðà ïî åãî ìàãè÷åñêîìó íîìåðó|
//+------------------------------------------------------------------+
double getOrderPriceByNum(int num) 
  {       
   int t, cnt1;     
   t = OrdersTotal();
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(OrderSymbol() == Symbol())
         {       
           if(OrderMagicNumber() == num) 
             {     
               return(OrderOpenPrice());
             }
         }
     }  
   return (0);   
  }
//+------------------------------------------------------------------+
//|  Ôóíêöèÿ ïîëó÷åíèÿ âðåìåíè îòêðûòèÿ îðäåðà ïî åãî ìàãè÷åñêîìó    |
//|  íîìåðó                                                          |
//+------------------------------------------------------------------+
datetime getOrderOpenTimeByNum (int num)
  {       
   int t, cnt1;     
   t = OrdersTotal();
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(OrderSymbol() == Symbol())
         {       
           if(OrderMagicNumber() == num) 
             {     
               return(OrderOpenTime());
             }
         }
      }  
   return (0);   
  }      
//+------------------------------------------------------------------+
//|  Ôóíêöèÿ ñ÷èòàåò îòêðûòûå ëîòû äëÿ ëîíãîâ ïî äàííîìó èíñòðóìåíòó |
//+------------------------------------------------------------------+
double getBuyLotsSum(int mode)
  {
   int t, cnt1;
   double sm;
   t = OrdersTotal();
   sm = 0;
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(mode != 1) 
         {     
           if(OrderType() == OP_BUY && OrderSymbol() == Symbol())
             {
               sm = sm + OrderLots();
             }
         } 
       else 
         { 
           // à çäåñü ïî âñåì îòêðûòûì ïîçèöèÿì ñ÷åòà
           if(OrderType() == OP_BUY)
             {
               sm = sm + OrderLots();
             }          
         }        
     }   
   return(sm);     
  }
//+------------------------------------------------------------------+
//|  Ôóíêöèÿ ñ÷èòàåò îòêðûòûå ëîòû äëÿ øîðòîâ ïî äàííîìó èíñòðóìåíòó |
//+------------------------------------------------------------------+
double getSellLotsSum(int mode)
  {
   int t, cnt1;
   double sm;
   t = OrdersTotal();
   sm = 0;
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(mode != 1) 
         {                
           if(OrderType() == OP_SELL && OrderSymbol() == Symbol())
             {
               sm = sm + OrderLots();
             }
         } 
       else 
         {
           // à çäåñü ïî âñåì îòêðûòûì ïîçèöèÿì ñ÷åòà
           if(OrderType() == OP_SELL)
             {
               sm = sm + OrderLots();
             }          
         }    
     }   
   return(sm);     
  }
//+------------------------------------------------------------------+
//| Ôóíêöèÿ äëÿ ìîäèôèêàöèè îòëîæåííûõ îðäåðîâ ëîíãîâ çäåñü          |
//| îïðåäåëÿåì ìàêñèìàëüíûé ìàãè÷åñêèé íîìåð îòêðûòîãî îðäåðà äëÿ    |
//| ëîíãîâ                                                           |
//+------------------------------------------------------------------+
int getMaxLongNum()
  {
   int t, cnt1;
   int topL;    
   t = OrdersTotal();
   topL = 0;
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(OrderSymbol() == Symbol())
         {     
           if(OrderType() == OP_BUY)
             {
               if(OrderMagicNumber() > topL) 
                   topL = OrderMagicNumber();
             }
         }
     }  
   return (topL);      
  }
//+------------------------------------------------------------------+
//| Ôóíêöèÿ îïðåäåëÿåò ìàêñèìàëüíûé ìàãè÷åñêèé íîìåð îòêðûòîãî       |
//| îðäåðà äëÿ øîðòîâ                                                |
//+------------------------------------------------------------------+
int getMaxShortNum()
  {
   int t, cnt1;
   int topL;    
   t = OrdersTotal();
   topL = 0;
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(OrderSymbol() == Symbol())
         {     
           if(OrderType() == OP_SELL)
             {
               if(OrderMagicNumber() > topL) 
                   topL = OrderMagicNumber();
             }
         }
     }  
   return (topL);      
  }
//+------------------------------------------------------------------+
//| Ôóíêöèÿ îïðåäåëÿåò ñëåäóþùèé ìàãè÷åñêèé íîìåð ïî äàííîìó         |
//+------------------------------------------------------------------+
int getNextOrderNum(int n1)
  {        
   if(n1 == 771) 
       return (781);
   if(n1 == 781) 
       return (791);
   if(n1 == 791) 
       return (801);
   if(n1 == 801) 
       return (811);
   if(n1 == 811) 
       return (821);
   if(n1 == 821) 
       return (831);
   if(n1 == 831) 
       return (841);
   if(n1 == 841) 
       return (851);        
   if(n1 == 851) 
       return (861);
   if(n1 == 861) 
       return (871);
   if(n1 == 871) 
       return (881);
   if(n1 == 772) 
       return (782);
   if(n1 == 782) 
       return (792);
   if(n1 == 792) 
       return (802);
   if(n1 == 802) 
       return (812); 
   if(n1 == 812) 
       return (822);
   if(n1 == 822) 
       return (832); 
   if(n1 == 832) 
       return (842); 
   if(n1 == 842) 
       return (852); 
   if(n1 == 852) 
       return (862); 
   if(n1 == 862) 
       return (872); 
   if(n1 == 872) 
       return (882); 
   return (0);       
  }    
//+------------------------------------------------------------------+
//| Ôóíêöèÿ âû÷èñëåíèå ìàãè÷åñêîãî íîìåðà ïî íîìåðó óðîâíÿ           |
//+------------------------------------------------------------------+
int getNum(int dir, int level)
  {
   if(dir == 1)
     {
       //äëÿ ëîíãîâ
       if(level == 1) 
           return(771);
       if(level == 2) 
           return(781);
       if(level == 3) 
           return(791);
       if(level == 4) 
           return(801);
       if(level == 5) 
           return(811);
       if(level == 6) 
           return(821);
       if(level == 7) 
           return(831);
       if(level == 8) 
           return(841);
       if(level == 9) 
           return(851);
       if(level == 10) 
           return(861);
       if(level == 11) 
           return(871);
       if(level == 12) 
           return(881);
     } 
   else 
     {
       if(level == 1) 
           return(772);
       if(level == 2) 
           return(782);
       if(level == 3) 
           return(792);
       if(level == 4) 
           return(802);
       if(level == 5) 
           return(812);
       if(level == 6) 
           return(822);
       if(level == 7) 
           return(832);
       if(level == 8) 
           return(842);
       if(level == 9) 
           return(852);        
       if(level == 10) 
           return(862);        
       if(level == 11) 
           return(872);        
       if(level == 12) 
           return(882);        
     }     
  }     
//+------------------------------------------------------------------+
//| Ôóíêöèÿ ìîäèôèêàöèè îòëîæåííîãî îðäåðà                           |
//+------------------------------------------------------------------+
// çäåñü ïîëó÷àåì âû÷èñëåííûå öåíû îòêðûòèÿ è òýéêïðîôèòà äëÿ 
// îòëîæåííûõ îðäåðîâ è åñëè îíè îòëè÷àþòñÿ îò öåí ìîäèôèöèðóåìîãî 
// îðäåðà, èçìåíÿåì èõ.
int modOrder(int num, double oprice, double prprice)
  {
   int t, cnt1, err, start;
   bool tic;
   double p1, p2;
   t = OrdersTotal();
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == num)
         { 
           if((OrderOpenPrice() != oprice || OrderTakeProfit() != prprice) && 
               oprice != 0) 
             {     
               if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLLIMIT)
                 {
                   p1 = oprice;
                   p2 = prprice;
                   NormalizeDouble(p2, MarketInfo(Symbol(), MODE_DIGITS));
                   NormalizeDouble(p1, MarketInfo(Symbol(), MODE_DIGITS));
                   if(NormalizeDouble(OrderOpenPrice(), Digits) != 
                      NormalizeDouble(p1, Digits) || 
                      NormalizeDouble(OrderTakeProfit(), Digits) != 
                      NormalizeDouble(p2, Digits)) 
                     {                  
                       start = GetTickCount();
                       tic = OrderModify(OrderTicket(), p1, 0, p2, 0, Green);
                       if(ShowLog)
                         {
                           Print("ìîäèô BUYSTOP ", OrderOpenPrice(), "->", p1,
                                 " t/p ", OrderTakeProfit(), "->", p2);
                           Print("Âðåìÿ ìîäèôèêàöèè ", (GetTickCount() - start) / 1000,
                                 " ñåêóíä.");  
                         }
                       if(tic) 
                           PlaySound("alert.wav");                    
                       if(!tic) 
                         {
                           err = GetLastError(); 
                           Print("Îøèáêà = ", err, " (", ErrorDescription(err), ")");
                         }                     
                       Sleep(timeOut);
                     }
                 }
               if(OrderType() == OP_SELLSTOP || OrderType() == OP_BUYLIMIT)
                 {
                   p1 = oprice;
                   p2 = prprice;
                   NormalizeDouble(p2, MarketInfo(Symbol(), MODE_DIGITS));
                   NormalizeDouble(p1, MarketInfo(Symbol(), MODE_DIGITS));
                   if(NormalizeDouble(OrderOpenPrice(), Digits) != 
                      NormalizeDouble(p1, Digits) || 
                      NormalizeDouble(OrderTakeProfit(), Digits) != 
                      NormalizeDouble(p2, Digits)) 
                     { 
                       start = GetTickCount();
                       tic = OrderModify(OrderTicket(), p1, 0, p2, 0, Green);
                       if(ShowLog)
                         {
                           Print("ìîäèô SELLSTOP ", OrderOpenPrice(), "->", p1, 
                                 " t/p ", OrderTakeProfit(),"->", p2);
                           Print("Âðåìÿ ìîäèôèêàöèè ", (GetTickCount() - start) / 1000,
                                 " ñåêóíä.");  
                         }
                       if(tic) 
                           PlaySound("alert.wav");                      
                       if(!tic) 
                         {
                           err = GetLastError(); 
                           Print("Îøèáêà = ", err, " (", ErrorDescription(err), ")");
                         }                       
                       Sleep(timeOut);
                     }                       
                 }              
             }            
         }
     }  
   return (1);      
  }    
//+------------------------------------------------------------------+
//| Ôóíêöèÿ ïîäñ÷åòà ïðîôèòà ïî ïîçèöèÿì â çàâèñèìîñòè îò ðåæèìà: ïðè|
//| mode=1 òîëüêî äëÿ òåêóùåãî èíñòðóìåíòà, ïðè ëþáîì äðóãîì äëÿ âñåõ|
//| ïîçèöèé ñ÷åòà                                                    |
//+------------------------------------------------------------------+
double getAllProfit(int mode)
  {
   int t, cnt1;
   double pf;
   t = OrdersTotal();
   pf = 0;
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(mode == 1)
         {      
           if(OrderSymbol() == Symbol() && (OrderType() == OP_BUY || 
              OrderType() == OP_SELL))
             {
               pf = pf + OrderProfit() + OrderSwap() + OrderCommission();           
             }
         } 
       else 
         {
           if(mode == 2 && OrderSymbol() == Symbol() && OrderType() == OP_BUY) 
             {
               pf = pf + OrderProfit() + OrderSwap() + OrderCommission();
             }
           if(mode == 3 && OrderSymbol() == Symbol() && OrderType() == OP_SELL)
             {
               pf = pf + OrderProfit() + OrderSwap() + OrderCommission();                        
             }   
         }
     }  
   return (pf);           
  }
//+------------------------------------------------------------------+
//| Ïðè ëþáîì äðóãîì äëÿ âñåõ ïîçèöèé ñ÷åòà                          |
//+------------------------------------------------------------------+
double getDayProfit(int mode, int dayShift)
  {
   int t, cnt1, cyear, cmonth, cday;
   double pf;
   datetime ctm;
   t = HistoryTotal();
   pf = 0;
   for(cnt1 = 0; cnt1 < t; cnt1++)
     {
       OrderSelect(cnt1, SELECT_BY_POS, MODE_HISTORY);
       ctm = OrderCloseTime();
       cyear = TimeYear(ctm);
       cmonth = TimeMonth(ctm);
       cday = TimeDay(ctm);
       if(cyear == Year() && cmonth == Month() && cday == (Day() - dayShift))
         {                 
           if(mode == 1)
             {      
               //ïðèáûëü ïî ëîíãàì è øîðòàì
               if(OrderType() == OP_BUY || OrderType() == OP_SELL) 
                 {
                   pf = pf + OrderProfit() + OrderSwap() + OrderCommission();           
                 }
             } 
           else 
             {
               if(mode == 2 && OrderType() == OP_BUY) 
                 { 
                   //ïðèáûëü òîëüêî ïî ëîíãàì
                   pf = pf + OrderProfit() + OrderSwap() + OrderCommission();
                 }
               if(mode == 3 && OrderType() == OP_SELL)
                 { 
                   //ïðèáûëü òîëüêî ïî øîðòàì
                   pf = pf + OrderProfit() + OrderSwap() + OrderCommission();                        
                 }   
             }      
         } 
     }  
   return (pf);           
  }
//+------------------------------------------------------------------+
//|  Ðàñ÷åò öåíû, ïî êîòîðîé âûñòàâëÿåòñÿ îðäåð SellStop             |
//+------------------------------------------------------------------+
double setPriceSellStop()
  {
   double topPrice, PriceSetka, HighestPriceInRange;
   int NumPoloski, NumBarsAfterOpenedOrder;
   datetime OpenOrderTime;
   if(mode_work == 0)
     {
       topPrice = getOrderPriceByNum(getMaxShortNum());
       OpenOrderTime = getOrderOpenTimeByNum(getMaxShortNum());
     }
   if(mode_work ==1 )
     {
       topPrice = getOrderPriceByNum(getMaxLongNum());
       OpenOrderTime = getOrderOpenTimeByNum(getMaxLongNum());
     }
   NumBarsAfterOpenedOrder = iBarShift(NULL, 0, OpenOrderTime, false);         
   HighestPriceInRange = Highest(NULL, 0, MODE_HIGH, NumBarsAfterOpenedOrder, 0);
// íîìåð ïîëîñêè ïîä òåêóùåé öåíîé BID
   NumPoloski = MathAbs(MathFloor((Bid - topPrice) / (Step*Point)));
// çíà÷åíèå öåíû, ñîîòâåòñòâóþùåå ýòîé ïîëîñêå 
   PriceSetka = topPrice + NumPoloski*Step*Point;
   if(HighestPriceInRange < PriceSetka + Step*Point && 
      PriceSetka >= topPrice + Step*Point && Bid > topPrice)   
     {
       return(NormalizeDouble(PriceSetka - Step*Point, Digits));
     }                
  }
//+------------------------------------------------------------------+
//| Ðàñ÷åò öåíû, ïî êîòîðîé âûñòàâëÿåòñÿ îðäåð BuyStop               |
//+------------------------------------------------------------------+
double setPriceBuyStop()
  {
   double lowPrice, PriceSetka, LowestPriceInRange;
   int NumPoloski, NumBarsAfterOpenedOrder;
   datetime OpenOrderTime;
   if(mode_work == 0)
     {         
       lowPrice = getOrderPriceByNum(getMaxLongNum());
       OpenOrderTime = getOrderOpenTimeByNum(getMaxLongNum());
     }
   if(mode_work == 1)
     {
       lowPrice = getOrderPriceByNum(getMaxShortNum());
       OpenOrderTime = getOrderOpenTimeByNum(getMaxShortNum());
     }
   NumBarsAfterOpenedOrder = iBarShift(NULL, 0, OpenOrderTime, false);         
   LowestPriceInRange = Lowest(NULL, 0, MODE_LOW, NumBarsAfterOpenedOrder, 0);
// íîìåð ïîëîñêè íàä òåêóùåé öåíîé ASK
   NumPoloski = MathAbs(MathFloor((lowPrice - Ask) / (Step*Point)));

   PriceSetka = lowPrice - NumPoloski*Step*Point;
// çíà÷åíèå öåíû, ñîîòâåòñòâóþùåå ýòîé ïîëîñêå    
   if(LowestPriceInRange > PriceSetka - Step*Point && 
      PriceSetka <= lowPrice - Step*Point && Ask < lowPrice)   
     {
       return(NormalizeDouble(PriceSetka + Step*Point,Digits));
     }
  }
//+------------------------------------------------------------------+
//| Ôóíêöèÿ çàêðûòèÿ îðäåðîâ ïî äîñòèæåíèþ ïðîôèòà                   |
//+------------------------------------------------------------------+
bool getProfitOrdersClose()
  {
   int cnt1, err, tic1,tic2, LotBy, LotBy1, i;
   bool ticdone;    
   int T_sell[10], T_buy[10], a;  
   a = 0;
   for(cnt1 = 0; cnt1 < OrdersTotal(); cnt1++)
     {
       //ïðîâåðÿåì, ìîæíî ëè çàêðûòü âñòðå÷íûå îðäåðà áåç ïîòåðè ñïðåäà
       OrderSelect(cnt1, SELECT_BY_POS);         
       tic1 = OrderTicket(); 
       LotBy = OrderLots();
       if(OrderType() == OP_SELL)
         {           
           for(i = 0; i < OrdersTotal(); i++)
             {
               OrderSelect(i, SELECT_BY_POS);             
               tic2 = OrderTicket(); 
               LotBy1 = OrderLots();
               if(OrderType() == OP_BUY && LotBy == LotBy1 && 
                  OrderSelect(tic1, SELECT_BY_TICKET) && 
                  OrderSelect(tic2, SELECT_BY_TICKET))
                 {                
                   T_sell[a] = tic1;
                   T_buy[a] = tic2;                    
                   a++;
                 }
             }
         }
     } 
   for(cnt1 = 0; cnt1 < a; cnt1++)
     {
       // çàêðûâàåì âñòðå÷íûå îðäåðà
       if(OrderSelect(T_sell[cnt1], SELECT_BY_TICKET) && 
          OrderSelect(T_buy[cnt1], SELECT_BY_TICKET))
         {
           ticdone = OrderCloseBy(T_sell[cnt1], T_buy[cnt1], Green);        
           if(!ticdone)
             {
               err = GetLastError(); 
               Print("Îøèáêà çàêðûòèÿ âñòðå÷íîãî îðäåðà = ", ErrorDescription(err), 
                     "¹ òèêåòà (sell)= ", T_sell[cnt1], "¹ òèêåòà (buy)= ", T_buy[cnt1]);
             }            
         }
     }   
   for(cnt1 = OrdersTotal(); cnt1 >= 0; cnt1--)
     {
       // çàêðûâàåì âñå îñòàâøèåñÿ îðäåðà
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if(OrderSymbol() == Symbol())
         {
           if(OrderType() == OP_BUY)
             {
               ticdone = OrderClose(OrderTicket(), OrderLots(), Ask, 5, Green);
               if(ticdone) 
                   PlaySound("timeout.wav");
               if(!ticdone)
                 {
                   err = GetLastError(); 
                   if(err != 0) 
                   Print("Îøèáêà çàêðûòèÿ îðäåðà = ", ErrorDescription(err));
                 }            
             }
           if(OrderType() == OP_SELL)
             {
               ticdone = OrderClose(OrderTicket(), OrderLots(), Bid, 5, Green);
               if(ticdone) 
                   PlaySound("timeout.wav");
               if(!ticdone)
                 {
                   err = GetLastError(); 
                   if(err != 0) 
                       Print("Îøèáêà çàêðûòèÿ îðäåðà = ", ErrorDescription(err));
                 }           
             }
         }
     }  
   return (False);       
  }
//+------------------------------------------------------------------+
//| Âçâåøåííàÿ öåíà äëÿ âñåõ ïîçèöèé â îäíó ñòîðîíó äëÿ âû÷èñëåíèÿ   |
//| çíà÷åíèÿ òåéêïðîôèòà âñåé ñåðèè                                  |
//+------------------------------------------------------------------+
double getSumWeightedPrice(int mode)
  {
   int i;
   double sumWeightedPrice;
   for(i=0;i<=OrdersTotal();i++)
     {
       OrderSelect(i,SELECT_BY_POS);
       if(OrderType() == OP_BUY && mode == 1)
         {
           sumWeightedPrice = sumWeightedPrice + OrderLots()*OrderOpenPrice();
         }
       if(OrderType() == OP_SELL && mode == 2)
         {
           sumWeightedPrice = sumWeightedPrice+OrderLots()*OrderOpenPrice();
         }   
      }
   return(sumWeightedPrice);
  }
//+------------------------------------------------------------------+
//| Îïðåäåëåíèå öåíû çàêðûòèÿ âñåõ îðäåðîâ, íåîáõîäèìîé äëÿ          |
//| âûñòàâëåíèÿ òåéêïðîôèòîâ è ñòîïëîññîâ äëÿ îðäåðîâ                |
//+------------------------------------------------------------------+
double getOptimalTakeProfit(double multiplier, bool SELL_BUY)
  {
//ñ ó÷åòîì îòêðûòîãî ïðîòèâîïîëîæíîãî ïëå÷à
   double TempOptimalTP, TempOptimalTP_sell, TempOptimalTP_buy, NeedTP_points, lots;
   int i;
   double profit_money, price_tick;    
   profit_money = AccountBalance()*ProfitPercent*multiplier / 100;
   price_tick = MarketInfo(Symbol(), MODE_TICKVALUE);
// íåîáõîäèìîå êîëè÷åñòâî ïóíêòîâ (ïðè ëîòå=1) äëÿ äîñòèæåíèÿ ïðîôèòà
   NeedTP_points = profit_money*Point / price_tick;
   lots = getBuyLotsSum(1) + getSellLotsSum(1);
   if(getSellLotsSum(1) != 0)   
     {
       TempOptimalTP_sell = (getSumWeightedPrice(2) - NeedTP_points) / getSellLotsSum(1);
     }
   else 
     {
       // áåç ó÷åòà îòêðûòîãî ïðîòèâîïîëîæíîãî ïëå÷à
       TempOptimalTP_sell = 0;
     }
   if(getBuyLotsSum(1) != 0)   
     {
       TempOptimalTP_buy = (getSumWeightedPrice(1) + NeedTP_points) / getBuyLotsSum(1);
     }
   else 
     {
       // áåç ó÷åòà îòêðûòîãî ïðîòèâîïîëîæíîãî ïëå÷à
       TempOptimalTP_buy = 0;
     }             
   if(!SELL_BUY)
     {  
       if(getBuyLotsSum(1) == getSellLotsSum(1))
         {
           TempOptimalTP = TempOptimalTP_buy;
         }
       else
         {  
           if(lots != 0)
             {
               TempOptimalTP = (TempOptimalTP_buy*getBuyLotsSum(1) + 
                                TempOptimalTP_sell*getSellLotsSum(1) + 
                                NeedTP_points) / lots;
             }
           else 
             {
               TempOptimalTP = 0;
             }
         }                 
       //ñ ó÷åòîì îòêðûòîãî ïðîòèâîïîëîæíîãî ïëå÷à
       return(NormalizeDouble(TempOptimalTP_buy, Digits));
     }
   if(SELL_BUY)
     {  
       if(getBuyLotsSum(1) == getSellLotsSum(1))
         {
           TempOptimalTP = TempOptimalTP_sell;
         }
       else
         {  
           if(lots != 0)
             {
               TempOptimalTP = (TempOptimalTP_buy*getBuyLotsSum(1) + 
                                TempOptimalTP_sell*getSellLotsSum(1) - 
                                NeedTP_points) / lots;
             }
           else 
             {
               TempOptimalTP = 0;
             }
         }                
       //ñ ó÷åòîì îòêðûòîãî ïðîòèâîïîëîæíîãî ïëå÷à
       return(NormalizeDouble(TempOptimalTP_sell,Digits));           
     }           
  }   
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void setPendingOrders(int mode)
  {
   int i, start, err;
   bool ticket;
   double lot;
// ïðîáîéíûé ðåæèì
   if(mode == 0)
     {
       //âûñòàâëÿåì îðäåðà äëÿ ëîíãîâ
       if(getTopLevel(1) < maxLevel && !isMgNum(100))
         {   
           for(i = 1; i < 12; i++)
             {
               if(getTopLevel(1) == i && isMgNum(getNum(1, i+1)) == False && 
                  isOrderActive(getNum(1, i)) == True && setPriceBuyStop() != 0 &&
                  getOrderPriceByNum(getMaxLongNum()) != setPriceBuyStop()) 
                 {
                   start = GetTickCount();                                  
                   ticket = OrderSend(Symbol(), OP_BUYSTOP, 
                                      getLotByLevel(getTopLevel(1) + 1),
                                      setPriceBuyStop(), 3, 0, 0,
                                      StringConcatenate(i + 1, " ëîíã"), 
                                      getNum(1, i + 1), 0, Green);
                   if(ShowLog)
                     {
                       Print("Âðåìÿ îòêðûòèÿ îðäåðà ", (GetTickCount() - start) / 1000,
                             " ñåêóíä.");                         
                     }
                   if(ticket) 
                       PlaySound("alert.wav");
                   if(!ticket) 
                     {
                       err = GetLastError(); 
                       Print("Îøèáêà = ", err, " (", ErrorDescription(err), ")");
                     }                
                   return(1);
                 } 
             }
         } 
       //âûñòàâëÿåì îðäåðà äëÿ øîðòîâ
       if(getTopLevel(2) < maxLevel && !isMgNum(101))
         {    
           for(i = 1; i < 12; i++)
             {
               if(getTopLevel(2) == i && isMgNum(getNum(0, i + 1)) == False && 
                  isOrderActive(getNum(0, i)) == True && setPriceSellStop() != 0 && 
                  getOrderPriceByNum(getMaxShortNum()) != setPriceSellStop()) 
                 {
                   start = GetTickCount();                 
                   ticket = OrderSend(Symbol(), OP_SELLSTOP, 
                                      getLotByLevel(getTopLevel(2) + 1),
                                      setPriceSellStop(), 3, 0, 0,
                                      StringConcatenate(i + 1, " øîðò"),
                                      getNum(0, i + 1), 0, Red);                 
                   if(ShowLog)
                     {
                       Print("Âðåìÿ îòêðûòèÿ îðäåðà ", (GetTickCount() - start) / 1000,
                             " ñåêóíä.");                        
                     }
                   if(ticket) 
                       PlaySound("alert.wav");
                   if(!ticket) 
                     {
                       err = GetLastError(); 
                       Print("Îøèáêà = ", err, " (", ErrorDescription(err), ")");
                     }                
                   return(1);
                 } 
             }
         }
     }      
// îòáîéíûé ðåæèì
   if(mode == 1)
     {
       //âûñòàâëÿåì îðäåðà äëÿ ëîíãîâ
       if(getTopLevel(1) < maxLevel)
         {   
           for(i = 1; i < 12; i++)
             {
               if(getTopLevel(2) == i && isMgNum(getNum(0, i + 1)) == False && 
                  isOrderActive(getNum(0, i)) == True && setPriceBuyStop() != 0 && 
                  getOrderPriceByNum(getMaxShortNum())!= setPriceBuyStop()) 
                 {
                   //÷òîáû íå áûëî ëîêîâ - getTopLevel(1)
                   start = GetTickCount();
                   lot = getLotByLevel(getTopLevel(1) + 1);
                   if(lot > MarketInfo(Symbol(), MODE_MAXLOT)) 
                     {
                       lot = MarketInfo(Symbol(), MODE_MAXLOT);
                     }
                   ticket = OrderSend(Symbol(), OP_SELLLIMIT, lot, setPriceBuyStop(),
                                      3, 0, 0, StringConcatenate(i + 1, " øîðò"), 
                                      getNum(0,i+1),0,Green);
                   if(ShowLog)
                     {
                       Print("Âðåìÿ îòêðûòèÿ îðäåðà ", (GetTickCount() - start) / 1000,
                             " ñåêóíä.");                         
                     }
                   if(ticket) 
                       PlaySound("alert.wav");
                   if(!ticket) 
                     {
                       err = GetLastError(); 
                       Print("Îøèáêà = ", err, " (", ErrorDescription(err), ")");
                     }                
                   return(1);
                 } 
             }
         } 
       //âûñòàâëÿåì îðäåðà äëÿ øîðòîâ
       if(getTopLevel(2) < maxLevel)
         {    
           for(i = 1; i < 12; i++)
             {
               if(getTopLevel(1) == i && isMgNum(getNum(1, i + 1)) == False && 
                  isOrderActive(getNum(1, i)) == True && setPriceSellStop() != 0 && 
                  getOrderPriceByNum(getMaxLongNum()) != setPriceSellStop()) 
                 {
                   start = GetTickCount();                 
                   // ÷òîáû íå áûëî ëîêîâ - getTopLevel(2)
                   lot = getLotByLevel(getTopLevel(2) + 1);
                   if(lot > MarketInfo(Symbol(), MODE_MAXLOT)) 
                     {
                       lot = MarketInfo(Symbol(), MODE_MAXLOT);
                     }
                   ticket = OrderSend(Symbol(), OP_BUYLIMIT, lot, setPriceSellStop(), 
                                      3, 0, 0, StringConcatenate(i + 1, " ëîíã"), 
                                      getNum(1, i + 1), 0, Red);                
                   if(ShowLog)
                     {
                       Print("Âðåìÿ îòêðûòèÿ îðäåðà ", (GetTickCount() - start) / 1000, 
                             " ñåêóíä.");                        
                     }
                   if(ticket) 
                       PlaySound("alert.wav");
                   if(!ticket) 
                     {
                       err = GetLastError(); 
                       Print("Îøèáêà = ", err, " (", ErrorDescription(err), ")");
                     }                
                   return(1);
                 } 
             }
         }
     }      
  }     
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void setTrailingStop(int trailingSL, double multiplier)
  {
   int cnt1, t, s;
   double PriceSL,spread, temp;         
   t = OrdersTotal();
   s = MarketInfo(Symbol(), MODE_SPREAD);
   spread = s*Point;     
   if((AccountEquity() - AccountBalance()) > AccountBalance()*ProfitPercent*multiplier / 100)
     {           
       if(getBuyLotsSum(1) > getSellLotsSum(1))
         {  
           PriceSL = Bid - Point*trailingSL;
           if(mode_work == 0)
             {
               temp = Bid - getOrderPriceByNum(getMaxLongNum());
             }
           else 
             {
               temp = Bid - getOrderPriceByNum(getMaxShortNum());
             }
           if(temp > Point*trailingSL)
             {
               if(OrderStopLoss() < PriceSL && mode_work == 0)
                 { 
                   for(cnt1 = 0; cnt1 < t; cnt1++)
                     {
                       OrderSelect(cnt1, SELECT_BY_POS);
                       if(OrderType() == OP_BUY)
                         {
                           if(PriceSL > Bid)
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                                           OrderStopLoss(), PriceSL, 0, Green);
                             }
                           else 
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                                           PriceSL, OrderTakeProfit(), 0, Green);
                             }
                         }
                       if(OrderType() == OP_SELL)
                         {
                           if(PriceSL > Bid)
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                                           PriceSL + spread, OrderTakeProfit(),
                                           0, Green);
                             }                                
                           else 
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                                           OrderStopLoss(), PriceSL + spread, 0, Green);
                             }
                         }
                     }                       
                 }
               if(OrderStopLoss() > PriceSL && mode_work == 1 || OrderStopLoss() == 0)
                 {  
                   for(cnt1 = 0; cnt1 < t; cnt1++)
                     {
                       OrderSelect(cnt1, SELECT_BY_POS);
                       if(OrderType() == OP_BUY)
                         {
                           if(PriceSL > Bid)
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                                           OrderStopLoss(), PriceSL, 0, Green);
                             }
                           else 
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), PriceSL, 
                                           OrderTakeProfit(), 0, Green);
                             }
                         }
                       if(OrderType() == OP_SELL)
                         {
                           if(PriceSL > Bid)
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                               PriceSL + spread, OrderTakeProfit(), 0, Green);
                             }
                           else 
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                                           OrderStopLoss(), PriceSL + spread, 0, Green);
                             }
                         }
                     }                       
                 }                          
             }                    
         }    
       if(getBuyLotsSum(1) < getSellLotsSum(1))
         {                               
           PriceSL = Ask + Point*trailingSL;
           if(mode_work == 0)
             {
               temp = getOrderPriceByNum(getMaxShortNum()) - Ask;
             }
           else
             {
               temp = getOrderPriceByNum(getMaxLongNum()) - Ask;
             }
           if(temp > Point*trailingSL)
             {                     
               if(OrderStopLoss() > PriceSL || OrderStopLoss() == 0 && mode_work == 0)
                 { 
                   for(cnt1 = 0; cnt1 < t; cnt1++)
                     {
                       OrderSelect(cnt1, SELECT_BY_POS);
                       if(OrderType() == OP_BUY)
                         {
                           if(PriceSL > Ask)
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                                           OrderStopLoss(), PriceSL-spread, 0, Green);
                             }
                           else 
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                                           PriceSL - spread, OrderTakeProfit(), 0, Green);
                             }
                         }
                       if(OrderType() == OP_SELL)
                         {
                           if(PriceSL > Ask)
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), PriceSL,
                                           OrderTakeProfit(), 0, Green);
                             }
                           else 
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                                           OrderStopLoss(), PriceSL, 0, Green);
                             }
                         }
                     }                                                
                 }
               if(OrderStopLoss() < PriceSL && mode_work == 1)
                 { 
                   for(cnt1 = 0; cnt1 < t; cnt1++)
                     {
                       OrderSelect(cnt1, SELECT_BY_POS);
                       if(OrderType() == OP_BUY)
                         {
                           if(PriceSL > Ask)
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                                           OrderStopLoss(), PriceSL - spread, 0, Green);
                             }
                           else 
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                                           PriceSL - spread, OrderTakeProfit(), 0, Green);
                             }
                         }
                       if(OrderType() == OP_SELL)
                         {
                           if(PriceSL > Ask)
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), PriceSL,
                                           OrderTakeProfit(), 0, Green);
                             }
                           else 
                             {
                               OrderModify(OrderTicket(), OrderOpenPrice(), 
                                           OrderStopLoss(), PriceSL, 0, Green);
                             }
                         }
                     }                                                
                 }
             }                     
         }  
     
     }    
  }
//+------------------------------------------------------------------+
//|  Breakdowning martingail™  v 1.0.2                               |
//+------------------------------------------------------------------+
int start()
  {
   double s, spread, Risk, level, LotsDifferent, lot_buy, lot_sell, 
          multiplier, forstep;
   int total, err, i, start, cnt1;   
   string level_str, mode;
   bool ticket; 
   s = MarketInfo(Symbol(), MODE_SPREAD);
   spread = s*Point;   
   total = OrdersTotal();
   LotsDifferent = MathAbs(getBuyLotsSum(1) - getSellLotsSum(1));     
   if(MinMaxStepMode == 0)
     {
       Step = Step;
     }
   if(MinMaxStepMode == 1)
     {
       Step = MathCeil((AccountBalance() - AccountEquity() + 1)*100000 / AccountBalance());
       if(Step < 15)
         {
           Step = 15;
         }
       if(Step > 40)
         {
           Step = 40;
         }
     }
   if(MinMaxStepMode == 2)
     {      
       forstep = MathPow(AccountBalance() / AccountEquity(), 4);
       Step = MathCeil(forstep*15);
     }
   if(AccountEquity() / AccountBalance() < 0.7)
     {
       mode_work = 1;
     }
   else
     {
       mode_work = 0;
     }
// Âêëþ÷åíèå ìàíèìåíåäæìåíòà (âû÷èñëåíèå ëîòîâ)        
   if(MoneyManagement == true && LogariphmicMM == true)
     {              
       Risk = MathCeil(Riskfactor*100 / MathSqrt(AccountBalance()));
       if(Risk > 20) 
           Risk = 20;             
       startLots = MathCeil(AccountBalance()*Risk / 10000) / 10;               
       if(startLots > MarketInfo(Symbol(), MODE_MAXLOT)) 
         {
           startLots = MarketInfo(Symbol(), MODE_MAXLOT);
         }
       if(startLots < MarketInfo(Symbol(), MODE_MINLOT)) 
         {
           startLots = MarketInfo(Symbol(), MODE_MINLOT);
         }
     }
   if(MoneyManagement == true && LogariphmicMM == false)
     {
       startLots = NormalizeDouble(AccountBalance()*Riskfactor / 100000, 1);
       if(startLots > MarketInfo(Symbol(), MODE_MAXLOT)) 
         {
           startLots = MarketInfo(Symbol(), MODE_MAXLOT);
         }
       if(startLots < MarketInfo(Symbol(), MODE_MINLOT)) 
         {
           startLots = MarketInfo(Symbol(), MODE_MINLOT);
         }
     }     
   if(MoneyManagement == false && LogariphmicMM == false)    
     {
       startLots  =startLots;
     }
//Îïðåäåëÿåì, áóäåì ëè èñïîëüçîâàòü OptimalTakePrifit            
   if(OptimalTakeProfit) 
     {
       multiplier = MathSqrt(LotsDifferent);
     }
   if(!OptimalTakeProfit) 
     {
       multiplier = 1;
     }         
//Îïðåäåëÿåì, áóäåì ëè èñïîëüçîâàòü NoTradeBeforeNewDay
   if(getDayProfit(1, 0) > 0 && NoTradeBeforeNewDay)
     {
       TradeAllowed = false;
     }
   if(getDayProfit(1, 0) == 0 && NoTradeBeforeNewDay)
     {
       TradeAllowed = true;
     }
//Ðàñïå÷àòêà ðàçëè÷íîé èíôîðìàöèè íà ýêðàíå       
   if(getBuyLotsSum(1) > getSellLotsSum(1))   
     {
       level = getOptimalTakeProfit(multiplier, false) - spread;
     }
   if(getBuyLotsSum(1) < getSellLotsSum(1))   
     {
       level = getOptimalTakeProfit(multiplier, true) + spread;
     }
   if(level != 0)
     {
       level_str = DoubleToStr(level, Digits);
     }
   else 
     {
       //ðàñïå÷àòêà óðîâíÿ çàêðûòèÿ âñåõ îðäåðîâ
       level_str=" ïîêà íåò, æäåì...";
     }
   if(mode_work == 0)
     {
       mode = "ïðîáîé (îðäåðà BuyStop è SellStop)";
     }
   if(mode_work == 1)
     {
       mode = "îòáîé  (îðäåðà BuyLimit è SellLimit)";
     }
   ObjectSetText("label_object1", StringConcatenate("Ïëàíèðóåìûé óðîâåíü çàêðûòèÿ ñåðèè ïî ",
                 Symbol(), ": ", level_str), 9, "Lucida Console", NavajoWhite);
   ObjectSetText("label_object2", StringConcatenate("Ðåæèì ðàáîòû : ", mode), 9, 
                 "Lucida Console", NavajoWhite);
   Comment("\n", "\n", "\n",
           "    Ïðîôèò ïî ëîíãàì  = ", NormalizeDouble(getAllProfit(2), 2), " $", "\n",
           "    Ïðîôèò ïî øîðòàì = ", NormalizeDouble(getAllProfit(3), 2), " $", "\n",
           "    ---------------------------------------------------", "\n",
           "    Ïðîôèò ñåãîäíÿ     = ", NormalizeDouble(getDayProfit(1, 0), 2), " $", "\n",
           "    Ïðîôèò â÷åðà       = ", NormalizeDouble(getDayProfit(1, 1), 2), " $", "\n",
           "    Ïðîôèò ïîçàâ÷åðà = ", NormalizeDouble(getDayProfit(1, 2), 2), " $", "\n",
           "    ---------------------------------------------------", "\n",
           "    Balance       = ",NormalizeDouble(AccountBalance(),2), " $", "\n",
           "    Equity         = ",NormalizeDouble(AccountEquity(),2), " $", "\n",
           "    Free Margin = ", NormalizeDouble(AccountFreeMargin(),2), " $", "\n",
           "    ---------------------------------------------------", "\n",
           "    Sell Lots = ", getSellLotsSum(1), "   |   Buy Lots = ", getBuyLotsSum(1), "\n",
           "    ---------------------------------------------------", "\n",
           "    Êðåäèòíîå ïëå÷î ñ÷¸òà  1:", AccountLeverage());
// Åñëè òîðãîâëÿ íå ðàçðåøåíà, è íåò ïåðâè÷íûõ îðäåðîâ - âûõîä         
   if(isMgNum(getNum(1, 1)) == False && isMgNum(getNum(1, 1)) == False && !TradeAllowed)
     {
       return;
     }
//âûñòàâëåíèå ïåðâûõ îðäåðîâ ñåðèè, åñëè òàêèõ åùå íåò
   if(isMgNum(getNum(1, 1)) == False && TradeAllowed) 
     {
       start = GetTickCount();
       ticket = OrderSend(Symbol(), OP_BUY, getLotByLevel(1), NormalizeDouble(Ask, Digits), 
                          3, 0, 0, "ïåðâàÿ ëîíã", getNum(1, 1), 0, Green);
       if(ShowLog)
         {
           Print("Îòêðûòèå ïåðâîé ïîçèöèè ñåðèè ëîíãîâ ", Symbol(), " ask= ", Ask, 
                 " ticket=", ticket);
           Print("Âðåìÿ îòêðûòèÿ îðäåðà ", (GetTickCount() - start) / 1000, " ñåêóíä.");  
         }                     
       if(ticket) 
           PlaySound("alert.wav");
       if(!ticket) 
         {
           err = GetLastError(); 
           Print("Îøèáêà = ", err, " (", ErrorDescription(err), ")");
         }                
     }
   if(isMgNum(getNum(0, 1)) == False && TradeAllowed) 
     {
       start = GetTickCount();
       ticket = OrderSend(Symbol(), OP_SELL, getLotByLevel(1), NormalizeDouble(Bid, Digits),
                          3, 0, 0, "ïåðâàÿ øîðò", getNum(0, 1), 0, Green);
       if(ShowLog)
         {
           Print("Îòêðûòèå ïåðâîé ïîçèöèè ñåðèè øîðòîâ ", Symbol(), " Bid= ", Bid, 
                 " ticket=", ticket);
           Print("Âðåìÿ îòêðûòèÿ îðäåðà ", (GetTickCount() - start) / 1000, " ñåêóíä.");  
         }
       if(ticket) 
           PlaySound("alert.wav");               
       if(!ticket) 
         {
           err = GetLastError(); 
           Print("Îøèáêà = ", err, " (", ErrorDescription(err), ")");
         }                
     }            
//âûñòàâëÿåì îòëîæåííûé îðäåð, åñëè åñëè åñòü âîçìîæíîñòü
   setPendingOrders(mode_work);
//ìîäèôèêàöèÿ îòëîæåííûõ îðäåðîâ BuyStop è SellStop (BuyLimit è SellLimit ïðè mode_work = 1)
   if(mode_work == 0)
     {      
       if(getOrderPriceByNum(getNextOrderNum(getMaxShortNum())) < setPriceSellStop() && 
          setPriceSellStop() != 0)
         { 
           //äëÿ øîðòîâ
           modOrder(getNextOrderNum(getMaxShortNum()), setPriceSellStop(), 0);
         }
       if(getOrderPriceByNum(getNextOrderNum(getMaxLongNum())) > setPriceBuyStop() && 
          setPriceBuyStop()!=0)
         { 
           //äëÿ ëîíãîâ
           modOrder(getNextOrderNum(getMaxLongNum()),setPriceBuyStop(),0); 
         }
     }
   if(mode_work == 1)
     {      
       if(getOrderPriceByNum(getNextOrderNum(getMaxLongNum())) < setPriceSellStop() && 
          setPriceSellStop() != 0)
         { 
           modOrder(getNextOrderNum(getMaxLongNum()), setPriceSellStop(), 0);
         }
       if(getOrderPriceByNum(getNextOrderNum(getMaxShortNum())) > setPriceBuyStop() && 
          setPriceBuyStop() != 0)
         { 
           modOrder(getNextOrderNum(getMaxShortNum()), setPriceBuyStop(), 0);
         }
     }
// óñëîâèÿ äëÿ ôèêñàöèè ïðèáûëè
   if(MathAbs(getBuyLotsSum(1) - getSellLotsSum(1)) < 0.2 && 
      (isOrderActive(getNum(0, 2)) || isOrderActive(getNum(1, 2))))
     {
       // åñëè ñóììà ëîòîâ â ðàçíûå ñòîðîíû ïðèìåðíî îäèíàêîâà - 
       // çàêðûâàåì âñòðå÷íûìè îðäåðàìè (îáíóëÿåì íà÷àëüíûé óðîâåíü)
       getProfitOrdersClose();                              
     }
   if(getAllProfit(1) > AccountBalance()*ProfitPercent*multiplier / 100 && TrailingStop == 0)
     {
       //ïðè äîñòèæåíèè íåîáõîäèìîãî ïðîôèòà çàêðûâàåì âñå îðäåðà                              
       getProfitOrdersClose();                              
     }           
   if(TrailingStop != 0)
     {
       // òðåéëèì ïðèáûëü, åñëè îíà åñòü 
       setTrailingStop(TrailingStop, multiplier);
     }
// óäàëåíèå âñåõ ëèøíèõ îðäåðîâ â ñëó÷àå, åñëè ñåðèÿ çàêðûëàñü ïðîôèòîì, 
// ò.å. åñëè íåò îòêðûòûõ îðäåðîâ ïåðâîé ñòóïåíè
// óäàëåíèå ëèøíèõ ëîíãîâ, åñëè íåò îðäåðà ïåðâîé ñòóïåíè           
   if(isOrderActive(getNum(1, 1)) == False)
     {
       for(i = getNum(1, 2); i < getNum(1, 9); i += 10)
         {
           //íà÷èíàåì ïåðåáèðàòü âñå ñî âòîðîãî óðîâíÿ
           deleteOrderNum(i);
         }          
     }           
   if(isOrderActive(getNum(0, 1)) == False)
     {
       //äëÿ øîðòîâ
       for(i = getNum(0, 2); i < getNum(0, 9); i+=10)
         {
           deleteOrderNum(i);
         }          
     }
   return(0);
  }         
//+------------------------------------------------------------------+





Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

It can change open orders parameters, due to possible stepping strategy
It Closes Orders by itself

Other Features:

It plays sound alerts