MonsterCorrelation_full

Author: Igor Zakharov
Price Data Components
Series array that contains open time of each barSeries array that contains close prices for each bar
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt Closes Orders by itself Checks for the total of closed orders
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
It opens Message Boxes to the userIt issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
MonsterCorrelation_full
ÿþ#property copyright "Igor Zakharov"

#property link "https://www.mql5.com/en/users/igor.i"

#property strict

#property version "5.0"

#property description "EA opens trades based on correlation of two symbols"

#property description "Free limited version"



const string Positive="~p";

const string Negative="~n";



enum MART

{

NONE, //No Martingale

SUMM, //Add to prev. lot

MULT, //Multiply prev. lot

};



enum CULCMODE

{

FIRST,  //TickValue based (V4)

SECOND, //Half-TickValue based

THIRD,  //No-TickValue used

};



enum REASONS

{

Done,

Not_Time_To_Trade,

Not_Alowed_Correlation_Type,

Limits_Reached,

No_Money,

Symbol_From_Stop_List,

Pair_Not_Found,

Symbol_Only_Once_Mode,

Currency_Only_Once_Mode,

};



enum VERSION

{

V2,   //Best correlation

V4_1, //Through another symbol (TF2)

V4_2, //Through another symbol (TF1)

};



enum CORRECTOR

{

CO_NO,    //No correction

CO_TVD,   //TickValue based (V2) 

CO_VOL_H, //Volatility based (TF1) (V4&3)

CO_VOL_L, //Volatility based (TF2)

};





enum ARR_SORT

{

HIGH,//Higer TF corr

DIF, //diff (higherTF-lowerTF)

GAP, //gap points

};



enum LIST

{

NOTH, //Nothing

STOP, //Stop-List

CURR, //Opened Currencies

SYMB_O,//Opened Symbols

SYMB_T,//Trading Symbols

};



extern bool Manual_Start=true;       //Start grids only manually

extern bool Allow_Pos=true;          //Trade positive correlation

extern bool Allow_Neg=true;          //Trade negative correlation

extern bool Use_MarketWatch=false;   //Use visible pairs from MarketWatch?

extern string SymbList="AUDNZD,AUDUSD,CADJPY,CADCHF,CHFJPY,EURAUD,EURCAD,EURCHF,EURGBP,EURJPY,EURNZD,GBPAUD,GBPCAD,GBPCHF,GBPJPY,GBPNZD,GBPUSD,NZDCAD,NZDJPY,NZDUSD,USDCAD,USDCHF,USDJPY";

extern VERSION Version=V4_1;

extern ARR_SORT ArraySortWay=HIGH;       //Sort way

extern CORRECTOR   Correction =CO_VOL_H; //Lot correction type

extern CULCMODE    PointCulc =SECOND;    //Points calculation mode

extern string Cap1="";               //........ Correlation settings:

extern ENUM_TIMEFRAMES TF1=PERIOD_H1;//TimeFrame Main

extern int  cPeriod1=1500;           //Period Main

extern ENUM_TIMEFRAMES TF2=PERIOD_M1;//TimeFrame 2

extern int  cPeriod2=500;            //Period 2

extern double Enought=0.7;           //Min. correlation

extern double Min=0.01;              //Min. deviation to trade



extern string Cap2="";   //........Trading logic:

extern int    MinGap=50;            //Min. gap (points)

input string  caption70   ="";      //......... Money & grid settings:

extern double Lots        =0.01;    //Initial lot

extern MART   Martin_way  =SUMM;    //Martingale method

extern double Martin      =0.01;    //Martingale factor

extern int    Martin_Start=2;       //Start Martingale from...

extern double MaxLot_Inp  =20;      //Max. lot

extern int    Trigger_Points=100;   //Loss for the grid, points

extern int    Trigger_Step  =200;   //Loss step for the grid, points





input string  Cap3   ="";    //......... Exit conditions:

 bool   Use_HEDGE_CLOSE   =true;  //Use hedge-close

 int    Grid_To_Hedge     =3;     //Size of the grid to use hedge-close

input string  Cap31  ="";               //... For one-pair grid:

extern double Prof_Points      =50;     //Points of profit for single pair of trades

extern int    BE_NMBR          =999;    //Number of pairs of orders to use grid profit

extern int    BE_Points        =5;      //Grid profit, points

extern double Lose_Points      =999999; //Points of loss

extern double Lose_Perc1       =100;    //Percent of loss

extern double Lose_Money1      =999999; //Loss in money

input string  Cap32  ="";    //...For all trades from EA:

extern double Prof_Perc        =5;      //Percent of profit

extern double Lose_Perc        =100;    //Percent of loss



input string  Cap4  ="";     //... Time filters:

extern ENUM_DAY_OF_WEEK Start_D=MONDAY;        //Day of the week to start opening

extern string           Start_H_s ="4:00";     //Start hours

extern ENUM_DAY_OF_WEEK Stop_D =FRIDAY;        //Day of the week to stop opening

extern string           Stop_H_s  ="18:00";    //Stop trading

extern int              SwapTime  = 21;        //SwapTime

extern int       MinutesBeforSwap = 2;         //Don't trade before swap time, minutes 

extern int       MinutesAfterSwap = 15;        //Don't trade after swap time, minutes 



input string  Cap5   ="";    //... Limitations for grid quantity:

extern bool   OneceSymb=true;         //Open Symbol once

extern bool   OneceCurr=false;        //Open Currency once

input  int    MAX_ORD_in_grid=50;     //Max. pairs of orders in one grid (stop adding into grid)

extern int    MAX_Grids_nmbr=20;      //Max. number of grids (blocks opening new grid)

input  int    MAX_ORD_TOTAL=24;       //Max. pairs of orders in ALL grids (blocks opening new grid)

input  int    MAX_In_One_Grid=3;      //Max. pairs of orders in one grids (blocks opening new grid)

extern bool   Reverse_Pos=false;      //Reverse trades under positive correlation

extern bool   Reverse_Neg=false;      //Reverse trades under negative correlation

extern string StopListFull="";        //Full-stop list

extern string StopList="";            //Stop list with support of opened grids



input string  Cap51   ="";     //......... Other settings:

input  int    RefrFr  =200;            //Refresh time, ms

input  int    CheckPoint_Shift=5;      //CheckPoint shift, seconds

extern int    Test_GS =10;             //Testing grid size

extern double Test_VF =3;              //Testing Volatility factor

extern int    Magic   =2;              //Magic number

extern string OComm   ="";             //Order comment



extern string Cap11="~~~~~~~~~~~~~~~~";//........ Decoration:

extern color  CL_Symb=clrWhite ;     //Caption color

extern color  CL=clrLightGray ;      //Text color

extern color  CL_Pos=clrYellow ;     //Positive correlation color

extern color  CL_Neg=clrDeepSkyBlue; //Negative correlation color

extern int    FS=8;                  //Font size

extern int    FS_Stat=8;             //Increase statistic unit font size

extern double V_Step=1.8;            //Vertical step

extern double H_Step=7;              //Horizontal step

extern bool   Silent=false;          //Silent mode

extern bool   ShowStatistic=false;   //Show statistic table

extern bool   ShowMayOpen=true;      //Show MayOpen list

extern bool   ShowAlready=true;      //Show AlreadyOpened list

extern bool   Show_Time=true;        //Show time instead of lot

extern bool   ShowSuffix=true;       //Show suffix (for opened trades only)

extern bool   Print_Test=true;       //Print VF-test results to log





struct DESCRIPTOR1

{

int r;

int c;

string Pos_Neg;

string Symb1;

string Symb2;

double CorrHigh;

double CorrLow;

double Diff;

double Gap;

double VolFactH;

double VolFactL;

double M1_H;

double M2_H;

double M1_L;

double M2_L;

ENUM_ORDER_TYPE Buy_Sell1;

ENUM_ORDER_TYPE Buy_Sell2;

};



struct DESCRIPTOR2

{

string Pos_Neg;

string Symb1;

string Symb2;

int Buy_Sell1;

int Buy_Sell2;

double profit;

double profitP;

double Lot1;

double Lot2;

int Orders1;

int Orders2;

datetime Op_Time;

};



string SymbListARR[100];

string No_Trades[99999];

int    No_Trades_Size=0;

int    Symb_Total=0;



double Start_H,Stop_H;

bool   MayStart;

datetime LastTime;

string obj_pref="Mon_";

double Volatility_Factor;

int    cntrMO;

int    Orders_ALL;

int    MaxGrid;

int    cntrAO;

double ProfALL;

datetime MinOpT=999999999999;

bool   IsSwapTime;



DESCRIPTOR1 MayOpen[];

DESCRIPTOR2 AlreadyOpened[],curr_order;



string OpenedSymb[999],

       OpenedCurr[999],

       FullLock[99];

int    OpenedSymbSyze,

       OpenedCurrSyze,

       FullLockSize;

       

LIST List=0;



long X_MIN=1300;

long Y_MIN=400;

long X_CURR;

long Y_CURR;

long X_SHIFT;

long Y_SHIFT;

int STAT_SHIFT;



void OnInit()

