//+------------------------------------------------------------------+
//|                                Dashboard - Power MeterV3_Fix.mq4 |
//|                                                   by Edition GVC |
//|                                      http://www.forexfactopy.com |
//|                                        forum - Dashboard Trading |
//+------------------------------------------------------------------+
//-------------------------------------------------------------------------------------------------
#property copyright "GVC"
#property link      "http://www.metaquotes.net"
#property version   "1.00"
#property strict
//-------------------------------------------------------------------------------------------------
#include <stdlib.mqh>
#include <WinUser32.mqh>
#include <ChartObjects\ChartObjectsTxtControls.mqh>
//-------------------------------------------------------------------------------------------------
#define BullColor Lime
#define BearColor Red

#define NONE 0
#define DOWN -1
#define UP 1

#define NOTHING 0
#define BUY     1
#define SELL    2
//-------------------------------------------------------------------------------------------------
struct pairinf
 {
  double PairPip;
  double Pips;
  double PipsSig;
  double Pipsprev;
  double Spread;
  double point;
  
  int    pipsfactor;
  int    lastSignal;
  int    base;
  int    quote;
 }; pairinf pairinfo[];

struct signal
 {
  string symbol;
  
  double range;
  double range1;
  double ratio;
  double ratio1;
  double bidratio;
  double fact;
  double strength;
  double strength_old;
  double strength1;
  double strength2;
  double calc;
  double strength3;
  double strength4;
  double strength5;
  double strength6;
  double strength7;
  double strength8;
  double strength_Gap;
  double hi;
  double lo;
  double prevratio;
  double prevbid;
  double open;
  double close;
  double bid;
  double point;
  double Signalperc;
  double SigRatio;
  double SigRelStr;
  double SigBSRatio;
  double SigCRS;
  double SigGap;
  double SigGapPrev;
  double SigRatioPrev;
  
  int shift;
 }; signal signals[];

struct currency
 {
  string curr;
  
  double strength;
  double prevstrength;
  double crs;
  
  int sync;
  
  datetime lastbar;
  }; currency currencies[8];

struct adrval
 {
  double adr;
  double adr1;
  double adr5;
  double adr10;
  double adr20;
 }; adrval adrvalues[];
//-------------------------------------------------------------------------------------------------
enum dbu
 {
  Constant    = 0,
  OneMinute   = 1,
  FiveMinutes =5
 };
//-------------------------------------------------------------------------------------------------
sinput string          t_trade                    = "EXPERT MANAGEMENT";  // =================================
sinput bool            UseDefaultPairs            = true;                 // Use the default 28 pairs
sinput string          OwnPairs                   = "";                   // Comma seperated own pair list
sinput dbu             DashUpdate                 = 0;                    // Dashboard update interval
sinput int             Magic_Number               = 9876;
sinput bool            autotrade                  = false;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sinput string          t_trigger                  = "TRIGGER MANAGEMENT"; // =================================
sinput bool            trigger_use_Pips           = true;                 // Use Pips
sinput double          trade_MIN_pips             = 30;                   // Minimum pips to open position
sinput bool            trigger_UseHeatMap1        = true;                 // Use Heat Map
sinput ENUM_TIMEFRAMES trigger_TF_HM1             = 1440;                 // TimeFrame for Heat Map 
sinput double          trade_MIN_HeatMap1         = 0.5;                  // Minimum % HeatMap to open position
sinput bool            trigger_use_bidratio       = true;                 // Use BidRatio filtering
sinput double          trigger_buy_bidratio       = 60;                   // % Level to open Buy
sinput double          trigger_sell_bidratio      = 30;                   // % Level to open Sell
sinput bool            trigger_use_relstrength    = true;                 // Use Relative Strength filtering (Base)
sinput double          trigger_buy_relstrength    = 5.0;                  // Strenth to open Buy
sinput double          trigger_sell_relstrength   =-5.0;                  // Strength to open Sell
sinput bool            trigger_use_buysellratio   = true;                 // Use Buy/Sell Ratio filtering
sinput double          trigger_buy_buysellratio   = 4.0;                  // Level to open Buy
sinput double          trigger_sell_buysellratio  = -4.0;                 // level to open Sell
sinput bool            trigger_use_gap            = true;                 // Use Gap filtering
sinput double          trigger_gap_buy            = 2.25;                 // Gap level to open Buy
sinput double          trigger_gap_sell           = -2.25;                // Gap level to open Sell
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sinput string          t_basket = "BASKET MANAGEMENT";                    // =================================
sinput double          lot                        = 0.01;                 // 
sinput int             MaxTrades                  = 3;                    // Max trades per pair
sinput int             MaxTotalTrades             = 0;                    // Max total trades overall
sinput double          MaxSpread                  = 4.0;                  // Max Spread Allowe
sinput int             Basket_Target              = 0;                    // Basket Take Profit in $
sinput int             Basket_StopLoss            = 0;                    // Basket Stop Lloss in $
sinput int             Piptp                      = 0;                    // Takeprofit in pips 
sinput int             Pipsl                      = 0;                    // Stoploss in pips 
sinput double          BasketP1                   = 0.0;                  // At profit 1
sinput double          BasketL1                   = 0.0;                  // Lock 1
sinput double          BasketP2                   = 0.0;                  // At profit 2
sinput double          BasketL2                   = 0.0;                  // Lock 2
sinput double          BasketP3                   = 0.0;                  // At profit 3
sinput double          BasketL3                   = 0.0;                  // Lock 3
sinput double          BasketP4                   = 0.0;                  // At profit 4
sinput double          BasketL4                   = 0.0;                  // Lock 4
sinput double          BasketP5                   = 0.0;                  // At profit 5
sinput double          BasketL5                   = 0.0;                  // Lock 5
sinput double          BasketP6                   = 0.0;                  // At profit 6
sinput double          BasketL6                   = 0.0;                  // Lock 6
sinput bool            TrailLastLock              = true;                 // Trail the last set lock
sinput double          TrailDistance              = 0.0;                  // Trail distance 0 means last lock
sinput int             StopProfit                 = 0;                    // Stop after this many profitable baskets
sinput double          Adr1tp                     = 10;                   // Takeprofit percent adr(10) 0=None
sinput double          Adr1sl                     = 40;                   // Stoploss adr percent adr(10) 0 = None
sinput int             StopLoss                   = 0;                    // Stop after this many losing baskets baskets
sinput bool            OnlyAddProfit              = true;                 // Only adds trades in profit 
sinput bool            CloseAllSession            = false;                // Close all trades after session(s)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sinput string          t_time                     = "TIME MANAGEMENT";    // =================================
sinput bool            UseSession1                = true;
sinput string          sess1start                 = "00:00";
sinput string          sess1end                   = "23:59";
sinput string          sess1comment               = "AUTO SESS1";
sinput bool            UseSession2                = false;
sinput string          sess2start                 = "00:00";
sinput string          sess2end                   = "23:59";
sinput string          sess2comment               = "AUTO SESS2";
sinput bool            UseSession3                = false;
sinput string          sess3start                 = "00:00";
sinput string          sess3end                   = "23:59";
sinput string          sess3comment               = "AUTO SESS3";
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sinput string          t_chart = "CHART MANAGEMENT";                      // =================================
sinput ENUM_TIMEFRAMES TimeFrame                  = 1440;                 // TimeFrame to open chart
sinput string          usertemplate               = "Dash";
sinput int             x_axis                     = 0;
sinput int             y_axis                     = 70;
//-------------------------------------------------------------------------------------------------
       int BeforeMin = 15;
       int FontSize  = 10;
       int ShiftX    = 250;
       int ShiftY    = 70;
       int Corner    = 0;
       
       string FontName = "Arial";
       
       //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       string button_close_basket_All  = "btn_Close ALL"; 
       string button_close_basket_Prof = "btn_Close Prof";
       string button_close_basket_Loss = "btn_Close Loss";
       
       string button_reset_ea = "RESET EA";
       
       string button_EUR_basket       = "EUR_BASKET";
       string button_EUR_basket_buy   = "EUR_BASKET_BUY";
       string button_EUR_basket_sell  = "EUR_BASKET_SELL";
       string button_EUR_basket_close = "EUR_BASKET_CLOSE";
       
       string button_GBP_basket       = "GBP_BASKET"; 
       string button_GBP_basket_buy   = "GBP_BASKET_BUY";
       string button_GBP_basket_sell  = "GBP_BASKET_SELL";
       string button_GBP_basket_close = "GBP_BASKET_CLOSE";
       
       string button_CHF_basket       = "CHF_BASKET";
       string button_CHF_basket_buy   = "CHF_BASKET_BUY";
       string button_CHF_basket_sell  = "CHF_BASKET_SELL";
       string button_CHF_basket_close = "CHF_BASKET_CLOSE";
       
       string button_USD_basket       = "USD_BASKET";
       string button_USD_basket_buy   = "USD_BASKET_BUY";
       string button_USD_basket_sell  = "USD_BASKET_SELL";
       string button_USD_basket_close = "USD_BASKET_CLOSE";
       
       string button_CAD_basket       = "CAD_BASKET";
       string button_CAD_basket_buy   = "CAD_BASKET_BUY";
       string button_CAD_basket_sell  = "CAD_BASKET_SELL";
       string button_CAD_basket_close = "CAD_BASKET_CLOSE";
       
       string button_NZD_basket       = "NZD_BASKET";
       string button_NZD_basket_buy   = "NZD_BASKET_BUY";
       string button_NZD_basket_sell  = "NZD_BASKET_SELL";
       string button_NZD_basket_close = "NZD_BASKET_CLOSE";
       
       string button_AUD_basket       = "AUD_BASKET";
       string button_AUD_basket_buy   = "AUD_BASKET_BUY";
       string button_AUD_basket_sell  = "AUD_BASKET_SELL";
       string button_AUD_basket_close = "AUD_BASKET_CLOSE";
       
       string button_JPY_basket       = "JPY_BASKET";
       string button_JPY_basket_buy   = "JPY_BASKET_BUY";
       string button_JPY_basket_sell  = "JPY_BASKET_SELL";
       string button_JPY_basket_close = "JPY_BASKET_CLOSE";
       
       //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       string TradePairs[];
       string DefaultPairs[] = {"AUDCAD", "AUDCHF", "AUDJPY", "AUDNZD", "AUDUSD",
                                "CADCHF", "CADJPY", "CHFJPY",
                                "EURAUD", "EURCAD", "EURCHF", "EURGBP", "EURJPY", "EURNZD", "EURUSD",
                                "GBPAUD", "GBPCAD", "GBPCHF", "GBPJPY", "GBPNZD", "GBPUSD",
                                "NZDCAD", "NZDCHF", "NZDJPY", "NZDUSD",
                                "USDCAD", "USDCHF", "USDJPY"
                               };
       string curr[8]  = {"USD", "EUR", "GBP", "JPY",
                          "AUD", "NZD", "CAD", "CHF"
                         };
       string EUR[7]   = {"EURAUD", "EURCAD", "EURCHF", "EURGBP",
                          "EURJPY", "EURNZD", "EURUSD"
                         };
       string GBP[6]   = {"GBPAUD", "GBPCAD", "GBPCHF",
                          "GBPJPY", "GBPNZD", "GBPUSD"
                         };
       string GBP_R[1] = {"EURGBP"};
       string CHF[1]   = {"CHFJPY"};
       string CHF_R[6] = {"AUDCHF", "CADCHF", "EURCHF",
                          "GBPCHF", "NZDCHF", "USDCHF"
                         };
       string USD[3]   = {"USDCAD", "USDCHF", "USDJPY"};
       string USD_R[4] = {"AUDUSD", "EURUSD",
                          "GBPUSD", "NZDUSD"
                         };
       string CAD[2]   = {"CADCHF", "CADJPY"};
       string CAD_R[5] = {"AUDCAD", "EURCAD", "GBPCAD",
                          "NZDCAD", "USDCAD"
                         };
       string NZD[4]   = {"NZDCAD", "NZDCHF",
                          "NZDJPY", "NZDUSD"
                         };
       string NZD_R[3] = {"AUDNZD", "EURNZD", "GBPNZD"};
       string AUD[5]   = {"AUDCAD", "AUDCHF", "AUDJPY",
                          "AUDNZD", "AUDUSD"
                         };
       string AUD_R[2] = {"EURAUD", "GBPAUD"};
       string JPY_R[7] = {"AUDJPY", "CADJPY", "CHFJPY", "EURJPY",
                          "GBPJPY", "NZDJPY", "USDJPY"
                         };
       
       //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       double totalbuystrength, totalsellstrength;
       double totalprofit,      totallots;
       double blots  [28], slots  [28],
              bprofit[28], sprofit[28],
              tprofit[28], bpos   [28],
              spos   [28];
       double factor;
       double GetBalanceSymbol, SymbolMaxDD,
              SymbolMaxHi;
       double PercentFloatingSymbol = 0;
       double PercentMaxDDSymbol    = 0;
       double currentlock           = 0.0;
       double lockdistance          = 0.0;
       double stoploss;
       double takeprofit;
       double currstrength[8];
       double prevstrength[8];
       
       int strper         = PERIOD_W1;
       int profitbaskets  = 0;
       int lossbaskets    = 0;
       int orders         = 0;
       int symb_cnt       = 0;
       int period1[]      = {240, 1440, 10080};
       int localday       = 99;
       int totaltrades    = 0;
       int maxtotaltrades = 0;
       int ticket;
       int labelcolor;
       
       datetime s1start, s2start, s3start;
       datetime s1end,   s2end,   s3end;
       datetime newday = 0;
       datetime newm1  = 0;
       
       color ProfitColor,  ProfitColor1,
             ProfitColor2, ProfitColor3,
             PipsColor,    LotColor,
             LotColor1,    OrdColor,
             OrdColor1;
       color BackGrnCol = C'20, 20, 20';
       color LineColor  = clrBlack;
       color TextColor  = clrBlack;
       
       string _font   = "Consolas";
       string postfix = StringSubstr(Symbol(), 6, 10);
       string comment;
       string strspl[];
