Author: Copyright � 2008, Xupypr
Price Data Components
Series array that contains open time of each barSeries array that contains open prices of each barSeries array that contains open prices of each barSeries array that contains close prices for each bar
Orders Execution
Checks for the total of closed ordersChecks for the total of open orders
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screenUses files from the file systemIt writes information to file
0 Views
0 Downloads
0 Favorites
Equity_v8
//+------------------------------------------------------------------+
//|                                                    Equity_v8.mq4 |
//|                                         Copyright © 2008, Xupypr |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Xupypr"

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 LightSteelBlue
#property indicator_color2 SteelBlue
#property indicator_color3 Black
#property indicator_color4 LightSteelBlue
#property indicator_color5 SteelBlue
#property indicator_color6 Black
#property indicator_color7 SteelBlue
#property indicator_color8 OrangeRed
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 3
#property indicator_width4 1
#property indicator_width5 1
#property indicator_width6 3
#property indicator_width7 1
#property indicator_width8 2

extern string Only_Comment="";    // Ó÷èòûâàòü îðäåðà òîëüêî ñ íàëè÷èåì óêàçàííîãî êîììåíòàðèÿ (íàïðèìåð [sl] èëè [tp])
extern string Only_Magics="";     // Ó÷èòûâàòü îðäåðà òîëüêî ñ óêàçàííûìè ìàãè÷åñêèìè íîìåðàìè (÷åðåç ëþáîé ðàçäåëèòåëü)
extern string Only_Symbols="";    // Ó÷èòûâàòü òîëüêî óêàçàííûå èíñòðóìåíòû (÷åðåç ëþáîé ðàçäåëèòåëü)
extern bool   Only_Current=false; // Ó÷èòûâàòü òîëüêî òåêóùèé èíñòðóìåíò
extern bool   Only_Buys=false;    // Ó÷èòûâàòü îðäåðà òîëüêî íà ïîêóïêó
extern bool   Only_Sells=false;   // Ó÷èòûâàòü îðäåðà òîëüêî íà ïðîäàæó
extern bool   Show_Balance=true; // Îòîáðàæàòü áàëàíñ
extern bool   Show_Equity=true;  // Îòîáðàæàòü ñðåäñòâà
extern bool   Show_Info=false;   // Îòîáðàæàòü äîïîëíèòåëüíóþ èíôîðìàöèþ
extern bool   File_Write=false;  // Çàïèñü äàííûõ â ôàéë

int      ANumber,Window;
bool     First;
double   EquityBodyUp[],EquityBodyDown[],MaskBody[],EquityShadeUp[],EquityShadeDown[],MaskShade[],EquityLine[],Balance[];
double   CurrentBalance,MaxProfit,Drawdown,MaxPeak,RecoveryFactor;
string   ShortName;
datetime TimeBar;

datetime OpenTime_Ticket[][2]; // âðåìÿ îòêðûòèÿ è íîìåð òèêåòà
datetime CloseTime[];          // âðåìÿ çàêðûòèÿ
int      Type[];               // òèï îïåðàöèè
string   Instrument[];         // èíñòðóìåíò
double   Lots[];               // êîëè÷åñòâî ëîòîâ
double   OpenPrice[];          // öåíà îòêðûòèÿ
double   ClosePrice[];         // öåíà çàêðûòèÿ
double   Commission[];         // êîìèññèÿ
double   Swap[];               // íàêîïëåííûé ñâîï
double   CurSwap[];            // òåêóùèé ñâîï
double   DaySwap[];            // äíåâíîé ñâîï
double   Profit[];             // ÷èñòàÿ ïðèáûëü
double   Magic[];              // ìàãè÷åñêèé íîìåð