{



 if(IsTesting()) 

  {

   Print("Multicurrency EAs can't be tested in MT4 tester!");

   //ExpertRemove();

  }

 

 STAT_SHIFT=int((FS+FS_Stat)*5/(V_Step*FS))+2;

 X_MIN=int(FS*23.5*H_Step);

 Y_MIN=int((STAT_SHIFT+14)*FS*V_Step);

 if(!GlobalVariableCheck(obj_pref+"_Depth_"+IntegerToString(Magic))) GlobalVariableSet(obj_pref+"_Depth_"+IntegerToString(Magic),7);



 if(!MarketInfo(NULL,MODE_CLOSEBY_ALLOWED)) 

  {

   Use_HEDGE_CLOSE=false;

   Print("CloseBy not allowed by broker. Danger of high slippage.");

  }



 EventSetMillisecondTimer(RefrFr);

 LastTime =0;

 MayStart =true;

 

 ChartSetInteger(0,CHART_FOREGROUND,false);

 ChartSetInteger(0,CHART_MODE,CHART_LINE);

 ChartSetInteger(0,CHART_SHOW_ASK_LINE,false);

 ChartSetInteger(0,CHART_SHOW_BID_LINE,false);

 ChartSetInteger(0,CHART_SHOW_GRID,false);

 ChartSetInteger(0,CHART_SHOW_PERIOD_SEP,false);

 ChartSetInteger(0,CHART_SHOW_DATE_SCALE,false);

 ChartSetInteger(0,CHART_SHOW_OHLC,false);

 ChartSetInteger(0,CHART_SHOW_PRICE_SCALE,false);

 ChartSetInteger(0,CHART_SHOW_VOLUMES,false);

 ChartSetInteger(0,CHART_SHOW_OBJECT_DESCR,false);

 ChartSetInteger(0,CHART_COLOR_CHART_LINE,clrNONE);



 //Check errors in inputs:

  Start_H=StringToDouble(StringSubstr(Start_H_s,0,MathMax(StringFind(Start_H_s,":"),0)))

         +((StringFind(Start_H_s,":")>0)?StringToDouble(StringSubstr(Start_H_s,StringFind(Start_H_s,":")+1))/60:0);

  Stop_H =StringToDouble(StringSubstr(Stop_H_s ,0,MathMax(StringFind(Stop_H_s,":"),0)))

         +((StringFind(Stop_H_s ,":")>0)?StringToDouble(StringSubstr(Stop_H_s ,StringFind(Stop_H_s ,":")+1))/60:0);



  if(StringToDouble(StringSubstr(Stop_H_s ,StringFind(Stop_H_s ,":")+1))>59 ||

     StringToDouble(StringSubstr(Start_H_s,StringFind(Start_H_s,":")+1))>59 ||

     StringToDouble(StringSubstr(Start_H_s,0,MathMax(StringFind(Start_H_s,":"),0)))>=24 ||

     StringToDouble(StringSubstr(Stop_H_s ,0,MathMax(StringFind(Stop_H_s ,":"),0)))>=24 ||

     Stop_D<=Start_D

    )

   {

    Print("Error in start / stop time.");

    MayStart=false;

   }

   

 Martin_Start=int(MathMin(2,Martin_Start));



 TF1=TF1==0?(ENUM_TIMEFRAMES)_Period:TF1;

 TF2=TF2==0?(ENUM_TIMEFRAMES)_Period:TF2;



 FullLockSize=No_Trades_Size=OpenedSymbSyze=OpenedCurrSyze=0;

  

 //form initial No_trade  

 if(StopList!="")

 {

  while(StringFind(StopList,",")>-1 && !IsStopped())

   {

    int pos=StringFind(StopList,",");

    if(pos==0) {StopList=StringSubstr(StopList,1);continue;}

    No_Trades[No_Trades_Size]=StringSubstr(StopList,0,pos);

    StopList=StringSubstr(StopList,pos+1);

    No_Trades_Size++;

   }

  if(StopList!="" && StopList!=",")

  {

   No_Trades[No_Trades_Size]=StopList;

   No_Trades_Size++;

  }

 }

 

 if(StopListFull!="")

 {

  while(StringFind(StopListFull,",")>-1 && !IsStopped())

   {

    int pos=StringFind(StopListFull,",");

    if(pos==0) {StopListFull=StringSubstr(StopListFull,1);continue;}

    FullLock[FullLockSize]=StringSubstr(StopListFull,0,pos);

    StopListFull=StringSubstr(StopListFull,pos+1);

    FullLockSize++;

   }

  if(StopListFull!="" && StopListFull!=",")

  {

   FullLock[FullLockSize]=StopListFull;

   FullLockSize++;

  }

 }

 

 //form array with tradeable symbols

 Symb_Total=0;

 if(!Use_MarketWatch)

 {

  while(StringFind(SymbList,",")>-1 && !IsStopped())

   {

    int pos=StringFind(SymbList,",");

    if(pos==0) {SymbList=StringSubstr(SymbList,1);continue;}

    SymbListARR[Symb_Total]=StringSubstr(SymbList,0,pos);

    if(CanTrade(SymbListARR[Symb_Total])) 

     Symb_Total++;

    SymbList=StringSubstr(SymbList,pos+1);

   }

  SymbListARR[Symb_Total]=SymbList;

  if(CanTrade(SymbListARR[Symb_Total])) Symb_Total++;

 }

 else

  for(int i=0;i<SymbolsTotal(true) && !IsStopped();i++)

   if(CanTrade(SymbolName(i,true)))

   {

    SymbListARR[Symb_Total]=SymbolName(i,true);

    Symb_Total++;

   }

  

 ArrayResize(MayOpen,       Symb_Total*Symb_Total);

 ArrayResize(AlreadyOpened ,Symb_Total*Symb_Total);



  X_CURR=ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);

  Y_CURR=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);

  CreateScrollButtons();

  

 //Create buttons

   if(ObjectFind(0,obj_pref+"BT00")==-1)

   {

   ObjectCreate(ChartID(),obj_pref+"BT00",OBJ_BUTTON,0,0,0);

   ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_CORNER,CORNER_LEFT_UPPER);   //--- CAB0=>28< C3>; 3@0D8:0, >B=>A8B5;L=> :>B>@>3> 1C4CB >?@545;OBLAO :>>@48=0BK B>G:8 

   ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_XDISTANCE,int(FS*10*H_Step)); //--- CAB0=>28< :>>@48=0BK :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_YDISTANCE,int((FS+FS_Stat)*5));

   ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_XSIZE,(FS+FS_Stat)*14);     //--- CAB0=>28< @07<5@ :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_YSIZE,int((FS+FS_Stat)*1.5));

   ObjectSetString(ChartID(),obj_pref+"BT00",OBJPROP_TEXT,"Silent OFF");//--- CAB0=>28< B5:AB

   ObjectSetString(ChartID(),obj_pref+"BT00",OBJPROP_FONT,"Arial");

   ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_FONTSIZE,FS+FS_Stat);

   ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_COLOR,clrBlack);

   ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_BGCOLOR,CL_Symb);

   ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_BORDER_COLOR,clrDarkGray);//--- CAB0=>28< F25B 3@0=8FK

   ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_BACK,False);      //--- >B>1@078< =0 ?5@54=5< (false) 8;8 704=5< (true) ?;0=5

   ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_STATE,false);     //--- ?5@52545< :=>?:C 2 7040==>5 A>AB>O=85

   if(Silent==false)

    {

     ObjectSetString(ChartID(),obj_pref+"BT00",OBJPROP_TEXT,"Silent OFF");//--- CAB0=>28< B5:AB

     ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_BGCOLOR,CL_Symb);

    }

   else

    {

     ObjectSetString(ChartID(),obj_pref+"BT00",OBJPROP_TEXT,"Silent ON");//--- CAB0=>28< B5:AB

     ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_BGCOLOR,clrGreen);

    }

   }

 

   if(ObjectFind(0,obj_pref+"BT11")==-1)

   {

   ObjectCreate(ChartID(),obj_pref+"BT11",OBJ_BUTTON,0,0,0);

   ObjectSetInteger(ChartID(),obj_pref+"BT11",OBJPROP_CORNER,CORNER_LEFT_UPPER);   //--- CAB0=>28< C3>; 3@0D8:0, >B=>A8B5;L=> :>B>@>3> 1C4CB >?@545;OBLAO :>>@48=0BK B>G:8 

   ObjectSetInteger(ChartID(),obj_pref+"BT11",OBJPROP_XDISTANCE,int(FS*10*H_Step)); //--- CAB0=>28< :>>@48=0BK :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"BT11",OBJPROP_YDISTANCE,int((FS+FS_Stat)*3));

   ObjectSetInteger(ChartID(),obj_pref+"BT11",OBJPROP_XSIZE,(FS+FS_Stat)*14);     //--- CAB0=>28< @07<5@ :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"BT11",OBJPROP_YSIZE,int((FS+FS_Stat)*1.5));

   ObjectSetString(ChartID(),obj_pref+"BT11",OBJPROP_TEXT,"Refresh");//--- CAB0=>28< B5:AB

   ObjectSetString(ChartID(),obj_pref+"BT11",OBJPROP_FONT,"Arial");

   ObjectSetInteger(ChartID(),obj_pref+"BT11",OBJPROP_FONTSIZE,FS+FS_Stat);

   ObjectSetInteger(ChartID(),obj_pref+"BT11",OBJPROP_COLOR,clrBlack);

   ObjectSetInteger(ChartID(),obj_pref+"BT11",OBJPROP_BGCOLOR,CL_Symb);

   ObjectSetInteger(ChartID(),obj_pref+"BT11",OBJPROP_BORDER_COLOR,clrDarkGray);//--- CAB0=>28< F25B 3@0=8FK

   ObjectSetInteger(ChartID(),obj_pref+"BT11",OBJPROP_BACK,False);      //--- >B>1@078< =0 ?5@54=5< (false) 8;8 704=5< (true) ?;0=5

   ObjectSetInteger(ChartID(),obj_pref+"BT11",OBJPROP_STATE,false);     //--- ?5@52545< :=>?:C 2 7040==>5 A>AB>O=85

   }

   

   if(ObjectFind(0,obj_pref+"BT22")==-1)

   {

   ObjectCreate(ChartID(),obj_pref+"BT22",OBJ_BUTTON,0,0,0);

   ObjectSetInteger(ChartID(),obj_pref+"BT22",OBJPROP_CORNER,CORNER_LEFT_UPPER);   //--- CAB0=>28< C3>; 3@0D8:0, >B=>A8B5;L=> :>B>@>3> 1C4CB >?@545;OBLAO :>>@48=0BK B>G:8 

   ObjectSetInteger(ChartID(),obj_pref+"BT22",OBJPROP_XDISTANCE,int(FS*10*H_Step)); //--- CAB0=>28< :>>@48=0BK :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"BT22",OBJPROP_YDISTANCE,int((FS+FS_Stat)*1));

   ObjectSetInteger(ChartID(),obj_pref+"BT22",OBJPROP_XSIZE,(FS+FS_Stat)*14);     //--- CAB0=>28< @07<5@ :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"BT22",OBJPROP_YSIZE,int((FS+FS_Stat)*1.5));

   ObjectSetString(ChartID(),obj_pref+"BT22",OBJPROP_TEXT,"Close ALL & Stop EA");//--- CAB0=>28< B5:AB

   ObjectSetInteger(ChartID(),obj_pref+"BT22",OBJPROP_ALIGN,ALIGN_LEFT);

   ObjectSetString(ChartID(),obj_pref+"BT22",OBJPROP_FONT,"Arial");

   ObjectSetInteger(ChartID(),obj_pref+"BT22",OBJPROP_FONTSIZE,FS+FS_Stat);

   ObjectSetInteger(ChartID(),obj_pref+"BT22",OBJPROP_COLOR,clrBlack);

   ObjectSetInteger(ChartID(),obj_pref+"BT22",OBJPROP_BGCOLOR,CL_Symb);

   ObjectSetInteger(ChartID(),obj_pref+"BT22",OBJPROP_BORDER_COLOR,clrDarkGray);//--- CAB0=>28< F25B 3@0=8FK

   ObjectSetInteger(ChartID(),obj_pref+"BT22",OBJPROP_BACK,False);      //--- >B>1@078< =0 ?5@54=5< (false) 8;8 704=5< (true) ?;0=5

   ObjectSetInteger(ChartID(),obj_pref+"BT22",OBJPROP_STATE,false);     //--- ?5@52545< :=>?:C 2 7040==>5 A>AB>O=85

   }

   

   string name=obj_pref+"BT33";

   if(ObjectFind(name)<0) ObjectCreate(name,OBJ_BUTTON,0,0,0);

   ObjectSet(name,OBJPROP_CORNER,CORNER_LEFT_UPPER);

   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,int(FS*H_Step*4)); 

   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,15); 

   ObjectSetInteger(0,name,OBJPROP_XSIZE,int(FS*H_Step*2.7)); 

   ObjectSetInteger(0,name,OBJPROP_YSIZE,int(FS*V_Step+1)); 

   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);

   ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);

   ObjectSetInteger(0,name,OBJPROP_ALIGN,ALIGN_LEFT);

   ObjectSetString(0,name,OBJPROP_FONT,"Arial");

   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,FS+2);

   ObjectSetInteger(0,name,OBJPROP_COLOR,CL_Symb);

   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,clrBlack);//--- CAB0=>28< F25B 3@0=8FK

   ObjectSetInteger(0,name,OBJPROP_BACK,true);      //--- >B>1@078< =0 ?5@54=5< (false) 8;8 704=5< (true) ?;0=5

   ObjectSetInteger(0,name,OBJPROP_STATE,false);     //--- ?5@52545< :=>?:C 2 7040==>5 A>AB>O=85

   if(ArraySortWay==GAP)

   ObjectSetString(0,name,OBJPROP_TEXT,"<sorted by gap>");//--- CAB0=>28< B5:AB

   if(ArraySortWay==DIF)

   ObjectSetString(0,name,OBJPROP_TEXT,"<sorted by difference>");//--- CAB0=>28< B5:AB   

   if(ArraySortWay==HIGH)

   ObjectSetString(0,name,OBJPROP_TEXT,"<sorted by correlation>");//--- CAB0=>28< B5:AB 

   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,clrBlack);

   

   name=obj_pref+"BT44";

   int x=int((1)*FS*H_Step)+5;

   if(ObjectFind(name)<0) ObjectCreate(name,OBJ_BUTTON,0,0,0);

   ObjectSet(name,OBJPROP_CORNER,CORNER_LEFT_UPPER);

   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,int(FS*H_Step*6.7)); 

   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,15); 

   ObjectSetInteger(0,name,OBJPROP_XSIZE,int(FS*H_Step*2.2)); 

   ObjectSetInteger(0,name,OBJPROP_YSIZE,int(FS*V_Step+1)); 

   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);

   ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);

   ObjectSetInteger(0,name,OBJPROP_ALIGN,ALIGN_LEFT);

   ObjectSetString(0,name,OBJPROP_FONT,"Arial");

   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,FS+2);

   ObjectSetInteger(0,name,OBJPROP_COLOR,CL_Symb);

   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,clrBlack);//--- CAB0=>28< F25B 3@0=8FK

   ObjectSetInteger(0,name,OBJPROP_BACK,true);      //--- >B>1@078< =0 ?5@54=5< (false) 8;8 704=5< (true) ?;0=5

   ObjectSetInteger(0,name,OBJPROP_STATE,false);     //--- ?5@52545< :=>?:C 2 7040==>5 A>AB>O=85

   if(List==NOTH)

   ObjectSetString(0,name,OBJPROP_TEXT,"< nothing >");//--- CAB0=>28< B5:AB

   if(List==STOP)

   ObjectSetString(0,name,OBJPROP_TEXT,"< stop-list >");//--- CAB0=>28< B5:AB   

   if(List==CURR)

   ObjectSetString(0,name,OBJPROP_TEXT,"<currencies>");//--- CAB0=>28< B5:AB

   if(List==SYMB_O)

   ObjectSetString(0,name,OBJPROP_TEXT,"<opened symbols>");//--- CAB0=>28< B5:AB

   if(List==SYMB_T)

   ObjectSetString(0,name,OBJPROP_TEXT,"<symbol-list>");//--- CAB0=>28< B5:AB

   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,clrBlack);



   if(ShowMayOpen && !Silent) Text2(0,0,"..... initialization .....",clrOrange,2);

//

  if(MayStart)

  {

  TimeToTrade();

  for(int ii=0;ii<Test_GS;ii++)

   for(int i=Symb_Total-1;i>=0;i--)

    for(int k=Symb_Total-1;k>=0;k--)

    {

     //if(SymbListARR[i]=="XAUUSD" || SymbListARR[k]=="XAUUSD") Print(i,"-",k," ",SymbListARR[i]," ",SymbListARR[k]);

     if(Print_Test) Print(i,"-",k," ",SymbListARR[i]," ",SymbListARR[k]," ",Correlation(SymbListARR[i],SymbListARR[k],TF1,cPeriod1)," ",Volatility_Factor);

     if(CanTrade(SymbListARR[i],SymbListARR[k]))

      LotSize(SymbListARR[i],SymbListARR[k],ii);

    }

  

  

  Print("Found ",Symb_Total," symbols to trade.");

  Print("Stop list has ",No_Trades_Size+FullLockSize," position(s).");

  if(Print_Test)

   for(int ii=0;ii<No_Trades_Size;ii++)

    Print(ii+1,"-",No_Trades[ii]);

  }

  

  ReculcLists();

  

  if(!MayStart) Text2(0,0,"!!!Initialization failed!!!",clrRed,2);

  

  if(IsTesting()) 

  {

   Print("!!!! Multicurrency EAs can't be tested in MT4 tester !!!!");

   //ExpertRemove();

  }

}



void OnDeinit(const int reason)

{

 ObjectsDeleteAll(0,obj_pref);

 ChartSetInteger(0,CHART_MODE,CHART_BARS);

 ChartSetInteger(0,CHART_SHOW_ASK_LINE,true);

 ChartSetInteger(0,CHART_SHOW_BID_LINE,true);

 ChartSetInteger(0,CHART_SHOW_PERIOD_SEP,true);

 ChartSetInteger(0,CHART_SHOW_DATE_SCALE,true);

 ChartSetInteger(0,CHART_SHOW_PRICE_SCALE,true);

 ChartSetInteger(0,CHART_SHOW_OBJECT_DESCR,true);

}



void OnChartEvent(const int id,         // 845=B8D8:0B>@ A>1KB8O  

                  const long& lparam,   // ?0@0<5B@ A>1KB8O B8?0 long

                  const double& dparam, // ?0@0<5B@ A>1KB8O B8?0 double

                  const string& sparam) // ?0@0<5B@ A>1KB8O B8?0 string

