MT4-CoupleHedgeEA_v2.5

Author: Copyright 2017-2020, Nikolaos Pantzos
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It automatically opens orders when conditions are reachedChecks for the total of closed orders
Miscellaneous
It opens Message Boxes to the userUses files from the file systemIt reads information from a fileIt writes information to file
0 Views
0 Downloads
0 Favorites
MT4-CoupleHedgeEA_v2.5
//====================================================================================================================================================//
#property copyright   "Copyright 2017-2020, Nikolaos Pantzos"
#property link        "https://www.mql5.com/en/users/pannik"
#property version     "2.5"
#property description "It's a multi currency system (use and need at least 2 pairs, which created from 3 currencies, to trade)."
#property description "Expert can to use maximum 5 currencies to make 10 pairs from which it creates 30 couples."
#property description "It is important the order of currencies be from the strongest to the weakest."
#property description "Strongest... EUR/GBP/AUD/NZD/USD/CAD/CHF/JPY ...weakest."
#property description "Attach expert in one chart only (no matter what pair or time frame)."
#property description "To better illustrate of graphics, select sreen resolution 1280 x 1024."
//#property icon        "\\Images\\CoupleHedge-Logo.ico";
#property strict
//====================================================================================================================================================//
enum Oper {Stand_by_Mode, Normal_Operation, Close_In_Profit_And_Stop, Close_Immediately_All_Orders};
enum Step {Not_Open_In_Loss, Open_With_Manual_Step, Open_With_Auto_Step};
enum CloseP {Ticket_Orders, Basket_Orders, Hybrid_Mode};
enum CloseL {Whole_Ticket, Only_First_Order, Not_Close_In_Loss};
enum ProgrO {Statical_Step, Geometrical_Step, Exponential_Step};
enum ProgrL {Statical_Lot, Geometrical_Lot, Exponential_Lot};
enum Side {Trade_Only_Plus, Trade_Only_Minus, Trade_Plus_And_Minus};
//====================================================================================================================================================//
#define PairsPerGroup 2
#define MagicSet      12021
//====================================================================================================================================================//
extern string OperationStr       = "||---------- Operation Set ----------||";
extern Oper   TypeOperation      = Normal_Operation;//Type Operation Mode
extern int    TimerInMillisecond = 100;//Timer In Millisecond For Events
extern string ManagePairsUse     = "||---------- Manage Pairs Use ----------||";
extern string CurrencyTrade      = "EUR/GBP/USD";//Currencies To Make Pairs
extern string NoOfGroupToSkip    = "46,47,48,49";//No Of Couples To Skip
extern Side   SideToOpenOrders   = Trade_Plus_And_Minus;//Side To Open Orders
extern string ManageOpenOrders   = "||---------- Manage Open Orders ----------||";
extern Step   OpenOrdersInLoss   = Open_With_Auto_Step;//Open Orders In Loss
extern double StepOpenNextOrders = 50.0;//Step For Next Order (Value $/Lot)
extern ProgrO StepOrdersProgress = Geometrical_Step;//Type Of Progress Step
extern string ManageCloseProfit  = "||---------- Manage Close Profit Orders ----------||";
extern CloseP TypeCloseInProfit  = Basket_Orders;//Type Of Close In Profit Orders
extern double TargetCloseProfit  = 50.0;//Target Close In Profit (Value $/Lot)
extern int    DelayCloseProfit   = 3;//Delay Before Close In Profit (Value Ticks)
extern string ManageCloseLoss    = "||---------- Manage Close Losses Orders ----------||";
extern CloseL TypeCloseInLoss    = Not_Close_In_Loss;//Type Of Close In Loss Orders
extern double TargetCloseLoss    = 1000.0;//Target Close In Loss (Value $/Lot)
extern int    GroupsStartClose   = 5;//Couples Start Close First Orders
extern int    DelayCloseLoss     = 3;//Delay Before Close In Loss (Value Ticks)
extern string MoneyManagement    = "||---------- Money Management ----------||";
extern bool   AutoLotSize        = false;//Use Auto Lot Size
extern double RiskFactor         = 0.1;//Risk Factor For Auto Lot
extern double ManualLotSize      = 0.01;//Manual Lot Size
extern ProgrL LotOrdersProgress  = Statical_Lot;//Type Of Progress Lot
extern string ControlSessionSet  = "||---------- Control Session ----------||";
extern bool   ControlSession     = false;//Use Control Session
extern int    WaitAfterOpen      = 60;//Wait After Monday Open
extern int    StopBeforeClose    = 60;//Stop Before Friday Close
extern string InfoOnTheScreen    = "||---------- Info On The Screen ----------||";
extern int    SizeFontsOfInfo    = 10;//Size Fonts Of Info
extern bool   ShowPairsInfo      = true;//Show Pairs Info On Screen
extern color  ColorOfTitle       = clrKhaki;//Color Of Titles
extern color  ColorOfInfo        = clrBeige;//Color Of Info
extern color  ColorLineTitles    = clrOrange;//Color Of Line Titles
extern color  ColorOfLine1       = clrMidnightBlue;//Color Of Line 1
extern color  ColorOfLine2       = clrDarkSlateGray;//Color Of Line 2
extern int    PositionOrders     = 415;//Position 'Orders' Info
extern int    PositionPnL        = 515;//Position 'PnL' Info
extern int    PositionClose      = 600;//Position 'Close' Info
extern int    PositionHistory    = 675;//Position 'History' Info
extern int    PositionMaximum    = 750;//Position 'Maximum' Info
extern int    PositionSpread     = 835;//Position 'Spread' Info
extern string Limitations        = "||---------- Limitations ----------||";
extern double MaxSpread          = 0.0;//Max Accepted Spread (0=Not Check)
extern long   MaximumOrders      = 0;//Max Opened Orders (0=Not Limit)
extern int    MaxSlippage        = 3;//Max Accepted Slippage
extern string Configuration      = "||---------- Configuration ----------||";
extern int    MagicNumber        = 0;//Orders' ID (0=Generate Automatic)
extern bool   SetChartUses       = true;//Set Automatically Chart To Use
extern bool   PrintLogReport     = false;//Print Log Report
extern bool   CheckOrders        = true;//Check All Orders
extern bool   ShowTaskInfo       = true;//Show On Chart Information
extern string StringOrdersEA     = "CoupleHedgeEA";//Comment For Orders
extern bool   SetChartInterface  = true;//Set Chart Appearance
extern bool   SaveInformations   = false;//Save Groups Informations
//====================================================================================================================================================//
string SymExt;
string CommentsEA;
string WarningPrint="";
string SymbolStatus[99][3];
string SkippedStatus[99];
//---------------------------------------------------------------------
double BidPricePair[99][3];
double SumSpreadGroup[99];
double FirstLotPlus[99][3];
double FirstLotMinus[99][3];
double LastLotPlus[99][3];
double LastLotMinus[99][3];
double CheckMargin[99];
double SumMargin;
double TotalProfitPlus[99][3];
double TotalProfitMinus[99][3];
double MaxProfit=-99999;
double MinProfit=99999;
double LevelProfitClosePlus[99];
double LevelProfitCloseMinus[99];
double LevelLossClosePlus[99];
double LevelLossCloseMinus[99];
double LevelOpenNextPlus[99];
double LevelOpenNextMinus[99];
double HistoryTotalProfitLoss;
double HistoryTotalProfitPlus;
double HistoryTotalProfitMinus;
double HistoryTotalPips;
double iLotSize;
double TotalLotPlus[99][3];
double TotalLotMinus[99][3];
double MultiplierStepPlus[99];
double MultiplierStepMinus[99];
double MultiplierLotPlus[99];
double MultiplierLotMinus[99];
double SumSpreadValuePlus[99];
double SumSpreadValueMinus[99];
double TotalCommissionPlus[99][3];
double TotalCommissionMinus[99][3];
double FirstProfitPlus[99][3];
double FirstProfitMinus[99][3];
double MaxFloating[99];
double TotalLots;
double FirstTotalLotPlus[99];
double FirstTotalLotMinus[99];
double FirstTotalProfitPlus[99];
double FirstTotalProfitMinus[99];
double SumProfitPlus[99];
double SumProfitMinus[99];
double SumCommissionPlus[99];
double SumCommissionMinus[99];
double SumLotPlus[99];
double SumLotMinus[99];
double SpreadPair[99][3];
double SpreadValuePlus[99][3];
double SpreadValueMinus[99][3];
double HistoryPlusProfit[99];
double HistoryMinusProfit[99];
double TotalGroupsProfit=0;
double TickValuePair[99][3];
double FirstLotPair[99][3];
double TotalGroupsSpread;
double MaximumProfitPlus;
double MaximumLossesPlus;
double MaximumProfitMinus;
double MaximumLossesMinus;
double MaximumProfit;
double MaximumLosses;
//---------------------------------------------------------------------
int i;
int j;
int k;
int MagicNo;
int CountComma;
int OrdersID[99];
int TicketNo[99];
int DecimalsPair;
int MaxTotalOrders=0;
int MultiplierPoint;
int FirstTicketPlus[99][3];
int FirstTicketMinus[99][3];
int LastTicketPlus[99][3];
int LastTicketMinus[99][3];
int TotalOrdersPlus[99][3];
int TotalOrdersMinus[99][3];
int HistoryTotalTrades;
int HistoryTotalOrdersPlus;
int HistoryTotalOrdersMinus;
int HistoryPlusOrders[99];
int HistoryMinusOrders[99];
int SuitePlus[99][3];
int SuiteMinus[99][3];
int CntTry;
int CntTick=0;
int CheckTicksOpenMarket;
int DelayTimesForCloseInLossPlus[99];
int DelayTimesForCloseInLossMinus[99];
int DelayTimesForCloseInProfitPlus[99];
int DelayTimesForCloseInProfitMinus[99];
int DelayTimesForCloseBasketProfit[99];
int DelayTimesForCloseBasketLoss[99];
int CountAllOpenedOrders;
int CountAllHistoryOrders;
int LastAllOrders=0;
int WarningMessage;
int GetCurrencyPos[99];
int MaxOrders[99];
int TotalOrders;
int NumberCurrenciesTrade;
int SumOrdersPlus[99];
int SumOrdersMinus[99];
int GroupsPlus[99];
int GroupsMinus[99];
int TotalGroupsOrders=0;
int NumberGroupsSkip[99];
int FindComma[200];
int PositionSkipped=0;
int DecimalsGet=0;
int CountSkippedGroups;
int GetGroupUnUse[99];
int SignalsMessageWarning;
int LastHourSaved=0;
int GroupWithMaximumProfitsPlus=-1;
int GroupWithMaximumLossesPlus=-1;
int GroupWithMaximumProfitsMinus=-1;
int GroupWithMaximumLossesMinus=-1;
int GroupWithMaximumProfits=-1;
int GroupWithMaximumLosses=-1;
//---------------------------------------------------------------------
bool SpreadOK[99];
bool OrdersIsOK[99];
bool CommentWarning;
bool CountHistory=false;
bool StopWorking=false;
bool WrongSet=false;
bool WrongPairs=false;
bool MarketIsOpen=false;
bool CallMain=false;
bool ChangeOperation=false;
bool ExpertCloseBasketInProfit[99];
bool ExpertCloseBasketInLoss[99];
bool ExpertClosePlusInLoss[99];
bool ExpertClosePlusInProfit[99];
bool ExpertCloseMinusInLoss[99];
bool ExpertCloseMinusInProfit[99];
bool SkipGroup[99];
bool FirsOrdersPlusOK[99];
bool FirsOrdersMinusOK[99];
bool LimitOfOrdersOk;
bool ExpertCloseOrdersInAdvancedMode[4];
//---------------------------------------------------------------------
datetime TimeBegin;
datetime TimeEnd;
datetime ChcekLockedDay=0;
datetime DiffTimes;
datetime StartTime;
//---------------------------------------------------------------------
int NumberGroupsTrade=0;
string SymbolPair[99][3];
int Position[6];
//---------------------------------------------------------------------
long ChartColor;
//---------------------------------------------------------------------
bool LockedDate=false;
datetime ExpiryDate=D'31.12.2019';
bool LockedAccount=false;
int AccountNo=123456;
//====================================================================================================================================================//
//OnInit function
//====================================================================================================================================================//
int OnInit()
  {
//---------------------------------------------------------------------
//Set timer
   EventSetMillisecondTimer(TimerInMillisecond);
   StartTime=TimeCurrent();
//---------------------------------------------------------------------
//Set background
   if((!IsTesting())&&(!IsVisualMode())&&(!IsOptimization()))
     {
      ChartColor=ChartGetInteger(0,CHART_COLOR_BACKGROUND,0);
      if(ObjectFind("Background")==-1)
         ChartBackground("Background",(color)ChartColor,BORDER_FLAT,FALSE,0,16,240,202);
      //---------------------------------------------------------------------
      //Set chart
      if(SetChartInterface==true)
        {
         ChartSetInteger(0,CHART_SHOW_GRID,false);//Hide grid
         ChartSetInteger(0,CHART_MODE,0);//Set price in bars
         ChartSetInteger(0,CHART_SCALE,1);//Set scale
         ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_HIDE);//Hide value
         ChartSetInteger(0,CHART_COLOR_CHART_UP,clrNONE);//Hide line up
         ChartSetInteger(0,CHART_COLOR_CHART_DOWN,clrNONE);//Hide line down
         ChartSetInteger(0,CHART_COLOR_CHART_LINE,clrNONE);//Hide chart line
        }
      //---------------------------------------------------------------------
      //Confirm ranges and sets
      if(RiskFactor<0.01)
         RiskFactor=0.01;
      if(RiskFactor>10.0)
         RiskFactor=10.0;
      if(DelayCloseProfit<1)
         DelayCloseProfit=1;
      if(DelayCloseProfit>60)
         DelayCloseProfit=60;
      if(DelayCloseLoss<1)
         DelayCloseLoss=1;
      if(DelayCloseLoss>60)
         DelayCloseLoss=60;
      if(MagicNumber<0)
         MagicNumber=0;
      if(MaximumOrders<0)
         MaximumOrders=0;
      if(MaxSlippage<1)
         MaxSlippage=1;
      if(MaxSpread<0)
         MaxSpread=0;
      if(WaitAfterOpen<0)
         WaitAfterOpen=0;
      if(StopBeforeClose<0)
         StopBeforeClose=0;
      if((SideToOpenOrders!=2)&&(OpenOrdersInLoss==2))
         OpenOrdersInLoss=1;
      //---------------------------------------------------------------------
      //Reset value
      ArrayInitialize(SkipGroup,false);
      ArrayInitialize(ExpertCloseOrdersInAdvancedMode,false);
      ArrayInitialize(ExpertCloseBasketInProfit,false);
      ArrayInitialize(ExpertCloseBasketInLoss,false);
      ArrayInitialize(ExpertClosePlusInLoss,false);
      ArrayInitialize(ExpertClosePlusInProfit,false);
      ArrayInitialize(ExpertCloseMinusInLoss,false);
      ArrayInitialize(ExpertCloseMinusInProfit,false);
      ArrayInitialize(DelayTimesForCloseInLossPlus,0);
      ArrayInitialize(DelayTimesForCloseInLossMinus,0);
      ArrayInitialize(DelayTimesForCloseInProfitPlus,0);
      ArrayInitialize(DelayTimesForCloseInProfitMinus,0);
      ArrayInitialize(DelayTimesForCloseBasketProfit,0);
      ArrayInitialize(DelayTimesForCloseBasketLoss,0);
      ArrayInitialize(OrdersID,0);
      ArrayInitialize(MaxOrders,0);
      ArrayInitialize(MaxFloating,99999);
      ArrayInitialize(Position,0);
      ArrayInitialize(NumberGroupsSkip,-1);
      ArrayInitialize(GetGroupUnUse,-1);
      ArrayInitialize(FindComma,0);
      CountSkippedGroups=0;
      CheckTicksOpenMarket=0;
      NumberCurrenciesTrade=0;
      PositionSkipped=0;
      WrongPairs=false;
      CntTick=0;
      CountComma=0;
      //---------------------------------------------------------------------
      //Symbol suffix
      if(StringLen(Symbol())>6)
         SymExt=StringSubstr(Symbol(),6);
      //---------------------------------------------------------------------
      //Calculate for 4 or 5 digits broker
      MultiplierPoint=1;
      DecimalsPair=(int)MarketInfo("EURUSD"+SymExt,MODE_DIGITS);
      if((DecimalsPair==3)||(DecimalsPair==5))
         MultiplierPoint=10;
      //---------------------------------------------------------------------
      //Comments orders
      if(StringOrdersEA=="")
         CommentsEA=WindowExpertName();
      else
         CommentsEA=StringOrdersEA;
      //---------------------------------------------------------------------
      //Set up pairs
      NumberCurrenciesTrade=((StringLen(CurrencyTrade)+1)/4);
      //---Set numbers of groups
      if(NumberCurrenciesTrade==3)
         NumberGroupsTrade=3;
      if(NumberCurrenciesTrade==4)
         NumberGroupsTrade=12;
      if(NumberCurrenciesTrade==5)
         NumberGroupsTrade=30;
      //---Set Positions
      Position[1]=0;
      Position[2]=4;
      Position[3]=8;
      Position[4]=12;
      Position[5]=16;
      //---------------------------------------------------------------------
      //Check and info
      if(NumberCurrenciesTrade<3)
        {
         Comment("\n "+StringOrdersEA+
                 "\n\n --- W A R N I N G S ---"+
                 "\n\nNumber of currencies to add \nis below the threshold of 3 (",NumberCurrenciesTrade,")"+
                 "\n\nplease check added currencies!");
         Print("Number of currencies to add is below the threshold of 3 (",NumberCurrenciesTrade,")");
         WrongPairs=true;
         return(0);
        }
      //---
      if(NumberCurrenciesTrade>5)
        {
         Comment("\n "+StringOrdersEA+
                 "\n\n --- W A R N I N G S ---"+
                 "\n\nNumber of currencies to add \nis above the threshold of 5 (",NumberCurrenciesTrade,")"+
                 "\n\nplease check added currencies!");
         Print("Number of currencies to add is above the threshold of 5 (",NumberCurrenciesTrade,")");
         WrongPairs=true;
         return(0);
        }
      //---------------------------------------------------------------------
      //Set up groups
      if(NumberCurrenciesTrade>=3)
        {
         //---1
         SymbolPair[0][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[2],3)+SymExt;
         SymbolPair[0][2]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[3],3)+SymExt;
         //---2
         SymbolPair[1][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[2],3)+SymExt;
         SymbolPair[1][2]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[3],3)+SymExt;
         //---3
         SymbolPair[2][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[3],3)+SymExt;
         SymbolPair[2][2]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[3],3)+SymExt;
        }
      //---Set groups of 4 currencies
      if(NumberCurrenciesTrade>=4)
        {
         //---4
         SymbolPair[3][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[2],3)+SymExt;
         SymbolPair[3][2]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         //---5
         SymbolPair[4][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[2],3)+SymExt;
         SymbolPair[4][2]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         //---6
         SymbolPair[5][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[3],3)+SymExt;
         SymbolPair[5][2]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         //---7
         SymbolPair[6][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[3],3)+SymExt;
         SymbolPair[6][2]=StringSubstr(CurrencyTrade,Position[3],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         //---8
         SymbolPair[7][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         SymbolPair[7][2]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         //---9
         SymbolPair[8][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         SymbolPair[8][2]=StringSubstr(CurrencyTrade,Position[3],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         //---10
         SymbolPair[9][1]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[3],3)+SymExt;
         SymbolPair[9][2]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         //---11
         SymbolPair[10][1]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[3],3)+SymExt;
         SymbolPair[10][2]=StringSubstr(CurrencyTrade,Position[3],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         //---12
         SymbolPair[11][1]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         SymbolPair[11][2]=StringSubstr(CurrencyTrade,Position[3],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
        }
      //---Set groups of 5 currencies
      if(NumberCurrenciesTrade>=5)
        {
         //---13
         SymbolPair[12][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[2],3)+SymExt;
         SymbolPair[12][2]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---14
         SymbolPair[13][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[2],3)+SymExt;
         SymbolPair[13][2]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---15
         SymbolPair[14][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[3],3)+SymExt;
         SymbolPair[14][2]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---16
         SymbolPair[15][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[3],3)+SymExt;
         SymbolPair[15][2]=StringSubstr(CurrencyTrade,Position[3],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---17
         SymbolPair[16][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         SymbolPair[16][2]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---18
         SymbolPair[17][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         SymbolPair[17][2]=StringSubstr(CurrencyTrade,Position[4],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---19
         SymbolPair[18][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         SymbolPair[18][2]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---20
         SymbolPair[19][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         SymbolPair[19][2]=StringSubstr(CurrencyTrade,Position[3],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---21
         SymbolPair[20][1]=StringSubstr(CurrencyTrade,Position[1],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         SymbolPair[20][2]=StringSubstr(CurrencyTrade,Position[4],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---22
         SymbolPair[21][1]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[3],3)+SymExt;
         SymbolPair[21][2]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---23
         SymbolPair[22][1]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[3],3)+SymExt;
         SymbolPair[22][2]=StringSubstr(CurrencyTrade,Position[3],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---24
         SymbolPair[23][1]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         SymbolPair[23][2]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---25
         SymbolPair[24][1]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         SymbolPair[24][2]=StringSubstr(CurrencyTrade,Position[4],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---26
         SymbolPair[25][1]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         SymbolPair[25][2]=StringSubstr(CurrencyTrade,Position[3],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---27
         SymbolPair[26][1]=StringSubstr(CurrencyTrade,Position[2],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         SymbolPair[26][2]=StringSubstr(CurrencyTrade,Position[4],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---28
         SymbolPair[27][1]=StringSubstr(CurrencyTrade,Position[3],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         SymbolPair[27][2]=StringSubstr(CurrencyTrade,Position[3],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---29
         SymbolPair[28][1]=StringSubstr(CurrencyTrade,Position[3],3)+StringSubstr(CurrencyTrade,Position[4],3)+SymExt;
         SymbolPair[28][2]=StringSubstr(CurrencyTrade,Position[4],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         //---30
         SymbolPair[29][1]=StringSubstr(CurrencyTrade,Position[3],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
         SymbolPair[29][2]=StringSubstr(CurrencyTrade,Position[4],3)+StringSubstr(CurrencyTrade,Position[5],3)+SymExt;
        }
      //---------------------------------------------------------------------
      //Set Skipped groups
      if(StringLen(NoOfGroupToSkip)>0)
        {
         if(StringLen(NoOfGroupToSkip)>2)
           {
            for(i=0; i<StringLen(NoOfGroupToSkip); i++)
              {
               if((i>0)&&(StringFind(NoOfGroupToSkip,",",i)!=-1)&&(StringFind(NoOfGroupToSkip,",",i)!=StringFind(NoOfGroupToSkip,",",i+1)))
                 {
                  FindComma[CountComma]=StringFind(NoOfGroupToSkip,",",i);
                  CountComma++;
                 }
              }
            //---
            for(i=0; i<CountComma+1; i++)
              {
               if(i==0)
                  NumberGroupsSkip[i]=StrToInteger(StringSubstr(NoOfGroupToSkip,0,FindComma[i]));
               if((i>0)&&(i<CountComma))
                  NumberGroupsSkip[i]=StrToInteger(StringSubstr(NoOfGroupToSkip,FindComma[i-1]+1,(FindComma[i]-FindComma[i-1])-1));
               if(i==CountComma)
                  NumberGroupsSkip[i]=StrToInteger(StringSubstr(NoOfGroupToSkip,FindComma[i-1]+1,0));
              }
           }
         //---
         if(StringLen(NoOfGroupToSkip)<=2)
           {
            PositionSkipped=0;
            DecimalsGet=StringLen(NoOfGroupToSkip);
            NumberGroupsSkip[0]=StrToInteger(StringSubstr(NoOfGroupToSkip,PositionSkipped,DecimalsGet));
           }
         //---Set groups to skip
         for(i=0; i<NumberGroupsTrade; i++)
           {
            if(NumberGroupsSkip[i]!=-1)
              {
               CountSkippedGroups++;
               GetGroupUnUse[CountSkippedGroups]=NumberGroupsSkip[i];
              }
           }
         //---
         for(i=0; i<=CountSkippedGroups; i++)
           {
            for(int cnt10=0; cnt10<=NumberGroupsTrade; cnt10++)
              {
               if(GetGroupUnUse[i]==cnt10)
                 {
                  SkipGroup[cnt10-1]=true;
                 }
              }
           }
        }
      //---------------------------------------------------------------------
      //Add symbols in data window
      for(i=0; i<NumberGroupsTrade; i++)
        {
         SkippedStatus[i]="";
         //---
         Print(" # "+WindowExpertName()+" # "+"Check couples No "+IntegerToString(i+1)+"...("+SymbolPair[i][1]+"/"+SymbolPair[i][2]+")");
         //---
         if((SymbolSelect(SymbolPair[i][1],true))&&(SymbolSelect(SymbolPair[i][2],true)))
           {
            Print(" # "+WindowExpertName()+" # "+SymbolPair[i][1]+"/"+SymbolPair[i][2]+" are ok");
            if(SkipGroup[i]==true)
              {
               SkippedStatus[i]="Couple Skipped by user from external parameters";
               Print(" # ",WindowExpertName()," # Skip couple No ",IntegerToString(i+1)," #");
              }
           }
         else
            Print(" # "+WindowExpertName()+" # "+SymbolPair[i][1]+"/"+SymbolPair[i][2]+" not found");
         //---Get prices of symbols
         BidPricePair[i][1]=MarketInfo(SymbolPair[i][1],MODE_BID);
         BidPricePair[i][2]=MarketInfo(SymbolPair[i][2],MODE_BID);
         //---Check symbols
         if(((BidPricePair[i][1]==0)||(BidPricePair[i][2]==0))&&(WrongPairs==false))
           {
            SymbolStatus[i][1]="Pair "+SymbolPair[i][1]+" Not Found. Number Of Couple: "+IntegerToString(i+1);
            SymbolStatus[i][2]="Pair "+SymbolPair[i][2]+" Not Found. Number Of Couple: "+IntegerToString(i+1);
            //---Warnings message
            Comment("\n "+StringOrdersEA+
                    "\n\n --- W A R N I N G S ---"+
                    "\n\n"+SymbolStatus[i][1]+" or \n"+SymbolStatus[i][2]+
                    "\n\nplease check added currencies!"+
                    "\n\nCorrect format and series for each currency is \nEUR/GBP/AUD/NZD/USD/CAD/CHF/JPY");
            WrongPairs=true;
           }
        }
      //---------------------------------------------------------------------
      //Set chart
      if(SetChartUses==true)
        {
         if((ChartSymbol()!=SymbolPair[0][1])||(ChartPeriod()!=PERIOD_M1))
           {
            Comment("\n\nExpert set chart symbol...");
            Print(" # "+WindowExpertName()+" # "+"Set chart symbol: "+SymbolPair[0][1]+" and Period: M1");
            ChartSetSymbolPeriod(0,SymbolPair[0][1],PERIOD_M1);
           }
        }
      //---------------------------------------------------------------------
      //Check sets and value
      CheckValue();
      if(WrongSet==true)
         return(0);
      if(WrongPairs==true)
         return(0);
      //---------------------------------------------------------------------
      //Currency and groups informations
      Print("### ",WindowExpertName()," || Number Of currencies use: ",NumberCurrenciesTrade," || Number of couples trade: ",NumberGroupsTrade," ###");
      //---------------------------------------------------------------------
      //ID orders
      if(MagicNumber==0)
        {
         MagicNo=0;
         for(i=0; i<StringLen(CurrencyTrade); i++)
            MagicNo+=(StringGetChar(CurrencyTrade,i)*(i+1));
         MagicNo+=MagicSet+AccountNumber()+(SideToOpenOrders*123);
        }
      else
        {
         MagicNo=MagicNumber;
        }
      //---------------------------------------------------------------------
      //Set magic and suite for each group
      for(i=0; i<NumberGroupsTrade; i++)
        {
         OrdersID[i]=MagicNo+i;
         //---Set up suite
         if((StringSubstr(SymbolPair[i][1],0,3)==StringSubstr(SymbolPair[i][2],0,3))||(StringSubstr(SymbolPair[i][1],3,6)==StringSubstr(SymbolPair[i][2],3,6)))
           {
            SuitePlus[i][1]=OP_BUY;
            SuitePlus[i][2]=OP_SELL;
            //---
            SuiteMinus[i][1]=OP_SELL;
            SuiteMinus[i][2]=OP_BUY;
           }
         else
           {
            SuitePlus[i][1]=OP_BUY;
            SuitePlus[i][2]=OP_BUY;
            //---
            SuiteMinus[i][1]=OP_SELL;
            SuiteMinus[i][2]=OP_SELL;
           }
        }
      //---------------------------------------------------------------------
      //Check maximum orders and minimum lot
      if(TypeOperation==1)
        {
         if(AutoLotSize==true)
            iLotSize=(AccountBalance()/100000)*RiskFactor;
         if(AutoLotSize==false)
            iLotSize=ManualLotSize;
         //---
         if(NumberGroupsTrade>=10)
           {
            if((AccountInfoInteger(ACCOUNT_LIMIT_ORDERS)!=0)||(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)!=iLotSize))
              {
               if(AccountInfoInteger(ACCOUNT_LIMIT_ORDERS)!=0)
                  SignalsMessageWarning=MessageBox("Account has maximum orders limit: "+IntegerToString(AccountInfoInteger(ACCOUNT_LIMIT_ORDERS))+
                                                   "\n\nBy clicking YES expert run. \n\nSTART EXPERT ADVISOR?","RISK DISCLAIMER - "+WindowExpertName(),MB_YESNO|MB_ICONEXCLAMATION);
               if(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)!=0.01)
                  SignalsMessageWarning=MessageBox("Account or pair has minimum lot: "+DoubleToStr(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN))+
                                                   "\n\nBy clicking YES expert run. \n\nSTART EXPERT ADVISOR?","RISK DISCLAIMER - "+WindowExpertName(),MB_YESNO|MB_ICONEXCLAMATION);
               if(SignalsMessageWarning==IDNO)
                  return(INIT_FAILED);
              }
           }
        }
      //---------------------------------------------------------------------
      //Set maximum orders
      if(((MaximumOrders==0)&&(AccountInfoInteger(ACCOUNT_LIMIT_ORDERS)!=0))||((MaximumOrders>AccountInfoInteger(ACCOUNT_LIMIT_ORDERS))&&(AccountInfoInteger(ACCOUNT_LIMIT_ORDERS)!=0)))
         MaximumOrders=AccountInfoInteger(ACCOUNT_LIMIT_ORDERS);
      //---------------------------------------------------------------------
      //Call MainFunction function to show information if market is closed
      MainFunction();
     }
//---------------------------------------------------------------------
   return(INIT_SUCCEEDED);
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
void OnDeinit(const int reason)
  {
//---------------------------------------------------------------------
//Clear chart
   for(i=0; i<99; i++)
     {
      if(ObjectFind("Comm1"+IntegerToString(i))>-1)
         ObjectDelete("Comm1"+IntegerToString(i));
      if(ObjectFind("Comm2"+IntegerToString(i))>-1)
         ObjectDelete("Comm2"+IntegerToString(i));
      if(ObjectFind("Comm3"+IntegerToString(i))>-1)
         ObjectDelete("Comm3"+IntegerToString(i));
      if(ObjectFind("Comm4"+IntegerToString(i))>-1)
         ObjectDelete("Comm4"+IntegerToString(i));
      if(ObjectFind("Comm5"+IntegerToString(i))>-1)
         ObjectDelete("Comm5"+IntegerToString(i));
      if(ObjectFind("Comm6"+IntegerToString(i))>-1)
         ObjectDelete("Comm6"+IntegerToString(i));
      if(ObjectFind("Comm7"+IntegerToString(i))>-1)
         ObjectDelete("Comm7"+IntegerToString(i));
      if(ObjectFind("BackgroundLine1"+IntegerToString(i))>-1)
         ObjectDelete("BackgroundLine1"+IntegerToString(i));
      if(ObjectFind("BackgroundLine2"+IntegerToString(i))>-1)
         ObjectDelete("BackgroundLine2"+IntegerToString(i));
      if(ObjectFind("Text"+IntegerToString(i))>-1)
         ObjectDelete("Text"+IntegerToString(i));
      if(ObjectFind("Str"+IntegerToString(i))>-1)
         ObjectDelete("Str"+IntegerToString(i));
     }
//---
   if(ObjectFind("BackgroundLine0")>-1)
      ObjectDelete("BackgroundLine0");
   if(ObjectFind("Background")>-1)
      ObjectDelete("Background");
//---
   Comment("");
   EventKillTimer();
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//OnTick function
//====================================================================================================================================================//
void OnTick()
  {
//---------------------------------------------------------------------
//Pass test to approval it on market place
   int OpenedOrders=0;
   int iSendOrder1=0;
   int iSendOrder2=0;
   bool iCloseOrder1=false;
   bool iCloseOrder2=false;
   double Profit1=0;
   double Profit2=0;
   double OrdersTakeProfit=10;
   double OrdersStopLoss=10;
   double LotsSize=NormalizeLot(0.01);
//---------------------------------------------------------------------
   if((IsTesting())||(IsVisualMode())||(IsOptimization()))
     {
      if(OrdersTotal()>0)
        {
         for(i=OrdersTotal()-1; i>=0; i--)
           {
            if(OrderSelect(i,SELECT_BY_POS)==true)
              {
               if(OrderMagicNumber()==123321)
                 {
                  OpenedOrders++;
                  if(OrderType()==OP_BUY)
                    {
                     Profit1=OrderProfit()+OrderCommission()+OrderSwap();
                     if((Profit1>=(OrderLots()*OrdersTakeProfit)*MarketInfo(Symbol(),MODE_TICKVALUE)*10)||(Profit1<=-((OrderLots()*OrdersStopLoss)*MarketInfo(Symbol(),MODE_TICKVALUE)*10)))
                       {
                        iCloseOrder1=OrderClose(OrderTicket(),OrderLots(),Bid,3,clrNONE);
                       }
                    }
                  if(OrderType()==OP_SELL)
                    {
                     Profit2=OrderProfit()+OrderCommission()+OrderSwap();
                     if((Profit2>=(OrderLots()*OrdersTakeProfit)*MarketInfo(Symbol(),MODE_TICKVALUE)*10)||(Profit2<=-((OrderLots()*OrdersStopLoss)*MarketInfo(Symbol(),MODE_TICKVALUE)*10)))
                       {
                        iCloseOrder2=OrderClose(OrderTicket(),OrderLots(),Ask,3,clrNONE);
                       }
                    }
                 }
              }
           }
        }
      else
         if((Hour()==12)||(Hour()==24))
           {
            if((OpenedOrders==0)&&(AccountFreeMargin()-((AccountFreeMargin()-AccountFreeMarginCheck(Symbol(),OP_BUY,LotsSize))+(AccountFreeMargin()-AccountFreeMarginCheck(Symbol(),OP_SELL,LotsSize)))>0))
              {
               iSendOrder1=OrderSend(Symbol(),OP_BUY,LotsSize,Ask,3,0,0,"",123321,0,clrBlue);
               iSendOrder2=OrderSend(Symbol(),OP_SELL,LotsSize,Bid,3,0,0,"",123321,0,clrRed);
              }
           }
      return;
     }
//---------------------------------------------------------------------
//Reset value
   CallMain=false;
//---------------------------------------------------------------------
//Warning message
   if(!IsTesting())
     {
      if(!IsExpertEnabled())
        {
         Comment("\n      The trading terminal",
                 "\n      of experts do not run",
                 "\n\n\n      Turn ON EA Please .......");
         return;
        }
      else
         if((!IsTradeAllowed())||(IsTradeContextBusy()))
           {
            Comment("\n      Trade is disabled",
                    "\n      or trade flow is busy.",
                    "\n\n\n      Wait Please .......");
            return;
           }
         else
           {
            CallMain=true;
           }
     }
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//OnTimer function
//====================================================================================================================================================//
void OnTimer()
  {
//---------------------------------------------------------------------
//Call main function
   if(CallMain==true)
      MainFunction();
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//main function
//====================================================================================================================================================//
void MainFunction()
  {
//---------------------------------------------------------------------
//Reset value
   HistoryTotalPips=0;
   HistoryTotalTrades=0;
   HistoryTotalOrdersPlus=0;
   HistoryTotalOrdersMinus=0;
   HistoryTotalProfitLoss=0;
   HistoryTotalProfitPlus=0;
   HistoryTotalProfitMinus=0;
   TotalGroupsProfit=0;
   TotalGroupsOrders=0;
   CommentWarning=false;
   LimitOfOrdersOk=true;
//---------------------------------------------------------------------
//Reset value
   ArrayInitialize(SpreadOK,true);
   ArrayInitialize(TicketNo,-1);
   ArrayInitialize(SumSpreadValuePlus,0);
   ArrayInitialize(SumSpreadValueMinus,0);
   ArrayInitialize(LevelProfitClosePlus,0);
   ArrayInitialize(LevelProfitCloseMinus,0);
   ArrayInitialize(LevelLossClosePlus,0);
   ArrayInitialize(LevelLossCloseMinus,0);
   ArrayInitialize(LevelOpenNextPlus,0);
   ArrayInitialize(LevelOpenNextMinus,0);
   ArrayInitialize(CheckMargin,0);
   ArrayInitialize(MultiplierLotPlus,0);
   ArrayInitialize(MultiplierLotMinus,0);
   ArrayInitialize(MultiplierStepPlus,0);
   ArrayInitialize(MultiplierStepMinus,0);
   ArrayInitialize(SpreadPair,0);
   ArrayInitialize(SumSpreadGroup,0);
   ArrayInitialize(SpreadValuePlus,0);
   ArrayInitialize(SpreadValueMinus,0);
   ArrayInitialize(FirsOrdersPlusOK,false);
   ArrayInitialize(FirsOrdersMinusOK,false);
//---------------------------------------------------------------------
//Check expiry date
   if(ChcekLockedDay!=DayOfYear())
     {
      ChcekLockedDay=DayOfYear();
      ChangeOperation=false;
      LockedCheck();
     }
//---Change operation
   if((ChangeOperation==true)&&(TypeOperation==1))
     {
      TypeOperation=2;
      CommentWarning=true;
      WarningPrint=StringConcatenate("Expert Has Expired, Working To Close In Profit And Stop");
     }
//---------------------------------------------------------------------
//Stop in locked version or wrong sets
   if(StopWorking==true)
      return;
   if(WrongSet==true)
      return;
   if(WrongPairs==true)
      return;
//---------------------------------------------------------------------
//Check open market
   if((!IsTesting())&&(!IsVisualMode())&&(!IsOptimization()))
     {
      if(CheckTicksOpenMarket<3)
         CheckTicksOpenMarket++;
      //---
      if(CheckTicksOpenMarket==1)
        {
         if(IsConnected())
           {
            MarketIsOpen=false;
            CommentWarning=true;
            WarningPrint="Market is closed!!!";
           }
         else
           {
            MarketIsOpen=false;
            CommentWarning=true;
            WarningPrint="Disconnected terminal!!!";
           }
        }
      //---
      if((CheckTicksOpenMarket>=2)&&(MarketIsOpen==false))
         MarketIsOpen=true;
     }
   else
     {
      MarketIsOpen=true;
     }
//---------------------------------------------------------------------
//Check limit of orders
   if(MaximumOrders!=0)
     {
      if(OrdersTotal()+(PairsPerGroup)>MaximumOrders)
        {
         LimitOfOrdersOk=false;
         CommentWarning=true;
         WarningPrint=StringConcatenate("Expert reached the limit of opened orders!!!");
        }
     }
//---------------------------------------------------------------------
//Control market session
   if(ControlSession==true)
     {
      //---Wait on Monday
      if((DayOfWeek()==1)&&(SymbolInfoSessionTrade(Symbol(),MONDAY,0,TimeBegin,TimeEnd)==true))
        {
         if(TimeToString(TimeCurrent(),TIME_MINUTES)<=TimeToString(TimeBegin+(WaitAfterOpen*60),TIME_MINUTES))
           {
            MarketIsOpen=false;
            CommentWarning=true;
            WarningPrint=StringConcatenate("Wait ",WaitAfterOpen," minutes after Monday open market!!!");
           }
        }
      //---Stop on Friday
      if((DayOfWeek()==5)&&(SymbolInfoSessionTrade(Symbol(),FRIDAY,0,TimeBegin,TimeEnd)==true))
        {
         if(TimeToString(TimeCurrent(),TIME_MINUTES)>=TimeToString(TimeEnd-(StopBeforeClose*60),TIME_MINUTES))
           {
            MarketIsOpen=false;
            CommentWarning=true;
            WarningPrint=StringConcatenate("Wait ",StopBeforeClose," minutes before Friday close market!!!");
           }
        }
     }
//---------------------------------------------------------------------
//Start multipair function
   for(int cnt=0; cnt<NumberGroupsTrade; cnt++)
     {
      //---------------------------------------------------------------------
      //Skip groups
      if(SkipGroup[cnt]==true)
         continue;
      //---------------------------------------------------------------------
      //Get orders' informations
      CountCurrentOrders(cnt);
      //---------------------------------------------------------------------
      //Get spreads and tick value
      for(i=1; i<=PairsPerGroup; i++)
        {
         SpreadPair[cnt][i]=NormalizeDouble(MarketInfo(SymbolPair[cnt][i],MODE_SPREAD)/MultiplierPoint,2);
         SumSpreadGroup[cnt]+=NormalizeDouble(SpreadPair[cnt][i],2);
         //---
         TickValuePair[cnt][i]=MarketInfo(SymbolPair[cnt][i],MODE_TICKVALUE);
         //---
         SpreadValuePlus[cnt][i]=SpreadPair[cnt][i]*TotalLotPlus[cnt][i]*TickValuePair[cnt][i]*MultiplierPoint;
         //---
         SpreadValueMinus[cnt][i]=SpreadPair[cnt][i]*TotalLotMinus[cnt][i]*TickValuePair[cnt][i]*MultiplierPoint;
         //---
         SumSpreadValuePlus[cnt]+=SpreadValuePlus[cnt][i];
         SumSpreadValueMinus[cnt]+=SpreadValueMinus[cnt][i];
        }
      //---
      if(cnt==0)
         TotalGroupsSpread=0;
      TotalGroupsSpread+=SumSpreadGroup[cnt];
      //---------------------------------------------------------------------
      //Check spreads
      if(MaxSpread>0.0)
        {
         if(SumSpreadGroup[cnt]>MaxSpread)
           {
            SpreadOK[cnt]=false;
            CommentWarning=true;
            WarningPrint=StringConcatenate("Spread it isn't normal (",SumSpreadGroup[cnt],"/",MaxSpread,")");
           }
        }
      //---------------------------------------------------------------------
      //Reset value
      if(SumOrdersPlus[cnt]==0)
        {
         ExpertClosePlusInProfit[cnt]=false;
         ExpertClosePlusInLoss[cnt]=false;
         DelayTimesForCloseInLossPlus[cnt]=0;
         DelayTimesForCloseInProfitPlus[cnt]=0;
        }
      //---
      if(SumOrdersMinus[cnt]==0)
        {
         ExpertCloseMinusInProfit[cnt]=false;
         ExpertCloseMinusInLoss[cnt]=false;
         DelayTimesForCloseInLossMinus[cnt]=0;
         DelayTimesForCloseInProfitMinus[cnt]=0;
        }
      //---
      if(SumOrdersPlus[cnt]+SumOrdersMinus[cnt]==0)
        {
         ExpertCloseBasketInProfit[cnt]=false;
         ExpertCloseBasketInLoss[cnt]=false;
         DelayTimesForCloseBasketLoss[cnt]=0;
         DelayTimesForCloseBasketProfit[cnt]=0;
        }
      //---Reset 1
      if((cnt==NumberGroupsTrade-1)&&(ExpertCloseOrdersInAdvancedMode[1]==true)&&
         (TotalOrdersPlus[GroupWithMaximumProfitsPlus][1]==0)&&
         (TotalOrdersPlus[GroupWithMaximumProfitsPlus][2]==0)&&
         (TotalOrdersPlus[GroupWithMaximumLossesPlus][1]==0)&&
         (TotalOrdersPlus[GroupWithMaximumLossesPlus][2]==0))
        {
         ExpertCloseOrdersInAdvancedMode[1]=false;
        }
      //---Reset 2
      if((cnt==NumberGroupsTrade-1)&&(ExpertCloseOrdersInAdvancedMode[2]==true)&&
         (TotalOrdersMinus[GroupWithMaximumProfitsMinus][1]==0)&&
         (TotalOrdersMinus[GroupWithMaximumProfitsMinus][2]==0)&&
         (TotalOrdersMinus[GroupWithMaximumLossesMinus][1]==0)&&
         (TotalOrdersMinus[GroupWithMaximumLossesMinus][2]==0))
        {
         ExpertCloseOrdersInAdvancedMode[2]=false;
        }
      //---Reset 3
      if((cnt==NumberGroupsTrade-1)&&(ExpertCloseOrdersInAdvancedMode[3]==true)&&
         (TotalOrdersPlus[GroupWithMaximumProfits][1]==0)&&
         (TotalOrdersPlus[GroupWithMaximumProfits][2]==0)&&
         (TotalOrdersMinus[GroupWithMaximumProfits][1]==0)&&
         (TotalOrdersMinus[GroupWithMaximumProfits][2]==0)&&
         (TotalOrdersPlus[GroupWithMaximumLosses][1]==0)&&
         (TotalOrdersPlus[GroupWithMaximumLosses][2]==0)&&
         (TotalOrdersMinus[GroupWithMaximumLosses][1]==0)&&
         (TotalOrdersMinus[GroupWithMaximumLosses][2]==0))
        {
         ExpertCloseOrdersInAdvancedMode[3]=false;
        }
      //---------------------------------------------------------------------
      //Count history orders first time
      if(CntTick<NumberGroupsTrade+4)
        {
         CntTick++;
         if(CntTick<NumberGroupsTrade+3)
            CountHistory=true;
        }
      //---------------------------------------------------------------------
      //Count history orders if close orders
      LastAllOrders=MathMax(LastAllOrders,OrdersTotal());
      if(OrdersTotal()<LastAllOrders)
        {
         LastAllOrders=OrdersTotal();
         CountHistory=true;
        }
      //---
      if(CountHistory==true)
        {
         CountHistory=false;
         CountHistoryOrders(cnt);
        }
      //---------------------------------------------------------------------
      //Set levels open/close
      if(StepOrdersProgress==0)//Statical
        {
         MultiplierStepPlus[cnt]=GroupsPlus[cnt];
         MultiplierStepMinus[cnt]=GroupsMinus[cnt];
        }
      //---
      if(StepOrdersProgress==1)//Geometrical
        {
         if(GroupsPlus[cnt]>0)
            for(i=0; i<=GroupsPlus[cnt]; i++)
               MultiplierStepPlus[cnt]+=i;
         if(GroupsMinus[cnt]>0)
            for(i=0; i<=GroupsMinus[cnt]; i++)
               MultiplierStepMinus[cnt]+=i;
        }
      //---
      if(StepOrdersProgress==2)//Exponential
        {
         if(GroupsPlus[cnt]>0)
            for(i=0; i<=GroupsPlus[cnt]; i++)
               MultiplierStepPlus[cnt]+=MathMax(1,MathPow(2,i-1));
         if(GroupsMinus[cnt]>0)
            for(i=0; i<=GroupsMinus[cnt]; i++)
               MultiplierStepMinus[cnt]+=MathMax(1,MathPow(2,i-1));
        }
      //---------------------------------------------------------------------
      //Levels
      for(i=1; i<=PairsPerGroup; i++)
        {
         //---Levels open next group in loss
         LevelOpenNextPlus[cnt]+=-(TotalLotPlus[cnt][i]*StepOpenNextOrders*MultiplierStepPlus[cnt]*TickValuePair[cnt][i]);
         LevelOpenNextMinus[cnt]+=-(TotalLotMinus[cnt][i]*StepOpenNextOrders*MultiplierStepMinus[cnt]*TickValuePair[cnt][i]);
         //---Levels close group in profit
         LevelProfitClosePlus[cnt]+=(TotalLotPlus[cnt][i]*TargetCloseProfit*TickValuePair[cnt][i]);
         LevelProfitCloseMinus[cnt]+=(TotalLotMinus[cnt][i]*TargetCloseProfit*TickValuePair[cnt][i]);
         //---Levels close group in loss
         LevelLossClosePlus[cnt]+=-(TotalLotPlus[cnt][i]*TargetCloseLoss*TickValuePair[cnt][i]);
         LevelLossCloseMinus[cnt]+=-(TotalLotMinus[cnt][i]*TargetCloseLoss*TickValuePair[cnt][i]);
        }
      //---
      LevelOpenNextPlus[cnt]-=(SumSpreadValuePlus[cnt]+SumCommissionPlus[cnt]);
      LevelOpenNextMinus[cnt]-=(SumSpreadValueMinus[cnt]+SumCommissionMinus[cnt]);
      //---
      LevelProfitClosePlus[cnt]-=(SumSpreadValuePlus[cnt]+SumCommissionPlus[cnt]);
      LevelProfitCloseMinus[cnt]-=(SumSpreadValueMinus[cnt]+SumCommissionMinus[cnt]);
      //---
      LevelLossClosePlus[cnt]-=(SumSpreadValuePlus[cnt]+SumCommissionPlus[cnt]);
      LevelLossCloseMinus[cnt]-=(SumSpreadValueMinus[cnt]+SumCommissionMinus[cnt]);
      //---------------------------------------------------------------------
      //Send group
      if((MarketIsOpen==true)&&(SpreadOK[cnt]==true)&&(ExpertClosePlusInLoss[cnt]==false)&&(ExpertCloseMinusInLoss[cnt]==false)&&
         (ExpertClosePlusInProfit[cnt]==false)&&(ExpertCloseMinusInProfit[cnt]==false)&&(ExpertCloseBasketInProfit[cnt]==false)&&(ExpertCloseBasketInLoss[cnt]==false)&&
         (ExpertCloseOrdersInAdvancedMode[1]==false)&&(ExpertCloseOrdersInAdvancedMode[2]==false)&&(ExpertCloseOrdersInAdvancedMode[3]==false))
        {
         //---------------------------------------------------------------------
         //Send oposite group if close a group in profit
         if((OpenOrdersInLoss==2)&&(TypeOperation!=0)&&(TypeOperation!=2)&&(TypeOperation!=3)&&(OrdersIsOK[cnt]==true))
           {
            //---Send minus if close plus
            if((SumOrdersPlus[cnt]==0)&&(SumOrdersMinus[cnt]>=PairsPerGroup))
              {
               for(i=1; i<=PairsPerGroup; i++)
                  OpenPairMinus(cnt,i);
              }
            //---Send plus if close minus
            if((SumOrdersMinus[cnt]==0)&&(SumOrdersPlus[cnt]>=PairsPerGroup))
              {
               for(i=1; i<=PairsPerGroup; i++)
                  OpenPairPlus(cnt,i);
              }
           }
         //---------------------------------------------------------------------
         //Send first group
         if((LimitOfOrdersOk==true)&&(TypeOperation!=0)&&(TypeOperation!=3))
           {
            for(i=1; i<=PairsPerGroup; i++)
              {
               if((TotalOrdersPlus[cnt][i]==0)&&((SideToOpenOrders==0)||(SideToOpenOrders==2)))
                  OpenPairPlus(cnt,i);
               if((TotalOrdersMinus[cnt][i]==0)&&((SideToOpenOrders==1)||(SideToOpenOrders==2)))
                  OpenPairMinus(cnt,i);
              }
            //---Check first orders
            for(i=1; i<=PairsPerGroup; i++)
              {
               if((TotalOrdersPlus[cnt][i]!=0)||(SideToOpenOrders==1))
                 {
                  FirsOrdersPlusOK[cnt]=true;
                 }
               else
                 {
                  FirsOrdersPlusOK[cnt]=false;
                  break;
                 }
               //---
               if((TotalOrdersMinus[cnt][i]!=0)||(SideToOpenOrders==0))
                 {
                  FirsOrdersMinusOK[cnt]=true;
                 }
               else
                 {
                  FirsOrdersMinusOK[cnt]=false;
                  break;
                 }
              }
            //---
            if((FirsOrdersPlusOK[cnt]==false)||(FirsOrdersMinusOK[cnt]==false))
              {
               CommentChart();
               continue;
              }
            //---------------------------------------------------------------------
            //Send next group in loss
            if(((OpenOrdersInLoss==1)||(TypeOperation==2))&&(OrdersIsOK[cnt]==true))
              {
               //---Send plus
               if((FirsOrdersPlusOK[cnt]==true)&&((SideToOpenOrders==0)||(SideToOpenOrders==2)))
                 {
                  if((SumOrdersPlus[cnt]>=PairsPerGroup)&&(SumProfitPlus[cnt]<=LevelOpenNextPlus[cnt])&&((TypeCloseInProfit==0)||(SumOrdersPlus[cnt]==SumOrdersMinus[cnt])||(SumOrdersPlus[cnt]>SumOrdersMinus[cnt])))
                    {
                     for(i=1; i<=PairsPerGroup; i++)
                        OpenPairPlus(cnt,i);
                     continue;
                    }
                 }
               //---Send minus
               if((FirsOrdersMinusOK[cnt]==true)&&((SideToOpenOrders==1)||(SideToOpenOrders==2)))
                 {
                  if((SumOrdersMinus[cnt]>=PairsPerGroup)&&(SumProfitMinus[cnt]<=LevelOpenNextMinus[cnt])&&((TypeCloseInProfit==0)||(SumOrdersPlus[cnt]==SumOrdersMinus[cnt])||(SumOrdersPlus[cnt]<SumOrdersMinus[cnt])))
                    {
                     for(i=1; i<=PairsPerGroup; i++)
                        OpenPairMinus(cnt,i);
                     continue;
                    }
                 }
              }
           }
        }
      //---------------------------------------------------------------------
      //Close orders
      if((MarketIsOpen==true)&&(TypeOperation!=0)&&(TypeOperation!=3))
        {
         //---------------------------------------------------------------------
         //Close orders in loss
         if((TypeCloseInLoss<2)&&(ExpertCloseBasketInProfit[cnt]==false)&&(ExpertClosePlusInProfit[cnt]==false)&&(ExpertCloseMinusInProfit[cnt]==false)&&
            (ExpertCloseOrdersInAdvancedMode[1]==false)&&(ExpertCloseOrdersInAdvancedMode[2]==false)&&(ExpertCloseOrdersInAdvancedMode[3]==false))
           {
            //---Close whole ticket
            if((TypeCloseInLoss==0)&&(SumOrdersPlus[cnt]+SumOrdersMinus[cnt]>0))
              {
               //---Start close plus in loss
               if(((SumProfitPlus[cnt]<0)&&(SumOrdersPlus[cnt]>0))||(ExpertClosePlusInLoss[cnt]==true))
                 {
                  if(SumProfitPlus[cnt]>LevelLossClosePlus[cnt])
                     DelayTimesForCloseInLossPlus[cnt]=0;//Resete delay times before close
                  if((SumProfitPlus[cnt]<=LevelLossClosePlus[cnt])||(ExpertClosePlusInLoss[cnt]==true))//Close plus groups
                    {
                     DelayTimesForCloseInLossPlus[cnt]++;
                     //---Close plus in loss
                     if((DelayTimesForCloseInLossPlus[cnt]>=DelayCloseLoss)||(ExpertClosePlusInLoss[cnt]==true))
                       {
                        for(i=1; i<=PairsPerGroup; i++)
                          {
                           if(TotalOrdersPlus[cnt][i]>0)
                              ClosePairPlus(cnt,-1,i);
                          }
                        //---
                        ExpertClosePlusInLoss[cnt]=true;
                        CountHistory=true;
                        continue;
                       }
                    }
                 }
               //---Start close minus in loss
               if(((SumProfitMinus[cnt]<0)&&(SumOrdersMinus[cnt]>0))||(ExpertCloseMinusInLoss[cnt]==true))
                 {
                  if(SumProfitMinus[cnt]>LevelLossCloseMinus[cnt])
                     DelayTimesForCloseInLossMinus[cnt]=0;//Resete delay times before close
                  if((SumProfitMinus[cnt]<=LevelLossCloseMinus[cnt])||(ExpertCloseMinusInLoss[cnt]==true))//Close minus groups
                    {
                     DelayTimesForCloseInLossMinus[cnt]++;
                     //---Close minus in loss
                     if((DelayTimesForCloseInLossMinus[cnt]>=DelayCloseLoss)||(ExpertCloseMinusInLoss[cnt]==true))
                       {
                        for(i=1; i<=PairsPerGroup; i++)
                          {
                           if(TotalOrdersMinus[cnt][i]>0)
                              ClosePairMinus(cnt,-1,i);
                          }
                        //---
                        ExpertCloseMinusInLoss[cnt]=true;
                        CountHistory=true;
                        continue;
                       }
                    }
                 }
              }//End if(TypeCloseInLoss==0)
            //---Close partial ticket
            if((TypeCloseInLoss==1)&&(SumOrdersPlus[cnt]+SumOrdersMinus[cnt]>0))
              {
               if((SumProfitPlus[cnt]<0)&&(SumOrdersPlus[cnt]>0)&&(GroupsPlus[cnt]>=GroupsStartClose))
                 {
                  //---Start close plus in loss
                  if((SumProfitPlus[cnt]>LevelLossClosePlus[cnt])||(GroupsPlus[cnt]<GroupsStartClose))
                     DelayTimesForCloseInLossPlus[cnt]=0;//Resete delay times before close
                  if((SumProfitPlus[cnt]<=LevelLossClosePlus[cnt])&&(GroupsPlus[cnt]>=GroupsStartClose))//Close first orders plus
                    {
                     DelayTimesForCloseInLossPlus[cnt]++;
                     //---Close plus in loss
                     if(DelayTimesForCloseInLossPlus[cnt]>=DelayCloseLoss)
                       {
                        for(i=1; i<=PairsPerGroup; i++)
                          {
                           if(TotalOrdersPlus[cnt][i]>0)
                              ClosePairPlus(cnt,FirstTicketPlus[cnt][i],i);
                          }
                        //---
                        CountHistory=true;
                        continue;
                       }
                    }
                 }
               //---Start close minus in loss
               if((SumProfitMinus[cnt]<0)&&(SumOrdersMinus[cnt]>0)&&(GroupsMinus[cnt]>=GroupsStartClose))
                 {
                  if((SumProfitMinus[cnt]>LevelLossCloseMinus[cnt])||(GroupsMinus[cnt]<GroupsStartClose))
                     DelayTimesForCloseInLossMinus[cnt]=0;//Resete delay times before close
                  if((SumProfitMinus[cnt]<=LevelLossCloseMinus[cnt])&&(GroupsMinus[cnt]>=GroupsStartClose))//Close first orders minus
                    {
                     DelayTimesForCloseInLossMinus[cnt]++;
                     //---Close minus in loss
                     if(DelayTimesForCloseInLossMinus[cnt]>=DelayCloseLoss)
                       {
                        for(i=1; i<=PairsPerGroup; i++)
                          {
                           if(TotalOrdersMinus[cnt][i]>0)
                              ClosePairMinus(cnt,FirstTicketMinus[cnt][i],i);
                          }
                        //---
                        CountHistory=true;
                        continue;
                       }
                    }
                 }
              }//End if(TypeCloseInLoss==1)
            //---
           }
         //---------------------------------------------------------------------
         //Close orders in profit
         if((TypeOperation!=0)&&(ExpertCloseBasketInLoss[cnt]==false)&&(ExpertClosePlusInLoss[cnt]==false)&&(ExpertCloseMinusInLoss[cnt]==false))
           {
            //---Close in ticket profit
            if(TypeCloseInProfit==0)
              {
               //---Start close plus in profit
               if((SumProfitPlus[cnt]>0)&&(SumOrdersPlus[cnt]>0))
                 {
                  if(SumProfitPlus[cnt]<LevelProfitClosePlus[cnt])
                     DelayTimesForCloseInProfitPlus[cnt]=0;//Resete delay times before close
                  if((SumProfitPlus[cnt]>=LevelProfitClosePlus[cnt])||(ExpertClosePlusInProfit[cnt]==true))//Close plus groups
                    {
                     DelayTimesForCloseInProfitPlus[cnt]++;
                     //---Close plus in profit
                     if((DelayTimesForCloseInProfitPlus[cnt]>=DelayCloseProfit)||(ExpertClosePlusInProfit[cnt]==true))
                       {
                        for(i=1; i<=PairsPerGroup; i++)
                          {
                           if(TotalOrdersPlus[cnt][i]>0)
                              ClosePairPlus(cnt,-1,i);
                          }
                        //---
                        ExpertClosePlusInProfit[cnt]=true;
                        CountHistory=true;
                        continue;
                       }
                    }
                 }
               //---Start close minus in profit
               if((SumProfitMinus[cnt]>0)&&(SumOrdersMinus[cnt]>0))
                 {
                  if(SumProfitMinus[cnt]<LevelProfitCloseMinus[cnt])
                     DelayTimesForCloseInProfitMinus[cnt]=0;//Resete delay times before close
                  if((SumProfitMinus[cnt]>=LevelProfitCloseMinus[cnt])||(ExpertCloseMinusInProfit[cnt]==true))//Close minus groups
                    {
                     DelayTimesForCloseInProfitMinus[cnt]++;
                     //---Close minus in profit
                     if((DelayTimesForCloseInProfitMinus[cnt]>=DelayCloseProfit)||(ExpertCloseMinusInProfit[cnt]==true))
                       {
                        for(i=1; i<=PairsPerGroup; i++)
                          {
                           if(TotalOrdersMinus[cnt][i]>0)
                              ClosePairMinus(cnt,-1,i);
                          }
                        //---
                        ExpertCloseMinusInProfit[cnt]=true;
                        CountHistory=true;
                        continue;
                       }
                    }
                 }
              }
            //---Close in basket profit
            if((TypeCloseInProfit==1)||(OpenOrdersInLoss==2))
              {
               //---Close in auto step
               if(OpenOrdersInLoss==2)
                 {
                  //---Start close plus in profit (smaller ticket plus)
                  if(((SumProfitPlus[cnt]>0)&&(SumOrdersPlus[cnt]>0)&&(SumOrdersPlus[cnt]<=SumOrdersMinus[cnt]))||(ExpertClosePlusInProfit[cnt]==true))
                    {
                     if(SumProfitMinus[cnt]>LevelOpenNextMinus[cnt])
                        DelayTimesForCloseInProfitPlus[cnt]=0;//Resete delay times before close
                     if((SumProfitMinus[cnt]<=LevelOpenNextMinus[cnt])||(ExpertClosePlusInProfit[cnt]==true))//Close plus groups
                       {
                        DelayTimesForCloseInProfitPlus[cnt]++;
                        //---Close plus in profit
                        if((DelayTimesForCloseInProfitPlus[cnt]>=DelayCloseProfit)||(ExpertClosePlusInProfit[cnt]==true))
                          {
                           for(i=1; i<=PairsPerGroup; i++)
                             {
                              if(TotalOrdersPlus[cnt][i]>0)
                                 ClosePairPlus(cnt,-1,i);
                             }
                           //---
                           ExpertClosePlusInProfit[cnt]=true;
                           CountHistory=true;
                           continue;
                          }
                       }
                    }
                  //---Start close minus in profit (smaller ticket minus)
                  if(((SumProfitMinus[cnt]>0)&&(SumOrdersMinus[cnt]>0)&&(SumOrdersPlus[cnt]>=SumOrdersMinus[cnt]))||(ExpertCloseMinusInProfit[cnt]==true))
                    {
                     if(SumProfitPlus[cnt]>LevelOpenNextPlus[cnt])
                        DelayTimesForCloseInProfitMinus[cnt]=0;//Resete delay times before close
                     if((SumProfitPlus[cnt]<=LevelOpenNextPlus[cnt])||(ExpertCloseMinusInProfit[cnt]==true))//Close minus groups
                       {
                        DelayTimesForCloseInProfitMinus[cnt]++;
                        //---Close minus in profit
                        if((DelayTimesForCloseInProfitMinus[cnt]>=DelayCloseProfit)||(ExpertCloseMinusInProfit[cnt]==true))
                          {
                           for(i=1; i<=PairsPerGroup; i++)
                             {
                              if(TotalOrdersMinus[cnt][i]>0)
                                 ClosePairMinus(cnt,-1,i);
                             }
                           //---
                           ExpertCloseMinusInProfit[cnt]=true;
                           CountHistory=true;
                           continue;
                          }
                       }
                    }
                 }
               //---Close all in basket profit (all tickets)
               if(TypeCloseInProfit==1)
                 {
                  if(((SumProfitPlus[cnt]+SumProfitMinus[cnt]>0)&&(SumOrdersPlus[cnt]+SumOrdersMinus[cnt]>0))||(ExpertCloseBasketInProfit[cnt]==true))
                    {
                     if((SumProfitPlus[cnt]+SumProfitMinus[cnt]<MathMax(LevelProfitClosePlus[cnt],LevelProfitCloseMinus[cnt])))
                        DelayTimesForCloseBasketProfit[cnt]=0;//Resete delay times before close
                     if((SumProfitPlus[cnt]+SumProfitMinus[cnt]>=MathMax(LevelProfitClosePlus[cnt],LevelProfitCloseMinus[cnt]))||(ExpertCloseBasketInProfit[cnt]==true))
                       {
                        DelayTimesForCloseBasketProfit[cnt]++;
                        //---Close plus and minus in profit
                        if((DelayTimesForCloseBasketProfit[cnt]>=DelayCloseProfit)||(ExpertCloseBasketInProfit[cnt]==true))
                          {
                           for(i=1; i<=PairsPerGroup; i++)
                             {
                              if(TotalOrdersPlus[cnt][i]>0)
                                 ClosePairPlus(cnt,-1,i);
                              if(TotalOrdersMinus[cnt][i]>0)
                                 ClosePairMinus(cnt,-1,i);
                             }
                           //---
                           ExpertCloseBasketInProfit[cnt]=true;
                           CountHistory=true;
                           continue;
                          }
                       }
                    }
                 }
              }
            //---Close in hybrid mode
            if(TypeCloseInProfit==2)
              {
               //---Get results if not open orders in loss
               if(OpenOrdersInLoss==0)
                 {
                  if((ExpertCloseOrdersInAdvancedMode[1]==false)&&(ExpertCloseOrdersInAdvancedMode[2]==false)&&(SumOrdersPlus[cnt]+SumOrdersMinus[cnt]>0))
                    {
                     //---Reset value
                     MaximumProfitPlus=-9999999;
                     MaximumLossesPlus=9999999;
                     MaximumProfitMinus=-9999999;
                     MaximumLossesMinus=9999999;
                     GroupWithMaximumProfitsPlus=-1;
                     GroupWithMaximumLossesPlus=-1;
                     GroupWithMaximumProfitsMinus=-1;
                     GroupWithMaximumLossesMinus=-1;
                     //---
                     for(i=1; i<NumberGroupsTrade; i++)
                       {
                        //---Get plus results
                        if((SideToOpenOrders==0)||(SideToOpenOrders==2))
                          {
                           //---Maximum profit plus
                           if((SumProfitPlus[i]>MaximumProfitPlus)&&(SumOrdersPlus[cnt]>0))
                             {
                              GroupWithMaximumProfitsPlus=i;
                              MaximumProfitPlus=SumProfitPlus[i];
                             }
                           //---Maximum loss plus
                           if((SumProfitPlus[i]<MaximumLossesPlus)&&(SumOrdersPlus[cnt]>0))
                             {
                              GroupWithMaximumLossesPlus=i;
                              MaximumLossesPlus=SumProfitPlus[i];
                             }
                          }
                        //---Get minus results
                        if((SideToOpenOrders==1)||(SideToOpenOrders==2))
                          {
                           //---Maximum profit  minus
                           if((SumProfitMinus[i]>MaximumProfitMinus)&&(SumOrdersMinus[cnt]>0))
                             {
                              GroupWithMaximumProfitsMinus=i;
                              MaximumProfitMinus=SumProfitMinus[i];
                             }
                           //---Maximum loss minus
                           if((SumProfitMinus[i]<MaximumLossesMinus)&&(SumOrdersMinus[cnt]>0))
                             {
                              GroupWithMaximumLossesMinus=i;
                              MaximumLossesMinus=SumProfitMinus[i];
                             }
                          }
                       }
                    }
                  //---Check if pass all groups
                  if(cnt==NumberGroupsTrade-1)
                    {
                     //---Plus vs plus
                     if((SideToOpenOrders==0)||(SideToOpenOrders==2))
                       {
                        if((MaximumProfitPlus+MaximumLossesPlus>=MathMax(LevelProfitClosePlus[GroupWithMaximumProfitsPlus],LevelProfitClosePlus[GroupWithMaximumLossesPlus]))||(ExpertCloseOrdersInAdvancedMode[1]==true))
                          {
                           if(TotalOrdersPlus[GroupWithMaximumProfitsPlus][1]>0)
                              ClosePairPlus(GroupWithMaximumProfitsPlus,-1,1);
                           if(TotalOrdersPlus[GroupWithMaximumProfitsPlus][2]>0)
                              ClosePairPlus(GroupWithMaximumProfitsPlus,-1,2);
                           if(TotalOrdersPlus[GroupWithMaximumLossesPlus][1]>0)
                              ClosePairPlus(GroupWithMaximumLossesPlus,-1,1);
                           if(TotalOrdersPlus[GroupWithMaximumLossesPlus][2]>0)
                              ClosePairPlus(GroupWithMaximumLossesPlus,-1,2);
                           //---
                           ExpertCloseOrdersInAdvancedMode[1]=true;
                           CountHistory=true;
                           continue;
                          }
                       }
                     //---Minus vs minus
                     if((SideToOpenOrders==1)||(SideToOpenOrders==2))
                       {
                        if((MaximumProfitMinus+MaximumLossesMinus>=MathMax(LevelProfitCloseMinus[GroupWithMaximumProfitsMinus],LevelProfitCloseMinus[GroupWithMaximumLossesMinus]))||(ExpertCloseOrdersInAdvancedMode[2]==true))
                          {
                           if(TotalOrdersMinus[GroupWithMaximumProfitsMinus][1]>0)
                              ClosePairMinus(GroupWithMaximumProfitsMinus,-1,1);
                           if(TotalOrdersMinus[GroupWithMaximumProfitsMinus][2]>0)
                              ClosePairMinus(GroupWithMaximumProfitsMinus,-1,2);
                           if(TotalOrdersMinus[GroupWithMaximumLossesMinus][1]>0)
                              ClosePairMinus(GroupWithMaximumLossesMinus,-1,1);
                           if(TotalOrdersMinus[GroupWithMaximumLossesMinus][2]>0)
                              ClosePairMinus(GroupWithMaximumLossesMinus,-1,2);
                           //---
                           ExpertCloseOrdersInAdvancedMode[2]=true;
                           CountHistory=true;
                           continue;
                          }
                       }
                    }
                 }//end if(OpenOrdersInLoss==0)
               //---Get results if open orders in loss
               if(OpenOrdersInLoss!=0)
                 {
                  if((ExpertCloseOrdersInAdvancedMode[3]==false)&&(SumOrdersPlus[cnt]+SumOrdersMinus[cnt]>0))
                    {
                     MaximumProfit=-9999999;
                     MaximumLosses=9999999;
                     GroupWithMaximumProfits=-1;
                     GroupWithMaximumLosses=-1;
                     //---
                     for(i=1; i<NumberGroupsTrade; i++)
                       {
                        if(SumProfitPlus[i]+SumProfitMinus[i]>MaximumProfit)
                          {
                           GroupWithMaximumProfits=i;
                           MaximumProfit=SumProfitPlus[i]+SumProfitMinus[i];
                          }
                        //---
                        if(SumProfitPlus[i]+SumProfitMinus[i]<MaximumLosses)
                          {
                           GroupWithMaximumLosses=i;
                           MaximumLosses=SumProfitPlus[i]+SumProfitMinus[i];
                          }
                       }
                    }
                  //---Check if pass alll couples
                  if(cnt==NumberGroupsTrade-1)
                    {
                     if((MaximumProfit+MaximumLosses>=MathMax(LevelProfitClosePlus[GroupWithMaximumLosses],LevelProfitCloseMinus[GroupWithMaximumLosses]))||(ExpertCloseOrdersInAdvancedMode[3]==true))
                       {
                        if(TotalOrdersPlus[GroupWithMaximumProfits][1]>0)
                           ClosePairPlus(GroupWithMaximumProfits,-1,1);
                        if(TotalOrdersPlus[GroupWithMaximumProfits][2]>0)
                           ClosePairPlus(GroupWithMaximumProfits,-1,2);
                        if(TotalOrdersMinus[GroupWithMaximumProfits][1]>0)
                           ClosePairMinus(GroupWithMaximumProfits,-1,1);
                        if(TotalOrdersMinus[GroupWithMaximumProfits][2]>0)
                           ClosePairMinus(GroupWithMaximumProfits,-1,2);
                        if(TotalOrdersPlus[GroupWithMaximumLosses][1]>0)
                           ClosePairPlus(GroupWithMaximumLosses,-1,1);
                        if(TotalOrdersPlus[GroupWithMaximumLosses][2]>0)
                           ClosePairPlus(GroupWithMaximumLosses,-1,2);
                        if(TotalOrdersMinus[GroupWithMaximumLosses][1]>0)
                           ClosePairMinus(GroupWithMaximumLosses,-1,1);
                        if(TotalOrdersMinus[GroupWithMaximumLosses][2]>0)
                           ClosePairMinus(GroupWithMaximumLosses,-1,2);
                        //---
                        ExpertCloseOrdersInAdvancedMode[3]=true;
                        CountHistory=true;
                        continue;
                       }
                    }
                 }//end if(OpenOrdersInLoss!=0)
              }
            //---
           }//end if(TypeOperation!=0)
        }//end if(MarketIsOpen==true)
      //---------------------------------------------------------------------
      //Close and stop
      if(TypeOperation==3)
        {
         //---There are not open orders
         if(SumOrdersPlus[cnt]+SumOrdersMinus[cnt]==0)
           {
            if(cnt==NumberGroupsTrade-1)
              {
               Comment(
                  "\n                  ",WindowExpertName()+
                  "\n\n             ~ Have Close All Orders ~ "+
                  "\n\n             ~ History Orders Results ~ "+
                  "\n  Pips: "+DoubleToStr(HistoryTotalPips,2)+" || Orders: "+DoubleToStr(HistoryTotalTrades,0)+" || PnL: "+DoubleToStr(HistoryTotalProfitLoss,2)
               );
              }
           }
         //---There are open orders
         if(SumOrdersPlus[cnt]+SumOrdersMinus[cnt]>0)
           {
            Comment("\n                  ",WindowExpertName(),
                    "\n\n             ~ Wait For Close Orders ~ ");
            //---Close orders
            for(i=1; i<=PairsPerGroup; i++)
              {
               if(TotalOrdersPlus[cnt][i]>0)
                  ClosePairPlus(cnt,-1,i);
               if(TotalOrdersMinus[cnt][i]>0)
                  ClosePairMinus(cnt,-1,i);
              }
           }//end if(TotalOrdersPlus+TotalOrdersMinus>0)
         continue;
        }//end if(StopAndClose==true)
      //---------------------------------------------------------------------
      //Check missing or excess orders
      if((CheckOrders==true)&&(ExpertClosePlusInLoss[cnt]==false)&&(ExpertCloseMinusInLoss[cnt]==false)&&(ExpertClosePlusInProfit[cnt]==false)&&(ExpertCloseMinusInProfit[cnt]==false)&&
         (ExpertCloseBasketInProfit[cnt]==false)&&(ExpertCloseBasketInLoss[cnt]==false)&&(FirsOrdersPlusOK[cnt]==true)&&(FirsOrdersMinusOK[cnt]==true)&&
         (ExpertCloseOrdersInAdvancedMode[1]==false)&&(ExpertCloseOrdersInAdvancedMode[2]==false)&&(ExpertCloseOrdersInAdvancedMode[3]==false))
        {
         //---Not check
         for(i=1; i<=PairsPerGroup; i++)
           {
            if(i>=2)
              {
               if((TotalOrdersPlus[cnt][i-1]==TotalOrdersPlus[cnt][i])&&(TotalOrdersMinus[cnt][i-1]==TotalOrdersMinus[cnt][i]))
                 {
                  OrdersIsOK[cnt]=true;
                 }
               else
                 {
                  OrdersIsOK[cnt]=false;
                  break;
                 }
              }
           }
         //---
         if(OrdersIsOK[cnt]==true)
           {
            continue;
           }
         else
           {
            if(LimitOfOrdersOk==true)
              {
               CheckMissingOrders(cnt);
              }
            else
              {
               CommentWarning=true;
               if(WarningPrint=="")
                  WarningPrint=StringConcatenate("Orders are in limit (",OrdersTotal(),"/",MaximumOrders,")");
               Print(WarningPrint);
               CheckExcessOrders(cnt);
              }
           }
        }//end if((TypeWorking==2)||(TypeWorking==0))
      //---------------------------------------------------------------------
      if((CheckOrders==false)||(OpenOrdersInLoss==0))
         OrdersIsOK[cnt]=true;
     }//end for(i=0; i<NumberGroupsTrade; i++)
//---------------------------------------------------------------------
//Call comment function
   if(TypeOperation<3)
      CommentChart();
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Normalize Lots
//====================================================================================================================================================//
double NormalizeLot(double LotsSize)
  {
//---------------------------------------------------------------------
   return(MathMin(MathMax((MathRound(LotsSize/MarketInfo(Symbol(),MODE_LOTSTEP))*MarketInfo(Symbol(),MODE_LOTSTEP)),MarketInfo(Symbol(),MODE_MINLOT)),MarketInfo(Symbol(),MODE_MAXLOT)));
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Open plus orders
//====================================================================================================================================================//
void OpenPairPlus(int PairOpen, int OpenOrder)
  {
//---------------------------------------------------------------------
   double PriceOpen=0;
   double StopLoss=0;
   double TakeProfit=0;
   double LotSizeOrder=0;
   double LotSize=0;
   double FreeMargin=0;
   color ColorOrder=0;
   string CommentOrder="";
//---------------------------------------------------------------------
//Calculate lot size per pair
   if(LotOrdersProgress==0)
      MultiplierLotPlus[PairOpen]=1;
   if(LotOrdersProgress==1)
      MultiplierLotPlus[PairOpen]=GroupsPlus[PairOpen]+1;
   if(LotOrdersProgress==2)
      MultiplierLotPlus[PairOpen]=MathMax(1,MathPow(2,GroupsPlus[PairOpen]));
//---------------------------------------------------------------------
//Set lots for orders
//---Auto or manual lot
   if(AutoLotSize==1)
      LotSize=(AccountBalance()/100000)*RiskFactor;
   if(AutoLotSize==0)
      LotSize=ManualLotSize;
//---
   if(GroupsPlus[PairOpen]>0)
      LotSizeOrder=NormalizeLot(FirstLotPair[PairOpen][OpenOrder]*MultiplierLotPlus[PairOpen]);
   else
      LotSizeOrder=NormalizeLot(LotSize);
//---------------------------------------------------------------------
//Count free margin
   if(AccountFreeMargin()>AccountFreeMarginCheck(SymbolPair[PairOpen][OpenOrder],SuitePlus[PairOpen][OpenOrder],LotSizeOrder))
      FreeMargin=AccountFreeMargin()-AccountFreeMarginCheck(SymbolPair[PairOpen][OpenOrder],SuitePlus[PairOpen][OpenOrder],LotSizeOrder);
   if(AccountFreeMargin()<AccountFreeMarginCheck(SymbolPair[PairOpen][OpenOrder],SuitePlus[PairOpen][OpenOrder],LotSizeOrder))
      FreeMargin=AccountFreeMargin()+(AccountFreeMargin()-AccountFreeMarginCheck(SymbolPair[PairOpen][OpenOrder],SuitePlus[PairOpen][OpenOrder],LotSizeOrder));
//---------------------------------------------------------------------
   CommentOrder=CommentsEA;
//---
   if(SuitePlus[PairOpen][OpenOrder]==OP_BUY)
     {
      PriceOpen=MarketInfo(SymbolPair[PairOpen][OpenOrder],MODE_ASK);
      ColorOrder=clrBlue;
     }
//---
   if(SuitePlus[PairOpen][OpenOrder]==OP_SELL)
     {
      PriceOpen=MarketInfo(SymbolPair[PairOpen][OpenOrder],MODE_BID);
      ColorOrder=clrRed;
     }
//---------------------------------------------------------------------
   if(LimitOfOrdersOk==true)
     {
      if(FreeMargin>=0)
        {
         CntTry=0;
         while(TRUE)
           {
            CntTry++;
            TicketNo[PairOpen]=OrderSend(SymbolPair[PairOpen][OpenOrder],SuitePlus[PairOpen][OpenOrder],LotSizeOrder,PriceOpen,MaxSlippage,StopLoss,TakeProfit,CommentOrder,OrdersID[PairOpen],0,ColorOrder);
            //---
            if(TicketNo[PairOpen]>0)
              {
               if(PrintLogReport==true)
                  Print("Open Plus",SymbolPair[PairOpen][OpenOrder]," || Ticket No: ",TicketNo[PairOpen]);
               break;
              }
            //---
            Sleep(100);
            if(CntTry>3)
               break;
            RefreshRates();
           }
        }
      else
        {
         CommentWarning=true;
         if(WarningPrint=="")
            WarningPrint=StringConcatenate("  Free margin is low (",DoubleToStr(FreeMargin),")");
         Print(WarningPrint);
         CheckExcessOrders(PairOpen);
        }
     }
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Open minus orders
//====================================================================================================================================================//
void OpenPairMinus(int PairOpen, int OpenOrder)
  {
//---------------------------------------------------------------------
   double PriceOpen=0;
   double StopLoss=0;
   double TakeProfit=0;
   double LotSizeOrder=0;
   double LotSize=0;
   double FreeMargin=0;
   color ColorOrder=0;
   string CommentOrder="";
//---------------------------------------------------------------------
//Calculate lot size per pair
   if(LotOrdersProgress==0)
      MultiplierLotMinus[PairOpen]=1;
   if(LotOrdersProgress==1)
      MultiplierLotMinus[PairOpen]=GroupsMinus[PairOpen]+1;
   if(LotOrdersProgress==2)
      MultiplierLotMinus[PairOpen]=MathMax(1,MathPow(2,GroupsMinus[PairOpen]));
//---------------------------------------------------------------------
//Set lots for orders
//---Auto or manual lot
   if(AutoLotSize==1)
      LotSize=(AccountBalance()/100000)*RiskFactor;
   if(AutoLotSize==0)
      LotSize=ManualLotSize;
//---
   if(GroupsMinus[PairOpen]>0)
      LotSizeOrder=NormalizeLot(FirstLotPair[PairOpen][OpenOrder]*MultiplierLotMinus[PairOpen]);
   else
      LotSizeOrder=NormalizeLot(LotSize);
//---------------------------------------------------------------------
//Count free margin
   if(AccountFreeMargin()>AccountFreeMarginCheck(SymbolPair[PairOpen][OpenOrder],SuiteMinus[PairOpen][OpenOrder],LotSizeOrder))
      FreeMargin=AccountFreeMargin()-AccountFreeMarginCheck(SymbolPair[PairOpen][OpenOrder],SuiteMinus[PairOpen][OpenOrder],LotSizeOrder);
   if(AccountFreeMargin()<AccountFreeMarginCheck(SymbolPair[PairOpen][OpenOrder],SuiteMinus[PairOpen][OpenOrder],LotSizeOrder))
      FreeMargin=AccountFreeMargin()+(AccountFreeMargin()-AccountFreeMarginCheck(SymbolPair[PairOpen][OpenOrder],SuiteMinus[PairOpen][OpenOrder],LotSizeOrder));
//---------------------------------------------------------------------
   CommentOrder=CommentsEA;
//---
   if(SuiteMinus[PairOpen][OpenOrder]==OP_BUY)
     {
      PriceOpen=MarketInfo(SymbolPair[PairOpen][OpenOrder],MODE_ASK);
      ColorOrder=clrBlue;
     }
//---
   if(SuiteMinus[PairOpen][OpenOrder]==OP_SELL)
     {
      PriceOpen=MarketInfo(SymbolPair[PairOpen][OpenOrder],MODE_BID);
      ColorOrder=clrRed;
     }
//---------------------------------------------------------------------
   if(LimitOfOrdersOk==true)
     {
      if(FreeMargin>=0)
        {
         CntTry=0;
         while(TRUE)
           {
            CntTry++;
            TicketNo[PairOpen]=OrderSend(SymbolPair[PairOpen][OpenOrder],SuiteMinus[PairOpen][OpenOrder],LotSizeOrder,PriceOpen,MaxSlippage,StopLoss,TakeProfit,CommentOrder,OrdersID[PairOpen],0,ColorOrder);
            //---
            if(TicketNo[PairOpen]>0)
              {
               if(PrintLogReport==true)
                  Print("Open Minus",SymbolPair[PairOpen][OpenOrder]," || Ticket No: ",TicketNo[PairOpen]);
               break;
              }
            //---
            Sleep(100);
            if(CntTry>3)
               break;
            RefreshRates();
           }
        }
      else
        {
         CommentWarning=true;
         if(WarningPrint=="")
            WarningPrint=StringConcatenate("  Free margin is low (",DoubleToStr(FreeMargin),")");
         Print(WarningPrint);
         CheckExcessOrders(PairOpen);
        }
     }
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Close plus orders
//====================================================================================================================================================//
void ClosePairPlus(int PairClose, int TicketClose, int CloseOrder)
  {
//---------------------------------------------------------------------
   double PriceClose=0;
   color ColorOrder=0;
//---------------------------------------------------------------------
   for(k=OrdersTotal()-1; k>=0; k--)//Last to first
     {
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderMagicNumber()==OrdersID[PairClose])&&(OrderSymbol()==SymbolPair[PairClose][CloseOrder])&&(OrderType()==SuitePlus[PairClose][CloseOrder]))
           {
            if((OrderTicket()==TicketClose)||(TicketClose==-1))
              {
               //---
               if(OrderType()==OP_BUY)
                 {
                  PriceClose=MarketInfo(OrderSymbol(),MODE_BID);
                  ColorOrder=clrPowderBlue;
                 }
               //---
               if(OrderType()==OP_SELL)
                 {
                  PriceClose=MarketInfo(OrderSymbol(),MODE_ASK);
                  ColorOrder=clrPink;
                 }
               //---------------------------------------------------------------------
               CntTry=0;
               while(TRUE)
                 {
                  CntTry++;
                  TicketNo[PairClose]=OrderClose(OrderTicket(),OrderLots(),PriceClose,MaxSlippage,ColorOrder);
                  //---
                  if(TicketNo[PairClose]>0)
                    {
                     if(PrintLogReport==true)
                        Print("Close Plus: ",SymbolPair[PairClose][CloseOrder]," || TicketNo: ",OrderTicket());
                     break;
                    }
                  //---
                  Sleep(100);
                  if(CntTry>3)
                     break;
                  RefreshRates();
                 }
              }
           }
        }
     }
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Close minus orders
//====================================================================================================================================================//
void ClosePairMinus(int PairClose, int TicketClose, int CloseOrder)
  {
//---------------------------------------------------------------------
   double PriceClose=0;
   color ColorOrder=0;
//---------------------------------------------------------------------
   for(k=OrdersTotal()-1; k>=0; k--)//Last to first
     {
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderMagicNumber()==OrdersID[PairClose])&&(OrderSymbol()==SymbolPair[PairClose][CloseOrder])&&(OrderType()==SuiteMinus[PairClose][CloseOrder]))
           {
            if((OrderTicket()==TicketClose)||(TicketClose==-1))
              {
               //---
               if(OrderType()==OP_BUY)
                 {
                  PriceClose=MarketInfo(OrderSymbol(),MODE_BID);
                  ColorOrder=clrPowderBlue;
                 }
               //---
               if(OrderType()==OP_SELL)
                 {
                  PriceClose=MarketInfo(OrderSymbol(),MODE_ASK);
                  ColorOrder=clrPink;
                 }
               //---------------------------------------------------------------------
               CntTry=0;
               while(TRUE)
                 {
                  CntTry++;
                  TicketNo[PairClose]=OrderClose(OrderTicket(),OrderLots(),PriceClose,MaxSlippage,ColorOrder);
                  //---
                  if(TicketNo[PairClose]>0)
                    {
                     if(PrintLogReport==true)
                        Print("Close Minus: ",SymbolPair[PairClose][CloseOrder]," || TicketNo: ",OrderTicket());
                     break;
                    }
                  //---
                  Sleep(100);
                  if(CntTry>3)
                     break;
                  RefreshRates();
                 }
              }
           }
        }
     }
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Check all open groups for missings orders
//====================================================================================================================================================//
void CheckMissingOrders(int PairCheck)
  {
//---------------------------------------------------------------------
   int MaxOrdersPlus=-99999;
   int MaxOrdersMinus=-99999;
//---------------------------------------------------------------------
   for(i=1; i<=PairsPerGroup; i++)
     {
      if(MaxOrdersPlus<TotalOrdersPlus[PairCheck][i])
         MaxOrdersPlus=TotalOrdersPlus[PairCheck][i];
      if(MaxOrdersMinus<TotalOrdersMinus[PairCheck][i])
         MaxOrdersMinus=TotalOrdersMinus[PairCheck][i];
     }
//---------------------------------------------------------------------
   for(i=1; i<=PairsPerGroup; i++)
     {
      if(TotalOrdersPlus[PairCheck][i]<MaxOrdersPlus)
        {
         OpenPairPlus(PairCheck,i);
         if(PrintLogReport==true)
            Print(StringConcatenate("Open Missing Plus"+IntegerToString(i)+" - ",SymbolPair[PairCheck][i]));
        }
      //---
      if(TotalOrdersMinus[PairCheck][i]<MaxOrdersMinus)
        {
         OpenPairMinus(PairCheck,i);
         if(PrintLogReport==true)
            Print(StringConcatenate("Open Missing Minus"+IntegerToString(i)+" - ",SymbolPair[PairCheck][i]));
        }
     }
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Check all open groups for excess orders
//====================================================================================================================================================//
void CheckExcessOrders(int PairCheck)
  {
//---------------------------------------------------------------------
   int MinOrdersPlus=99999;
   int MinOrdersMinus=99999;
//---------------------------------------------------------------------
   for(i=1; i<=PairsPerGroup; i++)
     {
      if(MinOrdersPlus>TotalOrdersPlus[PairCheck][i])
         MinOrdersPlus=TotalOrdersPlus[PairCheck][i];
      if(MinOrdersMinus>TotalOrdersMinus[PairCheck][i])
         MinOrdersMinus=TotalOrdersMinus[PairCheck][i];
     }
//---------------------------------------------------------------------
   for(i=1; i<=PairsPerGroup; i++)
     {
      if(TotalOrdersPlus[PairCheck][i]>MinOrdersPlus)
        {
         ClosePairPlus(PairCheck,FirstTicketPlus[PairCheck][i],i);
         if(PrintLogReport==true)
            Print(StringConcatenate("Close Excess Plus"+IntegerToString(i)+" - ",SymbolPair[PairCheck][i]));
        }
      //---
      if(TotalOrdersMinus[PairCheck][i]>MinOrdersMinus)
        {
         ClosePairMinus(PairCheck,FirstTicketMinus[PairCheck][i],i);
         if(PrintLogReport==true)
            Print(StringConcatenate("Close Excess Minus"+IntegerToString(i)+" - ",SymbolPair[PairCheck][i]));
        }
     }
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Count current orders and resuluts
//====================================================================================================================================================//
void CountCurrentOrders(int PairGet)
  {
//---------------------------------------------------------------------
   CountAllOpenedOrders=0;
//---------------------------------------------------------------------
   for(j=1; j<=PairsPerGroup; j++)
     {
      TotalProfitPlus[PairGet][j]=0;
      TotalProfitMinus[PairGet][j]=0;
      FirstLotPlus[PairGet][j]=0;
      FirstLotMinus[PairGet][j]=0;
      FirstTicketPlus[PairGet][j]=0;
      FirstTicketMinus[PairGet][j]=0;
      LastTicketPlus[PairGet][j]=0;
      LastTicketMinus[PairGet][j]=0;
      FirstProfitPlus[PairGet][j]=0;
      FirstProfitMinus[PairGet][j]=0;
      TotalOrdersPlus[PairGet][j]=0;
      TotalOrdersMinus[PairGet][j]=0;
      TotalLotPlus[PairGet][j]=0;
      TotalLotMinus[PairGet][j]=0;
      TotalCommissionPlus[PairGet][j]=0;
      TotalCommissionMinus[PairGet][j]=0;
      FirstLotPair[PairGet][j]=0;
     }
//---------------------------------------------------------------------
   GroupsPlus[PairGet]=0;
   GroupsMinus[PairGet]=0;
   SumOrdersPlus[PairGet]=0;
   SumOrdersMinus[PairGet]=0;
   FirstTotalLotPlus[PairGet]=0;
   FirstTotalLotMinus[PairGet]=0;
   FirstTotalProfitPlus[PairGet]=0;
   FirstTotalProfitMinus[PairGet]=0;
   SumProfitPlus[PairGet]=0;
   SumProfitMinus[PairGet]=0;
   SumCommissionPlus[PairGet]=0;
   SumCommissionMinus[PairGet]=0;
   SumLotPlus[PairGet]=0;
   SumLotMinus[PairGet]=0;
//---------------------------------------------------------------------
//Get groups informations
   if(OrdersTotal()>0)
     {
      //---Last to first
      for(i=OrdersTotal()-1; i>=0; i--)
        {
         //---Start check trades
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            CountAllOpenedOrders++;
            if(OrderMagicNumber()==OrdersID[PairGet])
              {
               //---Total groups
               TotalGroupsOrders++;
               TotalGroupsProfit+=OrderProfit()+OrderSwap()+OrderCommission();
               //---Plus and minus
               for(j=1; j<=PairsPerGroup; j++)
                 {
                  //---Plus pair
                  if((OrderType()==SuitePlus[PairGet][j])&&(OrderSymbol()==SymbolPair[PairGet][j]))
                    {
                     FirstLotPair[PairGet][j]=OrderLots();
                     TotalProfitPlus[PairGet][j]+=OrderProfit()+OrderSwap()+OrderCommission();
                     TotalCommissionPlus[PairGet][j]+=MathAbs(OrderCommission()+OrderSwap());
                     FirstLotPlus[PairGet][j]=OrderLots();
                     TotalLotPlus[PairGet][j]+=OrderLots();
                     TotalOrdersPlus[PairGet][j]++;
                     FirstTicketPlus[PairGet][j]=OrderTicket();
                     FirstProfitPlus[PairGet][j]=OrderProfit()+OrderSwap()+OrderCommission();
                     if(LastTicketPlus[PairGet][j]==0)
                        LastTicketPlus[PairGet][j]=OrderTicket();
                     if(LastLotPlus[PairGet][j]==0)
                        LastLotPlus[PairGet][j]=OrderLots();
                    }
                  //---Minus pair
                  if((OrderType()==SuiteMinus[PairGet][j])&&(OrderSymbol()==SymbolPair[PairGet][j]))
                    {
                     FirstLotPair[PairGet][j]=OrderLots();
                     TotalProfitMinus[PairGet][j]+=OrderProfit()+OrderSwap()+OrderCommission();
                     TotalCommissionMinus[PairGet][j]+=MathAbs(OrderCommission()+OrderSwap());
                     FirstLotMinus[PairGet][j]=OrderLots();
                     TotalLotMinus[PairGet][j]+=OrderLots();
                     TotalOrdersMinus[PairGet][j]++;
                     FirstTicketMinus[PairGet][j]=OrderTicket();
                     FirstProfitMinus[PairGet][j]=OrderProfit()+OrderSwap()+OrderCommission();
                     if(LastTicketMinus[PairGet][j]==0)
                        LastTicketMinus[PairGet][j]=OrderTicket();
                     if(LastLotMinus[PairGet][j]==0)
                        LastLotMinus[PairGet][j]=OrderLots();
                    }
                 }
              }
           }
        }
      //if(CountAllOpenedOrders!=OrdersTotal()) return;//Pass again orders
     }//end if(OrdersTotal()>0)
//---------------------------------------------------------------------
//Processing groups informations
   for(j=1; j<=PairsPerGroup; j++)
     {
      SumOrdersPlus[PairGet]+=TotalOrdersPlus[PairGet][j];
      SumOrdersMinus[PairGet]+=TotalOrdersMinus[PairGet][j];
      FirstTotalLotPlus[PairGet]+=FirstLotPlus[PairGet][j];
      FirstTotalLotMinus[PairGet]+=FirstLotMinus[PairGet][j];
      FirstTotalProfitPlus[PairGet]+=FirstProfitPlus[PairGet][j];
      FirstTotalProfitMinus[PairGet]+=FirstProfitMinus[PairGet][j];
      SumProfitPlus[PairGet]+=TotalProfitPlus[PairGet][j];
      SumProfitMinus[PairGet]+=TotalProfitMinus[PairGet][j];
      SumCommissionPlus[PairGet]+=TotalCommissionPlus[PairGet][j];
      SumCommissionMinus[PairGet]+=TotalCommissionMinus[PairGet][j];
      SumLotPlus[PairGet]+=TotalLotPlus[PairGet][j];
      SumLotMinus[PairGet]+=TotalLotMinus[PairGet][j];
     }
//---------------------------------------------------------------------
   GroupsPlus[PairGet]=SumOrdersPlus[PairGet]/PairsPerGroup;
   GroupsMinus[PairGet]=SumOrdersMinus[PairGet]/PairsPerGroup;
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Count history orders and resuluts
//====================================================================================================================================================//
void CountHistoryOrders(int PairGet)
  {
//---------------------------------------------------------------------
//Reset value
   CountAllHistoryOrders=0;
   HistoryPlusOrders[PairGet]=0;
   HistoryMinusOrders[PairGet]=0;
   HistoryPlusProfit[PairGet]=0;
   HistoryMinusProfit[PairGet]=0;
//---------------------------------------------------------------------
   if(OrdersHistoryTotal()>0)
     {
      for(i=OrdersHistoryTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
           {
            CountAllHistoryOrders++;
            //---
            if(OrderMagicNumber()==OrdersID[PairGet])
              {
               //---------------------------------------------------------------------
               //Count orders and profit/loss
               HistoryTotalTrades++;
               HistoryTotalProfitLoss+=OrderProfit()+OrderCommission()+OrderSwap();
               //---------------------------------------------------------------------
               //Count plus orders
               for(j=1; j<=PairsPerGroup; j++)
                 {
                  if((OrderType()==SuitePlus[PairGet][j])&&(OrderSymbol()==SymbolPair[PairGet][j]))
                    {
                     HistoryTotalOrdersPlus++;
                     HistoryPlusOrders[PairGet]++;
                     HistoryTotalProfitPlus+=OrderProfit()+OrderCommission()+OrderSwap();
                     HistoryPlusProfit[PairGet]+=OrderProfit()+OrderCommission()+OrderSwap();
                    }
                  //---------------------------------------------------------------------
                  //Count minus orders
                  if((OrderType()==SuiteMinus[PairGet][j])&&(OrderSymbol()==SymbolPair[PairGet][j]))
                    {
                     HistoryTotalOrdersMinus++;
                     HistoryMinusOrders[PairGet]++;
                     HistoryTotalProfitMinus+=OrderProfit()+OrderCommission()+OrderSwap();
                     HistoryMinusProfit[PairGet]+=OrderProfit()+OrderCommission()+OrderSwap();
                    }
                 }
               //---------------------------------------------------------------------
               //Count pips
               if(OrderType()==OP_BUY)
                  HistoryTotalPips+=(OrderClosePrice()-OrderOpenPrice())/(MarketInfo(OrderSymbol(),MODE_POINT)*MultiplierPoint);
               if(OrderType()==OP_SELL)
                  HistoryTotalPips+=(OrderOpenPrice()-OrderClosePrice())/(MarketInfo(OrderSymbol(),MODE_POINT)*MultiplierPoint);
               //---------------------------------------------------------------------
              }
           }
         if(CountAllHistoryOrders!=OrdersHistoryTotal())
            CountHistory=true;//Pass again orders
        }
     }
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Background for comments
//====================================================================================================================================================//
void ChartBackground(string StringName, color ImageColor, int TypeBorder, bool InBackGround, int Xposition, int Yposition, int Xsize, int Ysize)
  {
//---------------------------------------------------------------------
   ObjectCreate(0,StringName,OBJ_RECTANGLE_LABEL,0,0,0,0,0);
   ObjectSetInteger(0,StringName,OBJPROP_XDISTANCE,Xposition);
   ObjectSetInteger(0,StringName,OBJPROP_YDISTANCE,Yposition);
   ObjectSetInteger(0,StringName,OBJPROP_XSIZE,Xsize);
   ObjectSetInteger(0,StringName,OBJPROP_YSIZE,Ysize);
   ObjectSetInteger(0,StringName,OBJPROP_BGCOLOR,ImageColor);
   ObjectSetInteger(0,StringName,OBJPROP_BORDER_TYPE,TypeBorder);
   ObjectSetInteger(0,StringName,OBJPROP_BORDER_COLOR,clrBlack);
   ObjectSetInteger(0,StringName,OBJPROP_BACK,InBackGround);
   ObjectSetInteger(0,StringName,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,StringName,OBJPROP_SELECTED,false);
   ObjectSetInteger(0,StringName,OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,StringName,OBJPROP_ZORDER,0);
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Display Text/image
//====================================================================================================================================================//
void DisplayText(string StringName, string Image, int FontSize, string TypeImage, color FontColor, int Xposition, int Yposition)
  {
//---------------------------------------------------------------------
   ObjectCreate(StringName,OBJ_LABEL,0,0,0);
   ObjectSet(StringName,OBJPROP_CORNER,0);
   ObjectSet(StringName,OBJPROP_BACK,FALSE);
   ObjectSet(StringName,OBJPROP_XDISTANCE,Xposition);
   ObjectSet(StringName,OBJPROP_YDISTANCE,Yposition);
   ObjectSet(StringName,OBJPROP_SELECTABLE,false);
   ObjectSet(StringName,OBJPROP_SELECTED,false);
   ObjectSet(StringName,OBJPROP_HIDDEN,TRUE);
   ObjectSetText(StringName,Image,FontSize,TypeImage,FontColor);
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Check value
//====================================================================================================================================================//
void CheckValue()
  {
//---------------------------------------------------------------------
   WrongSet=false;
//---------------------------------------------------------------------
//Check step value
   if((OpenOrdersInLoss==1)&&(StepOpenNextOrders<=0)&&(WrongSet==false))
     {
      Comment("\n "+StringOrdersEA+
              "\n\n\nStepOpenNextOrders parameter not correct ("+DoubleToStr(StepOpenNextOrders,2)+")"
              "\n\nPlease insert a value greater than 0");
      Print(" # "+WindowExpertName()+" # "+"StepOpenNextOrders parameter not correct ("+DoubleToStr(StepOpenNextOrders,2)+")");
      WrongSet=true;
      WarningMessage=MessageBox(" # "+WindowExpertName()+" # "+"StepOpenNextOrders parameter not correct ("+DoubleToStr(StepOpenNextOrders,2)+"), please insert a value greater than 0", "RISK DISCLAIMER");
     }
//---------------------------------------------------------------------
//Check profit close value
   if((TargetCloseProfit<=0)&&(WrongSet==false))
     {
      Comment("\n "+StringOrdersEA+
              "\n\n\nTargetCloseProfit parameter not correct ("+DoubleToStr(TargetCloseProfit,2)+")"
              "\n\nPlease insert a value greater than 0");
      Print(" # "+WindowExpertName()+" # "+"TargetCloseProfit parameter not correct ("+DoubleToStr(TargetCloseProfit,2)+")");
      WrongSet=true;
      WarningMessage=MessageBox(" # "+WindowExpertName()+" # "+"TargetCloseProfit parameter not correct ("+DoubleToStr(TargetCloseProfit,2)+"), please insert a value greater than 0", "RISK DISCLAIMER");
     }
//---------------------------------------------------------------------
//Check loss close value
   if((TypeCloseInLoss<2)&&(TargetCloseLoss<=0)&&(WrongSet==false))
     {
      Comment("\n "+StringOrdersEA+
              "\n\n\nTargetCloseLoss parameter not correct ("+DoubleToStr(TargetCloseLoss,2)+")"
              "\n\nPlease insert a value greater than 0");
      Print(" # "+WindowExpertName()+" # "+"TargetCloseLoss parameter not correct ("+DoubleToStr(TargetCloseLoss,2)+")");
      WrongSet=true;
      WarningMessage=MessageBox(" # "+WindowExpertName()+" # "+"TargetCloseLoss parameter not correct ("+DoubleToStr(TargetCloseLoss,2)+"), please insert a value greater than 0", "RISK DISCLAIMER");
     }
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Check locked
//====================================================================================================================================================//
void LockedCheck()
  {
//---------------------------------------------------------------------
//Check expire date
   if((TimeCurrent()>=ExpiryDate)&&(LockedDate==true))
     {
      //---Check orders
      if(StopWorking==false)
        {
         TotalOrders=0;
         for(int cnt4=0; cnt4<NumberGroupsTrade; cnt4++)
           {
            CountCurrentOrders(cnt4);
            TotalOrders+=(TotalOrdersPlus[cnt4][1]+TotalOrdersPlus[cnt4][2]+TotalOrdersMinus[cnt4][1]+TotalOrdersMinus[cnt4][2]);
           }
        }
      //---Thera are opened orders
      if(TotalOrders==0)
        {
         Comment("\n "+StringOrdersEA+
                 "\n\n\nExpert has expired ("+TimeToString(ExpiryDate,TIME_DATE)+")"
                 "\n\nPlease contact at"+
                 "\nnikolaospantzos@gmail.com");
         Print(" # "+WindowExpertName()+" # "+"Version has expired, please contact with author: nikolaospantzos@gmail.com");
         StopWorking=true;
         WarningMessage=MessageBox(" # "+WindowExpertName()+" # "+"Expert has expired ("+TimeToString(ExpiryDate,TIME_DATE)+"). Please contact with author: nikolaospantzos@gmail.com", "RISK DISCLAIMER");
        }
      //---Thera are not opened orders
      if(TotalOrders>0)
        {
         ChangeOperation=true;
         CommentWarning=true;
         WarningPrint=StringConcatenate("Expert Has Expired, Working To Close In Profit And Stop");
        }
     }
//---------------------------------------------------------------------
//Check number account
   if((!IsDemo())&&(AccountNumber()!=AccountNo)&&(LockedAccount==true))
     {
      Comment("\n "+StringOrdersEA+
              "\n\n\n Expert run only on specific account!!!"+
              "\n\n Please contact at"+
              "\n nikolaospantzos@gmail.com");
      Print(" # "+WindowExpertName()+" # "+"Locked version, please contact with author: nikolaospantzos@gmail.com");
      StopWorking=true;
      WarningMessage=MessageBox(" # "+WindowExpertName()+" # "+"Locked version. Expert run only on specific account. Please contact with author: nikolaospantzos@gmail.com", "RISK DISCLAIMER");
     }
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//Comments in the chart
//====================================================================================================================================================//
void CommentChart()
  {
//---------------------------------------------------------------------
   double LevelCloseInLossPlus[99];
   double LevelCloseInLossMinus[99];
   double ShowMaxProfit=0;
   double ShowMinProfit=0;
   double TotalProfitLoss=0;
   double TotalProfitLossPlus=0;
   double TotalProfitLossMinus=0;
   string FirstLineStr;
   string CloseProfitStr;
   string CloseLossStr;
   string SpreadStr;
   string StepNextStr;
   string LotOrdersStr;
   string ShowInfoOfPairs;
   string Space[99];
   color TextColor;
   int FileHandle;
//---------------------------------------------------------------------
//Reset values
   ArrayInitialize(LevelCloseInLossPlus,0);
   ArrayInitialize(LevelCloseInLossMinus,0);
   TotalOrders=0;
   TotalLots=0;
//---------------------------------------------------------------------
//First line comment
   if(TypeOperation==0)
      FirstLineStr=StringConcatenate("Expert Is In Stand By Mode");
   if(TypeOperation==1)
      FirstLineStr=StringConcatenate("Expert Is Ready To Open/Close Orders");
   if(TypeOperation==2)
      FirstLineStr=StringConcatenate("Expert Wait Close In Profit And Stop");
   if(TypeOperation==3)
      FirstLineStr=StringConcatenate("Expert Close Immediately All Orders");
//---
   if(CommentWarning==true)
      FirstLineStr=StringConcatenate("Warning: ",WarningPrint);
//---------------------------------------------------------------------
//Close mode
   if(TypeCloseInProfit==0)
      CloseProfitStr="Single Ticket ("+DoubleToStr(TargetCloseProfit,2)+")";
   if(TypeCloseInProfit==1)
      CloseProfitStr="Basket Ticket ("+DoubleToStr(TargetCloseProfit,2)+")";
   if(TypeCloseInProfit==2)
      CloseProfitStr="Hybrid Mode ("+DoubleToStr(TargetCloseProfit,2)+")";
//---
   if(TypeCloseInLoss==0)
      CloseLossStr="Whole Ticket ("+DoubleToStr(-TargetCloseLoss,2)+")";
   if(TypeCloseInLoss==1)
      CloseLossStr="Partial Ticket ("+DoubleToStr(-TargetCloseLoss,2)+" / "+IntegerToString(GroupsStartClose)+")";
   if(TypeCloseInLoss==2)
      CloseLossStr="Not Close In Loss";
//---------------------------------------------------------------------
//Open next and step
   if(OpenOrdersInLoss==0)
      StepNextStr="Not Open Next In Loss";
//---
   if(OpenOrdersInLoss==1)
     {
      if(StepOrdersProgress==0)
         StepNextStr="Manual / Statical ("+DoubleToStr(StepOpenNextOrders,1)+")";
      if(StepOrdersProgress==1)
         StepNextStr="Manual / Geometrical ("+DoubleToStr(StepOpenNextOrders,1)+")";
      if(StepOrdersProgress==2)
         StepNextStr="Manual / Exponential ("+DoubleToStr(StepOpenNextOrders,1)+")";
     }
//---
   if(OpenOrdersInLoss==2)
     {
      if(StepOrdersProgress==0)
         StepNextStr="Automatic / Statical ("+DoubleToStr(TargetCloseProfit,1)+")";
      if(StepOrdersProgress==1)
         StepNextStr="Automatic / Geometrical ("+DoubleToStr(TargetCloseProfit,1)+")";
      if(StepOrdersProgress==2)
         StepNextStr="Automatic / Exponential ("+DoubleToStr(TargetCloseProfit,1)+")";
     }
//---------------------------------------------------------------------
//Lot orders
   if(AutoLotSize==false)
     {
      if(LotOrdersProgress==0)
         LotOrdersStr="Manual / Statical ("+DoubleToStr(ManualLotSize,2)+")";
      if(LotOrdersProgress==1)
         LotOrdersStr="Manual / Geometrical ("+DoubleToStr(ManualLotSize,2)+")";
      if(LotOrdersProgress==2)
         LotOrdersStr="Manual / Exponential ("+DoubleToStr(ManualLotSize,2)+")";
     }
//---
   if(AutoLotSize==true)
     {
      if(LotOrdersProgress==0)
         LotOrdersStr="Automatic / Statical ("+DoubleToStr((AccountBalance()/100000)*RiskFactor,2)+")";
      if(LotOrdersProgress==1)
         LotOrdersStr="Automatic / Geometrical ("+DoubleToStr((AccountBalance()/100000)*RiskFactor,2)+")";
      if(LotOrdersProgress==2)
         LotOrdersStr="Automatic / Exponential ("+DoubleToStr((AccountBalance()/100000)*RiskFactor,2)+")";
     }
//---------------------------------------------------------------------
//Set up pairs information
   if(ShowTaskInfo==true)
     {
      for(i=0; i<NumberGroupsTrade; i++)
        {
         //---------------------------------------------------------------------
         //Close levels
         if(TypeCloseInLoss<2)
           {
            LevelCloseInLossPlus[i]=LevelLossClosePlus[i];
            LevelCloseInLossMinus[i]=LevelLossCloseMinus[i];
           }
         //---------------------------------------------------------------------
         //Calculate max and min value
         MaxOrders[i]=MathMax(MaxOrders[i],SumOrdersPlus[i]+SumOrdersMinus[i]);
         MaxFloating[i]=MathMin(MaxFloating[i],SumProfitPlus[i]+SumProfitMinus[i]);
         //---------------------------------------------------------------------
         //Count total orders, lots and floating
         TotalOrders+=SumOrdersPlus[i]+SumOrdersMinus[i];
         TotalProfitLoss+=SumProfitPlus[i]+SumProfitMinus[i];
         TotalProfitLossPlus+=SumProfitPlus[i];
         TotalProfitLossMinus+=SumProfitMinus[i];
         TotalLots+=TotalLotPlus[i][1]+TotalLotPlus[i][2]+TotalLotMinus[i][1]+TotalLotMinus[i][2];
         //---------------------------------------------------------------------
         //Calculate max and min value
         if(TotalOrders>0)
           {
            MaxProfit=MathMax(TotalProfitLoss,MaxProfit);
            MinProfit=MathMin(TotalProfitLoss,MinProfit);
           }
         //---
         if(MaxProfit==-99999)
            ShowMaxProfit=0;
         else
            ShowMaxProfit=MaxProfit;
         if(MinProfit==99999)
            ShowMinProfit=0;
         else
            ShowMinProfit=MinProfit;
         MaxTotalOrders=MathMax(MaxTotalOrders,TotalOrders);
         //---------------------------------------------------------------------
         //Speread string
         if(MaxSpread==0)
            SpreadStr="Expert Not Check Spread";
         if(MaxSpread!=0)
            SpreadStr="Expert Check Spread ("+DoubleToStr(MaxSpread,2)+")";
         //---------------------------------------------------------------------
         //Set space
         if(i<9)
            Space[i]="  ";
         //---------------------------------------------------------------------
         //Set comments on chart
         if(ShowPairsInfo==true)
           {
            //---Set color
            TextColor=ColorOfInfo;
            if(TypeCloseInProfit==2)
              {
               if(SideToOpenOrders==0)
                 {
                  if((GroupWithMaximumProfitsPlus!=-1)&&(i==GroupWithMaximumProfitsPlus))
                     TextColor=clrAqua;
                  if((GroupWithMaximumLossesPlus!=-1)&&(i==GroupWithMaximumLossesPlus))
                     TextColor=clrHotPink;
                 }
               //---
               if(SideToOpenOrders==1)
                 {
                  if((GroupWithMaximumProfitsMinus!=-1)&&(i==GroupWithMaximumProfitsMinus))
                     TextColor=clrAqua;
                  if((GroupWithMaximumLossesMinus!=-1)&&(i==GroupWithMaximumLossesMinus))
                     TextColor=clrHotPink;
                 }
               //---
               if(SideToOpenOrders==2)
                 {
                  if((GroupWithMaximumProfits!=-1)&&(i==GroupWithMaximumProfits))
                     TextColor=clrAqua;
                  if((GroupWithMaximumLosses!=-1)&&(i==GroupWithMaximumLosses))
                     TextColor=clrHotPink;
                 }
              }
            //---Make strings
            if(SymbolPair[i][1]!="")
              {
               //---Str1
               if(ObjectFind("Str1")==-1)
                  DisplayText("Str1","Pairs",SizeFontsOfInfo,"Arial Black",ColorOfTitle,310,0);
               //---Str2
               if(ObjectFind("Str2")==-1)
                  DisplayText("Str2","Orders",SizeFontsOfInfo,"Arial Black",ColorOfTitle,PositionOrders,0);
               //---Str3
               if(ObjectFind("Str3")==-1)
                  DisplayText("Str3","PnL",SizeFontsOfInfo,"Arial Black",ColorOfTitle,PositionPnL,0);
               //---Str4
               if(ObjectFind("Str4")==-1)
                  DisplayText("Str4","Close",SizeFontsOfInfo,"Arial Black",ColorOfTitle,PositionClose,0);
               //---Str5
               if(ObjectFind("Str5")==-1)
                  DisplayText("Str5","History",SizeFontsOfInfo,"Arial Black",ColorOfTitle,PositionHistory,0);
               //---Str6
               if(ObjectFind("Str6")==-1)
                  DisplayText("Str6","Maximum",SizeFontsOfInfo,"Arial Black",ColorOfTitle,PositionMaximum,0);
               //---Str7
               if(ObjectFind("Str7")==-1)
                  DisplayText("Str7","Spread",SizeFontsOfInfo,"Arial Black",ColorOfTitle,PositionSpread,0);
               //---Comm1
               ObjectDelete("Comm1"+IntegerToString(i));
               if(ObjectFind("Comm1"+IntegerToString(i))==-1)
                  DisplayText("Comm1"+IntegerToString(i),IntegerToString(i+1)+". "+Space[i]+StringSubstr(SymbolPair[i][1],0,6)+"-"+StringSubstr(SymbolPair[i][2],0,6),SizeFontsOfInfo,"Arial Black",TextColor,245,20+(i*14));
               //---
               if(SkippedStatus[i]!="Couple Skipped by user from external parameters")
                 {
                  //---Comm2
                  ObjectDelete("Comm2"+IntegerToString(i));
                  if(ObjectFind("Comm2"+IntegerToString(i))==-1)
                     DisplayText("Comm2"+IntegerToString(i),StringConcatenate(TotalOrdersPlus[i][1],"/",TotalOrdersPlus[i][2],"-",TotalOrdersMinus[i][1],"/",TotalOrdersMinus[i][2]),SizeFontsOfInfo,"Arial Black",TextColor,PositionOrders,20+(i*14));
                  //---Comm3
                  ObjectDelete("Comm3"+IntegerToString(i));
                  if(ObjectFind("Comm3"+IntegerToString(i))==-1)
                     DisplayText("Comm3"+IntegerToString(i),DoubleToStr(SumProfitPlus[i]+SumProfitMinus[i],2),SizeFontsOfInfo,"Arial Black",TextColor,PositionPnL-5,20+(i*14));
                  //---Comm4
                  ObjectDelete("Comm4"+IntegerToString(i));
                  if(ObjectFind("Comm4"+IntegerToString(i))==-1)
                     DisplayText("Comm4"+IntegerToString(i),DoubleToStr(MathMax(LevelProfitClosePlus[i],LevelProfitCloseMinus[i]),2),SizeFontsOfInfo,"Arial Black",TextColor,PositionClose+5,20+(i*14));
                  //---Comm5
                  ObjectDelete("Comm5"+IntegerToString(i));
                  if(ObjectFind("Comm5"+IntegerToString(i))==-1)
                     DisplayText("Comm5"+IntegerToString(i),DoubleToStr(HistoryPlusOrders[i]+HistoryMinusOrders[i],0)+"/"+DoubleToStr(HistoryPlusProfit[i]+HistoryMinusProfit[i],2),SizeFontsOfInfo,"Arial Black",TextColor,PositionHistory,20+(i*14));
                  //---Comm6
                  ObjectDelete("Comm6"+IntegerToString(i));
                  if(ObjectFind("Comm6"+IntegerToString(i))==-1)
                     DisplayText("Comm6"+IntegerToString(i)," ("+DoubleToStr(MaxOrders[i],0)+"/"+DoubleToStr(MaxFloating[i],2)+")",SizeFontsOfInfo,"Arial Black",TextColor,PositionMaximum,20+(i*14));
                  //---Comm7
                  ObjectDelete("Comm7"+IntegerToString(i));
                  if(ObjectFind("Comm7"+IntegerToString(i))==-1)
                     DisplayText("Comm7"+IntegerToString(i),DoubleToStr(SpreadPair[i][1]+SpreadPair[i][2],1),SizeFontsOfInfo,"Arial Black",TextColor,PositionSpread+15,20+(i*14));
                 }
               else
                 {
                  ObjectDelete("Comm2"+IntegerToString(i));
                  if(ObjectFind("Comm2"+IntegerToString(i))==-1)
                     DisplayText("Comm2"+IntegerToString(i),SkippedStatus[i],SizeFontsOfInfo,"Arial",TextColor,PositionOrders,20+(i*14));
                 }
               //---Background0
               if(ObjectFind("BackgroundLine0")==-1)
                  ChartBackground("BackgroundLine0",ColorLineTitles,EMPTY_VALUE,TRUE,245,0,PositionSpread-245+55,24);
               //---Background1
               if((i<NumberGroupsTrade/2)&&(MathMod(NumberGroupsTrade,2)==0))
                  if(ObjectFind("BackgroundLine1"+IntegerToString(i))==-1)
                     ChartBackground("BackgroundLine1"+IntegerToString(i),ColorOfLine1,EMPTY_VALUE,TRUE,245,22+(i*14*2),PositionSpread-245+55,16);
               if((i<=NumberGroupsTrade/2)&&(MathMod(NumberGroupsTrade,2)==1))
                  if(ObjectFind("BackgroundLine1"+IntegerToString(i))==-1)
                     ChartBackground("BackgroundLine1"+IntegerToString(i),ColorOfLine1,EMPTY_VALUE,TRUE,245,22+(i*14*2),PositionSpread-245+55,16);
               //---Background2
               if(i<NumberGroupsTrade/2)
                  if(ObjectFind("BackgroundLine2"+IntegerToString(i))==-1)
                     ChartBackground("BackgroundLine2"+IntegerToString(i),ColorOfLine2,EMPTY_VALUE,TRUE,245,36+(i*14*2),PositionSpread-245+55,16);
              }
           }
        }//End for(i=0; i<NumberGroupsTrade; i++)
     }//End if(ShowTaskInfo==true)
//---------------------------------------------------------------------
//Saving information about opened groups
   if((SaveInformations==true)&&(TimeHour(TimeCurrent())!=LastHourSaved))
     {
      //---Set values
      int w=0;
      int FindGroup[100];
      int FindMaxFloating[100];
      int FindMaxOrders[100];
      int FindNext1[100];
      int FindNext2[100];
      string GetGroup[100];
      string GetMaxFloating[100];
      string GetMaxOrders[100];
      string ReadString;
      string NameOfFile=Symbol()+"-"+IntegerToString(MagicNo)+"-"+StringOrdersEA+"-"+IntegerToString(AccountNumber())+".log";
      //---Read existing file
      FileHandle=FileOpen(NameOfFile,FILE_READ|FILE_CSV|FILE_COMMON);
      //---Start prosses file
      if(FileHandle!=INVALID_HANDLE)
        {
         while(!FileIsEnding(FileHandle))
           {
            w++;
            //---Read informations
            ReadString=FileReadString(FileHandle);
            //---Find potitions
            FindGroup[w]=StringFind(ReadString,"Group No: ",0);
            FindMaxFloating[w]=StringFind(ReadString,"Max Floating: ",0);
            FindMaxOrders[w]=StringFind(ReadString,"Max Orders: ",0);
            FindNext1[w]=StringFind(ReadString," || Pairs: ",0);
            FindNext2[w]=StringFind(ReadString," || Max Floating: ",0);
            //---Get informations
            GetGroup[w]=StringSubstr(ReadString,FindGroup[w]+10,FindNext1[w]-(FindGroup[w]+10));
            GetMaxFloating[w]=StringSubstr(ReadString,FindMaxFloating[w]+14,10);
            GetMaxOrders[w]=StringSubstr(ReadString,FindMaxOrders[w]+11,FindNext2[w]-(FindMaxOrders[w]+11));
           }
         FileClose(FileHandle);
        }
      //---Reset maximum value
      for(int x=1; x<NumberGroupsTrade+1; x++)
        {
         if((x==StrToInteger(GetGroup[x]))&&(StrToInteger(GetMaxOrders[x])>MaxOrders[x-1]))
            MaxOrders[x-1]=StrToInteger(GetMaxOrders[x]);
         if((x==StrToInteger(GetGroup[x]))&&(StrToInteger(GetMaxFloating[x])<MaxFloating[x-1]))
            MaxFloating[x-1]=StrToInteger(GetMaxFloating[x]);
        }
      //---Write first time the file
      FileHandle=FileOpen(NameOfFile,FILE_READ|FILE_WRITE|FILE_CSV|FILE_COMMON);
      //---Continue to write the file
      if(FileHandle!=INVALID_HANDLE)
        {
         for(i=0; i<NumberGroupsTrade; i++)
           {
            FileWrite(FileHandle,"Group No: "+IntegerToString(i+1)+" || Pairs: "+StringSubstr(SymbolPair[i][1],0,6)+"-"+StringSubstr(SymbolPair[i][2],0,6)+" || History Profit: "+DoubleToStr(HistoryPlusProfit[i]+HistoryMinusProfit[i],2)+" || Max Orders: "+DoubleToStr(MaxOrders[i],0)+" || Max Floating: "+DoubleToStr(MaxFloating[i],2));
            FileFlush(FileHandle);
            if(i==NumberGroupsTrade-1)
               LastHourSaved=TimeHour(TimeCurrent());
           }
         FileClose(FileHandle);
        }
      //---
     }//End if(SaveInformations==true)
//---------------------------------------------------------------------
//Chart comment
   Comment("================================="+
           "\n  "+FirstLineStr+
           "\n================================="+
           "\n  Spread: "+SpreadStr+"  ("+DoubleToStr(TotalGroupsSpread,2)+")"+
           "\n================================="+
           "\n  Close In Profit Orders: "+CloseProfitStr+
           "\n  Close In Loss Orders  : "+CloseLossStr+
           "\n  Step For Next Order  : "+StepNextStr+
           "\n  Order Lot Size Type  : "+LotOrdersStr+
           "\n================================="+
           ShowInfoOfPairs+
           "\n  Orders: "+IntegerToString(TotalOrders)+" || PnL: "+DoubleToStr(TotalProfitLoss,2)+"  ["+DoubleToStr(TotalProfitLossPlus,2)+"/"+DoubleToStr(TotalProfitLossMinus,2)+"]"+
           "\n================================="+
           "\n  Maximum Orders: "+IntegerToString(MaxTotalOrders)+" || Maximum PnL: "+DoubleToStr(ShowMinProfit,2)+
           "\n================================="+
           "\n  T O T A L   H I S T O R Y   R E S U L T S"+
           "\n  Orders: "+IntegerToString(HistoryTotalTrades)+" ["+IntegerToString(HistoryTotalOrdersPlus)+"/"+IntegerToString(HistoryTotalOrdersMinus)+"]"+" || PnL: "+DoubleToStr(HistoryTotalProfitLoss,2)+" ["+DoubleToStr(HistoryTotalProfitPlus,2)+"/"+DoubleToStr(HistoryTotalProfitMinus,2)+"]"+
           "\n=================================");
//---------------------------------------------------------------------
  }
//====================================================================================================================================================//
//End of code
//====================================================================================================================================================//

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 ---