//       string Sig[28], Sell;
       
       bool CloseAll;
       bool Accending    = true;
       bool s1active     = false;
       bool s2active     = false;
       bool s3active     = false;
       bool trailstarted = false;
       
       MqlDateTime sess;
//-------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
 {
  if (UseDefaultPairs == true)
   ArrayCopy(TradePairs, DefaultPairs);
  else
   StringSplit(OwnPairs, ',', TradePairs);
  
  for (int i = 0; i < 8; i++)
   currencies[i].curr = curr[i];
  
  if (ArraySize(TradePairs) <= 0)
   {
    Print("No pairs to trade");
    
    return(INIT_FAILED);
   } // exit if (ArraySize(TradePairs) <= 0)
  
  //---
  ArrayResize(adrvalues, ArraySize(TradePairs));
  ArrayResize(signals,   ArraySize(TradePairs));
  ArrayResize(pairinfo,  ArraySize(TradePairs));
  
  for (int i = 0; i < ArraySize(TradePairs); i++)
   {
    TradePairs[i] = TradePairs[i] + postfix;
    
    pairinfo[i].base  = (int)StringToInteger(StringSubstr(TradePairs[i], 0, 3));
    pairinfo[i].quote = (int)StringToInteger(StringSubstr(TradePairs[i], 3, 0));
    
    if (MarketInfo(TradePairs[i], MODE_DIGITS) == 4 ||
        MarketInfo(TradePairs[i], MODE_DIGITS) == 2)
     {
      pairinfo[i].PairPip    = MarketInfo(TradePairs[i], MODE_POINT);
      pairinfo[i].pipsfactor = 1;
     } // exit if (MarketInfo(TradePairs[i], MODE_DIGITS) == 4 || ...
    else
     {
      pairinfo[i].PairPip    = MarketInfo(TradePairs[i], MODE_POINT) * 10;
      pairinfo[i].pipsfactor = 10;
     } // exit if (MarketInfo(TradePairs[i], MODE_DIGITS) == 5 || ...
    
    //---
    SetPanel("BarSupMeter", 0, x_axis,       y_axis - 30,  1098, 30,  clrDarkSlateGray, C'61, 61, 61', 1);
    SetPanel("Bar",         0, x_axis,       y_axis,       1098, 450, C'30, 30, 30',    C'61, 61, 61', 1);
    SetPanel("Panel",       0, x_axis + 585, y_axis + 13,  170,  150, C'30, 30, 30',    C'61, 61, 61', 1);
//    SetPanel("BottPanel",   0, x_axis + 405, y_axis + 450, 602,  77,  C'30, 30, 30',    clrWhite,1);
    
    SetPanel("Spread"   + IntegerToString(i), 0, x_axis + 60,  (i * 16) + y_axis - 2, 30,  17, clrBlack,      C'61, 61, 61', 1);
    SetPanel("Pips"     + IntegerToString(i), 0, x_axis + 90,  (i * 16) + y_axis - 2, 35,  17, clrBlack,      C'61, 61, 61', 1);
    SetPanel("Adr"      + IntegerToString(i), 0, x_axis + 125, (i * 16) + y_axis - 2, 35,  17, clrBlack,      C'61, 61, 61', 1);
    SetPanel("BidRatio" + IntegerToString(i), 0, x_axis + 160, (i * 16) + y_axis - 2, 60,  17, clrBlack,      C'61, 61, 61', 1);
    SetPanel("RelStr"   + IntegerToString(i), 0, x_axis + 220, (i * 16) + y_axis - 2, 30,  17, clrBlack,      C'61, 61, 61', 1);
    SetPanel("BSRatio"  + IntegerToString(i), 0, x_axis + 250, (i * 16) + y_axis - 2, 40,  17, clrBlack,      C'61, 61, 61', 1);
    SetPanel("PrevGAP"  + IntegerToString(i), 0, x_axis + 290, (i * 16) + y_axis - 2, 40,  17, clrBlack,      C'61, 61, 61', 1);
    SetPanel("GAP123"   + IntegerToString(i), 0, x_axis + 330, (i * 16) + y_axis - 2, 45,  17, clrBlack,      C'61, 61, 61', 1);
    SetPanel("HM1"      + IntegerToString(i), 0, x_axis + 375, (i * 16) + y_axis,     50,  16, BackGrnCol,    C'61, 61, 61', 1);
    SetPanel("A2"       + IntegerToString(i), 0, x_axis + 780, (i * 16) + y_axis - 2, 318, 17, C'30, 30, 30', C'61, 61, 61', 1);
    
    SetPanel("TP",  0, x_axis + 1040, y_axis - 27, 55,  20, Black, White, 1);
    SetPanel("TP1", 0, x_axis + 220,  y_axis - 50, 125, 20, Black, White, 1);
    SetPanel("TP2", 0, x_axis + 345,  y_axis - 50, 160, 20, Black, White, 1);
    SetPanel("TP3", 0, x_axis + 505,  y_axis - 50, 160, 20, Black, White, 1);
    SetPanel("TP4", 0, x_axis + 665,  y_axis - 50, 130, 20, Black, White, 1);
    SetPanel("TP5", 0, x_axis + 795,  y_axis - 50, 130, 20, Black, White, 1);
    SetPanel("TP6", 0, x_axis + 95,   y_axis - 50, 100, 20, Black, White, 1);
    SetPanel("TP7", 0, x_axis + 921,  y_axis - 50, 130, 20, Black, White, 1);
    SetPanel("TP8", 0, x_axis + 1051, y_axis - 50, 22,  20, Black, White, 1);
    SetPanel("TP9", 0, x_axis + 1073, y_axis - 50, 22,  20, Black, White, 1);
    
    //---
    SetText("Pr1" + IntegerToString(i), StringSubstr(TradePairs[i], 0, 6), x_axis + 780, (i * 16) + y_axis, clrWhite, 8);
    
    SetText("Spr1" + IntegerToString(i), (string)0, x_axis + 65,  (i * 16) + y_axis, Orange,    8);
    SetText("Pp1"  + IntegerToString(i), (string)0, x_axis + 95,  (i * 16) + y_axis, PipsColor, 8);
    SetText("S1"   + IntegerToString(i), (string)0, x_axis + 133, (i * 16) + y_axis, Yellow,    8);
    
    SetText("bLots"   + IntegerToString(i), DoubleToStr(blots[i], 2), x_axis + 840, (i * 16) + y_axis, C'61, 61, 61', 8);
    SetText("sLots"   + IntegerToString(i), DoubleToStr(slots[i], 2), x_axis + 880, (i * 16) + y_axis, C'61, 61, 61', 8);
    SetText("bPos"    + IntegerToString(i), DoubleToStr(bpos[i],  0), x_axis + 920, (i * 16) + y_axis, C'61, 61, 61', 8);
    SetText("sPos"    + IntegerToString(i), DoubleToStr(spos[i],  0), x_axis + 940, (i * 16) + y_axis, C'61, 61, 61', 8);
    
    SetText("TProf"   + IntegerToString(i), DoubleToStr(MathAbs(bprofit[i]), 2), x_axis + 970,  (i * 16) + y_axis, C'61, 61, 61', 8);
    SetText("SProf"   + IntegerToString(i), DoubleToStr(MathAbs(sprofit[i]), 2), x_axis + 1010, (i * 16) + y_axis, C'61, 61, 61', 8);
    SetText("TtlProf" + IntegerToString(i), DoubleToStr(MathAbs(tprofit[i]), 2), x_axis + 1060, (i * 16) + y_axis, C'61, 61, 61', 8);
    
    SetText("Lowest",  "Lowest = "  + DoubleToStr(SymbolMaxDD, 2) + " (" + DoubleToStr(PercentMaxDDSymbol,    2) + "%)", x_axis + 670, y_axis - 47, BearColor, 8);
    SetText("Highest", "Highest = " + DoubleToStr(SymbolMaxHi, 2) + " (" + DoubleToStr(PercentFloatingSymbol, 2) + "%)", x_axis + 800, y_axis - 47, BullColor, 8);
    SetText("Lock",    "Lock = "    + DoubleToStr(currentlock, 2),                                                       x_axis + 925, y_axis - 47, BullColor, 8);
    
    SetText("TotProf", DoubleToStr(MathAbs(totalprofit), 2), x_axis + 1043, y_axis - 22, ProfitColor1, 8);
    
    SetText("Won",  IntegerToString(profitbaskets, 2), x_axis + 1053, y_axis - 47, BullColor, 8);
    SetText("Lost", IntegerToString(lossbaskets,   2), x_axis + 1075, y_axis - 47, BearColor, 8);
    
    //---
    Create_Button(IntegerToString(i) + "Pair", StringSubstr(TradePairs[i], 0, 6), 60, 14, x_axis, (i * 16) + y_axis, C'35, 35, 35', clrWhite);
    
    Create_Button((string)i + "Hold",  "~",     18, 15, x_axis + 760, (i * 16) + y_axis, C'35, 35, 35', clrAqua);
    Create_Button((string)i + "BUY",   "BUY",   50, 15, x_axis + 430, (i * 16) + y_axis, C'35, 35, 35', clrLime);
    Create_Button((string)i + "SELL",  "SELL",  50, 15, x_axis + 480, (i * 16) + y_axis, C'35, 35, 35', clrRed);
    Create_Button((string)i + "CLOSE", "CLOSE", 50, 15, x_axis + 530, (i * 16) + y_axis, C'35, 35, 35', clrOrange);
   } // exit for (int i = 0; i < ArraySize(TradePairs); i++)
  
  //---
  SetText("TPr",    "Basket TakeProfit = $ " + DoubleToStr(Basket_Target,   0), x_axis + 378, y_axis - 47, Yellow, 8);
  SetText("SL",     "Basket StopLoss = $ -"  + DoubleToStr(Basket_StopLoss, 0), x_axis + 538, y_axis - 47, Yellow, 8);
  
  SetText("Symbol", "Sprd    PFO     ADR     BidRatio     RStr   BSRatio  Prev", x_axis + 60,  y_axis - 17, White, 8);
  SetText("Sy",     "Gap        HeatMap",                                        x_axis + 335, y_axis - 17, White, 8);
  SetText("Trades", "Buy       Sell     Buy  Sell      Buy      Sell",           x_axis + 840, y_axis - 17, White, 8);
  SetText("TTr",    "Lots           Orders",                                     x_axis + 860, y_axis - 30, White, 8);
  
  //Basket Trades
  int basket_x = x_axis + 3;
  int basket_y = y_axis + 450;
  int i = 0;
  
  //--- AUD
  Create_Button(button_AUD_basket,       "AUD",   50, 18, basket_x + i, basket_y,      C'35, 35, 35', clrWhite);
  Create_Button(button_AUD_basket_buy,   "BUY",   50, 18, basket_x + i, basket_y + 20, C'35, 35, 35', clrLime);
  Create_Button(button_AUD_basket_sell,  "SELL",  50, 18, basket_x + i, basket_y + 40, C'35, 35, 35', clrRed);
  Create_Button(button_AUD_basket_close, "CLOSE", 50, 18, basket_x + i, basket_y + 60, C'35, 35, 35', clrOrange);
  
  //--- CAD
  i += 50;
  Create_Button(button_CAD_basket,       "CAD",   50, 18, basket_x + i, basket_y,      C'35, 35, 35', clrWhite);
  Create_Button(button_CAD_basket_buy,   "BUY",   50, 18, basket_x + i, basket_y + 20, C'35, 35, 35', clrLime);
  Create_Button(button_CAD_basket_sell,  "SELL",  50, 18, basket_x + i, basket_y + 40, C'35, 35, 35', clrRed);
  Create_Button(button_CAD_basket_close, "CLOSE", 50, 18, basket_x + i, basket_y + 60, C'35, 35, 35', clrOrange);
  
  //--- CHF
  i += 50;
  Create_Button(button_CHF_basket,       "CHF",   50, 18, basket_x + i, basket_y,      C'35, 35, 35', clrWhite);
  Create_Button(button_CHF_basket_buy,   "BUY",   50, 18, basket_x + i, basket_y + 20, C'35, 35, 35', clrLime);
  Create_Button(button_CHF_basket_sell,  "SELL",  50, 18, basket_x + i, basket_y + 40, C'35, 35, 35', clrRed);
  Create_Button(button_CHF_basket_close, "CLOSE", 50, 18, basket_x + i, basket_y + 60, C'35, 35, 35', clrOrange);
  
  //--- EUR
  i += 50;
  Create_Button(button_EUR_basket,       "EUR",   50, 18, basket_x + i, basket_y,      C'35, 35, 35', clrWhite);
  Create_Button(button_EUR_basket_buy,   "BUY",   50, 18, basket_x + i, basket_y + 20, C'35, 35, 35', clrLime);
  Create_Button(button_EUR_basket_sell,  "SELL",  50, 18, basket_x + i, basket_y + 40, C'35, 35, 35', clrRed);
  Create_Button(button_EUR_basket_close, "CLOSE", 50, 18, basket_x + i, basket_y + 60, C'35, 35, 35', clrOrange);
  
  //--- GBP
  i += 50;
  Create_Button(button_GBP_basket,       "GBP",   50, 18, basket_x + i, basket_y,      C'35, 35, 35', clrWhite);
  Create_Button(button_GBP_basket_buy,   "BUY",   50, 18, basket_x + i, basket_y + 20, C'35, 35, 35', clrLime);
  Create_Button(button_GBP_basket_sell,  "SELL",  50, 18, basket_x + i, basket_y + 40, C'35, 35, 35', clrRed);
  Create_Button(button_GBP_basket_close, "CLOSE", 50, 18, basket_x + i, basket_y + 60, C'35, 35, 35', clrOrange);
  
  //--- JPY
  i += 50;
  Create_Button(button_JPY_basket,       "JPY",   50, 18, basket_x + i, basket_y,      C'35, 35, 35', clrWhite);
  Create_Button(button_JPY_basket_buy,   "BUY",   50, 18, basket_x + i, basket_y + 20, C'35, 35, 35', clrLime);
  Create_Button(button_JPY_basket_sell,  "SELL",  50, 18, basket_x + i, basket_y + 40, C'35, 35, 35', clrRed);
  Create_Button(button_JPY_basket_close, "CLOSE", 50, 18, basket_x + i, basket_y + 60, C'35, 35, 35', clrOrange);
  
  //--- NZD
  i += 50;
  Create_Button(button_NZD_basket,       "NZD",   50, 18, basket_x + i, basket_y,      C'35, 35, 35', clrWhite);
  Create_Button(button_NZD_basket_buy,   "BUY",   50, 18, basket_x + i, basket_y + 20, C'35, 35, 35', clrLime);
  Create_Button(button_NZD_basket_sell,  "SELL",  50, 18, basket_x + i, basket_y + 40, C'35, 35, 35', clrRed);
  Create_Button(button_NZD_basket_close, "CLOSE", 50, 18, basket_x + i, basket_y + 60, C'35, 35, 35', clrOrange);
  
  //--- USD
  i += 50;
  Create_Button(button_USD_basket,       "USD",   50, 18, basket_x + i, basket_y,      C'35, 35, 35', clrWhite);
  Create_Button(button_USD_basket_buy,   "BUY",   50, 18, basket_x + i, basket_y + 20, C'35, 35, 35', clrLime);
  Create_Button(button_USD_basket_sell,  "SELL",  50, 18, basket_x + i, basket_y + 40, C'35, 35, 35', clrRed);
  Create_Button(button_USD_basket_close, "CLOSE", 50, 18, basket_x + i, basket_y + 60, C'35, 35, 35', clrOrange);
  
  //---
  Create_Button(button_close_basket_All,  "CLOSE ALL",    90, 18, x_axis + 1010, basket_y,      C'35, 35, 35', clrWhite);
  Create_Button(button_close_basket_Prof, "CLOSE PROFIT", 90, 18, x_axis + 1010, basket_y + 20, C'35, 35, 35', clrLime);
  Create_Button(button_close_basket_Loss, "CLOSE LOSS",   90, 18, x_axis + 1010, basket_y + 40, C'35, 35, 35', clrRed);
  Create_Button(button_reset_ea,          "RESET EA",     90, 18, x_axis + 1010, basket_y + 60, C'35, 35, 35', clrOrange);
  
  //---
  newday = 0;
  newm1  = 0;
  
  /*  HP  */
  localday     = 99;
  s1active     = false;
  s2active     = false;
  s3active     = false;
  trailstarted = false;
  
  if (MaxTotalTrades == 0)
   maxtotaltrades = ArraySize(TradePairs) * MaxTrades;
  else
   maxtotaltrades = MaxTotalTrades;
  
  /*  HP  */
  
  //---
  EventSetTimer(1);
  
  //-------------------------
  return(INIT_SUCCEEDED);
 }