{

    if(id==CHARTEVENT_OBJECT_ENDEDIT)

     {

      ObjectsDeleteAll(0,obj_pref+"_T1");

      GlobalVariableSet(obj_pref+"_Depth_"+IntegerToString(Magic),StrToDouble(ObjectGetString(ChartID(),obj_pref+"_Depth",OBJPROP_TEXT)));

      Statistick();

     }



    if(id==CHARTEVENT_CHART_CHANGE) 

     {

      X_CURR=ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);

      Y_CURR=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);

      Y_MIN=int(MathMax(((STAT_SHIFT+14)*FS*V_Step),MathMax((cntrAO+4)*V_Step*FS,(cntrMO+2)*V_Step*FS))+(ShowStatistic?(FS+FS_Stat/3)*V_Step*7:0));

      if(X_SHIFT!=0 || Y_SHIFT!=0) 

       {

        for(int i=0;i<ObjectsTotal();i++)

        {

         if(ObjectName(0,i)==obj_pref+"Scroll_Left" || ObjectName(0,i)==obj_pref+"Scroll_Right" || 

           ObjectName(0,i)==obj_pref+"Scroll_Up"   || ObjectName(0,i)==obj_pref+"Scroll_Dn" 

           || StringFind(ObjectName(0,i),obj_pref)<0) continue;

         if(ObjectGetInteger(0,ObjectName(0,i),OBJPROP_CORNER)==CORNER_LEFT_UPPER)

          {

           ObjectSetInteger(0,ObjectName(0,i),OBJPROP_XDISTANCE,ObjectGetInteger(0,ObjectName(0,i),OBJPROP_XDISTANCE)-X_SHIFT);

           ObjectSetInteger(0,ObjectName(0,i),OBJPROP_YDISTANCE,ObjectGetInteger(0,ObjectName(0,i),OBJPROP_YDISTANCE)-Y_SHIFT);

          } 

        }

        X_SHIFT=Y_SHIFT=0;

       }

      CreateScrollButtons();

     }

     

    if(ObjectGetInteger(0,obj_pref+"Scroll_Left",OBJPROP_STATE))

     {

      ObjectSetInteger(0,obj_pref+"Scroll_Left",OBJPROP_STATE,false);

      X_SHIFT+=int(FS*H_Step);

      if(X_SHIFT>0) {X_SHIFT=0;return;}

      for(int i=0;i<ObjectsTotal();i++)

       {

        if(ObjectName(0,i)==obj_pref+"Scroll_Left" || ObjectName(0,i)==obj_pref+"Scroll_Right" || 

           ObjectName(0,i)==obj_pref+"Scroll_Up"   || ObjectName(0,i)==obj_pref+"Scroll_Dn" 

           || StringFind(ObjectName(0,i),obj_pref)<0) continue;

        if(ObjectGetInteger(0,ObjectName(0,i),OBJPROP_CORNER)==CORNER_LEFT_UPPER)

         ObjectSetInteger(0,ObjectName(0,i),OBJPROP_XDISTANCE,ObjectGetInteger(0,ObjectName(0,i),OBJPROP_XDISTANCE)+int(FS*H_Step));

       }

     }

    if(ObjectGetInteger(0,obj_pref+"Scroll_Right",OBJPROP_STATE))

     {

      ObjectSetInteger(0,obj_pref+"Scroll_Right",OBJPROP_STATE,false);

      if(X_SHIFT<X_CURR-X_MIN) return;

      X_SHIFT-=int(FS*H_Step);

      for(int i=0;i<ObjectsTotal();i++)

       {

        if(ObjectName(0,i)==obj_pref+"Scroll_Left" || ObjectName(0,i)==obj_pref+"Scroll_Right" || 

           ObjectName(0,i)==obj_pref+"Scroll_Up"   || ObjectName(0,i)==obj_pref+"Scroll_Dn" 

           || StringFind(ObjectName(0,i),obj_pref)<0) continue;

        if(ObjectGetInteger(0,ObjectName(0,i),OBJPROP_CORNER)==CORNER_LEFT_UPPER)

         ObjectSetInteger(0,ObjectName(0,i),OBJPROP_XDISTANCE,ObjectGetInteger(0,ObjectName(0,i),OBJPROP_XDISTANCE)-int(FS*H_Step));

       }

      

     }

    if(ObjectGetInteger(0,obj_pref+"Scroll_Up",OBJPROP_STATE))

     {

      ObjectSetInteger(0,obj_pref+"Scroll_Up",OBJPROP_STATE,false);

      Y_SHIFT+=int(FS*V_Step);

      if(Y_SHIFT>0) {Y_SHIFT=0;return;}

      for(int i=0;i<ObjectsTotal();i++)

       {

        if(ObjectName(0,i)==obj_pref+"Scroll_Left" || ObjectName(0,i)==obj_pref+"Scroll_Right" || 

           ObjectName(0,i)==obj_pref+"Scroll_Up"   || ObjectName(0,i)==obj_pref+"Scroll_Dn" 

           || StringFind(ObjectName(0,i),obj_pref)<0) continue;

        if(ObjectGetInteger(0,ObjectName(0,i),OBJPROP_CORNER)==CORNER_LEFT_UPPER)

         ObjectSetInteger(0,ObjectName(0,i),OBJPROP_YDISTANCE,ObjectGetInteger(0,ObjectName(0,i),OBJPROP_YDISTANCE)+int(FS*V_Step));

       }

     }

    if(ObjectGetInteger(0,obj_pref+"Scroll_Dn",OBJPROP_STATE))

     {

      ObjectSetInteger(0,obj_pref+"Scroll_Dn",OBJPROP_STATE,false);

      if(Y_SHIFT<Y_CURR-Y_MIN-int(FS*V_Step)*2-(ShowStatistic?((FS+FS_Stat/3)*V_Step*7):0)) return;

      Y_SHIFT-=int(FS*V_Step);

      for(int i=0;i<ObjectsTotal();i++)

       {

        if(ObjectName(0,i)==obj_pref+"Scroll_Left" || ObjectName(0,i)==obj_pref+"Scroll_Right" || 

           ObjectName(0,i)==obj_pref+"Scroll_Up"   || ObjectName(0,i)==obj_pref+"Scroll_Dn" 

           || StringFind(ObjectName(0,i),obj_pref)<0) continue;

        if(ObjectGetInteger(0,ObjectName(0,i),OBJPROP_CORNER)==CORNER_LEFT_UPPER)

         ObjectSetInteger(0,ObjectName(0,i),OBJPROP_YDISTANCE,ObjectGetInteger(0,ObjectName(0,i),OBJPROP_YDISTANCE)-int(FS*V_Step));

       }

     }



    //manual grid close

    for(int i=0;i<cntrAO;i++)

     if(ObjectGetInteger(0,obj_pref+"_B_"+IntegerToString(i+1),OBJPROP_STATE)==true)

     {

      ObjectSetInteger(0,obj_pref+"_B_"+IntegerToString(i+1),OBJPROP_STATE,false);

      int ret=MessageBox("Close "+(AlreadyOpened[i].Pos_Neg==Positive?"positive":"negative")+"-correlation grid "+AlreadyOpened[i].Symb1+"-"+AlreadyOpened[i].Symb2+" ?",

      "Are you sure?", MB_OKCANCEL); 

      if (ret==IDOK) 

       {

        Print("Closing "+(AlreadyOpened[i].Pos_Neg==Positive?"positive":"negative")+" grid "+AlreadyOpened[i].Symb1+"-"+AlreadyOpened[i].Symb2," under manual command.");

        Close_Hedge(i);

        Print("Pair ",AlreadyOpened[i].Symb1+"-"+AlreadyOpened[i].Symb2," added to No-Trades list as it was closed manualy.");

        No_Trades[No_Trades_Size]=AlreadyOpened[i].Symb1+"-"+AlreadyOpened[i].Symb2;

        No_Trades_Size++;

        return;

       }

     }

 

    //Silent

    if(!ObjectGetInteger(0,obj_pref+"BT00",OBJPROP_STATE))

    {

     if(Silent==true) LastTime=0;

     Silent=false;

     ObjectSetString(ChartID(),obj_pref+"BT00",OBJPROP_TEXT,"Silent OFF");//--- CAB0=>28< B5:AB

     ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_BGCOLOR,CL_Symb);

    }

    else

    {

     if(Silent==false) ObjectsDeleteAll(0,obj_pref+"_");

     Silent=true;

     ObjectSetString(ChartID(),obj_pref+"BT00",OBJPROP_TEXT,"Silent ON");//--- CAB0=>28< B5:AB

     ObjectSetInteger(ChartID(),obj_pref+"BT00",OBJPROP_BGCOLOR,clrGreen);

     

    }

   

 

    //refresh

    if(ObjectGetInteger(0,obj_pref+"BT11",OBJPROP_STATE)==true)

     {

      ObjectSetInteger(0,obj_pref+"BT11",OBJPROP_STATE,false);

      ObjectsDeleteAll(0,obj_pref+"_");

      MayStart=true;

      LastTime=0;

     }

    

    //close all

    if(ObjectGetInteger(0,obj_pref+"BT22",OBJPROP_STATE)==true)

     {

      ObjectSetInteger(0,obj_pref+"BT22",OBJPROP_STATE,false);

      int ret=MessageBox("Close ALL trades and stop EA?",

      "Are you sure?", MB_OKCANCEL); 

      if (ret==IDOK) 

       {

        Print("Closing ALL trades under user command.");

        Close_ALL();

        MayStart=false;

        ObjectsDeleteAll(0,obj_pref+"_");

        Text2(0,0,"!!! EA Stopped !!!",clrRed,2);

        Print("EA Stopped");

        Sleep(500);

       } 

     }

     

     //sorting

     if(ObjectGetInteger(0,obj_pref+"BT33",OBJPROP_STATE))

      {

       //ObjectsDeleteAll(0,obj_pref+"_T2_");

       ArraySortWay=ARR_SORT((ArraySortWay==GAP)?HIGH:ArraySortWay+1);

       if(ArraySortWay==GAP)

        ObjectSetString(0,obj_pref+"BT33",OBJPROP_TEXT,"<sorted by gap>");

       if(ArraySortWay==DIF)

        ObjectSetString(0,obj_pref+"BT33",OBJPROP_TEXT,"<sorted by difference>");   

       if(ArraySortWay==HIGH)

        ObjectSetString(0,obj_pref+"BT33",OBJPROP_TEXT,"<sorted by correlation>");



       ObjectSetInteger(0,obj_pref+"BT33",OBJPROP_STATE,false);

       LastTime=0;

      }

      

     //List

     if(ObjectGetInteger(0,obj_pref+"BT44",OBJPROP_STATE))

      {

       if(!Silent) {List=LIST((List==SYMB_T)?NOTH:List+1); RedrawList();}

       ObjectSetInteger(0,obj_pref+"BT44",OBJPROP_STATE,false);

      }



    //manual order start

     for(int i=1;i<cntrMO+1;i++)

     if(ObjectGetInteger(0,obj_pref+"_B2_"+IntegerToString(i)+"_0",OBJPROP_STATE))

     {

      ObjectSetInteger(0,obj_pref+"_B2_"+IntegerToString(i)+"_0",OBJPROP_STATE,false);

      int ret=MessageBox("Open new grid "+MayOpen[i-1].Symb1+"-"+MayOpen[i-1].Symb2+" ?"+

      "\n\nCorelation type: "+(MayOpen[i-1].Pos_Neg==Positive?"Positive ":"Negative ")+

      "\nGap: "+DoubleToString(MayOpen[i-1].Gap,0)+" points"

      "\nCorrelation value: "+DoubleToString(MayOpen[i-1].CorrHigh,3)+

      "\nCorrelation difference: "+DoubleToString(MayOpen[i-1].Diff,3),

      "Are you sure?", MB_OKCANCEL);

      if (ret==IDOK) 

       {

        Print("Open "+(MayOpen[i-1].Pos_Neg==Positive?"Positive ":"Negative ")+MayOpen[i-1].Symb1+"-"+MayOpen[i-1].Symb2+" under manual command ..... ",

        EnumToString(Open_Grid(MayOpen[i-1].Pos_Neg,MayOpen[i-1].Symb1,MayOpen[i-1].Symb2,MayOpen[i-1].Buy_Sell1,MayOpen[i-1].Buy_Sell2,0)));

        Sleep(100);

        return;

       }

      }

}





void OnTimer()