//+----------------------------------------------------------------------------+
//|  Custom indicator initialization function                                  |
//+----------------------------------------------------------------------------+
int init()
{
 if (Only_Comment=="" && Only_Magics=="" && Only_Symbols=="" && !Only_Current && !Only_Buys && !Only_Sells) ShortName="Total";
 else
 {
  if (Only_Comment!="") ShortName=Only_Comment; else ShortName="";
  if (Only_Magics!="")  ShortName=StringConcatenate(ShortName," ",Only_Magics);
  if (Only_Symbols!="") ShortName=StringConcatenate(ShortName," ",Only_Symbols);
  else if (Only_Current) ShortName=StringConcatenate(ShortName," ",Symbol());
  if (Only_Sells) Only_Buys=false;
  if (Only_Buys)  ShortName=StringConcatenate(ShortName," Buys");
  if (Only_Sells) ShortName=StringConcatenate(ShortName," Sells");
 }
 SetIndexBuffer(0,EquityBodyUp);
 SetIndexLabel(0,ShortName+" Equity");
 SetIndexStyle(0,DRAW_HISTOGRAM);
 SetIndexBuffer(1,EquityBodyDown);
 SetIndexLabel(1,ShortName+" Equity");
 SetIndexStyle(1,DRAW_HISTOGRAM);
 SetIndexBuffer(2,MaskBody);
 SetIndexLabel(2,"Mask");
 SetIndexStyle(2,DRAW_HISTOGRAM);
 SetIndexBuffer(3,EquityShadeUp);
 SetIndexLabel(3,ShortName+" Equity");
 SetIndexStyle(3,DRAW_HISTOGRAM);
 SetIndexBuffer(4,EquityShadeDown);
 SetIndexLabel(4,ShortName+" Equity");
 SetIndexStyle(4,DRAW_HISTOGRAM);
 SetIndexBuffer(5,MaskShade);
 SetIndexLabel(5,"Mask");
 SetIndexStyle(5,DRAW_HISTOGRAM);
 SetIndexBuffer(6,EquityLine);
 SetIndexLabel(6,ShortName+" Equity");
 SetIndexStyle(6,DRAW_LINE);
 SetIndexBuffer(7,Balance);
 SetIndexLabel(7,ShortName+" Balance");
 SetIndexStyle(7,DRAW_LINE);
 if (Show_Equity)  ShortName=StringConcatenate(ShortName," Equity");
 if (Show_Balance) ShortName=StringConcatenate(ShortName," Balance");
 IndicatorShortName(ShortName);
 IndicatorDigits(2);
 ANumber=AccountNumber();
 First=true;
 TimeBar=0;
 return(0);
}
//+----------------------------------------------------------------------------+
//|  Custom indicator deinitialization function                                |
//+----------------------------------------------------------------------------+
int deinit()
{
 ObjectsDeleteAll(Window);
 return(0);
}
//+----------------------------------------------------------------------------+
//|  Custom indicator iteration function                                       |
//+----------------------------------------------------------------------------+
int start()
{
 static bool open;
 string filename,objectname,text,time;
 static string minfosymbols="",m1symbols="";
 static double equityopen,equityhigh,equitylow,equityclose;
 double spread,lotsize;
 int handle,beginbar,bar,i,m,j,start,total,historytotal,opentotal;
 //int tick=GetTickCount();

 if (ANumber!=AccountNumber())
 {
  ArrayInitialize(EquityBodyUp,EMPTY_VALUE);
  ArrayInitialize(EquityBodyDown,EMPTY_VALUE);
  ArrayInitialize(MaskBody,EMPTY_VALUE);
  ArrayInitialize(EquityShadeUp,EMPTY_VALUE);
  ArrayInitialize(EquityShadeDown,EMPTY_VALUE);
  ArrayInitialize(MaskShade,EMPTY_VALUE);
  ArrayInitialize(EquityLine,EMPTY_VALUE);
  ArrayInitialize(Balance,EMPTY_VALUE);
  ObjectsDeleteAll(Window);
  ANumber=AccountNumber();
  minfosymbols="";
  m1symbols="";
  First=true;
  TimeBar=0;
 }
 if (!IsConnected())
 {
  Print("Ñâÿçü ñ ñåðâåðîì îòñóòñòâóåò èëè ïðåðâàíà");
  return(0);
 }
 if (!OrderSelect(0,SELECT_BY_POS,MODE_HISTORY)) return(0);
 Window=WindowFind(ShortName);
 if (First)
 {
  First=false;
  MaxProfit=0.0;
  Drawdown=0.0;
  MaxPeak=0.0;
  if (Period()>PERIOD_D1)
  {
   Alert("Ïåðèîä íå ìîæåò áûòü áîëüøå D1"); 
   return(0);
  }
  historytotal=OrdersHistoryTotal();
  opentotal=OrdersTotal();
  total=historytotal+opentotal;
  ArrayResize(OpenTime_Ticket,total);
  for (i=0;i<historytotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
  {
   if (Select())
   {
    OpenTime_Ticket[i][0]=OrderOpenTime();
    OpenTime_Ticket[i][1]=OrderTicket();
   }
   else
   {
    OpenTime_Ticket[i][0]=EMPTY_VALUE;
    total--;
   }
  }
  if (opentotal>0)
  {
   for (i=0;i<opentotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
   {
    if (Select())
    {
     OpenTime_Ticket[historytotal+i][0]=OrderOpenTime();
     OpenTime_Ticket[historytotal+i][1]=OrderTicket();
    }
    else
    {
     OpenTime_Ticket[historytotal+i][0]=EMPTY_VALUE;
     total--;
    }
   }
  }
  ArraySort(OpenTime_Ticket);
  ArrayResize(OpenTime_Ticket,total);
  ArrayResize(CloseTime,total);
  ArrayResize(Type,total);
  ArrayResize(Lots,total);
  ArrayResize(Instrument,total);
  ArrayResize(OpenPrice,total);
  ArrayResize(ClosePrice,total);
  ArrayResize(Commission,total);
  ArrayResize(Swap,total);
  ArrayResize(CurSwap,total);
  ArrayResize(DaySwap,total);
  ArrayResize(Profit,total);
  ArrayResize(Magic,total);
  for (i=0;i<total;i++) if (OrderSelect(OpenTime_Ticket[i][1],SELECT_BY_TICKET)) ReadOrder(i);
  if (Type[0]<6)
  {
   Alert("Èñòîðèÿ ñäåëîê çàãðóæåíà íå ïîëíîñòüþ");
   return(0);
  }
  if (File_Write)
  {
   filename=StringConcatenate(AccountNumber(),"_",Period(),".csv");
   handle=FileOpen(filename,FILE_CSV|FILE_WRITE);
   if (handle<0)
   {
    Alert("Îøèáêà #",GetLastError()," ïðè îòêðûòèè ôàéëà");
    return(0);
   }
  }
  start=0;
  CurrentBalance=0.0;
  beginbar=iBarShift(NULL,0,OpenTime_Ticket[0][0]);
  for (i=beginbar;i>=0;i--)
  {
   open=true;
   equityopen=0.0;
   TimeBar=iTime(NULL,0,i);
   for (m=0;m<Period();m++)
   {
    if (TimeBar>TimeCurrent()) break;
    equityclose=0.0;
    for (j=start;j<total;j++)
    {
     if (OpenTime_Ticket[j][0]>TimeBar+60) break;
     if (CloseTime[start]<TimeBar) start++;
     if (CloseTime[j]>=TimeBar && CloseTime[j]<TimeBar+60 && Type[j]>5)
     {
      CurrentBalance+=Profit[j];
      objectname=StringConcatenate("Time: ",TimeToStr(CloseTime[j]));
      if (ObjectFind(objectname)==-1) ObjectCreate(objectname,OBJ_VLINE,Window,TimeBar,0);
      ObjectSetText(objectname,StringConcatenate(Instrument[j],": ",DoubleToStr(Profit[j],2)));
      ObjectSet(objectname,OBJPROP_TIME1,TimeBar);
      ObjectSet(objectname,OBJPROP_COLOR,OrangeRed);
      ObjectSet(objectname,OBJPROP_WIDTH,2);
      continue;
     }
     if (CloseTime[j]>=TimeBar && CloseTime[j]<TimeBar+60 && ClosePrice[j]!=0) CurrentBalance+=Swap[j]+Commission[j]+Profit[j];
     else if (Show_Equity && OpenTime_Ticket[j][0]<=TimeBar && CloseTime[j]>=TimeBar)
     {
      if (MarketInfo(Instrument[j],MODE_POINT)==0)
      {
       if (StringFind(minfosymbols,Instrument[j])==-1)
       {
        Alert("Â îáçîðå ðûíêà íå õâàòàåò "+Instrument[j]);
        minfosymbols=StringConcatenate(minfosymbols," ",Instrument[j]);
       }
       continue;
      }
      bar=iBarShift(Instrument[j],PERIOD_M1,TimeBar);
      if (iTime(Instrument[j],PERIOD_M1,bar)>TimeBar+300)
      {
       if (StringFind(m1symbols,Instrument[j])==-1)
       {
        Alert("Îòñóòñòâóåò èñòîðèÿ M1 ïî "+Instrument[j]+" íà÷èíàÿ ñ "+TimeToStr(iTime(Instrument[j],PERIOD_M1,bar)));
        m1symbols=StringConcatenate(m1symbols," ",Instrument[j]);
       }
       continue;
      }
      if (open)
      {
       if (TimeDayOfWeek(iTime(NULL,0,i))!=TimeDayOfWeek(iTime(NULL,0,i+1)) && OpenTime_Ticket[j][0]<TimeBar)
       {
        switch (MarketInfo(Instrument[j],MODE_PROFITCALCMODE))
        {
         case 0:
         {
          if (TimeDayOfWeek(iTime(NULL,0,i))==4) CurSwap[j]+=3*DaySwap[j];
          else CurSwap[j]+=DaySwap[j];
         } break;
         case 1:
         {
          if (TimeDayOfWeek(iTime(NULL,0,i))==1) CurSwap[j]+=3*DaySwap[j];
          else CurSwap[j]+=DaySwap[j];
         }
        }
       }
       if (Type[j]==OP_BUY)
       {
        lotsize=LotSize(Instrument[j],TimeBar,false);
        equityopen+=Commission[j]+CurSwap[j]+(iOpen(Instrument[j],PERIOD_M1,bar)-OpenPrice[j])*Lots[j]*lotsize;
       }
       else
       {
        spread=MarketInfo(Instrument[j],MODE_POINT)*MarketInfo(Instrument[j],MODE_SPREAD);
        lotsize=LotSize(Instrument[j],TimeBar,false);
        equityopen+=Commission[j]+CurSwap[j]+(OpenPrice[j]-iOpen(Instrument[j],PERIOD_M1,bar)-spread)*Lots[j]*lotsize;
       }
      }
      if (Type[j]==OP_BUY)
      {
       lotsize=LotSize(Instrument[j],TimeBar,true);
       equityclose+=Commission[j]+CurSwap[j]+(iClose(Instrument[j],PERIOD_M1,bar)-OpenPrice[j])*Lots[j]*lotsize;
      }
      else
      {
       spread=MarketInfo(Instrument[j],MODE_POINT)*MarketInfo(Instrument[j],MODE_SPREAD);
       lotsize=LotSize(Instrument[j],TimeBar,true);
       equityclose+=Commission[j]+CurSwap[j]+(OpenPrice[j]-iClose(Instrument[j],PERIOD_M1,bar)-spread)*Lots[j]*lotsize;
      }
     }
    }
    TimeBar+=60;
    if (open)
    {
     equityopen+=CurrentBalance;
     equityhigh=equityopen;
     equitylow=equityopen;
     open=false;
    }
    equityclose+=CurrentBalance;
    if (equityhigh<equityclose) equityhigh=equityclose;
    if (equitylow>equityclose)  equitylow=equityclose;
    if (Show_Info) Information(equityclose);
   }
   if (Show_Balance) Balance[i]=NormalizeDouble(CurrentBalance,2);
   if (Show_Equity)
   {
    if (equityopen<=equityclose)
    {
     EquityBodyUp[i]=NormalizeDouble(equityclose,2);
     MaskBody[i]=NormalizeDouble(equityopen,2);
     EquityShadeUp[i]=NormalizeDouble(equityhigh,2);
    }
    else
    {
     EquityBodyDown[i]=NormalizeDouble(equityopen,2);
     MaskBody[i]=NormalizeDouble(equityclose,2);
     EquityShadeDown[i]=NormalizeDouble(equityhigh,2);
    }
    MaskShade[i]=NormalizeDouble(equitylow,2);
    if (equityhigh==equitylow) EquityLine[i]=equityhigh;
    if (equityclose<0) EquityLine[i]=equityclose;
    if (File_Write)
    {
     time=StringConcatenate(TimeToStr(iTime(NULL,0,i),TIME_DATE),";",TimeToStr(iTime(NULL,0,i),TIME_MINUTES));
     if (FileWrite(handle,time,equityopen,equityhigh,equitylow,equityclose,CurrentBalance)<0) Print("Îøèáêà #",GetLastError()," ïðè çàïèñè â ôàéë");
    }
   }
  }
  TimeBar=Time[0];
  ArrayResize(OpenTime_Ticket,opentotal);
  if (opentotal>0)
  {
   for (i=0;i<opentotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) OpenTime_Ticket[i][1]=OrderTicket();
  }
  if (File_Write) FileClose(handle);
 }
 else
 {
  if (TimeBar!=Time[0])
  {
   TimeBar=Time[0];
   equityopen=0.0;
   equityclose=0.0;
   open=true;
  }
  if (Only_Comment=="" && Only_Magics=="" && Only_Symbols=="" && !Only_Current && !Only_Buys && !Only_Sells)
  {
   if (Show_Balance) Balance[0]=NormalizeDouble(AccountBalance(),2);
   if (Show_Equity)
   {
    if (open)
    {
     equityopen=AccountEquity();
     equityhigh=equityopen;
     equitylow=equityopen;
     open=false;
    }
    equityclose=AccountEquity();
    if (equityclose<equitylow)  equitylow=equityclose;
    if (equityclose>equityhigh) equityhigh=equityclose;
   }
   if (Show_Info) Information(AccountEquity());
  }
  else
  {
   opentotal=ArraySize(OpenTime_Ticket);
   if (opentotal>0)
   {
    for (i=0;i<opentotal;i++)
    {
     if (!OrderSelect(OpenTime_Ticket[i][1],SELECT_BY_TICKET)) continue;
     if (OrderCloseTime()==0) continue;
     else if (Select()) CurrentBalance+=OrderCommission()+OrderSwap()+OrderProfit();
    }
   }
   equityclose=0.0;
   opentotal=OrdersTotal();
   if (opentotal>0)
   {
    for (i=0;i<opentotal;i++)
    {
     if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
     if (Select()) equityclose+=OrderCommission()+OrderSwap()+OrderProfit();
    }
   }
   equityclose+=CurrentBalance;
   if (Show_Balance) Balance[0]=NormalizeDouble(CurrentBalance,2);
   if (Show_Equity)
   {
    if (open)
    {
     equityopen=equityclose;
     equitylow=equityopen;
     equityhigh=equityopen;
     open=false;
    }
    if (equityclose<equitylow)  equitylow=equityclose;
    if (equityclose>equityhigh) equityhigh=equityclose;
   }
   if (Show_Info) Information(equityclose);
   ArrayResize(OpenTime_Ticket,opentotal);
   if (opentotal>0)
   {
    for (i=0;i<opentotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) OpenTime_Ticket[i][1]=OrderTicket();
   }
  }
  if (Show_Equity)
  {
   if (equityopen<=equityclose)
   {
    EquityBodyDown[0]=EMPTY_VALUE;
    EquityBodyUp[0]=NormalizeDouble(equityclose,2);
    MaskBody[0]=NormalizeDouble(equityopen,2);
    EquityShadeDown[0]=EMPTY_VALUE;
    EquityShadeUp[0]=NormalizeDouble(equityhigh,2);
   }
   else
   {
    EquityBodyUp[0]=EMPTY_VALUE;
    EquityBodyDown[0]=NormalizeDouble(equityopen,2);
    MaskBody[0]=NormalizeDouble(equityclose,2);
    EquityShadeUp[0]=EMPTY_VALUE;
    EquityShadeDown[0]=NormalizeDouble(equityhigh,2);
   }
   MaskShade[0]=NormalizeDouble(equitylow,2);
   if (equityhigh==equitylow) EquityLine[0]=equityhigh; else EquityLine[0]=EMPTY_VALUE;
  }
 }
 objectname="Equity Level";
 if (ObjectFind(objectname)==-1) ObjectCreate(objectname,OBJ_HLINE,Window,0,equityclose);
 ObjectSet(objectname,OBJPROP_PRICE1,equityclose);
 ObjectSet(objectname,OBJPROP_COLOR,LightSlateGray);
 if (Show_Info)
 {
  objectname="Maximal Drawdown";
  if (ObjectFind(objectname)==-1) ObjectCreate(objectname,OBJ_LABEL,Window,0,0);
  text=StringConcatenate(objectname,": ",DoubleToStr(Drawdown,2));
  if (MaxPeak>0) text=StringConcatenate(text," (",DoubleToStr(100*Drawdown/MaxPeak,2),"%)");
  ObjectSetText(objectname,text);
  ObjectSet(objectname,OBJPROP_XDISTANCE,10);
  ObjectSet(objectname,OBJPROP_YDISTANCE,10);
  ObjectSet(objectname,OBJPROP_CORNER,1);
  ObjectSet(objectname,OBJPROP_COLOR,Silver);
  objectname="Recovery Factor";
  if (ObjectFind(objectname)==-1) ObjectCreate(objectname,OBJ_LABEL,Window,0,0);
  if (Drawdown>0) RecoveryFactor=equityclose/Drawdown;
  text=StringConcatenate(objectname,": ",DoubleToStr(RecoveryFactor,2));
  ObjectSetText(objectname,text);
  ObjectSet(objectname,OBJPROP_XDISTANCE,10);
  ObjectSet(objectname,OBJPROP_YDISTANCE,30);
  ObjectSet(objectname,OBJPROP_CORNER,1);
  ObjectSet(objectname,OBJPROP_COLOR,Silver);
 }
 //Print("Calculating - ",GetTickCount()-tick," ms");
 return(0);
}
//+----------------------------------------------------------------------------+
//|  ×òåíèå äàííûõ îðäåðà                                                      |
//+----------------------------------------------------------------------------+
void ReadOrder(int n)
{
 Type[n]=OrderType();
 if (OrderType()>5) Instrument[n]=OrderComment();
 else Instrument[n]=OrderSymbol();
 Lots[n]=OrderLots();
 OpenPrice[n]=OrderOpenPrice();
 int close;
 if (OrderCloseTime()!=0)
 {
  CloseTime[n]=OrderCloseTime();
  ClosePrice[n]=OrderClosePrice();
  close=iBarShift(NULL,0,OrderCloseTime());
 }
 else
 {
  CloseTime[n]=TimeCurrent();
  ClosePrice[n]=0.0;
  close=0;
 }
 Commission[n]=OrderCommission();
 Swap[n]=OrderSwap();
 Profit[n]=OrderProfit();
 CurSwap[n]=0.0;
 int swapdays=0;
 int open=iBarShift(NULL,0,OrderOpenTime());
 for (int b=open-1;b>=close;b--)
 {
  if (TimeDayOfWeek(iTime(NULL,0,b))!=TimeDayOfWeek(iTime(NULL,0,b+1)))
  {
   switch (MarketInfo(Instrument[n],MODE_PROFITCALCMODE))
   {
    case 0:
    {
     if (TimeDayOfWeek(iTime(NULL,0,b))==4) swapdays+=3;
     else swapdays++;
    } break;
    case 1:
    {
     if (TimeDayOfWeek(iTime(NULL,0,b))==1) swapdays+=3;
     else swapdays++;
    }
   }
  }
 }
 if (swapdays>0) DaySwap[n]=Swap[n]/swapdays; else DaySwap[n]=0.0;
 Magic[n]=OrderMagicNumber();
 if (Lots[n]==0)
 {
  string ticket=StringSubstr(OrderComment(),StringFind(OrderComment(),"#")+1);
  if (OrderSelect(StrToInteger(ticket),SELECT_BY_TICKET,MODE_HISTORY)) Lots[n]=OrderLots();
 }
}
//+----------------------------------------------------------------------------+
//|  Ðàñ÷¸ò ìàêñèìàëüíîé ïðîñàäêè                                             |
//+----------------------------------------------------------------------------+
void Information(double equity)
{
 if (MaxProfit<equity) MaxProfit=equity;
 if (Drawdown<(MaxProfit-equity))
 {
  Drawdown=MaxProfit-equity;
  MaxPeak=MaxProfit;
 }
}
//+----------------------------------------------------------------------------+
//|  Îïðåäåëåíèå ðàçìåðà êîíòðàêòà                                             |
//+----------------------------------------------------------------------------+
double LotSize(string symbol, datetime tbar, bool close)
{
 double size;
 string BQ,currency=AccountCurrency();
 switch (MarketInfo(symbol,MODE_PROFITCALCMODE))
 {
  case 0:
  {
   int sbar=iBarShift(symbol,PERIOD_M1,tbar);
   size=MarketInfo(symbol,MODE_LOTSIZE);
   if (StringSubstr(symbol,3,3)=="USD") break;
   if (StringSubstr(symbol,0,3)=="USD")
   {
    if (close) size=size/iClose(symbol,PERIOD_M1,sbar);
    else size=size/iOpen(symbol,PERIOD_M1,sbar);
   }
   else
   {
    BQ=StringSubstr(symbol,0,3)+"USD";
    if (iClose(BQ,PERIOD_M1,0)==0) BQ="USD"+StringSubstr(symbol,0,3);
    if (iClose(BQ,PERIOD_M1,0)==0) break;
    int BQbar=iBarShift(BQ,PERIOD_M1,tbar);
    if (StringSubstr(BQ,0,3)=="USD")
    {
     if (close) size=size/iClose(BQ,PERIOD_M1,BQbar)/iClose(symbol,PERIOD_M1,sbar);
     else size=size/iOpen(BQ,PERIOD_M1,BQbar)/iOpen(symbol,PERIOD_M1,sbar);
    }
    else
    {
     if (close) size=size*iClose(BQ,PERIOD_M1,BQbar)/iClose(symbol,PERIOD_M1,sbar);
     else size=size*iOpen(BQ,PERIOD_M1,BQbar)/iOpen(symbol,PERIOD_M1,sbar);
    }
   }
  } break;
  case 1: size=MarketInfo(symbol,MODE_LOTSIZE); break;
  case 2: size=MarketInfo(symbol,MODE_TICKVALUE)/MarketInfo(symbol,MODE_TICKSIZE);
 }
 if (currency!="USD")
 {
  BQ=currency+"USD";
  if (iClose(BQ,PERIOD_M1,0)==0)
  {
   BQ="USD"+currency;
   if (close) size*=iClose(BQ,PERIOD_M1,iBarShift(BQ,PERIOD_M1,tbar));
   else size*=iOpen(BQ,PERIOD_M1,iBarShift(BQ,PERIOD_M1,tbar));
  }
  else
  {
   if (close) size/=iClose(BQ,PERIOD_M1,iBarShift(BQ,PERIOD_M1,tbar));
   else size/=iOpen(BQ,PERIOD_M1,iBarShift(BQ,PERIOD_M1,tbar));
  }
 }
 return(size);
}
//+----------------------------------------------------------------------------+
//|  Âûáîð îðäåðà ïî êðèòåðèÿì                                                 |
//+----------------------------------------------------------------------------+
bool Select()
{
 if (OrderType()>5) return(true);
 if (OrderType()>1) return(false);
 if (Only_Comment!="")
 {
  if (StringFind(OrderComment(),Only_Comment)==-1) return(false);
 }
 if (Only_Magics!="")
 {
  if (StringFind(Only_Magics,DoubleToStr(OrderMagicNumber(),0))==-1) return(false);
 }
 if (Only_Symbols!="")
 {
  if (StringFind(Only_Symbols,OrderSymbol())==-1) return(false);
 }
 else if (Only_Current && OrderSymbol()!=Symbol()) return(false);
 if (Only_Buys && OrderType()!=OP_BUY) return(false);
 if (Only_Sells && OrderType()!=OP_SELL) return(false);
 return(true);
}
//+----------------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---