C:\ChangeInput_Examples\Xupypr\equity_v7_mod.mq4 C:\ChangeInput_Examples\Xupypr\equity_v7_mod_Converted.mq4
1//+------------------------------------------------------------------+ 1//+------------------------------------------------------------------+
2//|                                                    Equity_v7.mq4 | 2//|                                                    Equity_v7.mq4 |
3//|                                         Copyright © 2009, Xupypr | 3//|                                         Copyright © 2009, Xupypr |
4//|                              http://www.mql4.com/ru/users/Xupypr | 4//|                              http://www.mql4.com/ru/users/Xupypr |
5//|                                             Версия от 09.09.2009 | 5//|                                             Версия от 09.09.2009 |
6//|                                 http://codebase.mql4.com/ru/4455 | 6//|                                 http://codebase.mql4.com/ru/4455 |
7//+------------------------------------------------------------------+ 7//+------------------------------------------------------------------+
8#property copyright "Copyright © 2009, Xupypr" 8#property copyright "Copyright © 2009, Xupypr"
9#property link      "http://www.mql4.com/ru/users/Xupypr" 9#property link      "http://www.mql4.com/ru/users/Xupypr"
10  10 
11#property indicator_separate_window 11#property indicator_separate_window
12#property indicator_buffers 4 12#property indicator_buffers 4
13#property indicator_color1 SteelBlue 13#property indicator_color1 SteelBlue
14#property indicator_color2 OrangeRed 14#property indicator_color2 OrangeRed
15#property indicator_color3 SlateGray 15#property indicator_color3 SlateGray
16#property indicator_color4 ForestGreen 16#property indicator_color4 ForestGreen
17#property indicator_width1 1 17#property indicator_width1 1
18#property indicator_width2 2 18#property indicator_width2 2
19#property indicator_width3 1 19#property indicator_width3 1
20#property indicator_width4 1 20#property indicator_width4 1
21  21 
22//------------- Фильтр истории торгов 22//------------- Фильтр истории торгов
23extern bool     Only_Trade=false;   // Учитывать только позиции, исключив пополнение/снятие средств 23extern bool     Only_Trade=false;   // Учитывать только позиции, исключив пополнение/снятие средств
24extern string   Only_Magics="";     // Учитывать только позиции с магическими номерами (через любой разделитель) 24extern string   Only_Magics="";     // Учитывать только позиции с магическими номерами (через любой разделитель)
25extern string   Only_Symbols="";    // Учитывать только позиции по инструментам (через любой разделитель) 25extern string   Only_Symbols="";    // Учитывать только позиции по инструментам (через любой разделитель)
26extern string   Only_Comment="";    // Учитывать только позиции с наличием комментария (например [sl] или [tp]) 26extern string   Only_Comment="";    // Учитывать только позиции с наличием комментария (например [sl] или [tp])
27extern bool     Only_Current=false; // Учитывать только позиции по текущему инструменту 27extern bool     Only_Current=false; // Учитывать только позиции по текущему инструменту
28extern bool     Only_Buys=false;    // Учитывать только позиции на покупку 28extern bool     Only_Buys=false;    // Учитывать только позиции на покупку
29extern bool     Only_Sells=false;   // Учитывать только позиции на продажу 29extern bool     Only_Sells=false;   // Учитывать только позиции на продажу
30  30 
31//------------- Внешний вид индикатора 31//------------- Внешний вид индикатора
32extern bool     Show_Balance=true;  // Отображать баланс 32extern bool     Show_Balance=true;  // Отображать баланс
33extern bool     Show_Margin=false;  // Отображать залог (только в режиме реального времени) 33extern bool     Show_Margin=false;  // Отображать залог (только в режиме реального времени)
34extern bool     Show_Free=false;    // Отображать свободные средства (только в режиме реального времени) 34extern bool     Show_Free=false;    // Отображать свободные средства (только в режиме реального времени)
35extern bool     Show_Info=false;    // Отображать дополнительную информацию о просадках, включая ФВ 35extern bool     Show_Info=false;    // Отображать дополнительную информацию о просадках, включая ФВ
36  36 
37//------------- Настройка сигналов о просадке 37//------------- Настройка сигналов о просадке
38extern double   Alert_Drawdown=0;   // Предупреждать о просадке средств в процентах за период (0 - отключить) 38extern double   Alert_Drawdown=0;   // Предупреждать о просадке средств в процентах за период (0 - отключить)
39extern double   Max_Drawdown=25;    // Максимально допустимая просадка в процентах за период ("красная зона") 39extern double   Max_Drawdown=25;    // Максимально допустимая просадка в процентах за период ("красная зона")
40extern bool     Current_Day=true;   // Просадка будет наблюдаться только за текущий день 40extern bool     Current_Day=true;   // Просадка будет наблюдаться только за текущий день
41extern datetime Begin_Monitoring=D'2009.08.17 00:00'; // Начало наблюдения за просадкой (если Current_Day=false) 41extern datetime Begin_Monitoring=D'2009.08.17 00:00'; // Начало наблюдения за просадкой (если Current_Day=false)
42  42 
43//------------- Другие параметры 43//------------- Другие параметры
44extern bool     File_Write=false;   // Запись данных о эквити и балансе в файл 44extern bool     File_Write=false;   // Запись данных о эквити и балансе в файл
45extern datetime Draw_Begin=D'2001.01.01 00:00'; // Начальная дата отрисовки индикатора 45extern datetime Draw_Begin=D'2001.01.01 00:00'; // Начальная дата отрисовки индикатора
46  46 
47int      DrawBeginBar,Window; 47int      DrawBeginBar,Window;
48string   ShortName,Unique; 48string   ShortName,Unique;
49double   Equity[],Balance[],Margin[],Free[]; 49double   Equity[],Balance[],Margin[],Free[];
50double   StartBalance,CurrentBalance,MaxPeak,MaxProfit; 50double   StartBalance,CurrentBalance,MaxPeak,MaxProfit;
51double   AbsDrawdown,MaxDrawdown,RelDrawdown,Drawdown,RecoveryFactor; 51double   AbsDrawdown,MaxDrawdown,RelDrawdown,Drawdown,RecoveryFactor;
52  52 
53datetime OpenTime_Ticket[][2]; // время открытия и номер тикета 53datetime OpenTime_Ticket[][2]; // время открытия и номер тикета
54int      OpenBar[];            // номер бара открытия 54int      OpenBar[];            // номер бара открытия
55int      CloseBar[];           // номер бара закрытия 55int      CloseBar[];           // номер бара закрытия
56int      Type[];               // тип операции 56int      Type[];               // тип операции
57string   Instrument[];         // инструмент 57string   Instrument[];         // инструмент
58double   Lots[];               // количество лотов 58double   Lots[];               // количество лотов
59double   OpenPrice[];          // цена открытия 59double   OpenPrice[];          // цена открытия
60double   ClosePrice[];         // цена закрытия 60double   ClosePrice[];         // цена закрытия
61double   Commission[];         // комиссия 61double   Commission[];         // комиссия
62double   Swap[];               // накопленный своп 62double   Swap[];               // накопленный своп
63double   CurSwap[];            // текущий своп 63double   CurSwap[];            // текущий своп
64double   DaySwap[];            // дневной своп 64double   DaySwap[];            // дневной своп
65double   Profit[];             // чистая прибыль 65double   Profit[];             // чистая прибыль
66  66 
67//+------------------------------------------------------------------+ 67//+------------------------------------------------------------------+
68//| Custom indicator initialization function                         | 68//| Custom indicator initialization function                         |
69//+------------------------------------------------------------------+ 69//+------------------------------------------------------------------+
70int init()  70int OnInit() 
71{ 71{
72 if (Only_Magics=="" && Only_Symbols=="" && Only_Comment=="" && !Only_Current && !Only_Buys && !Only_Sells) ShortName="Total"; 72 if (Only_Magics=="" && Only_Symbols=="" && Only_Comment=="" && !Only_Current && !Only_Buys && !Only_Sells) ShortName="Total";
73 else 73 else
74 { 74 {
75  if (Only_Magics!="")   ShortName=Only_Magics; else ShortName=""; 75  if (Only_Magics!="")   ShortName=Only_Magics; else ShortName="";
76  if (Only_Symbols!="")  ShortName=StringConcatenate(ShortName," ",Only_Symbols); 76  if (Only_Symbols!="")  ShortName=StringConcatenate(ShortName," ",Only_Symbols);
77  else if (Only_Current) ShortName=StringConcatenate(ShortName," ",Symbol()); 77  else if (Only_Current) ShortName=StringConcatenate(ShortName," ",Symbol());
78  if (Only_Comment!="")  ShortName=StringConcatenate(ShortName," ",Only_Comment); 78  if (Only_Comment!="")  ShortName=StringConcatenate(ShortName," ",Only_Comment);
79  if (Only_Sells) Only_Buys=false; 79  if (Only_Sells) Only_Buys=false;
80  if (Only_Buys)  ShortName=StringConcatenate(ShortName," Buys"); 80  if (Only_Buys)  ShortName=StringConcatenate(ShortName," Buys");
81  if (Only_Sells) ShortName=StringConcatenate(ShortName," Sells"); 81  if (Only_Sells) ShortName=StringConcatenate(ShortName," Sells");
82 } 82 }
83 if (Only_Trade) ShortName=StringConcatenate(ShortName," Zero"); 83 if (Only_Trade) ShortName=StringConcatenate(ShortName," Zero");
84 SetIndexBuffer(0,Equity); 84 SetIndexBuffer(0,Equity);
85 SetIndexLabel(0,ShortName+" Equity"); 85 SetIndexLabel(0,ShortName+" Equity");
86 SetIndexStyle(0,DRAW_LINE); 86 SetIndexStyle(0,DRAW_LINE);
87 SetIndexBuffer(1,Balance); 87 SetIndexBuffer(1,Balance);
88 SetIndexLabel(1,ShortName+" Balance"); 88 SetIndexLabel(1,ShortName+" Balance");
89 SetIndexStyle(1,DRAW_LINE); 89 SetIndexStyle(1,DRAW_LINE);
90 SetIndexBuffer(2,Margin); 90 SetIndexBuffer(2,Margin);
91 SetIndexLabel(2,ShortName+" Margin"); 91 SetIndexLabel(2,ShortName+" Margin");
92 SetIndexStyle(2,DRAW_LINE); 92 SetIndexStyle(2,DRAW_LINE);
93 SetIndexBuffer(3,Free); 93 SetIndexBuffer(3,Free);
94 SetIndexLabel(3,ShortName+" Free"); 94 SetIndexLabel(3,ShortName+" Free");
95 SetIndexStyle(3,DRAW_LINE); 95 SetIndexStyle(3,DRAW_LINE);
96                   ShortName=StringConcatenate(ShortName," Equity"); 96                   ShortName=StringConcatenate(ShortName," Equity");
97 if (Show_Balance) ShortName=StringConcatenate(ShortName," Balance"); 97 if (Show_Balance) ShortName=StringConcatenate(ShortName," Balance");
98 if (Show_Margin)  ShortName=StringConcatenate(ShortName," Margin"); 98 if (Show_Margin)  ShortName=StringConcatenate(ShortName," Margin");
99 if (Show_Free)    ShortName=StringConcatenate(ShortName," Free"); 99 if (Show_Free)    ShortName=StringConcatenate(ShortName," Free");
100 Unique=DoubleToStr(GetTickCount()+MathRand(),0); 100 Unique=DoubleToStr(GetTickCount()+MathRand(),0);
101 DrawBeginBar=iBarShift(NULL,0,Draw_Begin); 101 DrawBeginBar=iBarShift(NULL,0,Draw_Begin);
102 IndicatorDigits(2); 102 IndicatorDigits(2);
103 return(0); 103 return(0);
104} 104}
105//+------------------------------------------------------------------+ 105//+------------------------------------------------------------------+
106//|  Custom indicator deinitialization function                      | 106//|  Custom indicator deinitialization function                      |
107//+------------------------------------------------------------------+ 107//+------------------------------------------------------------------+
108int deinit()  108int OnDeinit( const int reason ) 
109{ 109{
110 DeleteAll(); 110 DeleteAll();
111 return(0); 111 return(0);
112} 112}
113//+------------------------------------------------------------------+ 113//+------------------------------------------------------------------+
114//| Custom indicator iteration function                              | 114//| Custom indicator iteration function                              |
115//+------------------------------------------------------------------+ 115//+------------------------------------------------------------------+
116int start()  116int OnCalculate(const int rates_total, 
  117                const int prev_calculated,  
  118                const datetime &time2[],  
  119                const double &open[],  
  120                const double &high[],  
  121                const double &low[],  
  122                const double &close[],  
  123                const long &tick_volume[],  
  124                const long &volume[],  
  125                const int &spread2[])  