{



 if(!MayStart) {return;}

 

 ulong c_start=GetMicrosecondCount();

 Orders_ALL=0;

 MaxGrid=0;

 ProfALL=0;

 MinOpT=999999999999;



 ZeroMemory(AlreadyOpened);

 

 cntrAO=0;

 for(int i=0;i<OrdersTotal();i++)

 {

  if( OrderSelect(i,SELECT_BY_POS)

   && OrderMagicNumber()==Magic)

    {

     int pos=StringFind(OrderComment(),Positive);

     if(pos>-1) curr_order.Pos_Neg=Positive; 

     else

     {

     pos=StringFind(OrderComment(),Negative); 

     if(pos>-1) curr_order.Pos_Neg=Negative;

      else continue;

     }

      curr_order.Symb1=OrderSymbol();

      curr_order.Symb2=StringSubstr(OrderComment(),pos+2);

      curr_order.profit=OrderCommission()+OrderSwap()+OrderProfit();

      curr_order.Buy_Sell1=OrderType();

      curr_order.Buy_Sell2=(curr_order.Pos_Neg==Negative)?OrderType():

                           (OrderType()==OP_BUY?OP_SELL:OP_BUY);

      curr_order.Lot1=OrderLots();

      curr_order.Op_Time=OrderOpenTime();

   

     //find grid like this

     int findme=-1;

     for(int ii=0;ii<=cntrAO;ii++)

      if(curr_order.Pos_Neg==AlreadyOpened[ii].Pos_Neg &&

       ((curr_order.Symb1==AlreadyOpened[ii].Symb1 && curr_order.Symb2==AlreadyOpened[ii].Symb2) ||

        (curr_order.Symb2==AlreadyOpened[ii].Symb1 && curr_order.Symb1==AlreadyOpened[ii].Symb2)))

     findme=ii;



     if(findme==-1 || cntrAO==0) {CopyStruct2(cntrAO);cntrAO++;} else CopyStruct2(findme,true);

  }

 }



   //find summary data and prof.in points for each grid  

   for(int i=0;i<cntrAO;i++)

    {

     //if(AlreadyOpened[i].Orders!=AlreadyOpened[i].Orders2) {OrderSynchronize(i);return;}

     Orders_ALL+=AlreadyOpened[i].Orders1+AlreadyOpened[i].Orders2;

     MaxGrid=MathMax(MaxGrid,AlreadyOpened[i].Orders1);

     MinOpT =MathMin(MinOpT ,AlreadyOpened[i].Op_Time);

     ProfALL+=AlreadyOpened[i].profit;

     if(PointCulc==0)

     AlreadyOpened[i].profitP=AlreadyOpened[i].profit*(MarketInfo(AlreadyOpened[i].Symb1,MODE_TICKVALUE)                      +MarketInfo(AlreadyOpened[i].Symb2,MODE_TICKVALUE))

                               /(AlreadyOpened[i].Lot1*MarketInfo(AlreadyOpened[i].Symb1,MODE_TICKVALUE)+AlreadyOpened[i].Lot2*MarketInfo(AlreadyOpened[i].Symb2,MODE_TICKVALUE));

     if(PointCulc==1)

     AlreadyOpened[i].profitP=AlreadyOpened[i].profit

                               /(AlreadyOpened[i].Lot1*MarketInfo(AlreadyOpened[i].Symb1,MODE_TICKVALUE)+AlreadyOpened[i].Lot2*MarketInfo(AlreadyOpened[i].Symb2,MODE_TICKVALUE));

     if(PointCulc==2)

     AlreadyOpened[i].profitP=AlreadyOpened[i].profit/(AlreadyOpened[i].Lot1+AlreadyOpened[i].Lot2);

    }

    

   //Trade Actions  

   for(int i=0;i<cntrAO;i++)

    {

    //Close one grid

    double Bal=AccountBalance();

    if((AlreadyOpened[i].Orders1<BE_NMBR && AlreadyOpened[i].profitP>=Prof_Points) || (AlreadyOpened[i].Orders1>=BE_NMBR && BE_NMBR>0 && AlreadyOpened[i].profitP>=BE_Points) || 

       (AlreadyOpened[i].Orders1!=0 && BE_NMBR<=0 && AlreadyOpened[i].profitP>=BE_Points+Prof_Points/AlreadyOpened[i].Orders1*2) || 

        AlreadyOpened[i].profitP<=-Lose_Points || (Bal!=0 && AlreadyOpened[i].profit/Bal*100<-Lose_Perc1) || AlreadyOpened[i].profit<-Lose_Money1)

     {

      Print("Close grid ",AlreadyOpened[i].Symb1,"-", AlreadyOpened[i].Symb2," as reached ",DoubleToStr(AlreadyOpened[i].profitP,1)," points; ",DoubleToStr(AlreadyOpened[i].profit,2),"$; ",DoubleToStr(AlreadyOpened[i].profit/Bal*100,2),"%");

      if((AlreadyOpened[i].profitP<=-Lose_Points || AlreadyOpened[i].profit/Bal*100<-Lose_Perc1 || AlreadyOpened[i].profit<-Lose_Money1) &&

         CanTrade(AlreadyOpened[i].Symb1+"-"+AlreadyOpened[i].Symb2,AlreadyOpened[i].Symb2+"-"+AlreadyOpened[i].Symb1)) 

      {

       Print("SL reached - adding symbols ",AlreadyOpened[i].Symb1,"-", AlreadyOpened[i].Symb2," to No-Trade list ");

       No_Trades[No_Trades_Size]=AlreadyOpened[i].Symb1+"-"+AlreadyOpened[i].Symb2;

       No_Trades_Size++;

      }



      ulong time=GetMicrosecondCount();

      Close_Hedge(i);

      //Close_GRID(AlreadyOpened[i].Pos_Neg, AlreadyOpened[i].Symb1, AlreadyOpened[i].Symb2);

      //Sleep(100); //to let MT4 refresh the list of opened trades

      Print("Grid closed with profit ",DoubleToStr(AccountBalance()-Bal,2),"$. Closing time ",IntegerToString((GetMicrosecondCount()-time)/1000-000),"ms");

      return;

     }



    //Open one more pair of orders

    if(AlreadyOpened[i].profitP<=-Trigger_Points*AlreadyOpened[i].Orders1-(AlreadyOpened[i].Orders1-1)*Trigger_Step && AlreadyOpened[i].Orders1<MAX_ORD_in_grid)

     {

      if(TimeToTrade() && CanTrade(AlreadyOpened[i].Symb1,AlreadyOpened[i].Symb2,true))

      Print("Add pair of orders #",AlreadyOpened[i].Orders1+1," to grid ",AlreadyOpened[i].Symb1+"-"+AlreadyOpened[i].Symb2," as current loss is ",

            DoubleToStr(AlreadyOpened[i].profitP,1)," points >= ",Trigger_Points*AlreadyOpened[i].Orders1+(AlreadyOpened[i].Orders1-1)*Trigger_Step," ..... "

           +EnumToString(Open_Grid(AlreadyOpened[i].Pos_Neg, AlreadyOpened[i].Symb1, AlreadyOpened[i].Symb2, AlreadyOpened[i].Buy_Sell1, AlreadyOpened[i].Buy_Sell2, AlreadyOpened[i].Orders1)));

      return;

     }

    }



   if(ProfALL/AccountBalance()*100<-Lose_Perc)

    {

     Print("Global SL reached. Loss = ",DoubleToStr(-ProfALL,2),"$. Ballance = ",AccountBalance(),"$.");

     Close_ALL();

     MayStart=false;

     Text2(0,0,"!!! Global SL reached !!!",clrRed,2);

    }

    

   if(ProfALL/AccountBalance()*100>Prof_Perc)

    {

     Print("Global TP reached. Profit = ",DoubleToStr(ProfALL,2),"$. Ballance = ",AccountBalance(),"$.");

     Close_ALL();

    }

    

   if(ShowAlready && !Silent)

    {

     for(int i=0;i<=cntrAO;i++)

      {

      string   TimrS_L;

      if(Show_Time)

      {

       datetime Timr=(TimeCurrent()-AlreadyOpened[i].Op_Time);

       TimrS_L="  "+IntegerToString(Timr/86400)+"."+(TimeToString(Timr,TIME_MINUTES));

      }

      else TimrS_L="-"+DoubleToString(AlreadyOpened[i].Lot1,2)+"/"+DoubleToString(AlreadyOpened[i].Lot2,2);

      Text2(i+1,17,IntegerToString(i+1)+") "+((AlreadyOpened[i].Buy_Sell1==OP_BUY)?"b.":"s.")+

                                             (ShowSuffix?AlreadyOpened[i].Symb1:StringSubstr(AlreadyOpened[i].Symb1,0,6))+"-"+

                                            ((AlreadyOpened[i].Buy_Sell2==OP_BUY)?"b.":"s.")+

                                             (ShowSuffix?AlreadyOpened[i].Symb2:StringSubstr(AlreadyOpened[i].Symb2,0,6))+

                                           " o:"+IntegerToString(AlreadyOpened[i].Orders1)+

                                           TimrS_L+

                                           "    "+(AlreadyOpened[i].profit >=0?"+":"")+DoubleToString(AlreadyOpened[i].profit,2)+

                                           "$ / "+(AlreadyOpened[i].profitP>=0?"+":"")+DoubleToString(AlreadyOpened[i].profitP,1)+"p"

                                           ,(AlreadyOpened[i].Orders1==MAX_In_One_Grid)?clrOrange:(AlreadyOpened[i].Orders1>MAX_In_One_Grid)?clrRed:(AlreadyOpened[i].Pos_Neg==Positive)?CL_Pos:CL_Neg);

      Butt(i+1);

      }

   Text2(cntrAO+1,17,"Max. grid size: "+IntegerToString(MaxGrid),(MaxGrid==MAX_In_One_Grid)?clrOrange:(MaxGrid>MAX_In_One_Grid)?clrRed:CL_Symb);

   Text2(cntrAO+2,17,"Max. time: "+(MinOpT>TimeCurrent()?"0":(IntegerToString((TimeCurrent()-MinOpT)/86400)+"."+(TimeToString(TimeCurrent()-MinOpT,TIME_MINUTES)))),(MaxGrid==MAX_In_One_Grid)?clrOrange:(MaxGrid>MAX_In_One_Grid)?clrRed:CL_Symb);

   int clean=cntrAO+3;

   while(ObjectFind(0,obj_pref+"_T2_"+IntegerToString(clean)+"_17")>-1)

    {

     ObjectDelete(0,obj_pref+"_T2_"+IntegerToString(clean)+"_17");

     clean++;

    }

   

   clean=cntrAO+1;

   while(ObjectFind(0,obj_pref+"_B_"+IntegerToString(clean))>-1)

    {

     ObjectDelete(0,obj_pref+"_B_"+IntegerToString(clean));

     clean++;

    }

    

   Text2(0,18,"Already opened "+IntegerToString(cntrAO)+" grids"+((OneceCurr || OneceSymb)?" (":"")+

                    (OneceCurr?IntegerToString(OpenedCurrSyze)+"curr.":"")+

                    ((OneceSymb && !OneceCurr)?IntegerToString(OpenedSymbSyze)+"symb.":"")+

                    ((OneceCurr || OneceSymb)?"):":":"),CL_Symb,2);

   

   Y_MIN=int(MathMax(((STAT_SHIFT+14)*FS*V_Step),(MathMax(cntrAO,cntrMO)+1)*V_Step));

  }

  

  if(!Silent) Daily_Info();





//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Onece per new bar actions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   if(LastTime==iTime(NULL,TF2,0)+CheckPoint_Shift) return;

 //  Print("Recalculating correlation table. Reason: ",LastTime!=0?"new bar.":"operations with grids or refresh.");

   LastTime = iTime(NULL,TF2,0)+CheckPoint_Shift;

   

   if(Silent && (!TimeToTrade() || cntrAO>=MAX_Grids_nmbr || Orders_ALL/2>=MAX_ORD_TOTAL || MaxGrid>=MAX_In_One_Grid)) return;

   else

   if(ShowMayOpen && !Silent) Text2(0,0,"..... recalculating table .....",clrOrange,2);

   

   ulong c_start0=GetMicrosecondCount();

   

   ReculcLists();



   cntrMO=0;

   for(int r=0;r<Symb_Total;r++) 

    for(int c=r;c<Symb_Total;c++)

     {

      if(!CanTrade(SymbListARR[r]+"-"+SymbListARR[c],SymbListARR[c]+"-"+SymbListARR[r]) 

   //   || !CanTrade(SymbListARR[r],SymbListARR[c])

         ) continue;

      double Corr1=Correlation(SymbListARR[r],SymbListARR[c],TF1,cPeriod1,0,cntrMO);

      if(Corr1>=0 && !Allow_Pos) continue;

      if(Corr1<=0 && !Allow_Neg) continue;

      if(Corr1>=1 || fabs(Corr1)<Enought) continue;

      

      double Corr2=Correlation(SymbListARR[r],SymbListARR[c],TF2,cPeriod2,0,cntrMO);

      MayOpen[cntrMO].Diff=(Corr1>0)?Corr1-Corr2:Corr2-Corr1;

      if(Corr2>=1 || MayOpen[cntrMO].Diff<Min) continue;

      MayOpen[cntrMO].Pos_Neg=(Corr1>0)?Positive:Negative;

      MayOpen[cntrMO].Symb1=SymbListARR[r];

      MayOpen[cntrMO].Symb2=SymbListARR[c];



     //Check if this grid exist

     int findme=-1;

     for(int ii=0;ii<=cntrAO;ii++)

      if(MayOpen[cntrMO].Pos_Neg==AlreadyOpened[ii].Pos_Neg &&

       ((MayOpen[cntrMO].Symb1==AlreadyOpened[ii].Symb1 && MayOpen[cntrMO].Symb2==AlreadyOpened[ii].Symb2) ||

        (MayOpen[cntrMO].Symb2==AlreadyOpened[ii].Symb1 && MayOpen[cntrMO].Symb1==AlreadyOpened[ii].Symb2)))

     {findme=ii;}

     if(findme>=0) continue;



      MayOpen[cntrMO].CorrHigh=Corr1;

      MayOpen[cntrMO].CorrLow =Corr2;

      Find_Diverg(); //Also fills gap, trade directions

      //Print(MayOpen[cntrMO].Symb1=SymbListARR[r],"-",MayOpen[cntrMO].Symb2=SymbListARR[c]," gap ",MayOpen[cntrMO].Gap);

      if(MayOpen[cntrMO].Gap<MinGap ||

         MayOpen[cntrMO].Buy_Sell1==-1 || MayOpen[cntrMO].Buy_Sell2==-1 ||

        (MayOpen[cntrMO].Pos_Neg==Positive && MayOpen[cntrMO].Buy_Sell1==MayOpen[cntrMO].Buy_Sell2)   ||

        (MayOpen[cntrMO].Pos_Neg==Negative && MayOpen[cntrMO].Buy_Sell1!=MayOpen[cntrMO].Buy_Sell2)

        )

       continue;

      cntrMO++;

     }



    ArraySortMY(MayOpen,ArraySortWay);

    

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ opening NEW grid ~~~~~~~~~~~~~~~~~~~~~~~

  if((TimeToTrade() && !Manual_Start) && 

    !(cntrAO>=MAX_Grids_nmbr || Orders_ALL/2>=MAX_ORD_TOTAL || MaxGrid>=MAX_In_One_Grid))

  for(int i=0;i<cntrMO;i++)

    {

      REASONS res=Open_Grid(MayOpen[i].Pos_Neg,MayOpen[i].Symb1,MayOpen[i].Symb2,MayOpen[i].Buy_Sell1,MayOpen[i].Buy_Sell2,0);

      if(res==Done) {cntrAO++; Orders_ALL+=2;LastTime=0;return;}

    }



  if(ShowMayOpen && !Silent)

  {

   for(int i=0;i<cntrMO;i++)

    Butt2(i+1,0,IntegerToString(i+1)+") "+((MayOpen[i].Buy_Sell1==OP_BUY)?"b.":"s.")+MayOpen[i].Symb1+"-"+

                                          ((MayOpen[i].Buy_Sell2==OP_BUY)?"b.":"s.")+MayOpen[i].Symb2+

                                           ": g."+DoubleToString(MayOpen[i].Gap,0)+

                                           "; "+DoubleToString(MayOpen[i].CorrHigh,2)+" / "

                                               +DoubleToString(MayOpen[i].CorrLow,2)+

                                           " / d."+DoubleToString(MayOpen[i].Diff,2)

                                           ,(MayOpen[i].Pos_Neg==Positive)?CL_Pos:CL_Neg);

   int clean=cntrMO+1;

   while(ObjectFind(0,obj_pref+"_B2_"+IntegerToString(clean)+"_0")>-1)

    {

     ObjectDelete(0,obj_pref+"_B2_"+IntegerToString(clean)+"_0");

     clean++;

    }

   ulong c_finish=GetMicrosecondCount();

   Text2(0,0,"Can be opened "+IntegerToString(cntrMO)+" grids ("+DoubleToString((c_finish-c_start0)/1000000.0,2)+"sec):",CL_Symb,2);

  }

  else

  Print("Can be opened "+IntegerToString(cntrMO)+" grids. Culculation time - "+DoubleToString((GetMicrosecondCount()-c_start0)/1000000.0,2)+"sec.");

  

  if(!Silent) {ObjectsDeleteAll(0,obj_pref+"_T1_");ObjectDelete(0,obj_pref+"_BG");ObjectDelete(0,obj_pref+"_Depth");Statistick();}

  RedrawList();

}

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ end of main unit ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^



double Correlation(string symbol1, string symbol2, int TF, int period, int shift=0,int MO_COUNT=-1)