//-------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
  //--- destroy timer
  EventKillTimer();
  ObjectsDeleteAll();
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
 {
  Trades();
  TradeManager();
  PlotTrades();
  PlotSpreadPips();
  GetSignals();
  displayMeter();
  
  //---
  if (newday != iTime("EURUSD" + postfix, PERIOD_D1, 0))
   {
    GetAdrValues();
    PlotAdrValues();
    
    newday = iTime("EURUSD" + postfix, PERIOD_D1, 0);
   } // exit if (newday != iTime("EURUSD" + postfix, PERIOD_D1, 0))
  
  if (DashUpdate == 0 ||
     (DashUpdate == 1 && newm1 != iTime("EURUSD" + postfix, PERIOD_M1, 0)) ||
     (DashUpdate == 5 && newm1 != iTime("EURUSD" + postfix, PERIOD_M5, 0)))
   {
    for (int i = 0; i < ArraySize(TradePairs); i++)
     for (int a = 0; a < 5; a++)
      {
       ChngBoxCol(((int)signals[i].Signalperc * 100), i);
       
       SetText("Percent" + IntegerToString(i), DoubleToStr(signals[i].Signalperc, 2) + "%", x_axis + 385, (i * 16) + y_axis, clrBlack, 8);
       
       if (pairinfo[i].PipsSig == UP)
        SetObjText("Sigpips" + IntegerToString(i), CharToStr(225), x_axis + 114, (i * 16) + y_axis, clrLime, 9);
       else
        if (pairinfo[i].PipsSig == DOWN)
         SetObjText("Sigpips" + IntegerToString(i), CharToStr(226), x_axis + 114, (i * 16) + y_axis, clrFireBrick, 9);
       
       //---
       SetText("BidRat"    + IntegerToString(i), DoubleToStr(signals[i].ratio,        1) + "%", x_axis + 165, (i * 16) + y_axis, Colorstr(signals[i].ratio),        8); 
       SetText("RelStrgth" + IntegerToString(i), DoubleToStr(signals[i].calc,         0),       x_axis + 228, (i * 16) + y_axis, Colorsync(signals[i].calc),        8);
       SetText("BSRat"     + IntegerToString(i), DoubleToStr(signals[i].strength5,    1),       x_axis + 256, (i * 16) + y_axis, ColorBSRat(signals[i].strength5),  8);
       SetText("PrevGap"   + IntegerToString(i), DoubleToStr(signals[i].strength8,    1),       x_axis + 300, (i * 16) + y_axis, clrOlive,                          8);
       SetText("gap"       + signals[i].symbol,  DoubleToStr(signals[i].strength_Gap, 1),       x_axis + 333, (i * 16) + y_axis, ColorGap(signals[i].strength_Gap), 8);
       
       if (signals[i].SigRatioPrev == UP)
        SetObjText("Sig" + IntegerToString(i), CharToStr(225), x_axis + 206, (i * 16) + y_axis, clrLime, 10);
       else
        if (signals[i].SigRatioPrev == DOWN)
         SetObjText("Sig" + IntegerToString(i), CharToStr(226), x_axis + 206, (i * 16) + y_axis, clrFireBrick, 10);
       
       if (signals[i].SigGapPrev == UP)
        SetObjText("GapSig" + IntegerToString(i), CharToStr(225), x_axis + 360, (i * 16) + y_axis, clrLime, 10);
       else
        if (signals[i].SigGapPrev == DOWN)
         SetObjText("GapSig" + IntegerToString(i), CharToStr(226), x_axis + 360, (i * 16) + y_axis, clrFireBrick, 10);
        else
         SetObjText("GapSig" + IntegerToString(i), CharToStr(224), x_axis + 360, (i * 16) + y_axis, clrOrange, 10);
       
       //------------------------------------------------------------------------------------------
       if (((pairinfo[i].PipsSig     == UP && pairinfo[i].Pips        >  trade_MIN_pips)          || trigger_use_Pips         == false) &&
           ((signals[i].SigRatioPrev == UP && signals[i].ratio        >= trigger_buy_bidratio)    || trigger_use_bidratio     == false) &&
                                             (signals[i].calc         >= trigger_buy_relstrength  || trigger_use_relstrength  == false) &&
                                             (signals[i].strength5    >= trigger_buy_buysellratio || trigger_use_buysellratio == false) &&
           ((signals[i].SigGapPrev   == UP && signals[i].strength_Gap >= trigger_gap_buy)         || trigger_use_gap          == false) &&
                                             (signals[i].Signalperc   >  trade_MIN_HeatMap1       || trigger_UseHeatMap1      == false))
        {
         labelcolor = clrGreen;
         
         if ((bpos[i] + spos[i]) < MaxTrades && pairinfo[i].lastSignal != BUY       && autotrade   == true && (OnlyAddProfit == false || bprofit[i] >= 0.0) &&
                                                pairinfo[i].Spread     <= MaxSpread && inSession() == true && totaltrades <= maxtotaltrades)
          {
           pairinfo[i].lastSignal = BUY;
           
           while (IsTradeContextBusy())
            Sleep(100);
           
           ticket = OrderSend(TradePairs[i], OP_BUY, lot, MarketInfo(TradePairs[i], MODE_ASK), 100, 0, 0, comment, Magic_Number, 0, Blue);
           
           //---
           if (OrderSelect(ticket, SELECT_BY_TICKET) == true)
            {
             if (Pipsl != 0.0)
              stoploss = OrderOpenPrice() - Pipsl * pairinfo[i].PairPip;
             else
              if (Adr1sl != 0.0)
               stoploss = OrderOpenPrice() - ((adrvalues[i].adr10 / 100) * Adr1sl) * pairinfo[i].PairPip;
              else
               stoploss = 0.0;
             //---
             if (Piptp != 0.0)
              takeprofit = OrderOpenPrice() + Piptp * pairinfo[i].PairPip;
             else
              if (Adr1tp != 0.0)
               takeprofit = OrderOpenPrice() + ((adrvalues[i].adr10 / 100) * Adr1tp) * pairinfo[i].PairPip;
              else
               takeprofit = 0.0;
             
             //---
             while (IsTradeContextBusy())
              Sleep(100);
             
             //---
             if (OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(stoploss,   (int)MarketInfo(TradePairs[i], MODE_DIGITS)),
                                                       NormalizeDouble(takeprofit, (int)MarketInfo(TradePairs[i], MODE_DIGITS)), 0, clrBlue))
              continue;
            } // exit if (OrderSelect(ticket, SELECT_BY_TICKET) == true)
          } // exit if ((bpos[i] + spos[i]) < MaxTrades && ...
        } // exit if (((pairinfo[i].PipsSig == UP && ...
       else
        if (((pairinfo[i].PipsSig     == DOWN && pairinfo[i].Pips        <  -trade_MIN_pips)          || trigger_use_Pips         == false) &&
            ((signals[i].SigRatioPrev == DOWN && signals[i].ratio        <= trigger_sell_bidratio)    || trigger_use_bidratio     == false) &&
                                                (signals[i].calc         <= trigger_sell_relstrength  || trigger_use_relstrength  == false) &&
                                                (signals[i].strength5    <= trigger_sell_buysellratio || trigger_use_buysellratio == false) &&
            ((signals[i].SigGapPrev   == DOWN && signals[i].strength_Gap <= trigger_gap_sell)         || trigger_use_gap          == false) &&
                                                (signals[i].Signalperc   <  -trade_MIN_HeatMap1       || trigger_UseHeatMap1      == false))
         {
          labelcolor = clrTomato;
          
          if ((bpos[i] + spos[i]) < MaxTrades && pairinfo[i].lastSignal != SELL      && autotrade   == true && (OnlyAddProfit == false || sprofit[i] >= 0.0) &&
                                                 pairinfo[i].Spread     <= MaxSpread && inSession() == true && totaltrades <= maxtotaltrades)
           {
            pairinfo[i].lastSignal = SELL;
            
            while (IsTradeContextBusy())
             Sleep(100);
            
            ticket = OrderSend(TradePairs[i], OP_SELL, lot, MarketInfo(TradePairs[i], MODE_BID), 100, 0, 0, comment, Magic_Number, 0, Red);
            
            //---
            if (OrderSelect(ticket, SELECT_BY_TICKET) == true)
             {
              if (Pipsl != 0.0)
               stoploss = OrderOpenPrice() + Pipsl * pairinfo[i].PairPip;
              else
               if (Adr1sl != 0.0)
                stoploss = OrderOpenPrice()+((adrvalues[i].adr10 / 100) * Adr1sl) * pairinfo[i].PairPip;
               else
                stoploss = 0.0;
              
              //---
              if (Piptp != 0.0)
               takeprofit = OrderOpenPrice() - Piptp * pairinfo[i].PairPip;
              else
               if (Adr1tp != 0.0)
                takeprofit = OrderOpenPrice() - ((adrvalues[i].adr10 / 100) * Adr1tp) * pairinfo[i].PairPip;
               else
                takeprofit = 0.0;
              
              //---
              while (IsTradeContextBusy())
               Sleep(100);
              
              if (OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(stoploss,   (int)MarketInfo(TradePairs[i], MODE_DIGITS)),
                                                        NormalizeDouble(takeprofit, (int)MarketInfo(TradePairs[i], MODE_DIGITS)), 0, clrBlue))
               continue;
             } // exit if (OrderSelect(ticket, SELECT_BY_TICKET) == true)
           } // exit if ((bpos[i] + spos[i]) < MaxTrades && ...
         } // exit if (((pairinfo[i].PipsSig == DOWN && ...
        else
         {
          labelcolor             = BackGrnCol;
          pairinfo[i].lastSignal = NOTHING;
         } // exit if (((pairinfo[i].PipsSig != DOWN && ...
       
       string HM0 = (string)iCustom(NULL, 0, "HeatMapModokiV1", 5,    10, "Arial", 585, 250, 0 , 0, i);
       string HM1 = (string)iCustom(NULL, 0, "HeatMapModokiV1", 15,   10, "Arial", 620, 250, 0 , 0, i);
       string HM2 = (string)iCustom(NULL, 0, "HeatMapModokiV1", 60,   10, "Arial", 655, 250, 0 , 0, i);
       string HM3 = (string)iCustom(NULL, 0, "HeatMapModokiV1", 240,  10, "Arial", 690, 250, 0 , 0, i);
       string HM4 = (string)iCustom(NULL, 0, "HeatMapModokiV1", 1440, 10, "Arial", 725, 250, 0 , 0, i);
       
       //---
       ColorPanel("Spread" + IntegerToString(i), labelcolor, C'61, 61, 61');
       ColorPanel("Pips"   + IntegerToString(i), labelcolor, C'61, 61, 61');
       ColorPanel("Adr"    + IntegerToString(i), labelcolor, C'61, 61, 61');
//       ColorPanel("A2"     + IntegerToString(i), labelcolor, C'61, 61, 61');
       
       ColorPanel("TP",  Black, White);
       ColorPanel("TP1", Black, White);
       ColorPanel("TP2", Black, White);
       ColorPanel("TP3", Black, White);
       ColorPanel("TP4", Black, White);
       ColorPanel("TP5", Black, White);
      } // exit for (int a = 0; a < 5; a++)
    
    if (DashUpdate == 1)
     newm1 = iTime("EURUSD" + postfix, PERIOD_M1, 0);
    else
     if (DashUpdate == 5)
      newm1 = iTime("EURUSD" + postfix, PERIOD_M5, 0);
   } // exit if (DashUpdate == 0 || ...
  
  WindowRedraw();
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void SetText(string name, string text, int x, int y, color colour, int fontsize = 12)
 {
  if (ObjectFind(0, name) < 0)
   ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
  
  //---
  ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
  ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
  ObjectSetInteger(0, name, OBJPROP_COLOR,     colour);
  ObjectSetInteger(0, name, OBJPROP_FONTSIZE,  fontsize);
  ObjectSetInteger(0, name, OBJPROP_CORNER,    CORNER_LEFT_UPPER);
  ObjectSetString (0, name, OBJPROP_TEXT,      text);
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void SetObjText(string name, string CharToStr, int x, int y, color colour, int fontsize = 12)
 {
  if (ObjectFind(0, name) < 0)
   ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
  
  //---
  ObjectSetInteger(0, name, OBJPROP_FONTSIZE, fontsize);
  ObjectSetInteger(0, name, OBJPROP_COLOR, colour);
  ObjectSetInteger(0, name, OBJPROP_BACK, false);
  ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
  ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
  ObjectSetString (0, name, OBJPROP_TEXT, CharToStr);
  ObjectSetString (0, name, OBJPROP_FONT, "Wingdings");
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetPanel(string name, int sub_window, int x, int y, int width, int height, color bg_color, color border_clr, int border_width)
 {
  if (ObjectCreate(0, name, OBJ_RECTANGLE_LABEL, sub_window, 0, 0))
   {
    ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
    ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
    ObjectSetInteger(0, name, OBJPROP_XSIZE, width);
    ObjectSetInteger(0, name, OBJPROP_YSIZE, height);
    ObjectSetInteger(0, name, OBJPROP_COLOR, border_clr);
    ObjectSetInteger(0, name, OBJPROP_BORDER_TYPE, BORDER_FLAT);
    ObjectSetInteger(0, name, OBJPROP_WIDTH, border_width);
    ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
    ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID);
    ObjectSetInteger(0, name, OBJPROP_BACK, true);
    ObjectSetInteger(0, name, OBJPROP_SELECTABLE, 0);
    ObjectSetInteger(0, name, OBJPROP_SELECTED, 0);
    ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
    ObjectSetInteger(0, name, OBJPROP_ZORDER, 0);
   } // exit if (ObjectCreate(0, name, OBJ_RECTANGLE_LABEL, sub_window, 0, 0))
  
  ObjectSetInteger(0, name, OBJPROP_BGCOLOR, bg_color);
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void ColorPanel(string name, color bg_color, color border_clr)
 {
  ObjectSetInteger(0, name, OBJPROP_COLOR,   border_clr);
  ObjectSetInteger(0, name, OBJPROP_BGCOLOR, bg_color);
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void Create_Button(string but_name, string label, int xsize, int ysize, int xdist, int ydist, int bcolor, int fcolor)
 {
  if (ObjectFind(0, but_name) < 0)
   {
    if (!ObjectCreate(0, but_name, OBJ_BUTTON, 0, 0, 0))
     {
      Print(__FUNCTION__, ": failed to create the button! Error code = ", GetLastError());
      
      return;
     } // exit if (!ObjectCreate(0, but_name, OBJ_BUTTON, 0, 0, 0))
    
    //---
    ObjectSetString (0, but_name, OBJPROP_TEXT,  label);
    ObjectSetInteger(0, but_name, OBJPROP_XSIZE, xsize);
    ObjectSetInteger(0, but_name, OBJPROP_YSIZE, ysize);
    ObjectSetInteger(0, but_name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
    ObjectSetInteger(0, but_name, OBJPROP_XDISTANCE, xdist);
    ObjectSetInteger(0, but_name, OBJPROP_YDISTANCE, ydist);
    ObjectSetInteger(0, but_name, OBJPROP_BGCOLOR, bcolor);
    ObjectSetInteger(0, but_name, OBJPROP_COLOR, fcolor);
    ObjectSetInteger(0, but_name, OBJPROP_FONTSIZE, 8);
    ObjectSetInteger(0, but_name, OBJPROP_HIDDEN, true);
//    ObjectSetInteger(0, but_name, OBJPROP_BORDER_COLOR, ChartGetInteger(0, CHART_COLOR_FOREGROUND));
    ObjectSetInteger(0, but_name, OBJPROP_BORDER_TYPE, BORDER_RAISED);
    
    ChartRedraw();
   } // exit if (ObjectFind(0, but_name) < 0)
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void OnChartEvent(const int id,  const long &lparam, const double &dparam,  const string &sparam)
 {
  if (id == CHARTEVENT_OBJECT_CLICK)
   {
    if (sparam == button_AUD_basket_buy)
     {
      buy_basket(AUD);
      sell_basket(AUD_R);
      
      ObjectSetInteger(0, button_AUD_basket_buy, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_AUD_basket_buy)
    
    //-------------------------------------------
    if (sparam == button_AUD_basket_sell)
     {
      sell_basket(AUD);
      buy_basket(AUD_R);
      
      ObjectSetInteger(0, button_AUD_basket_sell, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_AUD_basket_sell)
    
    //-------------------------------------------
    if (sparam == button_CAD_basket_buy)
     {
      buy_basket(CAD);
      sell_basket(CAD_R);
      
      ObjectSetInteger(0, button_CAD_basket_buy, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_CAD_basket_buy)
    
    //-------------------------------------------
    if (sparam == button_CAD_basket_sell)
     {
      sell_basket(CAD);
      buy_basket(CAD_R);
      
      ObjectSetInteger(0, button_CAD_basket_sell, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_CAD_basket_sell)
    
    //-------------------------------------------
    if (sparam == button_CHF_basket_buy)
     {
      buy_basket(CHF);
      sell_basket(CHF_R);
      
      ObjectSetInteger(0, button_CHF_basket_buy, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_CHF_basket_buy)
    
    //-------------------------------------------
    if (sparam == button_CHF_basket_sell)
     {
      sell_basket(CHF);
      buy_basket(CHF_R);
      
      ObjectSetInteger(0, button_CHF_basket_sell, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_CHF_basket_sell)
    
    //-------------------------------------------
    if (sparam == button_EUR_basket_buy)
     {
      buy_basket(EUR);
      
      ObjectSetInteger(0, button_EUR_basket_buy, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_EUR_basket_buy)
    
    //-------------------------------------------
    if (sparam == button_EUR_basket_sell)
     {
      sell_basket(EUR);
      
      ObjectSetInteger(0, button_EUR_basket_sell, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_EUR_basket_sell)
    
    //-------------------------------------------
    if (sparam == button_GBP_basket_buy)
     {
      buy_basket(GBP);
      sell_basket(GBP_R);
      
      ObjectSetInteger(0, button_GBP_basket_buy, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_GBP_basket_buy)
    
    //-------------------------------------------
    if (sparam == button_GBP_basket_sell)
     {
      sell_basket(GBP);
      buy_basket(GBP_R);
      
      ObjectSetInteger(0, button_GBP_basket_sell, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_GBP_basket_sell)
    
    //-------------------------------------------
    if (sparam == button_JPY_basket_buy)
     {
      sell_basket(JPY_R);
      
      ObjectSetInteger(0, button_JPY_basket_buy, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_JPY_basket_buy)
    
    //-------------------------------------------
    if (sparam == button_JPY_basket_sell)
     {
      buy_basket(JPY_R);
      
      ObjectSetInteger(0, button_JPY_basket_sell, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_JPY_basket_sell)
    
    //-------------------------------------------
    if (sparam == button_NZD_basket_buy)
     {
      buy_basket(NZD);
      sell_basket(NZD_R);
      
      ObjectSetInteger(0, button_NZD_basket_buy, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_NZD_basket_buy)
    
    //-------------------------------------------
    if (sparam == button_NZD_basket_sell)
     {
      sell_basket(NZD);
      buy_basket(NZD_R);
      
      ObjectSetInteger(0, button_NZD_basket_sell, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_NZD_basket_sell)
    
    //-------------------------------------------
    if (sparam == button_USD_basket_buy)
     {
      buy_basket(USD);
      sell_basket(USD_R);
      
      ObjectSetInteger(0, button_USD_basket_buy, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_USD_basket_buy)
    
    //-------------------------------------------
    if (sparam == button_USD_basket_sell)
     {
      sell_basket(USD);
      buy_basket(USD_R);
      
      ObjectSetInteger(0, button_USD_basket_sell, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_USD_basket_sell)
    
    //-------------------------------------------
    if (sparam == button_AUD_basket_close)
     {
      close_cur_basket(AUD);
      close_cur_basket(AUD_R);
      
      ObjectSetInteger(0, button_AUD_basket_close, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_AUD_basket_close)
    
    //-------------------------------------------
    if (sparam == button_CAD_basket_close)
     {
      close_cur_basket(CAD);
      close_cur_basket(CAD_R);
      
      ObjectSetInteger(0, button_CAD_basket_close, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_CAD_basket_close)
    
    //-------------------------------------------
    if (sparam == button_CHF_basket_close)
     {
      close_cur_basket(CHF);
      close_cur_basket(CHF_R);
      
      ObjectSetInteger(0, button_CHF_basket_close, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_CHF_basket_close)
    
    //-------------------------------------------
    if (sparam == button_EUR_basket_close)
     {
      close_cur_basket(EUR);
      
      ObjectSetInteger(0, button_EUR_basket_close, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_EUR_basket_close)
    
    //-------------------------------------------
    if (sparam == button_GBP_basket_close)
     {
      close_cur_basket(GBP);
      close_cur_basket(GBP_R);
      
      ObjectSetInteger(0, button_GBP_basket_close, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_GBP_basket_close)
    
    //-------------------------------------------
    if (sparam == button_JPY_basket_close)
     {
      close_cur_basket(JPY_R);
      
      ObjectSetInteger(0, button_JPY_basket_close, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_JPY_basket_close)
    
    //-------------------------------------------
    if (sparam == button_NZD_basket_close)
     {
      close_cur_basket(NZD);
      close_cur_basket(NZD_R);
      
      ObjectSetInteger(0, button_NZD_basket_close, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_NZD_basket_close)
    
    //-------------------------------------------
      if (sparam == button_USD_basket_close)
       {
        close_cur_basket(USD);
        close_cur_basket(USD_R);
        
        ObjectSetInteger(0, button_USD_basket_close, OBJPROP_STATE, 0);
        
        return;
       } // exit if (sparam == button_USD_basket_close)
    
    //-------------------------------------------
    if (sparam == button_reset_ea)
     {
      Reset_EA();
      
      ObjectSetInteger(0, button_reset_ea, OBJPROP_STATE, 0);
      
      return;
     } // exit if (sparam == button_reset_ea)
    
    //-------------------------------------------
    if (sparam == button_close_basket_All)
     {
      ObjectSetString(0, button_close_basket_All, OBJPROP_TEXT, "Closing...");
      
      close_basket(Magic_Number);
      
      ObjectSetInteger(0, button_close_basket_All, OBJPROP_STATE, 0);
      ObjectSetString (0, button_close_basket_All, OBJPROP_TEXT, "Close Basket"); 
      
      return;
     } // exit if (sparam == button_close_basket_All)
    
    //-------------------------------------------
    if (sparam == button_close_basket_Prof)
     {
      ObjectSetString(0, button_close_basket_Prof, OBJPROP_TEXT, "Closing...");
      
      close_profit();
      
      ObjectSetInteger(0, button_close_basket_Prof, OBJPROP_STATE, 0);
      ObjectSetString (0, button_close_basket_Prof, OBJPROP_TEXT, "Close Basket"); 
      
      return;
     } // exit if (sparam == button_close_basket_Prof)
    
    //-------------------------------------------
    if (sparam == button_close_basket_Loss)
     {
      ObjectSetString(0, button_close_basket_Loss, OBJPROP_TEXT, "Closing...");
      
      close_loss();
      
      ObjectSetInteger(0, button_close_basket_Loss, OBJPROP_STATE, 0);
      ObjectSetString (0, button_close_basket_Loss, OBJPROP_TEXT, "Close Basket");
      
      return;
     } // exit if (sparam == button_close_basket_Loss)
    
    //-------------------------------------------
    if (StringFind(sparam, "BUY") >= 0)
     {
      int ind = (int)StringToInteger(sparam);
      
      //---
      ticket = OrderSend(TradePairs[ind], OP_BUY, lot, MarketInfo(TradePairs[ind], MODE_ASK), 100, 0, 0, "OFF", Magic_Number, 0, Blue);
      
      if (OrderSelect(ticket, SELECT_BY_TICKET) == true)
       {
        if (Pipsl != 0.0)
         stoploss = OrderOpenPrice() - Pipsl * pairinfo[ind].PairPip;
        else
         if (Adr1sl != 0.0)
          stoploss = OrderOpenPrice() - ((adrvalues[ind].adr10 / 100) * Adr1sl) * pairinfo[ind].PairPip;
         else
          stoploss = 0.0;
        
        //---
        if (Piptp != 0.0)
         takeprofit = OrderOpenPrice() + Piptp * pairinfo[ind].PairPip;
        else
         if (Adr1tp != 0.0)
          takeprofit = OrderOpenPrice() + ((adrvalues[ind].adr10 / 100) * Adr1tp) * pairinfo[ind].PairPip;
         else
          takeprofit = 0.0;
        
        //---
        if (OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(stoploss,   (int)MarketInfo(TradePairs[ind], MODE_DIGITS)),
                                                  NormalizeDouble(takeprofit, (int)MarketInfo(TradePairs[ind], MODE_DIGITS)), 0, clrBlue))
         return;
       } // exit if (OrderSelect(ticket, SELECT_BY_TICKET) == true)
      
      ObjectSetInteger(0, (string)ind + "BUY", OBJPROP_STATE, 0);
      ObjectSetString (0, (string)ind + "BUY", OBJPROP_TEXT, "BUY");
      
      return;
     } // exit if (StringFind(sparam, "BUY") >= 0)
    
    //---
    if (StringFind(sparam, "SELL") >= 0)
     {
      int ind = (int)StringToInteger(sparam);
      
      //---
      ticket = OrderSend(TradePairs[ind], OP_SELL, lot, MarketInfo(TradePairs[ind], MODE_BID), 100, 0, 0, "OFF", Magic_Number, 0, Red);
      
      if (OrderSelect(ticket, SELECT_BY_TICKET) == true)
       {
        if (Pipsl != 0.0)
         stoploss = OrderOpenPrice() + Pipsl * pairinfo[ind].PairPip;
        else
         if (Adr1sl != 0.0)
          stoploss = OrderOpenPrice()+((adrvalues[ind].adr10 / 100) * Adr1sl) * pairinfo[ind].PairPip;
         else
          stoploss = 0.0;
        
        //---
        if (Piptp != 0.0)
         takeprofit = OrderOpenPrice() - Piptp * pairinfo[ind].PairPip;
        else
         if (Adr1tp != 0.0)
          takeprofit = OrderOpenPrice() - ((adrvalues[ind].adr10 / 100) * Adr1tp) * pairinfo[ind].PairPip;
         else
          takeprofit = 0.0;
        
        //---
        if (OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(stoploss,   (int)MarketInfo(TradePairs[ind], MODE_DIGITS)),
                                                  NormalizeDouble(takeprofit, (int)MarketInfo(TradePairs[ind], MODE_DIGITS)), 0, clrBlue))
         return;
       } // exit if (OrderSelect(ticket, SELECT_BY_TICKET) == true)
      
      ObjectSetInteger(0, (string)ind + "SELL", OBJPROP_STATE, 0);
      ObjectSetString (0, (string)ind + "SELL", OBJPROP_TEXT, "SELL");
      
      return;
     } // exit if (StringFind(sparam, "SELL") >= 0)
    
    //---
    if (StringFind(sparam,"CLOSE") >= 0)
     {
      int ind = (int)StringToInteger(sparam);
      
      //---
      closeOpenOrders(TradePairs[ind]);
      
      ObjectSetInteger(0, (string)ind + "CLOSE", OBJPROP_STATE, 0);
      ObjectSetString (0, (string)ind + "CLOSE", OBJPROP_TEXT, "CLOSE");
      
      return;
     } // exit if (StringFind(sparam,"CLOSE") >= 0)
    
    //---
    if (StringFind(sparam, "Pair") >= 0)
     {
      int ind = (int)StringToInteger(sparam);
      
      //---
      ObjectSetInteger(0, sparam, OBJPROP_STATE, 0);
      
      OpenChart(ind);
      
      return;
     } // exit if (StringFind(sparam, "Pair") >= 0)
   } // exit if (id == CHARTEVENT_OBJECT_CLICK)
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void buy_basket(string &pairs[])
 {
  int i;
  int ticket_ = 0;
  
  //---
  for (i = 0; i < ArraySize(pairs); i++)
   {
    ticket_ = OrderSend(pairs[i], OP_BUY, lot, MarketInfo(pairs[i], MODE_ASK), 100, 0, 0, NULL, Magic_Number, 0, clrNONE);
    
    if (OrderSelect(ticket_, SELECT_BY_TICKET) == true)
     {
      if (Pipsl != 0.0)
       stoploss = OrderOpenPrice() - Pipsl * pairinfo[i].PairPip;
      else
       if (Adr1sl != 0.0)
        stoploss = OrderOpenPrice() - ((adrvalues[i].adr10 / 100) * Adr1sl) * pairinfo[i].PairPip;
       else
        stoploss = 0.0;
      
      //---
      if (Piptp != 0.0)
       takeprofit = OrderOpenPrice() + Piptp * pairinfo[i].PairPip;
      else
       if (Adr1tp != 0.0)
        takeprofit = OrderOpenPrice() + ((adrvalues[i].adr10 / 100) * Adr1tp) * pairinfo[i].PairPip;
       else
        takeprofit = 0.0;
      
      //---
      if (OrderModify(ticket_, OrderOpenPrice(), NormalizeDouble(stoploss,   (int)MarketInfo(pairs[i], MODE_DIGITS)),
                                                 NormalizeDouble(takeprofit, (int)MarketInfo(pairs[i], MODE_DIGITS)), 0, clrBlue))
       continue;
     } // exit if (OrderSelect(ticket_, SELECT_BY_TICKET) == true)
   } // exit for (i = 0; i < ArraySize(pairs); i++)
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void sell_basket(string &pairs[])
 {
  int i;
  int ticket_ = 0;
  
  //---
  for (i = 0; i < ArraySize(pairs); i++)
   {
    ticket_ = OrderSend(pairs[i], OP_SELL, lot, MarketInfo(pairs[i], MODE_BID), 100, 0, 0, NULL, Magic_Number, 0, clrNONE);
    
    if (OrderSelect(ticket_, SELECT_BY_TICKET) == true)
     {
      if (Pipsl != 0.0)
       stoploss = OrderOpenPrice() + Pipsl * pairinfo[i].PairPip;
      else
       if (Adr1sl != 0.0)
        stoploss = OrderOpenPrice() + ((adrvalues[i].adr10 / 100) * Adr1sl) * pairinfo[i].PairPip;
       else
        stoploss = 0.0;
      
      //---
      if (Piptp != 0.0)
       takeprofit = OrderOpenPrice() - Piptp * pairinfo[i].PairPip;
      else
       if (Adr1tp != 0.0)
        takeprofit = OrderOpenPrice() - ((adrvalues[i].adr10 / 100) * Adr1tp) * pairinfo[i].PairPip;
       else
        takeprofit = 0.0;
      
      //---
      if (OrderModify(ticket_, OrderOpenPrice(), NormalizeDouble(stoploss,   (int)MarketInfo(pairs[i], MODE_DIGITS)),
                                                 NormalizeDouble(takeprofit, (int)MarketInfo(pairs[i], MODE_DIGITS)), 0, clrBlue))
       continue;
     } // exit if (OrderSelect(ticket_, SELECT_BY_TICKET) == true)
   } // exit for (i = 0; i < ArraySize(pairs); i++)
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void close_cur_basket(string &pairs[])
 {
  if (OrdersTotal() <= 0)
   return;
  
  //---
  int TradeList[][2];
  int ctTrade = 0;
  
  //---
  for (int i = 0; i < OrdersTotal(); i++)
   if (OrderSelect(i, SELECT_BY_POS))
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true         &&
       (OrderType()                                == 0            ||
        OrderType()                                == 1)           &&
        OrderMagicNumber()                         == Magic_Number && InArray(pairs, OrderSymbol())) 
     {
      ctTrade++;
      
      ArrayResize(TradeList, ctTrade);
      TradeList[ctTrade-1][0] = (int)OrderOpenTime();
      TradeList[ctTrade-1][1] = OrderTicket();
     } // exit if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && ...
  
  //---
  ArraySort(TradeList, WHOLE_ARRAY, 0, MODE_ASCEND);
  
  for (int i = 0; i < ctTrade; i++)
   {
    if (OrderSelect(TradeList[i][1], SELECT_BY_TICKET) == true)
     {
      if (OrderType() == 0)
       {
        ticket = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 100, clrNONE);
        
        if (ticket == -1)
         Print("Error: ", GetLastError());
       } // exit if (OrderType() == 0)
      
      if (OrderType() == 1)
       {
        ticket = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 100, clrNONE);
        
        if (ticket == -1)
         Print("Error: ", GetLastError());
       } // exit if (OrderType() == 1)
     } // exit if (OrderSelect(TradeList[i][1], SELECT_BY_TICKET) == true)
    
    Sleep(500);
   } // exit for (int i = 0; i < ctTrade; i++)
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//| CloseOpenOrders                                                  |
//+------------------------------------------------------------------+
void closeOpenOrders(string closecurr)
 {
  int cnt = 0;
  
  //---
  for (cnt = OrdersTotal()-1 ; cnt >= 0 ; cnt--)
   if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) == true)
    {
     if (OrderType()        == OP_BUY    &&
         OrderSymbol()      == closecurr &&
         OrderMagicNumber() == Magic_Number)
      ticket = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Violet);
     else
      if (OrderType()        == OP_SELL   &&
          OrderSymbol()      == closecurr &&
          OrderMagicNumber() == Magic_Number)
       ticket = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Violet);
      else
       if (OrderType() > OP_SELL) // pending orders
        ticket = OrderDelete(OrderTicket());
    } // exit if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) == true)
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void close_basket(int magic_number)
 {
  if (OrdersTotal() <= 0)
   return;
  
  //---
  int TradeList[][2];
  int ctTrade = 0;
  
  //---
  for (int i = 0; i < OrdersTotal(); i++)
   if (OrderSelect(i, SELECT_BY_POS))
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true &&
       (OrderType()                                == 0    ||
        OrderType()                                == 1)   &&
        OrderMagicNumber()                         == Magic_Number)
     {
      ctTrade++;
      
      ArrayResize(TradeList, ctTrade);
      
      TradeList[ctTrade - 1][0] = (int)OrderOpenTime();
      TradeList[ctTrade - 1][1] = OrderTicket();
     } // exit if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && ...
  
  //---
  ArraySort(TradeList, WHOLE_ARRAY, 0, MODE_ASCEND);
  
  for (int i = 0; i < ctTrade; i++)
   if (OrderSelect(TradeList[i][1], SELECT_BY_TICKET) == true)
    {
     if (OrderType() == 0)
      {
       ticket = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 3, Red);
       
       if (ticket == -1)
        Print("Error: ", GetLastError());
      } // exit if (OrderType() == 0)
     
     if (OrderType() == 1)
      {
       ticket = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 3, Red);
       
       if (ticket == -1)
        Print("Error: ", GetLastError());
      } // exit if (OrderType() == 1)
    } // exit if (OrderSelect(TradeList[i][1], SELECT_BY_TICKET) == true)
  
  //---
  for (int i = 0; i < ArraySize(TradePairs); i++)
   pairinfo[i].lastSignal = NOTHING;
  
  //---
  currentlock           = 0.0;
  lockdistance          = 0.0;
  SymbolMaxDD           = 0;
  SymbolMaxHi           = 0;
  PercentFloatingSymbol = 0;
  PercentMaxDDSymbol    = 0;
  
  trailstarted = false;
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void close_profit()
 {
  int cnt = 0;
  
  //---
  for (cnt = OrdersTotal()-1 ; cnt >= 0 ; cnt--)
   if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) == true)
    if (OrderProfit() > 0)
     {
      if (OrderType()        == OP_BUY &&
          OrderMagicNumber() == Magic_Number)
       ticket = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Violet);
      
      if (OrderType()        == OP_SELL &&
          OrderMagicNumber() == Magic_Number)
       ticket = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Violet);
      
      if (OrderType() > OP_SELL)
       ticket = OrderDelete(OrderTicket());
     } // exit if (OrderProfit() > 0)
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void close_loss()
 {
  int cnt = 0;
  
  //---
  for (cnt = OrdersTotal()-1 ; cnt >= 0 ; cnt--)
   if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) == true)
    if (OrderProfit() < 0)
     {
      if (OrderType()        == OP_BUY &&
          OrderMagicNumber() == Magic_Number)
       ticket = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Violet);
      
      if (OrderType()        == OP_SELL &&
          OrderMagicNumber() == Magic_Number)
       ticket = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Violet);
      
      if (OrderType() > OP_SELL)
       ticket = OrderDelete(OrderTicket());
     } // exit if (OrderProfit() < 0)
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void Reset_EA()
 {
  currentlock           = 0.0;
  lockdistance          = 0.0;
  SymbolMaxDD           = 0;
  SymbolMaxHi           = 0;
  PercentFloatingSymbol = 0;
  PercentMaxDDSymbol    = 0;
  
  trailstarted = false;
  
  OnInit();
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void Trades()
 {
  int i, j;
  
  //---
  totallots   = 0;
  totalprofit = 0;
  totaltrades = 0;
  
  //---
  for (i = 0; i < ArraySize(TradePairs); i++)
   {
    bpos   [i] = 0;
    spos   [i] = 0;
    blots  [i] = 0;
    slots  [i] = 0;
    bprofit[i] = 0;
    sprofit[i] = 0;
    tprofit[i] = 0;
   } // exit for (i = 0; i < ArraySize(TradePairs); i++)
  
  //---
  for (i = 0; i < OrdersTotal(); i++)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false)
     break;
    
    for (j = 0; j < ArraySize(TradePairs); j++)
     if ((TradePairs[j] == OrderSymbol() ||
          TradePairs[j] == "")           && OrderMagicNumber() == Magic_Number)
      {
       TradePairs[j] = OrderSymbol();
       tprofit   [j] = tprofit[j] + OrderProfit() + OrderSwap() + OrderCommission();
       
       //---
       if (OrderType() == 0)
        bprofit[j] += OrderProfit() + OrderSwap() + OrderCommission();
       
       if (OrderType() == 1)
        sprofit[j] += OrderProfit() + OrderSwap() + OrderCommission();
       
       if (OrderType() == 0)
        blots[j] += OrderLots();
       
       if (OrderType() == 1)
        slots[j] += OrderLots();
       
       if (OrderType() == 0)
        bpos[j] += +1;
       
       if (OrderType() == 1)
        spos[j] += +1;
       
       //---
       totallots = totallots + OrderLots();
       totaltrades++;
       totalprofit = totalprofit + OrderProfit() + OrderSwap() + OrderCommission();
       
       break;
      } // exit if ((TradePairs[j] == OrderSymbol() || ...
   } // exit for (i = 0; i < OrdersTotal(); i++)
  
  //---
  if (OrdersTotal() == 0)
   SetText("CTP", "No Trades To Monitor", x_axis + 225, y_axis - 47, Yellow, 8);
  else
   SetText("CTP", "Monitoring Trades", x_axis + 228, y_axis - 47, Yellow, 8);
  
  //---
  if (inSession() == true)
   SetText("CTPT", "Trading", x_axis + 99, y_axis - 48, Green, 9);
  else
   SetText("CTPT", "Closed", x_axis + 99, y_axis - 48, Red, 9);
  
  //---
//  SetPanel("TP6", 0, x_axis + 95, y_axis - 50, 100, 20, Black, White, 1);
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void OpenChart(int ind)
 {
  long nextchart = ChartFirst();
  
  //---
  do
   {
    string sym = ChartSymbol(nextchart);
    
    if (StringFind(sym, TradePairs[ind]) >= 0)
     {
      ChartSetInteger     (nextchart, CHART_BRING_TO_TOP, true);
      ChartSetSymbolPeriod(nextchart, TradePairs[ind],    TimeFrame);
      ChartApplyTemplate  (nextchart, usertemplate);
      
      return;
     } // exit if (StringFind(sym, TradePairs[ind]) >= 0)
   } while ((nextchart = ChartNext(nextchart)) != -1);
  
  //---
  long newchartid = ChartOpen(TradePairs[ind], TimeFrame);
  
  //---
  ChartApplyTemplate(newchartid, usertemplate);
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void TradeManager()
 {
  double AccBalance=AccountBalance();
  
  //---
  //--- Target
  if (Basket_Target > 0 && totalprofit >= Basket_Target)
   {
    profitbaskets++;
    close_basket(Magic_Number);
    
    return;
   } // exit if (Basket_Target > 0 && ...
  
  //--- StopLoss
  if (Basket_StopLoss > 0 && totalprofit < (0 - Basket_StopLoss))
   {
    lossbaskets++;
    close_basket(Magic_Number);
    
    return;
   } // exit if (Basket_StopLoss > 0 && ...
  
  //--- Out off session
  if (inSession() == false && totallots > 0.0 && CloseAllSession == true)
   {
    close_basket(Magic_Number);
    
    return;
   } // exit if (inSession() == false && ...
  
  //--- Profit lock stoploss
  if (currentlock != 0.0 && totalprofit < currentlock)
   {
    profitbaskets++;
    close_basket(Magic_Number);
    
    return;
   } // exit if (currentlock != 0.0 && ...
  
  //--- Profit lock trail
  if (trailstarted == true && totalprofit > currentlock + lockdistance)
   currentlock = totalprofit - lockdistance;
  
  //---
  //--- Lock in profit 1
  if (BasketP1 != 0.0 &&
      BasketL1 != 0.0 && currentlock < BasketL1)
   {
    if (totalprofit > BasketP1)
     currentlock = BasketL1;
    
    if (BasketP2 == 0.0 && TrailLastLock == true)
     {
      trailstarted = true;
      
      if (TrailDistance != 0.0)
       lockdistance = BasketP1 - TrailDistance;
      else
       lockdistance = BasketL1;
     } // exit if (BasketP2 == 0.0 && ...
   } // exit if (BasketP1 != 0.0 && ...
  
  //--- Lock in profit 2
  if (BasketP2 != 0.0 &&
      BasketL2 != 0.0 && currentlock < BasketL2)
   {
    if (totalprofit > BasketP2)
     currentlock = BasketL2;
    
    if (BasketP3 == 0.0 && TrailLastLock == true)
     {
      trailstarted = true;
      
      if (TrailDistance != 0.0)
       lockdistance = BasketP2 - TrailDistance;
      else
       lockdistance = BasketL2;
     } // exit if (BasketP3 == 0.0 && ...
   } // exit if (BasketP2 != 0.0 && ...
  
  //--- Lock in profit 3
  if (BasketP3 != 0.0 &&
      BasketL3 != 0.0 && currentlock < BasketL3)
   {
    if (totalprofit > BasketP3)
     currentlock = BasketL3;
    
    if (BasketP4 == 0.0 && TrailLastLock == true)
     {
      trailstarted = true;
      
      if (TrailDistance != 0.0)
       lockdistance = BasketP3 - TrailDistance;
      else
       lockdistance = BasketL3;
     } // exit if (BasketP4 == 0.0 && ...
   } // exit if (BasketP3 != 0.0 && ...
  
  //--- Lock in profit 4
  if (BasketP4 != 0.0 &&
      BasketL4 != 0.0 && currentlock < BasketL4)
   {
    if (totalprofit > BasketP4)
     currentlock = BasketL4;
    
    if (BasketP5 == 0.0 && TrailLastLock == true)
     {
      trailstarted = true;
      
      if (TrailDistance != 0.0)
       lockdistance = BasketP4 - TrailDistance;
      else
       lockdistance = BasketL4;
     } // exit if (BasketP5 == 0.0 && ...
   } // exit if (BasketP4 != 0.0 && ...
  
  //- Lock in profit 5
  if (BasketP5 != 0.0 &&
      BasketL5 != 0.0 && currentlock < BasketL5)
   {
    if (totalprofit > BasketP5)
     currentlock = BasketL5;
    
    if (BasketP6 == 0.0 && TrailLastLock == true)
     {
      trailstarted = true;
      
      if (TrailDistance != 0.0)
       lockdistance = BasketP5 - TrailDistance;
      else
       lockdistance = BasketL5;
     } // exit if (BasketP6 == 0.0 && ...
   } // exit if (BasketP5 != 0.0 && ...
  
  //--- Lock in profit 6
  if (BasketP6 != 0.0 &&
      BasketL6 != 0.0 && currentlock < BasketL6)
   {
    if (totalprofit > BasketP6)
     currentlock = BasketL6;
    
    if (TrailLastLock == true)
     {
      trailstarted = true;
      
      if (TrailDistance != 0.0)
       lockdistance = BasketP6 - TrailDistance;
      else
       lockdistance = BasketL6;
     } // exit if (TrailLastLock == true)
   } // exit if (BasketP6 != 0.0 && ...
  
  //---
  if (totalprofit <= SymbolMaxDD)
   {
    SymbolMaxDD      = totalprofit;
    GetBalanceSymbol = AccBalance;
   } // exit if (totalprofit <= SymbolMaxDD)
  
  if (GetBalanceSymbol != 0)
   PercentMaxDDSymbol = (SymbolMaxDD * 100) / GetBalanceSymbol;
  
  //---
  if (totalprofit >= SymbolMaxHi)
   {
    SymbolMaxHi      = totalprofit;
    GetBalanceSymbol = AccBalance;
   } // exit if (totalprofit >= SymbolMaxHi)
  
  if(GetBalanceSymbol != 0)
   PercentFloatingSymbol = (SymbolMaxHi * 100) / GetBalanceSymbol;
  
  //---
  ObjectSetText("Lowest",  "Lowest = "  + DoubleToStr(SymbolMaxDD, 2) + " (" + DoubleToStr(PercentMaxDDSymbol,    2) + "%)", 8, NULL, BearColor);
  ObjectSetText("Highest", "Highest = " + DoubleToStr(SymbolMaxHi, 2) + " (" + DoubleToStr(PercentFloatingSymbol, 2) + "%)", 8, NULL, BullColor);
  ObjectSetText("Lock",    "Lock = "    + DoubleToStr(currentlock, 2),                                                       8, NULL, BullColor);
  
  ObjectSetText("Won",  IntegerToString(profitbaskets, 2), 8, NULL, BullColor);
  ObjectSetText("Lost", IntegerToString(lossbaskets,   2), 8, NULL, BearColor);
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void PlotTrades()
 {
  for (int i = 0; i < ArraySize(TradePairs); i++)
   {
    if (blots[i] > 0)
     LotColor = Orange;
    
    if (blots[i] == 0)
     LotColor = C'61, 61, 61';
    
    //---
    if (slots[i] > 0)
     LotColor1 = Orange;
    
    if (slots[i] == 0)
     LotColor1 = C'61, 61, 61';
    
    //---
    if (bpos[i] > 0)
     OrdColor = DodgerBlue;
    
    if (bpos[i] == 0)
     OrdColor = C'61, 61, 61';
    
    //---
    if (spos[i] > 0)
     OrdColor1 = DodgerBlue;
    
    if (spos[i] == 0)
     OrdColor1 = C'61, 61, 61';
    
    //---
    if (bprofit[i] > 0)
     ProfitColor = BullColor;
    
    if (bprofit[i] < 0)
     ProfitColor = BearColor;
    
    if (bprofit[i] == 0)
     ProfitColor = C'61, 61, 61';
    
    //---
    if (sprofit[i] > 0)
     ProfitColor2 = BullColor;
    
    if (sprofit[i] < 0)
     ProfitColor2 = BearColor;
    
    if (sprofit[i] == 0)
     ProfitColor2 = C'61, 61, 61';
    
    //---
    if (tprofit[i] > 0)
     ProfitColor3 = BullColor;
    
    if (tprofit[i] < 0)
     ProfitColor3 = BearColor;
    
    if (tprofit[i] == 0)
     ProfitColor3 = C'61, 61, 61';
    
    //---
    if (totalprofit > 0)
     ProfitColor1 = BullColor;
    
    if (totalprofit < 0)
     ProfitColor1 = BearColor;
    
    if (totalprofit == 0)
     ProfitColor1 = clrWhite;
    
    //---
    ObjectSetText("bLots" + IntegerToString(i), DoubleToStr(blots[i], 2), 8, NULL, LotColor);
    ObjectSetText("sLots" + IntegerToString(i), DoubleToStr(slots[i], 2), 8, NULL, LotColor1);
    
    ObjectSetText("bPos" + IntegerToString(i), DoubleToStr(bpos[i],  0), 8, NULL, OrdColor);
    ObjectSetText("sPos" + IntegerToString(i), DoubleToStr(spos[i],  0), 8, NULL, OrdColor1);
    
    ObjectSetText("TProf"   + IntegerToString(i), DoubleToStr(MathAbs(bprofit[i]), 2), 8, NULL, ProfitColor);
    ObjectSetText("SProf"   + IntegerToString(i), DoubleToStr(MathAbs(sprofit[i]), 2), 8, NULL, ProfitColor2);
    ObjectSetText("TtlProf" + IntegerToString(i), DoubleToStr(MathAbs(tprofit[i]), 2), 8, NULL, ProfitColor3);
    
    ObjectSetText("TotProf", DoubleToStr(MathAbs(totalprofit), 2), 8, NULL, ProfitColor1);
   } // exit for (int i = 0; i < ArraySize(TradePairs); i++)
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void PlotAdrValues()
 {
  for (int i = 0; i < ArraySize(TradePairs); i++)
   ObjectSetText("S1" + IntegerToString(i), DoubleToStr(adrvalues[i].adr, 0), 8, NULL, Yellow);
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
bool inSession()
 {
  if ((localday != TimeDayOfWeek(TimeLocal()) && s1active == false &&
                                                 s2active == false &&
                                                 s3active == false) || localday == 99)
   {
    TimeToStruct(TimeLocal(), sess);
    
    //---
    StringSplit(sess1start, ':', strspl);
    
    sess.hour = (int)strspl[0];
    sess.min  = (int)strspl[1];
    sess.sec  = 0;
    
    s1start = StructToTime(sess);
    
    //---
    StringSplit(sess1end, ':', strspl);
    
    sess.hour = (int)strspl[0];
    sess.min  = (int)strspl[1];
    sess.sec  = 0;
    
    s1end = StructToTime(sess);
    
    //---
    StringSplit(sess2start, ':', strspl);
    
    sess.hour = (int)strspl[0];
    sess.min  = (int)strspl[1];
    sess.sec  = 0;
    
    s2start = StructToTime(sess);
    
    //---
    StringSplit(sess2end, ':', strspl);
    
    sess.hour = (int)strspl[0];
    sess.min  = (int)strspl[1];
    sess.sec  = 0;
    
    s2end = StructToTime(sess);
    
    //---
    StringSplit(sess3start, ':', strspl);
    
    sess.hour = (int)strspl[0];
    sess.min  = (int)strspl[1];
    sess.sec  = 0;
    
    s3start = StructToTime(sess);
    
    //---
    StringSplit(sess3end, ':', strspl);
    
    sess.hour = (int)strspl[0];
    sess.min  = (int)strspl[1];
    sess.sec  = 0;
    
    s3end = StructToTime(sess);
    
    //---
    if (s1end < s1start)
     s1end += 24 * 60 * 60;
    
    if (s2end < s2start)
     s2end += 24 * 60 * 60;
    
    if (s3end < s3start)
     s3end += 24 * 60 * 60;
    
    //---
    newSession();
    
    localday = TimeDayOfWeek(TimeLocal());
    
    Print("Sessions for today");
    
    //---
    if (UseSession1 == true)
     Print("Session 1 From: " + (string)s1start + " until " + (string)s1end);
    
    if (UseSession2 == true)
     Print("Session 2 From: " + (string)s2start + " until " + (string)s2end);
    
    if (UseSession3 == true)
     Print("Session 3 From :" + (string)s3start + " until " + (string)s3end);
   } // exit if ((localday != TimeDayOfWeek(TimeLocal()) && ...
  
  //---
  if (UseSession1 && TimeLocal() >= s1start &&
                     TimeLocal() <= s1end)
   {
    comment = sess1comment;
    
    if (s1active == false)
     newSession();
    else
     if ((StopProfit != 0 && profitbaskets >= StopProfit) ||
         (StopLoss   != 0 && lossbaskets   >= StopLoss))
      return(false);
    
    s1active = true;
    return(true);
   } // exit if (UseSession1 && ...
  else 
   s1active = false;
  
  //---
  if (UseSession2 && TimeLocal() >= s2start &&
                     TimeLocal() <= s2end)
   {
    comment = sess2comment;
    
    if (s2active == false)
     newSession();
    else
     if ((StopProfit != 0 && profitbaskets >= StopProfit) ||
         (StopLoss   != 0 && lossbaskets   >= StopLoss))
      return(false);
    
    s2active = true;
    return(true);
   } // exit if (UseSession2 && ...
  else
   s2active = false;
  
  //---
  if (UseSession3 && TimeLocal() >= s3start &&
                     TimeLocal() <= s3end)
   {
    comment = sess3comment;
    
    if (s3active == false)
     newSession();
    else
     if ((StopProfit != 0 && profitbaskets >= StopProfit) ||
         (StopLoss   != 0 && lossbaskets   >= StopLoss))
      return(false);
    
    s3active = true;
    return(true);
   } // exit if (UseSession3 && ...
  else
   s3active = false;
  
  //-------------------------
  return(false);
 }
//-------------------------------------------------------------------------------------------------
void newSession()
 {
  profitbaskets         = 0;
  lossbaskets           = 0;
  SymbolMaxDD           = 0.0;
  PercentMaxDDSymbol    = 0.0;
  SymbolMaxHi           = 0.0;
  PercentFloatingSymbol = 0.0;
  currentlock           = 0.0;
  lockdistance          = 0.0;
  
  trailstarted = false;
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void ChngBoxCol(int mVal, int mBx)
 {
  if (mVal >= 0 &&
      mVal <  10)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, White);
  
  if (mVal > 10 &&
      mVal < 20)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, LightCyan);
  
  if (mVal > 20 &&
      mVal < 30)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, PowderBlue);
  
  if (mVal > 30 &&
      mVal < 40)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, PaleTurquoise);
  
  if (mVal > 40 &&
      mVal < 50)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, LightBlue);
  
  if (mVal > 50 &&
      mVal < 60)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, SkyBlue);
  
  if (mVal > 60 &&
      mVal < 70)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, Turquoise);
  
  if (mVal > 70 &&
      mVal < 80)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, DeepSkyBlue);
  
  if (mVal > 80 &&
      mVal < 90)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, SteelBlue);
  
  if (mVal > 90 &&
      mVal < 100)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, Blue);
  
  if (mVal > 100)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, MediumBlue);
  
  //---
  if (mVal < 0 &&
      mVal > -10)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, White);
  
  if (mVal < -10 &&
      mVal > -20)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, Seashell);
  
  if (mVal < -20 &&
      mVal > -30)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, MistyRose);
  
  if (mVal < -30 &&
      mVal > -40)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, Pink);
  
  if (mVal < -40 &&
      mVal > -50)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, LightPink);
  
  if (mVal < -50 &&
      mVal > -60)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, Plum);
  
  if (mVal < -60 &&
      mVal >-70)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, Violet);
  
  if (mVal < -70 &&
      mVal > -80)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, Orchid);
  
  if (mVal < -80 &&
      mVal > -90)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, DeepPink);
  
  if (mVal < -90)
   ObjectSet("HM1" + (string)mBx, OBJPROP_BGCOLOR, Red);
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
bool InArray(string &pairs[], string symbol)
 {
  int arraysize = ArraySize(pairs);
  int i;
  
  //---
  if (arraysize <= 0)
   return(false);
  
  if (symbol == NULL)
   return(false);
  
  //---
  for (i = 0; i < arraysize; i++)
   if (pairs[i] == symbol)
    return(true);
  
  //-------------------------
  return(false);
 }
//-------------------------------------------------------------------------------------------------
void PlotSpreadPips()
 {
  for (int i = 0; i < ArraySize(TradePairs); i++)
   {
    if (MarketInfo(TradePairs[i], MODE_POINT) != 0 && pairinfo[i].pipsfactor != 0)
     {
      pairinfo[i].Pips     = (iClose(TradePairs[i], PERIOD_D1,                      0) - iOpen(TradePairs[i], PERIOD_D1, 0)) / MarketInfo(TradePairs[i], MODE_POINT) / pairinfo[i].pipsfactor;
      pairinfo[i].Pipsprev = (iClose(TradePairs[i], PERIOD_D1, signals[i].shift + 900) - iOpen(TradePairs[i], PERIOD_D1, 0)) / MarketInfo(TradePairs[i], MODE_POINT) / pairinfo[i].pipsfactor;
      
      pairinfo[i].Spread = MarketInfo(TradePairs[i], MODE_SPREAD) / pairinfo[i].pipsfactor;
      
      if (iClose(TradePairs[i], trigger_TF_HM1, 1) != 0)
       signals[i].Signalperc = (iClose(TradePairs[i], 1, 0) - iClose(TradePairs[i], trigger_TF_HM1, 1)) / iClose(TradePairs[i], trigger_TF_HM1, 1) * 100;
     } // exit if (MarketInfo(TradePairs[i], MODE_POINT) != 0 && ...
    
    //---
    if (pairinfo[i].Pips > 0)
     PipsColor = BullColor;
    
    if (pairinfo[i].Pips < 0)
     PipsColor = BearColor;
    
    if (pairinfo[i].Pips == 0)
     PipsColor = clrWhite;
    
    //---
    if (pairinfo[i].Spread > MaxSpread)
     ObjectSetText("Spr1" + IntegerToString(i), DoubleToStr(pairinfo[i].Spread, 1), 8, NULL, Red);
    else
     ObjectSetText("Spr1" + IntegerToString(i), DoubleToStr(pairinfo[i].Spread, 1), 8, NULL, Orange);
    
    ObjectSetText("Pp1" + IntegerToString(i), DoubleToStr(MathAbs(pairinfo[i].Pips), 0), 8, NULL, PipsColor);
    
    if (pairinfo[i].Pips > pairinfo[i].Pipsprev)
     pairinfo[i].PipsSig = UP;
    else
     if (pairinfo[i].Pips < pairinfo[i].Pipsprev)
      pairinfo[i].PipsSig = DOWN;
   } // exit for (int i = 0; i < ArraySize(TradePairs); i++)
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
 void GetAdrValues()
 {
  double s = 0.0;
  
  //---
  for (int i = 0; i < ArraySize(TradePairs); i++)
   {
    for(int a = 1; a <= 20; a++)
     {
      if (pairinfo[i].PairPip != 0)
       s = s + (iHigh(TradePairs[i], PERIOD_D1, a) - iLow(TradePairs[i], PERIOD_D1, a)) / pairinfo[i].PairPip;
      
      if (a == 1)
       adrvalues[i].adr1 = MathRound(s);
      
      if (a == 5)
       adrvalues[i].adr5 = MathRound(s / 5);
      
      if (a == 10)
       adrvalues[i].adr10 = MathRound(s / 10);
      
      if (a == 20)
       adrvalues[i].adr20 = MathRound(s / 20);
     } // exit for(int a = 1; a <= 20; a++)
    
    adrvalues[i].adr = MathRound((adrvalues[i].adr1 + adrvalues[i].adr5 + adrvalues[i].adr10 + adrvalues[i].adr20) / 4.0);
    s                = 0.0;
   } // exit for (int i = 0; i < ArraySize(TradePairs); i++)
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
void GetSignals()
 {
  int cnt = 0;
  
  //---
  ArrayResize(signals, ArraySize(TradePairs));
  
  for (int i = 0; i < ArraySize(signals); i++)
   {
    signals[i].symbol  = TradePairs[i];
    signals[i].point   = MarketInfo(signals[i].symbol, MODE_POINT);
    signals[i].open    = iOpen (signals[i].symbol, PERIOD_D1, 0);
    signals[i].close   = iClose(signals[i].symbol, PERIOD_D1, 0);
    signals[i].hi      = MarketInfo(signals[i].symbol, MODE_HIGH);
    signals[i].lo      = MarketInfo(signals[i].symbol, MODE_LOW);
    signals[i].bid     = MarketInfo(signals[i].symbol, MODE_BID);
    signals[i].range   = (signals[i].hi - signals[i].lo);
    signals[i].shift   = iBarShift(signals[i].symbol, PERIOD_M1, TimeCurrent() - 1800);
    signals[i].prevbid = iClose   (signals[i].symbol, PERIOD_M1, signals[i].shift);
    
    //---
    if (signals[i].range != 0)
     {
      signals[i].ratio     = MathMin(((signals[i].bid     - signals[i].lo) / signals[i].range * 100), 100);
      signals[i].prevratio = MathMin(((signals[i].prevbid - signals[i].lo) / signals[i].range * 100), 100);
      
      for (int j = 0; j < 8; j++)
       {
        if (signals[i].ratio <= 3.0)
         signals[i].fact = 0;
        
        if (signals[i].ratio > 3.0)
         signals[i].fact = 1;
        
        if (signals[i].ratio > 10.0)
         signals[i].fact = 2;
        
        if (signals[i].ratio > 25.0)
         signals[i].fact = 3;
        
        if (signals[i].ratio > 40.0)
         signals[i].fact = 4;
        
        if (signals[i].ratio > 50.0)
         signals[i].fact = 5;
        
        if (signals[i].ratio > 60.0)
         signals[i].fact = 6;
        
        if (signals[i].ratio > 75.0)
         signals[i].fact = 7;
        
        if (signals[i].ratio > 90.0)
         signals[i].fact = 8;
        
        if (signals[i].ratio > 97.0)
         signals[i].fact = 9;
        
        //---
        cnt++;
        
        if (curr[j] == StringSubstr(signals[i].symbol, 3, 3))
         signals[i].fact = 9 - signals[i].fact;
        
        if (curr[j] == StringSubstr(signals[i].symbol, 0, 3))
         signals[i].strength1 = signals[i].fact;
        else
         if (curr[j] == StringSubstr(signals[i].symbol, 3, 3))
          signals[i].strength2 = signals[i].fact;
        
        //---
        signals[i].calc     = signals[i].strength1 - signals[i].strength2;
        signals[i].strength = currency_strength(curr[j]);
        
        if (curr[j] == StringSubstr(signals[i].symbol, 0, 3))
         signals[i].strength3 = signals[i].strength;
        else
         if (curr[j] == StringSubstr(signals[i].symbol, 3, 3))
          signals[i].strength4 = signals[i].strength;
        
        //---
        signals[i].strength5    = (signals[i].strength3 - signals[i].strength4);
        signals[i].strength_old = old_currency_strength(curr[j]);
        
        if (curr[j] == StringSubstr(signals[i].symbol, 0, 3))
         signals[i].strength6 = signals[i].strength_old;
        else
         if (curr[j] == StringSubstr(signals[i].symbol, 3, 3))
          signals[i].strength7 = signals[i].strength_old;
        
        //---
        signals[i].strength8    = (signals[i].strength6 - signals[i].strength7);
        signals[i].strength_Gap = signals[i].strength5  - signals[i].strength8;
        
        if (signals[i].ratio >= trigger_buy_bidratio)
         signals[i].SigRatio = UP;
        else
         if (signals[i].ratio <= trigger_sell_bidratio)
          signals[i].SigRatio = DOWN;
        
        //---
        if (signals[i].ratio > signals[i].prevratio)
         signals[i].SigRatioPrev = UP;
        else
         if (signals[i].ratio < signals[i].prevratio)
          signals[i].SigRatioPrev = DOWN;
        
        //---
        if (signals[i].calc >= trigger_buy_relstrength)
         signals[i].SigRelStr = UP;
        else
         if (signals[i].calc <= trigger_sell_relstrength)
          signals[i].SigRelStr = DOWN;
        
        //---
        if (signals[i].strength5 >= trigger_buy_buysellratio)
         signals[i].SigBSRatio = UP;
        else
         if (signals[i].calc <= trigger_sell_buysellratio)
          signals[i].SigBSRatio = DOWN;
        
        //---
        if (signals[i].strength_Gap >= trigger_gap_buy)
         signals[i].SigGap = UP;
        else
         if (signals[i].strength_Gap <= trigger_gap_sell)
          signals[i].SigGap = DOWN;
        
        //---
        if (signals[i].strength5 > signals[i].strength8)
         signals[i].SigGapPrev = UP;
        else
         if (signals[i].strength5 < signals[i].strength8)
          signals[i].SigGapPrev = DOWN;
       } // exit for (int j = 0; j < 8; j++)
     } // exit if (signals[i].range != 0)
   } // exit for (int i = 0; i < ArraySize(signals); i++)
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
color Colorstr(double tot)
 {
  if (tot >= trigger_buy_bidratio)
   return(BullColor);
  
  if (tot <= trigger_sell_bidratio)
   return(BearColor);
  
  //-------------------------
  return(clrOrange);
 }
//-------------------------------------------------------------------------------------------------
color ColorBSRat(double tot)
 {
  if (tot >= trigger_buy_buysellratio)
   return(BullColor);
  
  if (tot <= trigger_sell_buysellratio)
   return(BearColor);
  
  //-------------------------
  return(clrOrange);
 }
//-------------------------------------------------------------------------------------------------
color ColorGap(double tot)
 {
  if (tot >= trigger_gap_buy)
   return(BullColor);
  
  if (tot <= trigger_gap_sell)
   return(BearColor);
  
  //-------------------------
  return(clrOrange);
 }
//-------------------------------------------------------------------------------------------------
void displayMeter()
 {
  double arrt[8][3];
  
  int arr2, arr3;
  
  //---
  arrt[0][0] = currency_strength(curr[0]);
  arrt[1][0] = currency_strength(curr[1]);
  arrt[2][0] = currency_strength(curr[2]);
  arrt[3][0] = currency_strength(curr[3]);
  arrt[4][0] = currency_strength(curr[4]);
  arrt[5][0] = currency_strength(curr[5]);
  arrt[6][0] = currency_strength(curr[6]);
  arrt[7][0] = currency_strength(curr[7]);
  
  arrt[0][2] = old_currency_strength(curr[0]);
  arrt[1][2] = old_currency_strength(curr[1]);
  arrt[2][2] = old_currency_strength(curr[2]);
  arrt[3][2] = old_currency_strength(curr[3]);
  arrt[4][2] = old_currency_strength(curr[4]);
  arrt[5][2] = old_currency_strength(curr[5]);
  arrt[6][2] = old_currency_strength(curr[6]);
  arrt[7][2] = old_currency_strength(curr[7]);
  
  arrt[0][1] = 0;
  arrt[1][1] = 1;
  arrt[2][1] = 2;
  arrt[3][1] = 3;
  arrt[4][1] = 4;
  arrt[5][1] = 5;
  arrt[6][1] = 6;
  arrt[7][1] = 7;
  
  //---
  ArraySort(arrt, WHOLE_ARRAY, 0, MODE_DESCEND);
  
  for (int m = 0; m < 8; m++)
   {
    arr2 = (int)arrt[m][1];
    arr3 = (int)arrt[m][2];
    
    currstrength[m] = arrt[m][0];
    prevstrength[m] = arrt[m][2];
    
    SetText(curr[arr2] + "pos",     IntegerToString(m + 1) + ".", x_axis + 595, (m * 18) + y_axis + 17, color_for_profit(arrt[m][0]), 12);
    SetText(curr[arr2] + "curr",    curr[arr2],                   x_axis + 610, (m * 18) + y_axis + 17, color_for_profit(arrt[m][0]), 12);
    SetText(curr[arr2] + "currdig", DoubleToStr(arrt[m][0], 1),   x_axis + 650, (m * 18) + y_axis + 17, color_for_profit(arrt[m][0]), 12);
//    SetText(curr[arr2] + "currdig", DoubleToStr(ratio[m][0], 1),  x_axis + 280, (m * 18) + y_axis + 17, color_for_profit(arrt[m][0]), 12);
    
    if (currstrength[m] > prevstrength[m])
     SetObjText("Sdir" + IntegerToString(m), CharToStr(233), x_axis + 680, (m * 18) + y_axis + 17, BullColor, 12);
    else
     if (currstrength[m] < prevstrength[m])
      SetObjText("Sdir" + IntegerToString(m), CharToStr(234), x_axis + 680, (m * 18) + y_axis + 17, BearColor, 12);
     else
      SetObjText("Sdir" + IntegerToString(m), CharToStr(243), x_axis + 680, (m * 18) + y_axis + 17, clrYellow, 12);
   } // exit for (int m = 0; m < 8; m++)
  
  ChartRedraw();
  
  //-------------------------
  return;
 }
//-------------------------------------------------------------------------------------------------
color color_for_profit(double total)
 {
  if (total < 2.0)
   return(clrRed);
  
  if (total <= 3.0)
   return(clrOrangeRed);
  
  if (total > 7.0)
   return(clrLime);
  
  if (total > 6.0)
   return(clrGreen);
  
  if (total > 5.0)
   return(clrSandyBrown);
  
  if (total <= 5.0)
   return(clrYellow);
  
  //-------------------------
  return(clrSteelBlue);
 }
//-------------------------------------------------------------------------------------------------
double currency_strength(string pair)
 {
  int fact;
  int cnt1 = 0;
  
  string sym;
  
  double range;
  double ratio;
  double strength = 0;
  
  //---
  for (int x = 0; x < ArraySize(TradePairs); x++)
   {
    fact = 0;
    sym  = TradePairs[x];
    
    if (pair == StringSubstr(sym, 0, 3) ||
        pair == StringSubstr(sym, 3, 3))
     {
//      sym   = sym + tempsym;
      range = (MarketInfo(sym, MODE_HIGH) - MarketInfo(sym, MODE_LOW));
      
      if (range != 0.0)
       {
        ratio = 100.0 * ((MarketInfo(sym, MODE_BID) - MarketInfo(sym, MODE_LOW)) / range );
        
        //---
        if (ratio > 3.0)
         fact = 1;
        
        if (ratio > 10.0)
         fact = 2;
        
        if (ratio > 25.0)
         fact = 3;
        
        if (ratio > 40.0)
         fact = 4;
        
        if (ratio > 50.0)
         fact = 5;
        
        if (ratio > 60.0)
         fact = 6;
        
        if (ratio > 75.0)
         fact = 7;
        
        if (ratio > 90.0)
         fact = 8;
        
        if (ratio > 97.0)
         fact = 9;
        
        //---
        cnt1++;
        
        if (pair == StringSubstr(sym, 3, 3))
         fact = 9 - fact;
        
        strength            += fact;
//        signals[x].strength += fact;
       } // exit if (range != 0.0)
     } // exit if (pair == StringSubstr(sym, 0, 3) || ...
   } // exit for (int x = 0; x < ArraySize(TradePairs); x++)
  
  //---
  /*
  for (int x = 0; x < ArraySize(TradePairs); x++)
   if (cnt1 != 0)
    signals[x].strength /= cnt1;
  */
  
  if (cnt1 != 0)
   strength /= cnt1;
  
  //-------------------------
  return(strength);
 }
//-------------------------------------------------------------------------------------------------
double old_currency_strength(string pair)
 {
  int fact;
  int cnt1 = 0;
  
  string sym;
  
  double range;
  double ratio;
  double strength = 0;
  
  //---
  for (int x = 0; x < ArraySize(TradePairs); x++)
   {
    fact = 0;
    sym  = TradePairs[x];
    
    //---
    int bar = iBarShift(TradePairs[x], PERIOD_M1, TimeCurrent() - 1800);
    
    double prevbid = iClose(TradePairs[x], PERIOD_M1, bar);
    
    //---
    if (pair == StringSubstr(sym, 0, 3) ||
        pair == StringSubstr(sym, 3, 3))
     {
//      sym   = sym + tempsym;
      range = (MarketInfo(sym, MODE_HIGH) - MarketInfo(sym, MODE_LOW));
      
      if (range != 0.0)
       {
        ratio = 100.0 * ((prevbid - MarketInfo(sym, MODE_LOW)) / range);
        
        if (ratio > 3.0)
         fact = 1;
        
        if (ratio > 10.0)
         fact = 2;
        
        if (ratio > 25.0)
         fact = 3;
        
        if (ratio > 40.0)
         fact = 4;
        
        if (ratio > 50.0)
         fact = 5;
        
        if (ratio > 60.0)
         fact = 6;
        
        if (ratio > 75.0)
         fact = 7;
        
        if (ratio > 90.0)
         fact = 8;
        
        if (ratio > 97.0)
         fact = 9;
        
        //---
        cnt1++;
        
        if (pair == StringSubstr(sym, 3, 3))
         fact = 9 - fact;
        
        strength += fact;
       } // exit if (range != 0.0)
     } // exit if (pair == StringSubstr(sym, 0, 3) || ...
   } // exit for (int x = 0; x < ArraySize(TradePairs); x++)
  
  //---
  if (cnt1 != 0)
   strength /= cnt1;
  
  //-------------------------
  return(strength);
 }
//-------------------------------------------------------------------------------------------------
color Colorsync(double tot)
 {
  if (tot >= trigger_buy_relstrength)
   return(BullColor);
  
  if (tot <= trigger_sell_relstrength)
   return(BearColor);
  
  //-------------------------
  return(clrOrange);
 }
//-------------------------------------------------------------------------------------------------