117{ 126{
118 static int anumber=-1; 127 static int anumber=-1;
119 static bool first; 128 static bool first;
120 static string minfosymbols; 129 static string minfosymbols;
121 string filename,text,date,time; 130 string filename,text,date,time;
122 double profitloss,spread,lotsize; 131 double profitloss,spread,lotsize;
123 int handle,bar,i,j,start,total,historytotal,opentotal;//startbar, 132 int handle,bar,i,j,start,total,historytotal,opentotal;//startbar,
124 //int tick=GetTickCount(); 133 //int tick=GetTickCount();
125  134 
126 if (anumber!=AccountNumber()) 135 if (anumber!=AccountNumber())
127 { 136 {
128  DeleteAll(); 137  DeleteAll();
129  IndicatorShortName(Unique); 138  IndicatorShortName(Unique);
130  Window=WindowFind(Unique); 139  Window=WindowFind(Unique);
131  IndicatorShortName(ShortName); 140  IndicatorShortName(ShortName);
132  ArrayInitialize(Balance,EMPTY_VALUE); 141  ArrayInitialize(Balance,EMPTY_VALUE);
133  ArrayInitialize(Equity,EMPTY_VALUE); 142  ArrayInitialize(Equity,EMPTY_VALUE);
134  ArrayInitialize(Margin,EMPTY_VALUE); 143  ArrayInitialize(Margin,EMPTY_VALUE);
135  ArrayInitialize(Free,EMPTY_VALUE); 144  ArrayInitialize(Free,EMPTY_VALUE);
136  anumber=AccountNumber(); 145  anumber=AccountNumber();
137  minfosymbols=""; 146  minfosymbols="";
138  first=true; 147  first=true;
139 } 148 }
140 if (!OrderSelect(0,SELECT_BY_POS,MODE_HISTORY)) return(0); 149 if (!OrderSelect(0,SELECT_BY_POS,MODE_HISTORY)) return(0);
141 if (first) 150 if (first)
142 { 151 {
143  first=false; 152  first=false;
144  MaxPeak=0.0; 153  MaxPeak=0.0;
145  MaxProfit=0.0; 154  MaxProfit=0.0;
146  AbsDrawdown=0.0; 155  AbsDrawdown=0.0;
147  MaxDrawdown=0.0; 156  MaxDrawdown=0.0;
148  RelDrawdown=0.0; 157  RelDrawdown=0.0;
149  if (Period()>PERIOD_D1) 158  if (Period()>PERIOD_D1)
150  { 159  {
151   Alert("Период не может быть больше D1");   160   Alert("Период не может быть больше D1");
152   return(0); 161   return(0);
153  } 162  }
154  historytotal=OrdersHistoryTotal(); 163  historytotal=OrdersHistoryTotal();
155  opentotal=OrdersTotal(); 164  opentotal=OrdersTotal();
156  total=historytotal+opentotal; 165  total=historytotal+opentotal;
157  ArrayResize(OpenTime_Ticket,total); 166  ArrayResize(OpenTime_Ticket,total);
158  for (i=0;i<historytotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 167  for (i=0;i<historytotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
159  { 168  {
160   if (Select()) 169   if (Select())
161   { 170   {
162    OpenTime_Ticket[i][0]=OrderOpenTime(); 171    OpenTime_Ticket[i][0]=OrderOpenTime();
163    OpenTime_Ticket[i][1]=OrderTicket(); 172    OpenTime_Ticket[i][1]=OrderTicket();
164   } 173   }
165   else 174   else
166   { 175   {
167    OpenTime_Ticket[i][0]=EMPTY_VALUE; 176    OpenTime_Ticket[i][0]=EMPTY_VALUE;
168    total--; 177    total--;
169   } 178   }
170  } 179  }
171  if (opentotal>0) 180  if (opentotal>0)
172  { 181  {
173   for (i=0;i<opentotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 182   for (i=0;i<opentotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
174   { 183   {
175    if (Select()) 184    if (Select())
176    { 185    {
177     OpenTime_Ticket[historytotal+i][0]=OrderOpenTime(); 186     OpenTime_Ticket[historytotal+i][0]=OrderOpenTime();
178     OpenTime_Ticket[historytotal+i][1]=OrderTicket(); 187     OpenTime_Ticket[historytotal+i][1]=OrderTicket();
179    } 188    }
180    else 189    else
181    { 190    {
182     OpenTime_Ticket[historytotal+i][0]=EMPTY_VALUE; 191     OpenTime_Ticket[historytotal+i][0]=EMPTY_VALUE;
183     total--; 192     total--;
184    } 193    }
185   } 194   }
186  } 195  }
187  ArraySort(OpenTime_Ticket); 196  ArraySort(OpenTime_Ticket);
188  ArrayResize(OpenTime_Ticket,total); 197  ArrayResize(OpenTime_Ticket,total);
189  ArrayResize(OpenBar,total); 198  ArrayResize(OpenBar,total);
190  ArrayResize(CloseBar,total); 199  ArrayResize(CloseBar,total);
191  ArrayResize(Type,total); 200  ArrayResize(Type,total);
192  ArrayResize(Lots,total); 201  ArrayResize(Lots,total);
193  ArrayResize(Instrument,total); 202  ArrayResize(Instrument,total);
194  ArrayResize(OpenPrice,total); 203  ArrayResize(OpenPrice,total);
195  ArrayResize(ClosePrice,total); 204  ArrayResize(ClosePrice,total);
196  ArrayResize(Commission,total); 205  ArrayResize(Commission,total);
197  ArrayResize(Swap,total); 206  ArrayResize(Swap,total);
198  ArrayResize(CurSwap,total); 207  ArrayResize(CurSwap,total);
199  ArrayResize(DaySwap,total); 208  ArrayResize(DaySwap,total);
200  ArrayResize(Profit,total); 209  ArrayResize(Profit,total);
201  for (i=0;i<total;i++) if (OrderSelect(OpenTime_Ticket[i][1],SELECT_BY_TICKET)) ReadOrder(i); 210  for (i=0;i<total;i++) if (OrderSelect(OpenTime_Ticket[i][1],SELECT_BY_TICKET)) ReadOrder(i);
202  if (Type[0]<6 && !Only_Trade) 211  if (Type[0]<6 && !Only_Trade)
203  { 212  {
204   Alert("История сделок загружена не полностью"); 213   Alert("История сделок загружена не полностью");
205   return(0); 214   return(0);
206  } 215  }
207  if (File_Write) 216  if (File_Write)
208  { 217  {
209   filename=StringConcatenate(AccountNumber(),"_",Period(),".csv"); 218   filename=StringConcatenate(AccountNumber(),"_",Period(),".csv");
210   handle=FileOpen(filename,FILE_CSV|FILE_WRITE); 219   handle=FileOpen(filename,FILE_CSV|FILE_WRITE);
211   if (handle<0) Alert("Ошибка #",GetLastError()," при открытии файла"); 220   if (handle<0) Alert("Ошибка #",GetLastError()," при открытии файла");
212   else if (FileWrite(handle,"Date","Time","Equity","Balance")<1) Print("Ошибка #",GetLastError()," при записи в файл"); 221   else if (FileWrite(handle,"Date","Time","Equity","Balance")<1) Print("Ошибка #",GetLastError()," при записи в файл");
213  } 222  }
214  start=0; 223  start=0;
215  StartBalance=0.0; 224  StartBalance=0.0;
216  CurrentBalance=0.0; 225  CurrentBalance=0.0;
217  for (i=OpenBar[0];i>=0;i--) 226  for (i=OpenBar[0];i>=0;i--)
218  { 227  {
219   profitloss=0.0; 228   profitloss=0.0;
220   for (j=start;j<total;j++) 229   for (j=start;j<total;j++)
221   { 230   {
222    if (OpenBar[j]<i) break; 231    if (OpenBar[j]<i) break;
223    if (CloseBar[start]>i) start++; 232    if (CloseBar[start]>i) start++;
224    if (CloseBar[j]==i && ClosePrice[j]!=0) CurrentBalance+=Swap[j]+Commission[j]+Profit[j]; 233    if (CloseBar[j]==i && ClosePrice[j]!=0) CurrentBalance+=Swap[j]+Commission[j]+Profit[j];
225    else if (OpenBar[j]>=i && CloseBar[j]<=i) 234    else if (OpenBar[j]>=i && CloseBar[j]<=i)
226    { 235    {
227     if (Type[j]>5) 236     if (Type[j]>5)
228     { 237     {
229      CurrentBalance+=Profit[j]; 238      CurrentBalance+=Profit[j];
230      if (i==OpenBar[0]) StartBalance=Profit[j]; 239      if (i==OpenBar[0]) StartBalance=Profit[j];
231      if (!Only_Trade && i<=DrawBeginBar) 240      if (!Only_Trade && i<=DrawBeginBar)
232      { 241      {
233       text=StringConcatenate(Instrument[j],": ",DoubleToStr(Profit[j],2)," ",AccountCurrency()); 242       text=StringConcatenate(Instrument[j],": ",DoubleToStr(Profit[j],2)," ",AccountCurrency());
234       LineCreate("Balance "+TimeToStr(OpenTime_Ticket[j][0]),OBJ_VLINE,2,OrangeRed,text,Time[i],0); 243       LineCreate("Balance "+TimeToStr(OpenTime_Ticket[j][0]),OBJ_VLINE,2,OrangeRed,text,Time[i],0);
235      } 244      }
236      continue; 245      continue;
237     } 246     }
238     if (i>DrawBeginBar) continue; 247     if (i>DrawBeginBar) continue;
239     if (MarketInfo(Instrument[j],MODE_POINT)==0) 248     if (MarketInfo(Instrument[j],MODE_POINT)==0)
240     { 249     {
241      if (StringFind(minfosymbols,Instrument[j])==-1) 250      if (StringFind(minfosymbols,Instrument[j])==-1)
242      { 251      {
243       Alert("В обзоре рынка не хватает "+Instrument[j]); 252       Alert("В обзоре рынка не хватает "+Instrument[j]);
244       minfosymbols=StringConcatenate(minfosymbols," ",Instrument[j]); 253       minfosymbols=StringConcatenate(minfosymbols," ",Instrument[j]);
245      } 254      }
246      continue; 255      continue;
247     } 256     }
248     bar=iBarShift(Instrument[j],0,Time[i]); 257     bar=iBarShift(Instrument[j],0,Time[i]);
249     if (TimeDayOfWeek(iTime(Instrument[j],0,bar))!=TimeDayOfWeek(iTime(Instrument[j],0,bar+1)) && OpenBar[j]!=bar) 258     if (TimeDayOfWeek(iTime(Instrument[j],0,bar))!=TimeDayOfWeek(iTime(Instrument[j],0,bar+1)) && OpenBar[j]!=bar)
250     { 259     {
251      int sw1= MarketInfo(Instrument[j],MODE_PROFITCALCMODE); 260      int sw1= MarketInfo(Instrument[j],MODE_PROFITCALCMODE);
252      switch (sw1) 261      switch (sw1)
253      { 262      {
254       case 0: 263       case 0:
255       { 264       {
256        if (TimeDayOfWeek(iTime(Instrument[j],0,bar))==4) CurSwap[j]+=3*DaySwap[j]; 265        if (TimeDayOfWeek(iTime(Instrument[j],0,bar))==4) CurSwap[j]+=3*DaySwap[j];
257        else CurSwap[j]+=DaySwap[j]; 266        else CurSwap[j]+=DaySwap[j];
258       } break; 267       } break;
259       case 1: 268       case 1:
260       { 269       {
261        if (TimeDayOfWeek(iTime(Instrument[j],0,bar))==1) CurSwap[j]+=3*DaySwap[j]; 270        if (TimeDayOfWeek(iTime(Instrument[j],0,bar))==1) CurSwap[j]+=3*DaySwap[j];
262        else CurSwap[j]+=DaySwap[j]; 271        else CurSwap[j]+=DaySwap[j];
263       } 272       }
264      } 273      }
265     } 274     }
266     lotsize=LotSize(Instrument[j],Time[i]); 275     lotsize=LotSize(Instrument[j],Time[i]);
267     if (Type[j]==OP_BUY) profitloss+=Commission[j]+CurSwap[j]+(iClose(Instrument[j],0,bar)-OpenPrice[j])*Lots[j]*lotsize; 276     if (Type[j]==OP_BUY) profitloss+=Commission[j]+CurSwap[j]+(iClose(Instrument[j],0,bar)-OpenPrice[j])*Lots[j]*lotsize;
268     else 277     else
269     { 278     {
270      spread=MarketInfo(Instrument[j],MODE_POINT)*MarketInfo(Instrument[j],MODE_SPREAD); 279      spread=MarketInfo(Instrument[j],MODE_POINT)*MarketInfo(Instrument[j],MODE_SPREAD);
271      profitloss+=Commission[j]+CurSwap[j]+(OpenPrice[j]-iClose(Instrument[j],0,bar)-spread)*Lots[j]*lotsize; 280      profitloss+=Commission[j]+CurSwap[j]+(OpenPrice[j]-iClose(Instrument[j],0,bar)-spread)*Lots[j]*lotsize;
272     } 281     }
273    } 282    }
274   } 283   }
275   if (i>DrawBeginBar) continue; 284   if (i>DrawBeginBar) continue;
276                     Equity[i]=NormalizeDouble(CurrentBalance+profitloss,2); 285                     Equity[i]=NormalizeDouble(CurrentBalance+profitloss,2);
277   if (Show_Balance) Balance[i]=NormalizeDouble(CurrentBalance,2); 286   if (Show_Balance) Balance[i]=NormalizeDouble(CurrentBalance,2);
278   if (Show_Info)    Drawdown(CurrentBalance+profitloss); 287   if (Show_Info)    Drawdown(CurrentBalance+profitloss);
279   if (File_Write && handle>0) 288   if (File_Write && handle>0)
280   { 289   {
281    date=TimeToStr(Time[i],TIME_DATE); 290    date=TimeToStr(Time[i],TIME_DATE);
282    time=TimeToStr(Time[i],TIME_MINUTES); 291    time=TimeToStr(Time[i],TIME_MINUTES);
283    if (FileWrite(handle,date,time,CurrentBalance+profitloss,CurrentBalance)<1) Print("Ошибка #",GetLastError()," при записи в файл"); 292    if (FileWrite(handle,date,time,CurrentBalance+profitloss,CurrentBalance)<1) Print("Ошибка #",GetLastError()," при записи в файл");
284   } 293   }
285  } 294  }
286  ArrayResize(OpenTime_Ticket,opentotal); 295  ArrayResize(OpenTime_Ticket,opentotal);
287  if (opentotal>0) for (i=0;i<opentotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) OpenTime_Ticket[i][1]=OrderTicket(); 296  if (opentotal>0) for (i=0;i<opentotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) OpenTime_Ticket[i][1]=OrderTicket();
288  if (File_Write && handle>0) FileClose(handle); 297  if (File_Write && handle>0) FileClose(handle);
289 } 298 }
290 else 299 else
291 { 300 {
292  if (Only_Magics=="" && Only_Symbols=="" && Only_Comment=="" && !Only_Current && !Only_Buys && !Only_Sells && !Only_Trade) 301  if (Only_Magics=="" && Only_Symbols=="" && Only_Comment=="" && !Only_Current && !Only_Buys && !Only_Sells && !Only_Trade)
293  { 302  {
294                     Equity[0]=AccountEquity(); 303                     Equity[0]=AccountEquity();
295   if (Show_Balance) Balance[0]=AccountBalance(); 304   if (Show_Balance) Balance[0]=AccountBalance();
296   if (Show_Margin)  Margin[0]=AccountMargin(); 305   if (Show_Margin)  Margin[0]=AccountMargin();
297   if (Show_Free)    Free[0]=AccountFreeMargin(); 306   if (Show_Free)    Free[0]=AccountFreeMargin();
298   if (Show_Info)    Drawdown(AccountEquity()); 307   if (Show_Info)    Drawdown(AccountEquity());
299  } 308  }
300  else 309  else
301  { 310  {
302   opentotal=ArraySize(OpenTime_Ticket); 311   opentotal=ArraySize(OpenTime_Ticket);
303   if (opentotal>0) 312   if (opentotal>0)
304   { 313   {
305    for (i=0;i<opentotal;i++) 314    for (i=0;i<opentotal;i++)
306    { 315    {
307     if (!OrderSelect(OpenTime_Ticket[i][1],SELECT_BY_TICKET)) continue; 316     if (!OrderSelect(OpenTime_Ticket[i][1],SELECT_BY_TICKET)) continue;
308     if (OrderCloseTime()==0) continue; 317     if (OrderCloseTime()==0) continue;
309     else if (Select()) CurrentBalance+=OrderCommission()+OrderSwap()+OrderProfit(); 318     else if (Select()) CurrentBalance+=OrderCommission()+OrderSwap()+OrderProfit();
310    } 319    }
311   } 320   }
312   profitloss=0.0; 321   profitloss=0.0;
313   opentotal=OrdersTotal(); 322   opentotal=OrdersTotal();
314   if (opentotal>0) 323   if (opentotal>0)
315   { 324   {
316    for (i=0;i<opentotal;i++) 325    for (i=0;i<opentotal;i++)
317    { 326    {
318     if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; 327     if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
319     if (Select()) profitloss+=OrderCommission()+OrderSwap()+OrderProfit(); 328     if (Select()) profitloss+=OrderCommission()+OrderSwap()+OrderProfit();
320    } 329    }
321   } 330   }
322                     Equity[0]=NormalizeDouble(CurrentBalance+profitloss,2); 331                     Equity[0]=NormalizeDouble(CurrentBalance+profitloss,2);
323   if (Show_Balance) Balance[0]=NormalizeDouble(CurrentBalance,2); 332   if (Show_Balance) Balance[0]=NormalizeDouble(CurrentBalance,2);
324   if (Show_Info)    Drawdown(CurrentBalance+profitloss); 333   if (Show_Info)    Drawdown(CurrentBalance+profitloss);
325   ArrayResize(OpenTime_Ticket,opentotal); 334   ArrayResize(OpenTime_Ticket,opentotal);
326   if (opentotal>0) for (i=0;i<opentotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) OpenTime_Ticket[i][1]=OrderTicket(); 335   if (opentotal>0) for (i=0;i<opentotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) OpenTime_Ticket[i][1]=OrderTicket();
327  } 336  }
328 } 337 }
329 LineCreate("Equity Level",OBJ_HLINE,1,SteelBlue,"",0,Equity[0]); 338 LineCreate("Equity Level",OBJ_HLINE,1,SteelBlue,"",0,Equity[0]);
330 if (Show_Info) 339 if (Show_Info)
331 { 340 {
332  if (MaxDrawdown>0) 341  if (MaxDrawdown>0)
333  { 342  {
334   RecoveryFactor=(Equity[0]-StartBalance)/MaxDrawdown; 343   RecoveryFactor=(Equity[0]-StartBalance)/MaxDrawdown;
335   text=StringConcatenate(": ",DoubleToStr(RecoveryFactor,2)); 344   text=StringConcatenate(": ",DoubleToStr(RecoveryFactor,2));
336   LabelCreate("Recovery Factor",text,10); 345   LabelCreate("Recovery Factor",text,10);
337  } 346  }
338  text=StringConcatenate(": ",DoubleToStr(AbsDrawdown,2)," ",AccountCurrency()); 347  text=StringConcatenate(": ",DoubleToStr(AbsDrawdown,2)," ",AccountCurrency());
339  LabelCreate("Absolute Drawdown",text,30); 348  LabelCreate("Absolute Drawdown",text,30);
340  if (MaxPeak>0) 349  if (MaxPeak>0)
341  { 350  {
342   text=StringConcatenate(": ",DoubleToStr(MaxDrawdown,2)," ",AccountCurrency()," (",DoubleToStr(100*MaxDrawdown/MaxPeak,2),"%)"); 351   text=StringConcatenate(": ",DoubleToStr(MaxDrawdown,2)," ",AccountCurrency()," (",DoubleToStr(100*MaxDrawdown/MaxPeak,2),"%)");
343   LabelCreate("Maximal Drawdown",text,50); 352   LabelCreate("Maximal Drawdown",text,50);
344  } 353  }
345  text=StringConcatenate(": ",DoubleToStr(RelDrawdown,2),"% (",DoubleToStr(Drawdown,2)," ",AccountCurrency(),")"); 354  text=StringConcatenate(": ",DoubleToStr(RelDrawdown,2),"% (",DoubleToStr(Drawdown,2)," ",AccountCurrency(),")");
346  LabelCreate("Relative Drawdown",text,70); 355  LabelCreate("Relative Drawdown",text,70);
347 } 356 }
348 if (Alert_Drawdown>0) AlertDrawdown(); 357 if (Alert_Drawdown>0) AlertDrawdown();
349 //Print("Calculating - ",GetTickCount()-tick," ms"); 358 //Print("Calculating - ",GetTickCount()-tick," ms");
350 return(0); 359 return(0);
351} 360}
352//+------------------------------------------------------------------+ 361//+------------------------------------------------------------------+
353//|  Создание текстовой метки                                        | 362//|  Создание текстовой метки                                        |
354//+------------------------------------------------------------------+ 363//+------------------------------------------------------------------+
355void LabelCreate(string name, string str, int y) 364void LabelCreate(string name, string str, int y)
356{ 365{
357 string objectname=StringConcatenate(name," ",Unique); 366 string objectname=StringConcatenate(name," ",Unique);
358 if (ObjectFind(objectname)==-1) 367 if (ObjectFind(objectname)==-1)
359 { 368 {
360  ObjectCreate(objectname,OBJ_LABEL,Window,0,0); 369  ObjectCreate(objectname,OBJ_LABEL,Window,0,0);
361  ObjectSet(objectname,OBJPROP_XDISTANCE,10); 370  ObjectSet(objectname,OBJPROP_XDISTANCE,10);
362  ObjectSet(objectname,OBJPROP_YDISTANCE,y); 371  ObjectSet(objectname,OBJPROP_YDISTANCE,y);
363  ObjectSet(objectname,OBJPROP_CORNER,1); 372  ObjectSet(objectname,OBJPROP_CORNER,1);
364  ObjectSet(objectname,OBJPROP_COLOR,SlateGray); 373  ObjectSet(objectname,OBJPROP_COLOR,SlateGray);
365 } 374 }
366 ObjectSetText(objectname,name+str); 375 ObjectSetText(objectname,name+str);
367} 376}
368//+------------------------------------------------------------------+ 377//+------------------------------------------------------------------+
369//|  Создание линии                                                  | 378//|  Создание линии                                                  |
370//+------------------------------------------------------------------+ 379//+------------------------------------------------------------------+
371void LineCreate(string name, int type, int width, color clr, string str, datetime time1, double price1, datetime time2=0, double price2=0) 380void LineCreate(string name, int type, int width, color clr, string str, datetime time1, double price1, datetime time2=0, double price2=0)
372{ 381{
373 string objectname=StringConcatenate(name," ",Unique); 382 string objectname=StringConcatenate(name," ",Unique);
374 if (ObjectFind(objectname)==-1) 383 if (ObjectFind(objectname)==-1)
375 { 384 {
376  ObjectCreate(objectname,type,Window,time1,price1,time2,price2); 385  ObjectCreate(objectname,type,Window,time1,price1,time2,price2);
377  ObjectSet(objectname,OBJPROP_WIDTH,width); 386  ObjectSet(objectname,OBJPROP_WIDTH,width);
378  if (type==OBJ_TREND) ObjectSet(objectname,OBJPROP_RAY,false); 387  if (type==OBJ_TREND) ObjectSet(objectname,OBJPROP_RAY,false);
379  if (type==OBJ_HLINE) ObjectSet(objectname,OBJPROP_STYLE,STYLE_DOT); 388  if (type==OBJ_HLINE) ObjectSet(objectname,OBJPROP_STYLE,STYLE_DOT);
380 } 389 }
381 ObjectSetText(objectname,str); 390 ObjectSetText(objectname,str);
382 ObjectSet(objectname,OBJPROP_COLOR,clr); 391 ObjectSet(objectname,OBJPROP_COLOR,clr);
383 ObjectSet(objectname,OBJPROP_TIME1,time1); 392 ObjectSet(objectname,OBJPROP_TIME1,time1);
384 ObjectSet(objectname,OBJPROP_PRICE1,price1); 393 ObjectSet(objectname,OBJPROP_PRICE1,price1);
385 ObjectSet(objectname,OBJPROP_TIME2,time2); 394 ObjectSet(objectname,OBJPROP_TIME2,time2);
386 ObjectSet(objectname,OBJPROP_PRICE2,price2); 395 ObjectSet(objectname,OBJPROP_PRICE2,price2);
387} 396}
388//+------------------------------------------------------------------+ 397//+------------------------------------------------------------------+
389//|  Удаление объектов по признаку                                   | 398//|  Удаление объектов по признаку                                   |
390//+------------------------------------------------------------------+ 399//+------------------------------------------------------------------+
391void DeleteAll() 400void DeleteAll()
392{ 401{
393 int total=ObjectsTotal()-1; 402 int total=ObjectsTotal()-1;
394 for (int i=total;i>=0;i--) 403 for (int i=total;i>=0;i--)
395 { 404 {
396  string name=ObjectName(i); 405  string name=ObjectName(i);
397  if (StringFind(name,Unique)!=-1) ObjectDelete(name); 406  if (StringFind(name,Unique)!=-1) ObjectDelete(name);
398 } 407 }
399} 408}
400//+------------------------------------------------------------------+ 409//+------------------------------------------------------------------+
401//|  Чтение данных ордера                                            | 410//|  Чтение данных ордера                                            |
402//+------------------------------------------------------------------+ 411//+------------------------------------------------------------------+
403void ReadOrder(int n) 412void ReadOrder(int n)
404{ 413{
405 OpenBar[n]=iBarShift(NULL,0,OrderOpenTime()); 414 OpenBar[n]=iBarShift(NULL,0,OrderOpenTime());
406 Type[n]=OrderType(); 415 Type[n]=OrderType();
407 if (OrderType()>5) Instrument[n]=OrderComment(); 416 if (OrderType()>5) Instrument[n]=OrderComment();
408 else Instrument[n]=OrderSymbol(); 417 else Instrument[n]=OrderSymbol();
409 Lots[n]=OrderLots(); 418 Lots[n]=OrderLots();
410 OpenPrice[n]=OrderOpenPrice(); 419 OpenPrice[n]=OrderOpenPrice();
411 if (OrderCloseTime()!=0) 420 if (OrderCloseTime()!=0)
412 { 421 {
413  CloseBar[n]=iBarShift(NULL,0,OrderCloseTime()); 422  CloseBar[n]=iBarShift(NULL,0,OrderCloseTime());
414  ClosePrice[n]=OrderClosePrice(); 423  ClosePrice[n]=OrderClosePrice();
415 } 424 }
416 else 425 else
417 { 426 {
418  CloseBar[n]=0; 427  CloseBar[n]=0;
419  ClosePrice[n]=0.0; 428  ClosePrice[n]=0.0;
420 } 429 }
421 Commission[n]=OrderCommission(); 430 Commission[n]=OrderCommission();
422 Swap[n]=OrderSwap(); 431 Swap[n]=OrderSwap();
423 Profit[n]=OrderProfit(); 432 Profit[n]=OrderProfit();
424 if (OrderType()>5 && Only_Trade) Profit[n]=0.0; 433 if (OrderType()>5 && Only_Trade) Profit[n]=0.0;
425 CurSwap[n]=0.0; 434 CurSwap[n]=0.0;
426 int swapdays=0; 435 int swapdays=0;
427 for (int b=OpenBar[n]-1;b>=CloseBar[n];b--) 436 for (int b=OpenBar[n]-1;b>=CloseBar[n];b--)
428 { 437 {
429  if (TimeDayOfWeek(iTime(NULL,0,b))!=TimeDayOfWeek(iTime(NULL,0,b+1))) 438  if (TimeDayOfWeek(iTime(NULL,0,b))!=TimeDayOfWeek(iTime(NULL,0,b+1)))
430  { 439  {
431   int sw2= MarketInfo(Instrument[n],MODE_PROFITCALCMODE); 440   int sw2= MarketInfo(Instrument[n],MODE_PROFITCALCMODE);
432   switch (sw2) 441   switch (sw2)
433   { 442   {
434    case 0: 443    case 0:
435    { 444    {
436     if (TimeDayOfWeek(iTime(NULL,0,b))==4) swapdays+=3; 445     if (TimeDayOfWeek(iTime(NULL,0,b))==4) swapdays+=3;
437     else swapdays++; 446     else swapdays++;
438    } break; 447    } break;
439    case 1: 448    case 1:
440    { 449    {
441     if (TimeDayOfWeek(iTime(NULL,0,b))==1) swapdays+=3; 450     if (TimeDayOfWeek(iTime(NULL,0,b))==1) swapdays+=3;
442     else swapdays++; 451     else swapdays++;
443    } 452    }
444   } 453   }
445  } 454  }
446 } 455 }
447 if (swapdays>0) DaySwap[n]=Swap[n]/swapdays; else DaySwap[n]=0.0; 456 if (swapdays>0) DaySwap[n]=Swap[n]/swapdays; else DaySwap[n]=0.0;
448 if (Lots[n]==0) 457 if (Lots[n]==0)
449 { 458 {
450  string ticket=StringSubstr(OrderComment(),StringFind(OrderComment(),"#")+1); 459  string ticket=StringSubstr(OrderComment(),StringFind(OrderComment(),"#")+1);
451  if (OrderSelect(StrToInteger(ticket),SELECT_BY_TICKET,MODE_HISTORY)) Lots[n]=OrderLots(); 460  if (OrderSelect(StrToInteger(ticket),SELECT_BY_TICKET,MODE_HISTORY)) Lots[n]=OrderLots();
452 } 461 }
453} 462}
454//+------------------------------------------------------------------+ 463//+------------------------------------------------------------------+
455//|  Расчёт просадки на всей истории счёта                           | 464//|  Расчёт просадки на всей истории счёта                           |
456//+------------------------------------------------------------------+ 465//+------------------------------------------------------------------+
457int Drawdown(double equity) 466int Drawdown(double equity)
458{ 467{
459 double relative; 468 double relative;
460 if (equity<0) return(-1); 469 if (equity<0) return(-1);
461 if (AbsDrawdown<StartBalance-equity) AbsDrawdown=StartBalance-equity; 470 if (AbsDrawdown<StartBalance-equity) AbsDrawdown=StartBalance-equity;
462 if (equity>MaxProfit) MaxProfit=equity; 471 if (equity>MaxProfit) MaxProfit=equity;
463 if (MaxDrawdown<MaxProfit-equity) 472 if (MaxDrawdown<MaxProfit-equity)
464 { 473 {
465  MaxDrawdown=MaxProfit-equity; 474  MaxDrawdown=MaxProfit-equity;
466  MaxPeak=MaxProfit; 475  MaxPeak=MaxProfit;
467  if (MaxPeak>0) 476  if (MaxPeak>0)
468  { 477  {
469   relative=100*MaxDrawdown/MaxPeak; 478   relative=100*MaxDrawdown/MaxPeak;
470   if (RelDrawdown<relative) 479   if (RelDrawdown<relative)
471   { 480   {
472    RelDrawdown=relative; 481    RelDrawdown=relative;
473    Drawdown=MaxDrawdown; 482    Drawdown=MaxDrawdown;
474   } 483   }
475  } 484  }
476 } 485 }
477 return(0); 486 return(0);
478} 487}
479//+------------------------------------------------------------------+ 488//+------------------------------------------------------------------+
480//|  Наблюдение и предупреждение о просадках за период               | 489//|  Наблюдение и предупреждение о просадках за период               |
481//+------------------------------------------------------------------+ 490//+------------------------------------------------------------------+
482int AlertDrawdown() 491int AlertDrawdown()
483{ 492{
484 static int day; 493 static int day;
485 static bool first=true; 494 static bool first=true;
486 static double maxpeak,maxprofit,maxdrawdown,reldrawdown,drawdown,balanceDD,maxDD; 495 static double maxpeak,maxprofit,maxdrawdown,reldrawdown,drawdown,balanceDD,maxDD;
487 static datetime time,timemaxprofit; 496 static datetime time,timemaxprofit;
488 int bar=0; 497 int bar=0;
489 double high,relative,level,curdrawdown; 498 double high,relative,level,curdrawdown;
490 datetime timehigh,timelow; 499 datetime timehigh,timelow;
491 string drawdownstr,text; 500 string drawdownstr,text;
492 color clr; 501 color clr;
493     502 
494 if (first) 503 if (first)
495 { 504 {
496  first=false; 505  first=false;
497  day=Day(); 506  day=Day();
498  if (Current_Day) time=StrToTime(TimeToStr(Time[0],TIME_DATE)); 507  if (Current_Day) time=StrToTime(TimeToStr(Time[0],TIME_DATE));
499  else time=Begin_Monitoring; 508  else time=Begin_Monitoring;
500  if (time<Draw_Begin) time=Draw_Begin; 509  if (time<Draw_Begin) time=Draw_Begin;
501  if (time<OpenTime_Ticket[0][0]) time=OpenTime_Ticket[0][0]; 510  if (time<OpenTime_Ticket[0][0]) time=OpenTime_Ticket[0][0];
502  bar=iBarShift(NULL,0,time); 511  bar=iBarShift(NULL,0,time);
503  maxprofit=0.0; 512  maxprofit=0.0;
504  maxdrawdown=0.0; 513  maxdrawdown=0.0;
505  reldrawdown=0.0; 514  reldrawdown=0.0;
506  balanceDD=0.0; 515  balanceDD=0.0;
507  maxDD=Alert_Drawdown; 516  maxDD=Alert_Drawdown;
508 } 517 }
509 else if (Current_Day && Day()!=day) first=true; 518 else if (Current_Day && Day()!=day) first=true;
510 for (int i=bar;i>=0;i--) 519 for (int i=bar;i>=0;i--)
511 { 520 {
512  if (Equity[i]<0) return(-1); 521  if (Equity[i]<0) return(-1);
513  high=Equity[i]; 522  high=Equity[i];
514  if (high>maxprofit) 523  if (high>maxprofit)
515  { 524  {
516   timemaxprofit=Time[i]; 525   timemaxprofit=Time[i];
517   maxprofit=high; 526   maxprofit=high;
518   maxdrawdown=0.0; 527   maxdrawdown=0.0;
519   reldrawdown=0.0; 528   reldrawdown=0.0;
520   maxDD=Alert_Drawdown; 529   maxDD=Alert_Drawdown;
521  } 530  }
522  if (Show_Balance && balanceDD<Balance[i]-Equity[i]) balanceDD=Balance[i]-Equity[i]; 531  if (Show_Balance && balanceDD<Balance[i]-Equity[i]) balanceDD=Balance[i]-Equity[i];
523  if (maxdrawdown<maxprofit-Equity[i]) 532  if (maxdrawdown<maxprofit-Equity[i])
524  { 533  {
525   maxdrawdown=maxprofit-Equity[i]; 534   maxdrawdown=maxprofit-Equity[i];
526   maxpeak=maxprofit; 535   maxpeak=maxprofit;
527   timehigh=timemaxprofit; 536   timehigh=timemaxprofit;
528   if (maxpeak>0) 537   if (maxpeak>0)
529   { 538   {
530    relative=NormalizeDouble(100*maxdrawdown/maxpeak,1); 539    relative=NormalizeDouble(100*maxdrawdown/maxpeak,1);
531    if (reldrawdown<relative) 540    if (reldrawdown<relative)
532    { 541    {
533     reldrawdown=relative; 542     reldrawdown=relative;
534     drawdown=maxdrawdown; 543     drawdown=maxdrawdown;
535     timelow=Time[i]; 544     timelow=Time[i];
536    } 545    }
537   } 546   }
538  } 547  }
539 } 548 }
540 if (ObjectFind("up")>0) 549 if (ObjectFind("up")>0)
541 { 550 {
542  if (ObjectGet("up",OBJPROP_PRICE1)<Equity[0]) 551  if (ObjectGet("up",OBJPROP_PRICE1)<Equity[0])
543  { 552  {
544   Alert("Эквити выше максимального уровня"); 553   Alert("Эквити выше максимального уровня");
545   ObjectSet("up",OBJPROP_PRICE1,Equity[0]); 554   ObjectSet("up",OBJPROP_PRICE1,Equity[0]);
546  } 555  }
547 } 556 }
548 if (ObjectFind("down")>0) 557 if (ObjectFind("down")>0)
549 { 558 {
550  if (ObjectGet("down",OBJPROP_PRICE1)>Equity[0]) 559  if (ObjectGet("down",OBJPROP_PRICE1)>Equity[0])
551  { 560  {
552   Alert("Эквити ниже минимального уровня"); 561   Alert("Эквити ниже минимального уровня");
553   ObjectSet("down",OBJPROP_PRICE1,Equity[0]); 562   ObjectSet("down",OBJPROP_PRICE1,Equity[0]);
554  } 563  }
555 } 564 }
556 if (reldrawdown>maxDD) 565 if (reldrawdown>maxDD)
557 { 566 {
558  maxDD=reldrawdown; 567  maxDD=reldrawdown;
559  if (maxDD>Max_Drawdown) 568  if (maxDD>Max_Drawdown)
560  { 569  {
561   text=StringConcatenate("Внимание! Превышен уровень допустимой просадки на ",DoubleToStr(maxDD-Max_Drawdown,1),"%\n"); 570   text=StringConcatenate("Внимание! Превышен уровень допустимой просадки на ",DoubleToStr(maxDD-Max_Drawdown,1),"%\n");
562   text=StringConcatenate(text,"Допустимая просадка задана на уровне ",DoubleToStr(Max_Drawdown,1),"%\n"); 571   text=StringConcatenate(text,"Допустимая просадка задана на уровне ",DoubleToStr(Max_Drawdown,1),"%\n");
563  } 572  }
564  else 573  else
565  { 574  {
566   text=StringConcatenate("Превышен уровень сигнальной просадки на ",DoubleToStr(maxDD-Alert_Drawdown,1),"%\n"); 575   text=StringConcatenate("Превышен уровень сигнальной просадки на ",DoubleToStr(maxDD-Alert_Drawdown,1),"%\n");
567   text=StringConcatenate(text,"Сигнальная просадка задана на уровне ",DoubleToStr(Alert_Drawdown,1),"%\n"); 576   text=StringConcatenate(text,"Сигнальная просадка задана на уровне ",DoubleToStr(Alert_Drawdown,1),"%\n");
568  } 577  }
569  drawdownstr=StringConcatenate(DoubleToStr(reldrawdown,1),"% (",DoubleToStr(drawdown,2)," ",AccountCurrency(),")"); 578  drawdownstr=StringConcatenate(DoubleToStr(reldrawdown,1),"% (",DoubleToStr(drawdown,2)," ",AccountCurrency(),")");
570  text=StringConcatenate(text,"Просадка в средствах за текущий период составила ",drawdownstr,"\n"); 579  text=StringConcatenate(text,"Просадка в средствах за текущий период составила ",drawdownstr,"\n");
571  if (balanceDD>0) text=StringConcatenate(text,"Просадка от баланса - ",DoubleToStr(balanceDD,2)," ",AccountCurrency(),"\n"); 580  if (balanceDD>0) text=StringConcatenate(text,"Просадка от баланса - ",DoubleToStr(balanceDD,2)," ",AccountCurrency(),"\n");
572  text=StringConcatenate(text,"Название индикатора: ",ShortName); 581  text=StringConcatenate(text,"Название индикатора: ",ShortName);
573  Alert(text); 582  Alert(text);
574  if (maxDD>Max_Drawdown) clr=Red; 583  if (maxDD>Max_Drawdown) clr=Red;
575  else clr=DarkOrange; 584  else clr=DarkOrange;
576  LineCreate("Drawdown Line",OBJ_TREND,2,clr,"       "+drawdownstr,timehigh,maxpeak,timelow,maxpeak-drawdown); 585  LineCreate("Drawdown Line",OBJ_TREND,2,clr,"       "+drawdownstr,timehigh,maxpeak,timelow,maxpeak-drawdown);
577 } 586 }
578 LineCreate("Begin Monitoring",OBJ_VLINE,1,SlateGray,"Begin Monitoring",time,0); 587 LineCreate("Begin Monitoring",OBJ_VLINE,1,SlateGray,"Begin Monitoring",time,0);
579 level=NormalizeDouble(maxprofit,2); 588 level=NormalizeDouble(maxprofit,2);
580 LineCreate("Max Profit",OBJ_TREND,1,DodgerBlue,"Max Profit",timemaxprofit,level,Time[0],level); 589 LineCreate("Max Profit",OBJ_TREND,1,DodgerBlue,"Max Profit",timemaxprofit,level,Time[0],level);
581 level=NormalizeDouble(maxprofit*(1-Alert_Drawdown/100),2); 590 level=NormalizeDouble(maxprofit*(1-Alert_Drawdown/100),2);
582 LineCreate("Alert Drawdown",OBJ_TREND,1,DarkOrange,"Alert Drawdown "+DoubleToStr(Alert_Drawdown,1)+"%",timemaxprofit,level,Time[0],level); 591 LineCreate("Alert Drawdown",OBJ_TREND,1,DarkOrange,"Alert Drawdown "+DoubleToStr(Alert_Drawdown,1)+"%",timemaxprofit,level,Time[0],level);
583 level=NormalizeDouble(maxprofit*(1-Max_Drawdown/100),2); 592 level=NormalizeDouble(maxprofit*(1-Max_Drawdown/100),2);
584 LineCreate("Max Drawdown",OBJ_TREND,1,Red,"Max Drawdown "+DoubleToStr(Max_Drawdown,1)+"%",timemaxprofit,level,Time[0],level); 593 LineCreate("Max Drawdown",OBJ_TREND,1,Red,"Max Drawdown "+DoubleToStr(Max_Drawdown,1)+"%",timemaxprofit,level,Time[0],level);
585 if (Show_Info) 594 if (Show_Info)
586 { 595 {
587  curdrawdown=maxprofit-Equity[0]; 596  curdrawdown=maxprofit-Equity[0];
588  text=StringConcatenate(": ",DoubleToStr(curdrawdown,2)," ",AccountCurrency()," (",DoubleToStr(100*curdrawdown/maxprofit,2),"%)"); 597  text=StringConcatenate(": ",DoubleToStr(curdrawdown,2)," ",AccountCurrency()," (",DoubleToStr(100*curdrawdown/maxprofit,2),"%)");
589  LabelCreate("Current Drawdown",text,90); 598  LabelCreate("Current Drawdown",text,90);
590 } 599 }
591 return(0); 600 return(0);
592} 601}
593//+------------------------------------------------------------------+ 602//+------------------------------------------------------------------+
594//|  Определение размера контракта                                   | 603//|  Определение размера контракта                                   |
595//+------------------------------------------------------------------+ 604//+------------------------------------------------------------------+
596double LotSize(string symbol, datetime tbar) 605double LotSize(string symbol, datetime tbar)
597{ 606{
598 double size,close1,close2; 607 double size,close1,close2;
599 string BQ,currency=AccountCurrency(); 608 string BQ,currency=AccountCurrency();
600 int sw3 = MarketInfo(symbol,MODE_PROFITCALCMODE); 609 int sw3 = MarketInfo(symbol,MODE_PROFITCALCMODE);
601 switch (sw3) 610 switch (sw3)
602 { 611 {
603  case 0: 612  case 0:
604  { 613  {
605   int sbar=iBarShift(symbol,0,tbar); 614   int sbar=iBarShift(symbol,0,tbar);
606   size=MarketInfo(symbol,MODE_LOTSIZE); 615   size=MarketInfo(symbol,MODE_LOTSIZE);
607   if (StringSubstr(symbol,3,3)=="USD") break; 616   if (StringSubstr(symbol,3,3)=="USD") break;
608   if (StringSubstr(symbol,0,3)=="USD") 617   if (StringSubstr(symbol,0,3)=="USD")
609   { 618   {
610    close1=iClose(symbol,0,sbar); 619    close1=iClose(symbol,0,sbar);
611    if (close1>0) size=size/close1; 620    if (close1>0) size=size/close1;
612   } 621   }
613   else 622   else
614   { 623   {
615    BQ=StringSubstr(symbol,0,3)+"USD"; 624    BQ=StringSubstr(symbol,0,3)+"USD";
616    if (iClose(BQ,0,0)==0) BQ="USD"+StringSubstr(symbol,0,3); 625    if (iClose(BQ,0,0)==0) BQ="USD"+StringSubstr(symbol,0,3);
617    if (iClose(BQ,0,0)==0) break; 626    if (iClose(BQ,0,0)==0) break;
618    int BQbar=iBarShift(BQ,0,tbar); 627    int BQbar=iBarShift(BQ,0,tbar);
619    close1=iClose(symbol,0,sbar); 628    close1=iClose(symbol,0,sbar);
620    close2=iClose(BQ,0,BQbar); 629    close2=iClose(BQ,0,BQbar);
621    if (close1>0 && close2>0) 630    if (close1>0 && close2>0)
622    { 631    {
623     if (StringSubstr(BQ,0,3)=="USD") size=size/close2/close1; 632     if (StringSubstr(BQ,0,3)=="USD") size=size/close2/close1;
624     else size=size*close2/close1; 633     else size=size*close2/close1;
625    } 634    }
626   } 635   }
627  } break; 636  } break;
628  case 1: size=MarketInfo(symbol,MODE_LOTSIZE); break; 637  case 1: size=MarketInfo(symbol,MODE_LOTSIZE); break;
629  case 2: size=MarketInfo(symbol,MODE_TICKVALUE)/MarketInfo(symbol,MODE_TICKSIZE); 638  case 2: size=MarketInfo(symbol,MODE_TICKVALUE)/MarketInfo(symbol,MODE_TICKSIZE);
630 } 639 }
631 if (currency!="USD") 640 if (currency!="USD")
632 { 641 {
633  BQ=currency+"USD"; 642  BQ=currency+"USD";
634  if (iClose(BQ,0,0)==0) 643  if (iClose(BQ,0,0)==0)
635  { 644  {
636   BQ="USD"+currency; 645   BQ="USD"+currency;
637   close1=iClose(BQ,0,iBarShift(BQ,0,tbar)); 646   close1=iClose(BQ,0,iBarShift(BQ,0,tbar));
638   if (close1>0) size*=close1; 647   if (close1>0) size*=close1;
639  } 648  }
640  else 649  else
641  { 650  {
642   close1=iClose(BQ,0,iBarShift(BQ,0,tbar)); 651   close1=iClose(BQ,0,iBarShift(BQ,0,tbar));
643   if (close1>0) size/=close1; 652   if (close1>0) size/=close1;
644  } 653  }
645 } 654 }
646 return(size); 655 return(size);
647} 656}
648//+------------------------------------------------------------------+ 657//+------------------------------------------------------------------+
649//|  Выбор ордера по критериям                                       | 658//|  Выбор ордера по критериям                                       |
650//+------------------------------------------------------------------+ 659//+------------------------------------------------------------------+
651bool Select() 660bool Select()
652{ 661{
653 if (OrderType()>5) return(true); 662 if (OrderType()>5) return(true);
654 if (OrderType()>1) return(false); 663 if (OrderType()>1) return(false);
655 if (Only_Magics!="" && StringFind(Only_Magics,DoubleToStr(OrderMagicNumber(),0))==-1) return(false); 664 if (Only_Magics!="" && StringFind(Only_Magics,DoubleToStr(OrderMagicNumber(),0))==-1) return(false);
656 if (Only_Symbols!="" && StringFind(Only_Symbols,OrderSymbol())==-1) return(false); 665 if (Only_Symbols!="" && StringFind(Only_Symbols,OrderSymbol())==-1) return(false);
657 else if (Only_Current && OrderSymbol()!=Symbol()) return(false); 666 else if (Only_Current && OrderSymbol()!=Symbol()) return(false);
658 if (Only_Comment!="" && StringFind(OrderComment(),Only_Comment)==-1) return(false); 667 if (Only_Comment!="" && StringFind(OrderComment(),Only_Comment)==-1) return(false);
659 if (Only_Buys && OrderType()!=OP_BUY) return(false); 668 if (Only_Buys && OrderType()!=OP_BUY) return(false);
660 if (Only_Sells && OrderType()!=OP_SELL) return(false); 669 if (Only_Sells && OrderType()!=OP_SELL) return(false);
661 return(true); 670 return(true);
662} 671}
663//+------------------------------------------------------------------+  672//+------------------------------------------------------------------+  
  673  
  674// for ChangeInput: добавление в конце исходника  
  675#include <ChangeInput.mqh>  
  676  
  677void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )  
  678{  
  679  EVENTBASE::MyEvent(id, lparam, dparam, sparam); // for ChangeInput: в OnChartEvent добавить эту строчку  
  680  
  681  return;  
  682}  
  683  
  684void CHANGEINPUT::MyInit( void )  
  685{  
  686//------------- Фильтр истории торгов  
  687  SetGetParameter("Учитывать только позиции, исключив пополнение/снятие средств", Only_Trade);  
  688  SetGetParameter("Учитывать только позиции по текущему инструменту", Only_Current);  
  689  SetGetParameter("Учитывать только позиции на покупку", Only_Buys);  
  690  SetGetParameter("Учитывать только позиции на продажу", Only_Sells);  
  691  
  692//------------- Внешний вид индикатора  
  693  SetGetParameter("Отображать баланс", Show_Balance);  
  694  SetGetParameter("Отображать залог (только в режиме реального времени)", Show_Margin);  
  695  SetGetParameter("Отображать свободные средства (только в режиме реального времени)", Show_Free);  
  696  SetGetParameter("Отображать дополнительную информацию о просадках, включая ФВ", Show_Info);  
  697  
  698//------------- Настройка сигналов о просадке  
  699  SetGetParameter("Предупреждать о просадке средств в процентах за период (0 - отключить)", Alert_Drawdown);  
  700  SetGetParameter("Максимально допустимая просадка в процентах за период (/""красная зона/"")", Max_Drawdown);  
  701  SetGetParameter("Просадка будет наблюдаться только за текущий день  ", Current_Day);  
  702  
  703  return;  
  704}  
705