{

   

   if( iBars(symbol1,TF)<period+shift+1 

    || iBars(symbol2,TF)<period+shift+1 

    || SymbolInfoDouble(symbol2,SYMBOL_TRADE_TICK_VALUE)==0

    || SymbolInfoDouble(symbol1,SYMBOL_TRADE_TICK_VALUE)==0

    || SymbolInfoDouble(symbol1,SYMBOL_POINT)==0

    || SymbolInfoDouble(symbol2,SYMBOL_POINT)==0)

    {

     if(CanTrade(symbol1+"-"+symbol2,symbol2+"-"+symbol1))

      {

       if(Print_Test) Print("Add ",symbol1+"-"+symbol2," to stop-list as no data");

       No_Trades[No_Trades_Size]=symbol1+"-"+symbol2;

       No_Trades_Size++;

      }

     Volatility_Factor=Correction==CO_NO?1:

                       Correction==CO_TVD?SymbolInfoDouble(symbol2,SYMBOL_TRADE_TICK_VALUE)/SymbolInfoDouble(symbol1,SYMBOL_TRADE_TICK_VALUE):

                       999999999999;

     return(2);

    } 



   int i;

   double M1=iMA(symbol1,TF,period,0,MODE_SMA,PRICE_CLOSE,shift);

   double M2=iMA(symbol2,TF,period,0,MODE_SMA,PRICE_CLOSE,shift);

   double D1, D2;

   double S1=0;

   double S2=0;

   double S3=0;



   for(i=shift;i<period+shift;i++)

    {

      D1=iClose(symbol1, TF,                                       i  )-M1;

      D2=iClose(symbol2, TF, iBarShift(symbol2,TF,iTime(symbol1,TF,i)))-M2;

      S1+=D1*D2;

      S2+=D1*D1;

      S3+=D2*D2;

    }

   

   if(MO_COUNT>-1)

   {

    Volatility_Factor=MathSqrt(S3/S2)

                    *SymbolInfoDouble(symbol2,SYMBOL_TRADE_TICK_VALUE)/SymbolInfoDouble(symbol1,SYMBOL_TRADE_TICK_VALUE)

                    *SymbolInfoDouble(symbol1,SYMBOL_POINT)           /SymbolInfoDouble(symbol2,SYMBOL_POINT);

    if(TF==TF1 && period==cPeriod1)

    {

     MayOpen[MO_COUNT].M1_H=M1;

     MayOpen[MO_COUNT].M2_H=M2;

     MayOpen[MO_COUNT].VolFactH=Volatility_Factor;

    }

    if(TF==TF2 && period==cPeriod2)

    {

     MayOpen[MO_COUNT].M1_L=M1;

     MayOpen[MO_COUNT].M2_L=M2;

     MayOpen[MO_COUNT].VolFactL=Volatility_Factor;

    }

   }

   else

   Volatility_Factor=Correction==CO_NO?1:

                    (Correction==CO_VOL_H || Correction==CO_VOL_L)?

                     MathSqrt(S3/S2)

                    *SymbolInfoDouble(symbol2,SYMBOL_TRADE_TICK_VALUE)/SymbolInfoDouble(symbol1,SYMBOL_TRADE_TICK_VALUE)

                    *SymbolInfoDouble(symbol1,SYMBOL_POINT)           /SymbolInfoDouble(symbol2,SYMBOL_POINT):

                     SymbolInfoDouble(symbol2,SYMBOL_TRADE_TICK_VALUE)/SymbolInfoDouble(symbol1,SYMBOL_TRADE_TICK_VALUE);

   

   return(S1/(MathSqrt(S2*S3)));

}



double LotSize(string Symb1, string Symb2, int OrdersNBR,int MO_POS=-1)

{

 double LotR=0;

 double Free=AccountFreeMargin()/3;

 double One_Lot =MarketInfo(Symb1,MODE_MARGINREQUIRED);

 double LotVal1 =MarketInfo(Symb1,MODE_TICKVALUE);  //AB>8<>ABL 1 ?C=:B0 4;O 1 ;>B0 

 double LotVal2 =MarketInfo(Symb2,MODE_TICKVALUE);  //AB>8<>ABL 1 ?C=:B0 4;O 1 ;>B0 

 double Min_Lot =MarketInfo(Symb1,MODE_MINLOT);

 double Max_Lot =MathMin(MaxLot_Inp,MarketInfo(Symb1,MODE_MAXLOT));

 

 if(LotVal1==0) {Print("Server returned zero MODE_TICKVALUE for ",Symb1,". Add it to full-stop list."); FullLock[FullLockSize]=Symb1;FullLockSize++; return(0);}

 if(LotVal2==0) {Print("Server returned zero MODE_TICKVALUE for ",Symb2,". Add it to full-stop list."); FullLock[FullLockSize]=Symb1;FullLockSize++; return(0);} 

 

 Volatility_Factor=Correction==CO_NO?1:

                   Correction==CO_TVD?SymbolInfoDouble(Symb2,SYMBOL_TRADE_TICK_VALUE)/SymbolInfoDouble(Symb1,SYMBOL_TRADE_TICK_VALUE):

                   999999999999;



 if(Correction==CO_VOL_H && Correlation(Symb1,Symb2,TF1,cPeriod1)==2) {return(0);}

 if(Correction==CO_VOL_L && Correlation(Symb1,Symb2,TF2,cPeriod2)==2) {return(0);}



 double Corrector=Volatility_Factor>1?Volatility_Factor:1.0;

 if(Volatility_Factor>Test_VF || 1/Volatility_Factor>Test_VF) 

  {

   if(Print_Test) Print("Big volatility factor for ",Symb1," and ",Symb2,": ",DoubleToStr(Volatility_Factor,2),"(",DoubleToStr(1/Volatility_Factor,2),"). Add them to No-Trade list.");

   if(CanTrade(Symb1+"-"+Symb2,Symb2+"-"+Symb1)) {No_Trades[No_Trades_Size]=Symb1+"-"+Symb2;No_Trades_Size++;}

   if(Volatility_Factor>Test_VF) Corrector=Test_VF;

  }



 if(Lots>0)          

  {

   if(Martin_way==NONE) LotR=Lots*Corrector;

   if(Martin_way==MULT) LotR=Lots*Corrector*pow(Martin,MathMax(OrdersNBR-Martin_Start+2,0));

   if(Martin_way==SUMM) LotR=(Lots+Martin*MathMax(OrdersNBR-Martin_Start+2,0))*Corrector;

  }



 if(LotR>=MaxLot_Inp && CanTrade(Symb1)) 

  {

   if(Print_Test) Print("Add ",Symb1," to stop-list as it reached max lot on trade ",OrdersNBR); 

   {No_Trades[No_Trades_Size]=Symb1;No_Trades_Size++;}

  }



 if(LotR<Min_Lot) LotR=Min_Lot;

 if(LotR>Max_Lot) LotR=Max_Lot;

 if(LotR*One_Lot>Free) return(0);

 if(Min_Lot>=0.1) return(NormalizeDouble(LotR,1));

 else             return(NormalizeDouble(LotR,2));

}





void Find_Diverg()                                                                                 /////////////////

{



 MayOpen[cntrMO].Buy_Sell1=MayOpen[cntrMO].Buy_Sell2=-1;



 if(Version==V4_1 || Version==V4_2)

  { 

   double M1,M2;

   int TF;

    if(Version==V4_2)

    {

     M1=MayOpen[cntrMO].M1_H;

     M2=MayOpen[cntrMO].M2_H;

     TF=TF1;

    }

    else

    {

     M1=MayOpen[cntrMO].M1_L;

     M2=MayOpen[cntrMO].M2_L;

     TF=TF2;

    }



     double corr=MayOpen[cntrMO].CorrLow;

     double VF=MayOpen[cntrMO].VolFactL/(MarketInfo(MayOpen[cntrMO].Symb2,MODE_TICKVALUE)/MarketInfo(MayOpen[cntrMO].Symb1,MODE_TICKVALUE)

                                        *MarketInfo(MayOpen[cntrMO].Symb1,MODE_POINT)    /MarketInfo(MayOpen[cntrMO].Symb2,MODE_POINT));

     int factor=corr<0?-1:1;

     double delta1=(iClose(MayOpen[cntrMO].Symb1,TF,0)-(M1-factor*(M2-iClose(MayOpen[cntrMO].Symb2,TF,0))/VF))/MarketInfo(MayOpen[cntrMO].Symb2,MODE_TICKVALUE)/MarketInfo(MayOpen[cntrMO].Symb1,MODE_POINT);

     double delta2=(iClose(MayOpen[cntrMO].Symb2,TF,0)-(M2-factor*(M1-iClose(MayOpen[cntrMO].Symb1,TF,0))*VF))/MarketInfo(MayOpen[cntrMO].Symb1,MODE_TICKVALUE)/MarketInfo(MayOpen[cntrMO].Symb2,MODE_POINT);

     double sumSpread=MarketInfo(MayOpen[cntrMO].Symb1,MODE_SPREAD)/MarketInfo(MayOpen[cntrMO].Symb1,MODE_TICKVALUE)+MarketInfo(MayOpen[cntrMO].Symb2,MODE_SPREAD)/MarketInfo(MayOpen[cntrMO].Symb2,MODE_TICKVALUE);

  

     MayOpen[cntrMO].Gap=fabs(delta1+delta2)-Prof_Points-sumSpread;



 if(MayOpen[cntrMO].Pos_Neg==Negative)

  {

   int Rev=Reverse_Neg?-1:1;

   if(MayOpen[cntrMO].Gap>=MinGap)

   {

   if(delta1*Rev>0 && delta2*Rev>0) MayOpen[cntrMO].Buy_Sell1=MayOpen[cntrMO].Buy_Sell2=OP_SELL;

   if(delta1*Rev<0 && delta2*Rev<0) MayOpen[cntrMO].Buy_Sell1=MayOpen[cntrMO].Buy_Sell2=OP_BUY;

   }

  }



 if(MayOpen[cntrMO].Pos_Neg==Positive)

  {

   int Rev=Reverse_Pos?-1:1;

   if(delta1*Rev>0 && delta2*Rev<0) {MayOpen[cntrMO].Buy_Sell1=OP_SELL;MayOpen[cntrMO].Buy_Sell2=OP_BUY;}

   if(delta1*Rev<0 && delta2*Rev>0) {MayOpen[cntrMO].Buy_Sell1=OP_BUY; MayOpen[cntrMO].Buy_Sell2=OP_SELL;}

  }

  return;

 }

 

 if(Version==V2)

 {

 double TV1=MarketInfo(MayOpen[cntrMO].Symb1,MODE_TICKVALUE);

 double TV2=MarketInfo(MayOpen[cntrMO].Symb2,MODE_TICKVALUE);

 if(TV1==0 || TV2==0) {Print("No info from broker for " + MayOpen[cntrMO].Symb1 + "-" + MayOpen[cntrMO].Symb2);return;}

 double Corrector1=(TV1>TV2)?1:TV2/TV1;

 double Corrector2=(TV1<TV2)?1:TV1/TV2;



 double BestC=0,CURR_CORR;

 int    barPos=0;

 if(MayOpen[cntrMO].Pos_Neg==Positive)

 for(int i=1;i<MathMin(cPeriod2,MathMin(Bars(MayOpen[cntrMO].Symb1,TF2),Bars(MayOpen[cntrMO].Symb2,TF2))-1) ;i++)

  {

   CURR_CORR=Correlation(MayOpen[cntrMO].Symb1,MayOpen[cntrMO].Symb2,TF2,cPeriod2,i);

   if(BestC<CURR_CORR) {BestC=CURR_CORR;barPos=i;}

  }

 else

 for(int i=0;i<MathMin(cPeriod2,MathMin(Bars(MayOpen[cntrMO].Symb1,TF2),Bars(MayOpen[cntrMO].Symb2,TF2))-1) ;i++)

  {

   CURR_CORR=Correlation(MayOpen[cntrMO].Symb1,MayOpen[cntrMO].Symb2,TF2,cPeriod2,i);

   if(BestC>CURR_CORR) {BestC=CURR_CORR;barPos=i;}

  }

  

  double delta1=(iClose(MayOpen[cntrMO].Symb1,TF2,0)-iClose(MayOpen[cntrMO].Symb1,TF2,barPos))/SymbolInfoDouble(MayOpen[cntrMO].Symb1,SYMBOL_POINT)/Corrector1;

  double delta2=(iClose(MayOpen[cntrMO].Symb2,TF2,0)-iClose(MayOpen[cntrMO].Symb2,TF2,barPos))/SymbolInfoDouble(MayOpen[cntrMO].Symb2,SYMBOL_POINT)/Corrector2;

  double sumSpread=SymbolInfoInteger(MayOpen[cntrMO].Symb1,SYMBOL_SPREAD)/Corrector1+SymbolInfoInteger(MayOpen[cntrMO].Symb2,SYMBOL_SPREAD)/Corrector2;



  MayOpen[cntrMO].Gap=fabs(delta1+delta2)-Prof_Points-sumSpread;

  

  if(MayOpen[cntrMO].Pos_Neg==Negative)

   {

    int Rev=Reverse_Neg?-1:1;

    if((delta1+delta2)*Rev>0) MayOpen[cntrMO].Buy_Sell1=MayOpen[cntrMO].Buy_Sell2=OP_SELL;

    else                      MayOpen[cntrMO].Buy_Sell1=MayOpen[cntrMO].Buy_Sell2=OP_BUY;

   }



  if(MayOpen[cntrMO].Pos_Neg==Positive)

   {

    int Rev=Reverse_Pos?-1:1;

    if(delta1*Rev>delta2*Rev) {MayOpen[cntrMO].Buy_Sell1=OP_SELL;MayOpen[cntrMO].Buy_Sell2=OP_BUY;}

    else                      {MayOpen[cntrMO].Buy_Sell1=OP_BUY; MayOpen[cntrMO].Buy_Sell2=OP_SELL;}

   }

  }



}



void ArraySortMY(DESCRIPTOR1 &ARR[],int index)

{

 //0 - Higer TF corr, 1 - diff (higherTF-lowerTF), 2 - gap points

 if(index==0)

 for(int i=0;i<cntrMO-1;i++)

  for(int j=0;j<cntrMO-1;j++)

    if(fabs(MayOpen[j+1].CorrHigh)>fabs(MayOpen[j].CorrHigh))

     {

      CopyStruct1(cntrMO+1,j+1);

      CopyStruct1(j+1     ,j);

      CopyStruct1(j       ,cntrMO+1);

     }

     

 if(index==1)

 for(int i=0;i<cntrMO-1;i++)

  for(int j=0;j<cntrMO-1;j++)

    if(MayOpen[j+1].Diff>MayOpen[j].Diff)

     {

      CopyStruct1(cntrMO+1,j+1);

      CopyStruct1(j+1     ,j);

      CopyStruct1(j       ,cntrMO+1);

     }

 

 if(index==2)

 for(int i=0;i<cntrMO-1;i++)

  for(int j=0;j<cntrMO-1;j++)

    if(MayOpen[j+1].Gap>MayOpen[j].Gap)

     {

      CopyStruct1(cntrMO+1,j+1);

      CopyStruct1(j+1     ,j);

      CopyStruct1(j       ,cntrMO+1);

     }

}



void CopyStruct1(int destination, int original)

{

MayOpen[destination]. Pos_Neg    =MayOpen[original]. Pos_Neg;

MayOpen[destination]. Symb1      =MayOpen[original]. Symb1;

MayOpen[destination]. Symb2      =MayOpen[original]. Symb2;

MayOpen[destination]. CorrHigh   =MayOpen[original]. CorrHigh;

MayOpen[destination]. CorrLow    =MayOpen[original]. CorrLow;

MayOpen[destination]. Diff       =MayOpen[original]. Diff;

MayOpen[destination]. Gap        =MayOpen[original]. Gap;

MayOpen[destination]. VolFactH   =MayOpen[original]. VolFactH;

MayOpen[destination]. VolFactL   =MayOpen[original]. VolFactL;

MayOpen[destination]. M1_H       =MayOpen[original]. M1_H;

MayOpen[destination]. M2_H       =MayOpen[original]. M2_H;

MayOpen[destination]. M1_L       =MayOpen[original]. M1_L;

MayOpen[destination]. M2_L       =MayOpen[original]. M2_L;

MayOpen[destination]. Buy_Sell1  =MayOpen[original]. Buy_Sell1;

MayOpen[destination]. Buy_Sell2  =MayOpen[original]. Buy_Sell2;

}



void CopyStruct2(int destination, bool ADD=false)

{

if(!ADD)

{

AlreadyOpened[destination]. Pos_Neg    =curr_order. Pos_Neg;

AlreadyOpened[destination]. Symb1      =curr_order. Symb1;

AlreadyOpened[destination]. Symb2      =curr_order. Symb2;

AlreadyOpened[destination]. Buy_Sell1  =curr_order. Buy_Sell1;

AlreadyOpened[destination]. Buy_Sell2  =curr_order. Buy_Sell2;

AlreadyOpened[destination]. profit     =curr_order. profit;

AlreadyOpened[destination]. Orders1    =1;

AlreadyOpened[destination]. Orders2    =0;

AlreadyOpened[destination]. Lot1       =curr_order. Lot1;

AlreadyOpened[destination]. Lot2       =0;

AlreadyOpened[destination]. Op_Time    =curr_order. Op_Time;

}

else

{

AlreadyOpened[destination]. profit+=curr_order. profit;

AlreadyOpened[destination]. Op_Time=MathMin(curr_order.Op_Time,AlreadyOpened[destination].Op_Time);

if(curr_order. Symb1==AlreadyOpened[destination].Symb1)

    {

     AlreadyOpened[destination].Orders1++;

     AlreadyOpened[destination].Lot1+=curr_order.Lot1;

    }

else 

    {

     AlreadyOpened[destination].Orders2++;

     AlreadyOpened[destination].Lot2+=curr_order.Lot1;

    }

}

}



//////////////////////////////////

////////////////////

//////

REASONS Open_Grid(string Pos_Neg, string Symb1, string Symb2,int Buy_Sell1,int Buy_Sell2,int ordersMBR)

{

 if(!IsTradeAllowed() || (ordersMBR==0 && ((!Allow_Neg && Pos_Neg==Negative) || (!Allow_Pos && Pos_Neg==Positive)))) return(Not_Alowed_Correlation_Type);

 if(!TimeToTrade()) return(Not_Time_To_Trade);

// if(!CanTrade(Symb1,Symb2)) return(Symbol_From_Stop_List);

 

 double Lot_size=LotSize(Symb1,Symb2,ordersMBR);

 if(Lot_size==0) return(No_Money);

 if(Buy_Sell1==OP_BUY)

     int res=OrderSend(Symb1,OP_BUY ,Lot_size,MarketInfo(Symb1,MODE_ASK),99999,0,0,OComm+Pos_Neg+Symb2,Magic);

 else   

     int res=OrderSend(Symb1,OP_SELL,Lot_size,MarketInfo(Symb1,MODE_BID),99999,0,0,OComm+Pos_Neg+Symb2,Magic);

 

 Lot_size=LotSize(Symb2,Symb1,ordersMBR);

 if(Lot_size==0) return(No_Money);

 if(Buy_Sell2==OP_BUY)

     int res=OrderSend(Symb2,OP_BUY ,Lot_size,MarketInfo(Symb2,MODE_ASK),99999,0,0,OComm+Pos_Neg+Symb1,Magic);

 else   

     int res=OrderSend(Symb2,OP_SELL,Lot_size,MarketInfo(Symb2,MODE_BID),99999,0,0,OComm+Pos_Neg+Symb1,Magic);



 LastTime=0;

 return(Done);

}





bool TimeToTrade()

{

double h=TimeHour(TimeCurrent())+TimeMinute(TimeCurrent())*1.0/60;

int    d=TimeDayOfWeek(TimeCurrent());



 if ((d==Stop_D  && h>=Stop_H) 

  || (d==Start_D && h< Start_H) 

  || (d> Stop_D  || d< Start_D))

 {

   if(!Silent)

   Text2(12+STAT_SHIFT,10,"Stop mode: "

       +" "+EnumToString(Stop_D) +"."+TimeToStr(int(Stop_H *3600),TIME_MINUTES)

       +">"+EnumToString((ENUM_DAY_OF_WEEK)d)+"."+TimeToStr(TimeCurrent(),TIME_MINUTES)

       +"<"+EnumToString(Start_D)+"."+TimeToStr(int(Start_H*3600),TIME_MINUTES),clrRed);

   return(false);

 }

else 

 if(!Silent) Text2(12+STAT_SHIFT,10,"Trading time: "+EnumToString((ENUM_DAY_OF_WEEK)d)+"."+TimeToStr(TimeCurrent(),TIME_MINUTES)

     +" ("+IntegerToString(Stop_H-h>0?Stop_D-d:Stop_D-d-1)+"."+TimeToStr(int(((Stop_H-h>0?(Stop_H-h):(24+Stop_H-h))*3600)),TIME_MINUTES)+")",clrLime);



double T1=SwapTime-MinutesBeforSwap*1.0/60; T1=T1<0 ?24+T1:T1;

double T2=SwapTime+MinutesAfterSwap*1.0/60; T2=T2>24?T2-24:T2;



if(T2>T1) IsSwapTime=(h>=T1 && h<T2);

else      IsSwapTime=(h>=T1 || h<T2);



if(IsSwapTime) Text2(13+STAT_SHIFT,10,"Swap Time",clrRed);

else           Text2(13+STAT_SHIFT,10,"");



return(!IsSwapTime);

}





void Close_ALL()

{

 if(!IsTradeAllowed()) return;

 for(int i=OrdersTotal()-1;i>=0;i--)

  if(     OrderSelect(i,SELECT_BY_POS,MODE_TRADES)

     &&   OrderMagicNumber()==Magic)

     {

      if (OrderType()==OP_BUY )  int res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),999999);

      if (OrderType()==OP_SELL)  int res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),999999);

     }

}



void Close_GRID_Direct(string Pos_Neg, string Symb1, string Symb2)

{

 if(!IsTradeAllowed()) return;

 for(int i=OrdersTotal()-1;i>=0;i--)

  if(     OrderSelect(i,SELECT_BY_POS,MODE_TRADES)

     &&   OrderMagicNumber()==Magic     

     && ((OrderSymbol()==Symb1 && StringFind(OrderComment(),Pos_Neg+Symb2)>-1) || 

         (OrderSymbol()==Symb2 && StringFind(OrderComment(),Pos_Neg+Symb1)>-1)   )

    )

     {

      if (OrderType()==OP_BUY )  int res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),999999);

      if (OrderType()==OP_SELL)  int res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),999999); 

     }

  LastTime=0;

}



void Text2(int row,int column, string text="",color CLR=0,int FS_shift=0)

{

   if(CLR==0) CLR=CL;

 //  if(!CanTrade(text,StopList)) CLR=clrRed;



   string name=obj_pref+"_T2_"+IntegerToString(row)+"_"+IntegerToString(column);

   if(ObjectFind(name)<0) 

   {

   ObjectCreate(name,OBJ_LABEL,0,0,0);

   ObjectSet(name,OBJPROP_CORNER,CORNER_LEFT_UPPER);

   ObjectSetInteger(0,name,OBJPROP_BACK,false);

   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);

   ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);

   ObjectSet(name,OBJPROP_XDISTANCE,int((column)*FS*H_Step+5+X_SHIFT));

   ObjectSet(name,OBJPROP_YDISTANCE,int((row)*FS*V_Step)+15+Y_SHIFT);

   }



   ObjectSetText(name,text,FS+FS_shift,"Arial",CLR);

}



void Butt2(int row,int column, string text="",color CLR=0,int FS_shift=0)

{

   string name=obj_pref+"_B2_"+IntegerToString(row)+"_"+IntegerToString(column);

//   if(CLR==0) CLR=CL;

//   if(!CanTrade(text,StopList)) CLR=clrRed;



   if(ObjectFind(name)<0) 

   {

   int y=int((row)*(FS*V_Step))+15;



   ObjectCreate(name,OBJ_BUTTON,0,0,0);

   ObjectSet(name,OBJPROP_CORNER,CORNER_LEFT_UPPER);

   ObjectSetInteger(0,name,OBJPROP_XSIZE,int(FS*H_Step*8)); 

   ObjectSetInteger(0,name,OBJPROP_YSIZE,int(FS*V_Step+1)); 

   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);

   ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);

   ObjectSetInteger(0,name,OBJPROP_ALIGN,ALIGN_LEFT);

   ObjectSetString(0,name,OBJPROP_FONT,"Arial");

   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,clrBlack);

   ObjectSetInteger(0,name,OBJPROP_BACK,true); 

   ObjectSetInteger(0,name,OBJPROP_STATE,false);

   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,clrBlack);

   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,int(FS*H_Step*column+X_SHIFT)); 

   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y+Y_SHIFT); }



   ObjectSetString(0,name,OBJPROP_TEXT,text);

   ObjectSetInteger(0,name,OBJPROP_COLOR,CLR); 

   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,FS+FS_shift);

}



void Butt(int row)

{ 



   string name=obj_pref+"_B_"+IntegerToString(row);

   if(ObjectFind(name)<0) 

   {

   int y=int((row)*FS*V_Step)+15;

   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);

   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);



   ObjectSetInteger(0,name,OBJPROP_XSIZE,int(FS*H_Step)); 

   ObjectSetInteger(0,name,OBJPROP_YSIZE,int(FS*V_Step)); 

   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);

   ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);

   

   ObjectSetString(0,name,OBJPROP_FONT,"Arial");

   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,FS);

   ObjectSetInteger(0,name,OBJPROP_COLOR,clrBlack);

   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,clrDarkGray);//--- CAB0=>28< F25B 3@0=8FK

   ObjectSetInteger(0,name,OBJPROP_BACK,False);      //--- >B>1@078< =0 ?5@54=5< (false) 8;8 704=5< (true) ?;0=5

   ObjectSetInteger(0,name,OBJPROP_STATE,false);     //--- ?5@52545< :=>?:C 2 7040==>5 A>AB>O=85

   ObjectSetString(0,name,OBJPROP_TEXT,"close");//--- CAB0=>28< B5:AB   

   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,CL);

   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,int(FS*H_Step*22.5+X_SHIFT)); 

   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y+Y_SHIFT);  }



}



void Daily_Info()

{

 if(MayStart)

 {

  int Orders_H=0;

  double lot=0;

  double comis=0;

  double Prof_H=0;

  for(int i=0;i<OrdersHistoryTotal();i++)

  if(   OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)

     && OrderMagicNumber()==Magic

     && TimeDayOfYear(OrderCloseTime())==TimeDayOfYear(TimeCurrent())

     && TimeYear     (OrderCloseTime())==TimeYear     (TimeCurrent())

     )

  {

   Orders_H++;

   lot+=OrderLots();

   comis+=OrderCommission();

   Prof_H+=OrderProfit()+OrderCommission()+OrderSwap();

  }

  Text2(STAT_SHIFT  ,10,"Orders: opened "+IntegerToString(Orders_ALL)+" / closed "+IntegerToString(Orders_H),CL_Symb,FS_Stat);

  Text2(STAT_SHIFT+2,10,"Current profit "+DoubleToStr(ProfALL,2)+"$",CL_Symb,FS_Stat);

  Text2(STAT_SHIFT+4,10,"Daily profit is "+DoubleToStr(Prof_H,2)+"$",CL_Symb,FS_Stat);

  Text2(STAT_SHIFT+6,10,"Daily commission is "+DoubleToStr(-comis,2)+"$",CL_Symb,FS_Stat);

  Text2(STAT_SHIFT+8,10,"Daily lot is "+DoubleToStr(lot,2),CL_Symb,FS_Stat);

  Text2(STAT_SHIFT+10,10,"Comment"+(OComm!=""?": "+OComm:" is empty")+" / Magic: "+IntegerToString(Magic),CL_Symb,FS_Stat/2);

 }

 if(TimeCurrent()%60==0) TimeToTrade();

}





void Statistick()

{

 if(ShowStatistic && MayStart)

 {

   //int Depth=(ObjectFind(ChartID(),obj_pref+"_Depth")==-1)?7:(int)StringToInteger(ObjectGetString(ChartID(),obj_pref+"_Depth",OBJPROP_TEXT));

   int Depth=int(GlobalVariableGet(obj_pref+"_Depth_"+IntegerToString(Magic)));

   if(ObjectFind(obj_pref+"_Depth")<0) 

   {

   ObjectCreate(ChartID(),obj_pref+"_Depth",OBJ_EDIT,0,0,0);

   int y=int((8)*FS*V_Step)+7;

   int x=int((1.5)*FS*H_Step)+8;

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_XDISTANCE,x); //--- CAB0=>28< :>>@48=0BK :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_YDISTANCE,y);

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_XSIZE,(FS+FS_Stat)*3);     //--- CAB0=>28< @07<5@ :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_YSIZE,int((FS+FS_Stat/3)*V_Step));

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_COLOR,CL_Symb); 

   ObjectSetString(ChartID(),obj_pref+"_Depth",OBJPROP_FONT,"Arial"); 

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_FONTSIZE,(FS+FS_Stat/3)); 

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_READONLY,false); 

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_ALIGN,ALIGN_LEFT); 

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_BGCOLOR,clrBlack);

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_BORDER_TYPE,BORDER_FLAT);

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_CORNER,CORNER_LEFT_LOWER); 

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_BACK,false); 

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_SELECTABLE,false); 

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_SELECTED,false); 

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_HIDDEN,true);

   ObjectSetInteger(ChartID(),obj_pref+"_Depth",OBJPROP_ZORDER,1);

   }

   ObjectSetString(ChartID(),obj_pref+"_Depth",OBJPROP_TEXT,IntegerToString(Depth));

   

   if(ObjectFind(obj_pref+"_BG")<0) 

   {

   ObjectCreate(ChartID(),obj_pref+"_BG",OBJ_RECTANGLE_LABEL,0,0,0);

   ObjectSetInteger(ChartID(),obj_pref+"_BG",OBJPROP_XDISTANCE,0);     //--- CAB0=>28< @07<5@ :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"_BG",OBJPROP_YDISTANCE,int((FS+FS_Stat/3)*V_Step*7));

   ObjectSetInteger(ChartID(),obj_pref+"_BG",OBJPROP_XSIZE,ChartGetInteger(0,CHART_WIDTH_IN_PIXELS));     //--- CAB0=>28< @07<5@ :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"_BG",OBJPROP_YSIZE,int((FS+FS_Stat/3)*V_Step*7));

   ObjectSetInteger(ChartID(),obj_pref+"_BG",OBJPROP_COLOR,clrDarkGray);

   ObjectSetInteger(ChartID(),obj_pref+"_BG",OBJPROP_BGCOLOR,clrBlack);

   ObjectSetInteger(ChartID(),obj_pref+"_BG",OBJPROP_BORDER_TYPE,BORDER_FLAT);

   ObjectSetInteger(ChartID(),obj_pref+"_BG",OBJPROP_CORNER,CORNER_LEFT_LOWER); 

   ObjectSetInteger(ChartID(),obj_pref+"_BG",OBJPROP_BACK,true); 

   ObjectSetInteger(ChartID(),obj_pref+"_BG",OBJPROP_SELECTABLE,false); 

   ObjectSetInteger(ChartID(),obj_pref+"_BG",OBJPROP_HIDDEN,true);

   }

   ObjectSetString(ChartID(),obj_pref+"_Depth",OBJPROP_TEXT,IntegerToString(Depth));

   

  double Orders_H[];

  double lot[];

  double comis[];

  double Prof_H[];

  datetime LongestT[];

  string LongestP[][3];

  

  ArrayResize(Orders_H,Depth+2);

  ArrayResize(lot,Depth+2);

  ArrayResize(comis,Depth+2);

  ArrayResize(Prof_H,Depth+2);

  ArrayResize(LongestT,Depth+2);

  ArrayResize(LongestP,Depth+2);

  

  ArrayInitialize(Orders_H,0);

  ArrayInitialize(lot,0);

  ArrayInitialize(comis,0);

  ArrayInitialize(Prof_H,0);

  ArrayInitialize(LongestT,0);



  Text(7,0,"Days to count",CL_Symb,FS_Stat/3);

  Text(6,0,"Orders closed",CL_Symb,FS_Stat/3);

  Text(5,0,"Profit, $",CL_Symb,FS_Stat/3);

  Text(4,0,"Commission, $",CL_Symb,FS_Stat/3);

  Text(3,0,"Lot",CL_Symb,FS_Stat/3);

  Text(2,0,"Longest order duration",CL_Symb,FS_Stat/3);

  Text(1,0,"Longest order symbol 1",CL_Symb,FS_Stat/3);

  Text(0,0,"Longest order symbol 2",CL_Symb,FS_Stat/3);

  

 // Text(8,4,"Current",CL_Symb,FS_Stat/2);

  if(Depth>0) Text(7,4,"Average",CL_Symb);



  for(int day=0;day<=Depth;day++)

  for(int i=0;i<OrdersHistoryTotal();i++)

  if(   OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)

     && OrderMagicNumber()==Magic

     && TimeDayOfYear(OrderCloseTime())==TimeDayOfYear(TimeCurrent())-day

     && TimeYear(OrderCloseTime())==TimeYear(TimeCurrent()))

  {

   Orders_H[day]++;

   lot[day]+=OrderLots();

   comis[day]+=OrderCommission();

   Prof_H[day]+=OrderProfit()+OrderCommission()+OrderSwap();

   if(LongestT[day]<OrderCloseTime()-OrderOpenTime())

    {

     LongestT[day]=OrderCloseTime()-OrderOpenTime();

     LongestP[day][0]=OrderSymbol();

     LongestP[day][1]=StringSubstr(OrderComment(),StringFind(OrderComment(),"~")+2,0);

     LongestP[day][2]=(StringFind(OrderComment(),Positive)>-1)?Positive:Negative;

    }

  }

  

  int last_day=1;

  int antishift=0;

  int shift=0;

  for(int day=0;day<=Depth;day++)

  {

   if (Orders_H[day]==0 && Prof_H[day]==0 && lot[day]==0 && day!=0) {antishift++;continue;}

   shift=day==0?3:(day+1)+3-antishift;

   Text(7,shift,TimeToStr(TimeCurrent()-day*86400,TIME_DATE),CL_Symb,-1);

   Text(6,shift,IntegerToString((int)Orders_H[day]),CL_Symb,FS_Stat/3);

   Text(5,shift,DoubleToStr(Prof_H[day],2),CL_Symb,FS_Stat/3);

   Text(4,shift,DoubleToStr(-comis[day],2),CL_Symb,FS_Stat/3);

   Text(3,shift,DoubleToStr(lot[day],2),CL_Symb,FS_Stat/3);

   Text(2,shift,IntegerToString(LongestT[day]/86400)+"."+TimeToStr(LongestT[day],TIME_MINUTES),CL_Symb,FS_Stat/3);

   Text(1,shift,LongestP[day][0],(LongestP[day][2]==Positive?CL_Pos:CL_Neg),-1);

   Text(0,shift,LongestP[day][1],(LongestP[day][2]==Positive?CL_Pos:CL_Neg),-1);

   last_day=shift+1;

  }

   ObjectSetInteger(ChartID(),obj_pref+"_BG",OBJPROP_XSIZE,int((shift)*H_Step*(FS+FS_Stat/3)));     //--- CAB0=>28< @07<5@ :=>?:8

   

   if(Depth>0)

   {

   Text(6,4,IntegerToString((int)iMAOnArray(Orders_H,0,Depth,0,MODE_SMA,1)),CL_Symb,FS_Stat/3);

   Text(5,4,DoubleToStr(iMAOnArray(Prof_H,0,Depth,0,MODE_SMA,1),2),CL_Symb,FS_Stat/3);

   Text(4,4,DoubleToStr(-iMAOnArray(comis,0,Depth,0,MODE_SMA,1),2),CL_Symb,FS_Stat/3);

   Text(3,4,DoubleToStr(iMAOnArray(lot,0,Depth,0,MODE_SMA,1),2),CL_Symb,FS_Stat/3);

   datetime LongestEver=LongestT[ArrayMaximum(LongestT)];

   Text(2,4,IntegerToString(LongestEver/86400)+"."+TimeToStr(LongestEver,TIME_MINUTES),CL_Symb,FS_Stat/3);

   Text(1,4,LongestP[ArrayMaximum(LongestT)][0],(LongestP[ArrayMaximum(LongestT)][2]==Positive?CL_Pos:CL_Neg),-1);

   Text(0,4,LongestP[ArrayMaximum(LongestT)][1],(LongestP[ArrayMaximum(LongestT)][2]==Positive?CL_Pos:CL_Neg),-1);

   }

  }

}



void Text(int row,int column, string text="",color CLR=0,int FS_shift=0)

{

//   if(CLR==0) CLR=CL;

//   if(!CanTrade(text,StopList)) CLR=clrRed;

   string name=obj_pref+"_T1_"+IntegerToString(row)+"_"+IntegerToString(column);//+"_"+text;

   if(ObjectFind(name)<0) 

   {

   int y=int((row)*FS*V_Step)+5;

   int x=int((column)*FS*H_Step)+5;   

   ObjectCreate(name,OBJ_LABEL,0,0,0);

   ObjectSet(name,OBJPROP_CORNER,CORNER_LEFT_LOWER);

   ObjectSet(name,OBJPROP_XDISTANCE,x);

   ObjectSet(name,OBJPROP_YDISTANCE,y);

   ObjectSetInteger(0,name,OBJPROP_BACK,false);

   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);

   ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);

   }

   ObjectSetText(name,text,FS+FS_shift,"Arial",CLR);

}



void Close_Hedge(int index)

{

 if(!IsTradeAllowed()) return;

 if(Use_HEDGE_CLOSE && AlreadyOpened[index].Orders1>=Grid_To_Hedge)

 {

  int Ticket1=-1,

      Ticket2=-1;

  if(AlreadyOpened[index].Buy_Sell1==OP_SELL)

     Ticket1=OrderSend(AlreadyOpened[index].Symb1,OP_BUY ,NormalizeDouble(AlreadyOpened[index].Lot1,2),MarketInfo(AlreadyOpened[index].Symb1,MODE_ASK),999999,0,0,OComm+"[H]",Magic,0);

  else

     Ticket1=OrderSend(AlreadyOpened[index].Symb1,OP_SELL,NormalizeDouble(AlreadyOpened[index].Lot1,2),MarketInfo(AlreadyOpened[index].Symb1,MODE_BID),999999,0,0,OComm+"[H]",Magic,0);



  if(Ticket1==-1)

   {

    Print("~ Hedge order sending error: ",GetLastError(),". Closing grid usual way.");

    Close_GRID_Direct(AlreadyOpened[index].Pos_Neg,AlreadyOpened[index].Symb1,AlreadyOpened[index].Symb2);

    Use_HEDGE_CLOSE=false;

    return;

   }

  else

   Print("~ Hedge order ",AlreadyOpened[index].Symb1," #",Ticket1);

 

  if(AlreadyOpened[index].Buy_Sell2==OP_SELL)

     Ticket2=OrderSend(AlreadyOpened[index].Symb2,OP_BUY ,NormalizeDouble(AlreadyOpened[index].Lot2,2),MarketInfo(AlreadyOpened[index].Symb2,MODE_ASK),999999,0,0,OComm+"[H]",Magic,0);

  else

     Ticket2=OrderSend(AlreadyOpened[index].Symb2,OP_SELL,NormalizeDouble(AlreadyOpened[index].Lot2,2),MarketInfo(AlreadyOpened[index].Symb2,MODE_ASK),999999,0,0,OComm+"[H]",Magic,0);



  if(Ticket2==-1)

   {

    Print("~ Hedge order sending error: ",GetLastError(),". Closing grid usual way.");

    int res=OrderClose(Ticket1,NormalizeDouble(AlreadyOpened[index].Lot1,2),(AlreadyOpened[index].Buy_Sell1==OP_BUY)?MarketInfo(AlreadyOpened[index].Symb1,MODE_ASK):MarketInfo(AlreadyOpened[index].Symb1,MODE_BID),99999);

    Close_GRID_Direct(AlreadyOpened[index].Pos_Neg,AlreadyOpened[index].Symb1,AlreadyOpened[index].Symb2);

    Use_HEDGE_CLOSE=false;

    return;

   }

  else

   Print("~ Hedge order for ",AlreadyOpened[index].Symb2," #",Ticket2);



 //close Symb1 part of the grid

 for(int i=OrdersTotal()-1;i>=0;i--)

  if(     OrderSelect(i,SELECT_BY_POS,MODE_TRADES)

     &&   OrderSymbol()==AlreadyOpened[index].Symb1

     &&   StringFind(OrderComment(),AlreadyOpened[index].Pos_Neg+AlreadyOpened[index].Symb2)>-1

     &&   OrderMagicNumber()==Magic)

     {

        if(OrderCloseBy(OrderTicket(),Ticket1))

        {

        double newlot=0;

        for(int k=OrdersTotal()-1;k>=0;k--)

         if( OrderSelect(k,SELECT_BY_POS,MODE_TRADES)

          && OrderSymbol()==AlreadyOpened[index].Symb1

          && StringFind(OrderComment(),Positive)==-1 && StringFind(OrderComment(),Negative)==-1

          && OrderMagicNumber()==Magic

          && ((OrderType()==OP_SELL && AlreadyOpened[index].Buy_Sell1==OP_BUY) || (OrderType()==OP_BUY && AlreadyOpened[index].Buy_Sell1==OP_SELL))

          && OrderLots()>=newlot)

          {

           newlot=OrderLots();

           Ticket1=OrderTicket();

          }

        }

         else 

          {

           Alert(Symbol()," error ",GetLastError()," when close #",OrderTicket()," by #",Ticket1); 

           Print("Setting Use_Hedge_Close to false!");

           Use_HEDGE_CLOSE=false;

           if(OrderSelect(Ticket1,SELECT_BY_TICKET))

            int res=OrderClose(OrderTicket(),OrderLots(),(OrderType()==OP_BUY)?MarketInfo(OrderSymbol(),MODE_ASK):MarketInfo(OrderSymbol(),MODE_BID),99999);

           if(OrderSelect(Ticket2,SELECT_BY_TICKET))

            int res=OrderClose(OrderTicket(),OrderLots(),(OrderType()==OP_BUY)?MarketInfo(OrderSymbol(),MODE_ASK):MarketInfo(OrderSymbol(),MODE_BID),99999);

           Close_GRID_Direct(AlreadyOpened[index].Pos_Neg,AlreadyOpened[index].Symb1,AlreadyOpened[index].Symb2);

           return;

           //Hedge_Security(OT,MN);

          }

     }

     

 //close Symb2 part of the grid

 for(int i=OrdersTotal()-1;i>=0;i--)

  if(     OrderSelect(i,SELECT_BY_POS,MODE_TRADES)

     &&   OrderSymbol()==AlreadyOpened[index].Symb2

     &&   StringFind(OrderComment(),AlreadyOpened[index].Pos_Neg+AlreadyOpened[index].Symb1)>-1

     &&   OrderMagicNumber()==Magic)

     {

        if(OrderCloseBy(OrderTicket(),Ticket2))

        {

        double newlot=0;

        for(int k=OrdersTotal()-1;k>=0;k--)

         if( OrderSelect(k,SELECT_BY_POS,MODE_TRADES)

          && OrderSymbol()==AlreadyOpened[index].Symb2

          && StringFind(OrderComment(),Positive)==-1 && StringFind(OrderComment(),Negative)==-1

          && OrderMagicNumber()==Magic

          && ((OrderType()==OP_SELL && AlreadyOpened[index].Buy_Sell2==OP_BUY) || (OrderType()==OP_BUY && AlreadyOpened[index].Buy_Sell2==OP_SELL))

          && OrderLots()>=newlot)

          {

           newlot=OrderLots();

           Ticket2=OrderTicket();

          }

        }

         else 

          {

           Alert(Symbol()," error ",GetLastError()," when close #",OrderTicket()," by #",Ticket2); 

           Print("Setting Use_Hedge_Close to false!");

           Use_HEDGE_CLOSE=false;

           if(OrderSelect(Ticket2,SELECT_BY_TICKET))

            int res=OrderClose(OrderTicket(),OrderLots(),(OrderType()==OP_BUY)?MarketInfo(OrderSymbol(),MODE_ASK):MarketInfo(OrderSymbol(),MODE_BID),99999);

           Close_GRID_Direct(AlreadyOpened[index].Pos_Neg,AlreadyOpened[index].Symb1,AlreadyOpened[index].Symb2);

           return;

           //Hedge_Security(OT,MN);

          }

     }

  }//use hedge close

  else

   Close_GRID_Direct(AlreadyOpened[index].Pos_Neg,AlreadyOpened[index].Symb1,AlreadyOpened[index].Symb2);

  LastTime=0;

}



void RedrawList()

{

 ReculcLists();

       int clean=1;

       if(List==NOTH)

         ObjectSetString(0,obj_pref+"BT44",OBJPROP_TEXT,"< nothing >");

       if(List==STOP)

        {

         ObjectSetString(0,obj_pref+"BT44",OBJPROP_TEXT,"< stop-list >");//--- CAB0=>28< B5:AB   

         Text2(1,7,"Full Lock:",CL_Symb);

         for(int i=0;i<FullLockSize;i++)

          Text2(i+2,7,"- "+FullLock[i],CL);

         Text2(FullLockSize+2,7,"Total: "+IntegerToString(FullLockSize),CL_Symb);



         Text2(FullLockSize+3,7,"No-Trades:",CL_Symb);

         for(int i=0;i<No_Trades_Size;i++)

          Text2(FullLockSize+i+4,7,"- "+No_Trades[i],CL);

         Text2(No_Trades_Size+No_Trades_Size+4,7,"Total: "+IntegerToString(No_Trades_Size),CL_Symb);

      



         clean=FullLockSize+No_Trades_Size+5;

        }

       if(List==CURR)

        {

         ObjectSetString(0,obj_pref+"BT44",OBJPROP_TEXT,"<currencies>");

         for(int i=0;i<OpenedCurrSyze;i++)

          Text2(i+1,7,"- "+OpenedCurr[i],CL);

         Text2(OpenedCurrSyze+1,7,"Total: "+IntegerToString(OpenedCurrSyze),CL_Symb);

         clean=OpenedCurrSyze+2;

        }

       if(List==SYMB_O)

        {

         ObjectSetString(0,obj_pref+"BT44",OBJPROP_TEXT,"<opened symbols>");

         for(int i=0;i<OpenedSymbSyze;i++)

          Text2(i+1,7,"- "+OpenedSymb[i],CL);

         Text2(OpenedSymbSyze+1,7,"Total: "+IntegerToString(OpenedSymbSyze),CL_Symb);

         clean=OpenedSymbSyze+2;

        }

       if(List==SYMB_T)

        {

         ObjectSetString(0,obj_pref+"BT44",OBJPROP_TEXT,"<symbol-list>");

         for(int i=0;i<Symb_Total;i++)

          Text2(i+1,7,"- "+SymbListARR[i],CL);

         Text2(Symb_Total+1,7,"Total: "+IntegerToString(Symb_Total),CL_Symb);

         clean=Symb_Total+2;

        }



       while(ObjectFind(0,obj_pref+"_T2_"+IntegerToString(clean)+"_7")>-1)

       {

        ObjectDelete(0,obj_pref+"_T2_"+IntegerToString(clean)+"_7");

        clean++;

       }

}



void ReculcLists()

{

   OpenedSymbSyze=0;

   OpenedCurrSyze=0;

   for(int i=0;i<OrdersTotal();i++)

    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

     {

       if((OneceCurr || (!Silent && List==CURR))  && CanTrade(StringSubstr(OrderSymbol(),0,3),"W",false,true))

        {OpenedCurr[OpenedCurrSyze]=StringSubstr(OrderSymbol(),0,3); OpenedCurrSyze++;}

       if((OneceCurr || (!Silent && List==CURR))  && CanTrade(StringSubstr(OrderSymbol(),3,3),"W",false,true))

        {OpenedCurr[OpenedCurrSyze]=StringSubstr(OrderSymbol(),3,3); OpenedCurrSyze++;}

       if((OneceSymb || (!Silent && List==SYMB_O))&& CanTrade(OrderSymbol(),"W",false,true))

        {OpenedSymb[OpenedSymbSyze]=OrderSymbol();OpenedSymbSyze++;}

     }

}



bool CanTrade(string Curr_Symb1,string Curr_Symb2="W",bool full=false, bool for_list=false)

{

 for(int i=0;i<FullLockSize;i++)

  if(StringFind(Curr_Symb1,FullLock[i])>-1 || StringFind(Curr_Symb2,FullLock[i])>-1) return(false);

 if(full) return(true);



 if(OneceCurr || (for_list && List==CURR))

 for(int i=0;i<OpenedCurrSyze;i++)

  if(StringFind(Curr_Symb1,OpenedCurr[i])>-1 || StringFind(Curr_Symb2,OpenedCurr[i])>-1) return(false);



 if((OneceSymb) || (for_list && List==SYMB_O))

 for(int i=0;i<OpenedSymbSyze;i++)

  if(StringFind(Curr_Symb1,OpenedSymb[i])>-1 || StringFind(Curr_Symb2,OpenedSymb[i])>-1) return(false);



 for(int i=0;i<No_Trades_Size;i++)

  if(StringFind(Curr_Symb1,No_Trades [i])>-1 || StringFind(Curr_Symb2,No_Trades [i])>-1) return(false);



 return(true);

}



void CreateScrollButtons()

{

  //Print(X_CURR,">=",X_MIN, " ",Y_CURR,">=",Y_MIN);

  if(X_CURR>=X_MIN && Y_CURR>=Y_MIN)

   {

    ObjectDelete(0,obj_pref+"Scroll_Left");

    ObjectDelete(0,obj_pref+"Scroll_Right");

    ObjectDelete(0,obj_pref+"Scroll_Up");

    ObjectDelete(0,obj_pref+"Scroll_Dn");

    ObjectDelete(0,obj_pref+"XSize");

    ObjectDelete(0,obj_pref+"YSize");

    X_SHIFT=Y_SHIFT=0;

    return;

   }



  if(ObjectFind(0,obj_pref+"Scroll_Left")==-1)

   {

   ObjectCreate(ChartID(),obj_pref+"Scroll_Left",OBJ_BUTTON,0,0,0);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Left",OBJPROP_CORNER,CORNER_RIGHT_LOWER);   //--- CAB0=>28< C3>; 3@0D8:0, >B=>A8B5;L=> :>B>@>3> 1C4CB >?@545;OBLAO :>>@48=0BK B>G:8 

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Left",OBJPROP_XDISTANCE,80); //--- CAB0=>28< :>>@48=0BK :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Left",OBJPROP_YDISTANCE,55);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Left",OBJPROP_XSIZE,20);     //--- CAB0=>28< @07<5@ :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Left",OBJPROP_YSIZE,20);

   ObjectSetString(ChartID(),obj_pref+"Scroll_Left",OBJPROP_TEXT,CharToString(239));//--- CAB0=>28< B5:AB

   ObjectSetString(ChartID(),obj_pref+"Scroll_Left",OBJPROP_FONT,"Wingdings");

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Left",OBJPROP_FONTSIZE,15);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Left",OBJPROP_COLOR,clrBlack);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Left",OBJPROP_BGCOLOR,CL_Symb);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Left",OBJPROP_BORDER_COLOR,clrDarkGray);//--- CAB0=>28< F25B 3@0=8FK

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Left",OBJPROP_BACK,False);      //--- >B>1@078< =0 ?5@54=5< (false) 8;8 704=5< (true) ?;0=5

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Left",OBJPROP_STATE,false);     //--- ?5@52545< :=>?:C 2 7040==>5 A>AB>O=85

  }

  

  if(ObjectFind(0,obj_pref+"Scroll_Right")==-1)

   {

   ObjectCreate(ChartID(),obj_pref+"Scroll_Right",OBJ_BUTTON,0,0,0);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Right",OBJPROP_CORNER,CORNER_RIGHT_LOWER);   //--- CAB0=>28< C3>; 3@0D8:0, >B=>A8B5;L=> :>B>@>3> 1C4CB >?@545;OBLAO :>>@48=0BK B>G:8 

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Right",OBJPROP_XDISTANCE,30); //--- CAB0=>28< :>>@48=0BK :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Right",OBJPROP_YDISTANCE,55);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Right",OBJPROP_XSIZE,20);     //--- CAB0=>28< @07<5@ :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Right",OBJPROP_YSIZE,20);

   ObjectSetString(ChartID(),obj_pref+"Scroll_Right",OBJPROP_TEXT,CharToString(240));//--- CAB0=>28< B5:AB

   ObjectSetString(ChartID(),obj_pref+"Scroll_Right",OBJPROP_FONT,"Wingdings");

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Right",OBJPROP_FONTSIZE,15);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Right",OBJPROP_COLOR,clrBlack);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Right",OBJPROP_BGCOLOR,CL_Symb);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Right",OBJPROP_BORDER_COLOR,clrDarkGray);//--- CAB0=>28< F25B 3@0=8FK

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Right",OBJPROP_BACK,False);      //--- >B>1@078< =0 ?5@54=5< (false) 8;8 704=5< (true) ?;0=5

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Right",OBJPROP_STATE,false);     //--- ?5@52545< :=>?:C 2 7040==>5 A>AB>O=85

  }

  

  if(ObjectFind(0,obj_pref+"Scroll_Up")==-1)

   {

   ObjectCreate(ChartID(),obj_pref+"Scroll_Up",OBJ_BUTTON,0,0,0);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Up",OBJPROP_CORNER,CORNER_RIGHT_LOWER);   //--- CAB0=>28< C3>; 3@0D8:0, >B=>A8B5;L=> :>B>@>3> 1C4CB >?@545;OBLAO :>>@48=0BK B>G:8 

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Up",OBJPROP_XDISTANCE,55); //--- CAB0=>28< :>>@48=0BK :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Up",OBJPROP_YDISTANCE,80);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Up",OBJPROP_XSIZE,20);     //--- CAB0=>28< @07<5@ :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Up",OBJPROP_YSIZE,20);

   ObjectSetString(ChartID(),obj_pref+"Scroll_Up",OBJPROP_TEXT,CharToString(241));//--- CAB0=>28< B5:AB

   ObjectSetString(ChartID(),obj_pref+"Scroll_Up",OBJPROP_FONT,"Wingdings");

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Up",OBJPROP_FONTSIZE,16);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Up",OBJPROP_COLOR,clrBlack);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Up",OBJPROP_BGCOLOR,CL_Symb);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Up",OBJPROP_BORDER_COLOR,clrDarkGray);//--- CAB0=>28< F25B 3@0=8FK

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Up",OBJPROP_BACK,False);      //--- >B>1@078< =0 ?5@54=5< (false) 8;8 704=5< (true) ?;0=5

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Up",OBJPROP_STATE,false);     //--- ?5@52545< :=>?:C 2 7040==>5 A>AB>O=85

  }

  

  if(ObjectFind(0,obj_pref+"Scroll_Dn")==-1)

   {

   ObjectCreate(ChartID(),obj_pref+"Scroll_Dn",OBJ_BUTTON,0,0,0);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_CORNER,CORNER_RIGHT_LOWER);   //--- CAB0=>28< C3>; 3@0D8:0, >B=>A8B5;L=> :>B>@>3> 1C4CB >?@545;OBLAO :>>@48=0BK B>G:8 

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_XDISTANCE,55); //--- CAB0=>28< :>>@48=0BK :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_YDISTANCE,30);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_XSIZE,20);     //--- CAB0=>28< @07<5@ :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_YSIZE,20);

   ObjectSetString(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_TEXT,CharToString(242));//--- CAB0=>28< B5:AB

   ObjectSetString(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_FONT,"Wingdings");

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_FONTSIZE,16);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_COLOR,clrBlack);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_BGCOLOR,CL_Symb);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_BORDER_COLOR,clrDarkGray);//--- CAB0=>28< F25B 3@0=8FK

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_BACK,False);      //--- >B>1@078< =0 ?5@54=5< (false) 8;8 704=5< (true) ?;0=5

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_STATE,false);     //--- ?5@52545< :=>?:C 2 7040==>5 A>AB>O=85

  }

  

  if(ObjectFind(0,obj_pref+"Scroll_Dn")==-1)

   {

   ObjectCreate(ChartID(),obj_pref+"Scroll_Dn",OBJ_BUTTON,0,0,0);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_CORNER,CORNER_RIGHT_LOWER);   //--- CAB0=>28< C3>; 3@0D8:0, >B=>A8B5;L=> :>B>@>3> 1C4CB >?@545;OBLAO :>>@48=0BK B>G:8 

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_XDISTANCE,55); //--- CAB0=>28< :>>@48=0BK :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_YDISTANCE,30);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_XSIZE,20);     //--- CAB0=>28< @07<5@ :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_YSIZE,20);

   ObjectSetString(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_TEXT,CharToString(242));//--- CAB0=>28< B5:AB

   ObjectSetString(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_FONT,"Wingdings");

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_FONTSIZE,16);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_COLOR,clrBlack);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_BGCOLOR,CL_Symb);

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_BORDER_COLOR,clrDarkGray);//--- CAB0=>28< F25B 3@0=8FK

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_BACK,False);      //--- >B>1@078< =0 ?5@54=5< (false) 8;8 704=5< (true) ?;0=5

   ObjectSetInteger(ChartID(),obj_pref+"Scroll_Dn",OBJPROP_STATE,false);     //--- ?5@52545< :=>?:C 2 7040==>5 A>AB>O=85

  }

  /*

  if(ObjectFind(0,obj_pref+"XSize")==-1)

   {

   ObjectCreate(ChartID(),obj_pref+"XSize",OBJ_LABEL,0,0,0);

   ObjectSetInteger(ChartID(),obj_pref+"XSize",OBJPROP_CORNER,CORNER_RIGHT_LOWER);   //--- CAB0=>28< C3>; 3@0D8:0, >B=>A8B5;L=> :>B>@>3> 1C4CB >?@545;OBLAO :>>@48=0BK B>G:8 

   ObjectSetInteger(ChartID(),obj_pref+"XSize",OBJPROP_XDISTANCE,55); //--- CAB0=>28< :>>@48=0BK :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"XSize",OBJPROP_YDISTANCE,55);

   ObjectSetString(ChartID(),obj_pref+"XSize",OBJPROP_TEXT,IntegerToString(Y_MIN));//--- CAB0=>28< B5:AB

   ObjectSetString(ChartID(),obj_pref+"XSize",OBJPROP_FONT,"Arial");

   ObjectSetInteger(ChartID(),obj_pref+"XSize",OBJPROP_FONTSIZE,6);

   ObjectSetInteger(ChartID(),obj_pref+"XSize",OBJPROP_COLOR,clrGray);

   ObjectSetInteger(ChartID(),obj_pref+"XSize",OBJPROP_SELECTABLE,false);

  }

  else

  ObjectSetString(ChartID(),obj_pref+"XSize",OBJPROP_TEXT,IntegerToString(Y_MIN));//--- CAB0=>28< B5:AB

  

  if(ObjectFind(0,obj_pref+"YSize")==-1)

   {

   ObjectCreate(ChartID(),obj_pref+"YSize",OBJ_LABEL,0,0,0);

   ObjectSetInteger(ChartID(),obj_pref+"YSize",OBJPROP_CORNER,CORNER_RIGHT_LOWER);   //--- CAB0=>28< C3>; 3@0D8:0, >B=>A8B5;L=> :>B>@>3> 1C4CB >?@545;OBLAO :>>@48=0BK B>G:8 

   ObjectSetInteger(ChartID(),obj_pref+"YSize",OBJPROP_XDISTANCE,55); //--- CAB0=>28< :>>@48=0BK :=>?:8

   ObjectSetInteger(ChartID(),obj_pref+"YSize",OBJPROP_YDISTANCE,45);

   ObjectSetString(ChartID(),obj_pref+"YSize",OBJPROP_TEXT,IntegerToString(Y_CURR));//--- CAB0=>28< B5:AB

   ObjectSetString(ChartID(),obj_pref+"YSize",OBJPROP_FONT,"Arial");

   ObjectSetInteger(ChartID(),obj_pref+"YSize",OBJPROP_FONTSIZE,6);

   ObjectSetInteger(ChartID(),obj_pref+"YSize",OBJPROP_COLOR,clrGray);

   ObjectSetInteger(ChartID(),obj_pref+"YSize",OBJPROP_SELECTABLE,false);

  }

  else

  ObjectSetString(ChartID(),obj_pref+"YSize",OBJPROP_TEXT,IntegerToString(Y_CURR));//--- CAB0=>28< B5:AB*/

}

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