//+------------------------------------------------------------------+
//|                                          SIXTHS Dashboard SQ.mq4 |
//+------------------------------------------------------------------+


/* Multi-pair SIXTHS Levels Displayer
*/


#property copyright "by Squalou"
#property indicator_chart_window
#property indicator_buffers 0

#define up "Up"
#define down "Down"
#define flat "Flat"

#define IND_RANGE 100

extern string  PairsToTrade = "EURUSD,GBPUSD,USDJPY,GBPJPY,EURJPY,EURGBP,USDCHF,EURCHF,CHFJPY,AUDCAD,AUDCHF,AUDNZD,AUDJPY,AUDUSD,CADCHF,CADJPY,EURAUD,EURCAD,EURNZD,GBPCHF,NZDUSD,NZDJPY,USDCAD";

//extern bool TwelvesMode = false; // use 12 lines instead of 6
//extern double blue    = 0;
extern double gold    = 16.6666;
extern double green   = 33.3333;
extern double middle  = 50.0;
extern string objPrefix = "SIXTHS Dashboard SQ";
extern int Xgap = 10;
extern int Ygap = 24;

int H1bars = 0;

//Pair extraction
string         InputString;//Holds the contents PairsToTrade for tidying yp etc
int            NoOfPairs;// Holds the number of pairs passed by the user via the inputs screen
string         TradePair[]; //Array to hold the pairs traded by the user
double         BarsPair[]; //Array to hold the number of Bars for the SIXTHS Lines for each pair

string strPair;
int bars;

//+------------------------------------------------------------------+
int init()
//+------------------------------------------------------------------+
{
  IndicatorShortName("SIXTHS Floating Lines Multi-Pair Summary");
   
  RemoveObjects(objPrefix);

  //Plot Heading line
  drawFixedLbl(objPrefix+".title", "SIXTHS Levels and short-term Trend:", 0, Xgap, Ygap, 10, "Arial Black", Black, true);
  Ygap+=12;
  
/*  if (TwelvesMode) {
    //blue   = 100*0.0/6;
    gold   = 100*1.0/6;
    green  = 100*1.75/6;
    middle = 100*2.5/6;
  }
*/
  
   //Extract the pairs traded by the user
   // Cleanup first
   InputString=PairsToTrade;
   CleanUpInputString();
   
   // Extract the number of paraaters passed by the user
   CalculatePairsPassed();
   //Print(NoOfPairs+" pairs");
   
   string AddChar = StringSubstr(Symbol(),6,4);
   
   // Resize the arrays appropriately
   ArrayResize(TradePair, NoOfPairs);
   ArrayResize(BarsPair, NoOfPairs);
   
   int Index = 0;//For searching InputString
   int LastIndex = 0;//Points the the most recent Index
   for (int cc = 0; cc < NoOfPairs; cc ++)
   {
      Index = StringFind(InputString, ",",LastIndex);
      if (Index > -1)
      {
         TradePair[cc] = StringSubstr(InputString, LastIndex,Index-LastIndex);
         TradePair[cc] = StringTrimLeft(TradePair[cc]);
         TradePair[cc] = StringTrimRight(TradePair[cc]);
         TradePair[cc] = StringConcatenate(TradePair[cc], AddChar);
         
         BarsPair[cc] = SixthsBarCount (TradePair[cc], H1bars);
         //Print (TradePair[cc]+":"+BarsPair[cc]+" bars");
         
         LastIndex = Index+1;         
      }//if (Index > -1)            
   }//for (int cc; cc<NoOfPairs; cc ++)

   
   start();
//----
   return(0);
  }

//+------------------------------------------------------------------+
int deinit()
//+------------------------------------------------------------------+
  {
//----
    Comment("");
    ObjectsDeleteAll(0, OBJ_LABEL);
    return(0);

//----
   return(0);
  }

//+------------------------------------------------------------------+
int start()
//+------------------------------------------------------------------+
{
  static datetime lastTime=0;
  if (TimeCurrent()-lastTime < 10 ) return; // update every 10s
  lastTime = TimeCurrent();

  //loop on all Pairs
  for (int cc = 0; cc < NoOfPairs; cc++)
  {
    string symbol = TradePair[cc];
    int bars = BarsPair[cc];
    double base,range,level=0;
    string strlevel;
    
    //compute sixths level
    if (iBars(symbol, 0) < bars) {
      strlevel = "?? INVALID HISTORICAL DATA ?? ("+iBars(symbol, 0)+" bars available)";
    } else {  
      base  = iLow(symbol,0,iLowest(symbol, 0, MODE_LOW, bars, 0));
      range = iHigh(symbol,0,iHighest(symbol, 0, MODE_HIGH, bars, 0)) - base;
      if (range==0) strlevel = "?? INVALID HISTORICAL DATA ??";
      else {
        level = (iClose(symbol,0,0)-base)/ range * IND_RANGE;
        strlevel = DoubleToStr(level,1)+"%";
      }
    }

    color c=0;
    
    if (level < gold || level > 100-gold) c = DodgerBlue;
    else if (level < green || level > 100-green) c = Orange;
    else if (level < middle || level > 100-middle) c = ForestGreen;
    else c = Red;

    int trend = GetTrend(symbol, PERIOD_M15, 0);
    color ctrend=Black;
    string strtrend = "-";
    if (trend > 0) {
      strtrend = "UP";
      ctrend = ForestGreen;
    } else if (trend < 0) {
      strtrend = "down";
      ctrend = Red;
    }

    string s = "------------";
    int pos = level/100*StringLen(s);
    string slevel = StringSetChar(s,pos,'I');
    drawFixedLbl(objPrefix+"."+symbol,     symbol+":", 0, Xgap, Ygap+12*cc, 10, "Arial Black", c, true);
    drawFixedLbl(objPrefix+"."+symbol+"l",slevel+"  "+strlevel, 0, Xgap+90, Ygap+12*cc, 10, "Arial Black", c, true);
    drawFixedLbl(objPrefix+"."+symbol+"t",strtrend, 0, Xgap+200, Ygap+12*cc, 10, "Arial Black", ctrend, true);

  }

}//start()


int GetTrend(string symbol, int timeframe, int bar)
{
  // very rough ultra-local trend detection: use 2 different speed momentums 
  double fastMom = iMomentum(symbol,timeframe, 5,PRICE_TYPICAL,bar);
  double slowMom = iMomentum(symbol,timeframe,14,PRICE_TYPICAL,bar);

  if (fastMom > 100 && slowMom > 100) return (1); // uptrend
  if (fastMom < 100 && slowMom < 100) return (-1); // downtrend
  else return (0); // undecided
}

void CleanUpInputString()
{
   // Does any tidying up of the user inputs
   
   //Remove unwanted spaces
   InputString = StringTrimLeft(InputString);
   InputString = StringTrimRight(InputString);

   //Add final comma if ommitted by user
   if (StringSubstr(InputString, StringLen(InputString)-1) != ",") 
      InputString = StringConcatenate(InputString,",");
      
   
}//void CleanUpInputString

void CalculatePairsPassed()
{
   // Calculates the numbers of paramaters passed in LongMagicNumber and TradeComment.
   
   int Index = 0;//For searching NoTradePairs
   int LastIndex;//Points the the most recent Index
   NoOfPairs = 0;
   
   while(Index > -1)
      {
         Index = StringFind(InputString, ",",LastIndex);
         if (Index > -1)
         {
            NoOfPairs ++;
            LastIndex = Index+1;            
         }//if (Index > -1)
      }//while(int cc > -1)
   
   
   
}//End void CalculatePairsPassed()

//+------------------------------------------------------------------+
int SixthsBarCount (string symbol, int H1bars)
//+------------------------------------------------------------------+
{
  string pairs[] = {
    "AUDCAD", "170",
    "AUDCHF", "170",
    "AUDJPY", "170",
    "AUDNZD", "170",
    "AUDSGD", "170",
    "AUDUSD", "170",
    "CADCHF", "170",
    "CADJPY", "180",
    "CHFJPY", "170",
    "CHFSGD", "170",
    "EURAUD", "170",
    "EURCAD", "170",
    "EURCHF", "170",
    "EURGBP", "170",
    "EURJPY", "180",
    "EURNZD", "170",
    "EURSGD", "170",
    "EURUSD", "170",
    "GBPAUD", "170",
    "GBPCAD", "170",
    "GBPCHF", "170",
    "GBPJPY", "180",
    "GBPUSD", "155",
    "NZDCAD", "170",
    "NZDCHF", "170",
    "NZDJPY", "170",
    "NZDUSD", "170",
    "SGDJPY", "170",
    "USDCAD", "170",
    "USDCHF", "180",
    "USDHKD", "170",
    "USDJPY", "180",
    "USDSGD", "170",

    "GOLD",   "160", // (FXPro) GOLD
    "SILVER", "160", // (FXPro) SILVER

    "#CL",    "160", // (FXPro) OIL (Light Sweet Crude Oil)

    "#FCE",   "160", // (FXPro) CAC40 Future

  };

  int n = H1bars;
  int i;

  //auto bar count taken from MagnumFreak Sixths 3.6 w AutoBar count
  if (n == 0)
  {
    //Set up the H1bars. H1 TF first. Default H1bars set at 170
    for (i=0;i<ArraySize(pairs)/2;i++) {
      if (StringSubstr(symbol, 0, StringLen(pairs[2*i])) == pairs[2*i]) {
        n = StrToInteger(pairs[2*i+1]);
        strPair = pairs[2*i];
        break;
      }
    }
    if (n==0) {
      n = 170; // default when the pair is not in the list
      strPair = "No pre-defined value for "+symbol+", using ";
    }
    H1bars = n; // update input parameter with found H1Bars value
  }
  //Now accommodate different time frames
  n *= PERIOD_H1;
  n /= Period();
  return (n);
}

//--------------------------------------------------------------------------------------
void drawFixedLbl(string objname, string s, int Corner, int DX, int DY, int FSize, string Font, color c, bool bg)
//--------------------------------------------------------------------------------------
{
   ObjectDelete(objname);
   ObjectCreate(objname, OBJ_LABEL, 0, 0, 0);
   ObjectSet(objname, OBJPROP_CORNER, Corner);
   ObjectSet(objname, OBJPROP_XDISTANCE, DX);
   ObjectSet(objname, OBJPROP_YDISTANCE, DY);
   ObjectSet(objname,OBJPROP_BACK, bg);      
   ObjectSetText(objname, s, FSize, Font, c);
} //drawFixedLbl

//--------------------------------------------------------------------------------------
void RemoveObjects(string Pref)
//--------------------------------------------------------------------------------------
{   
   int i;
   string objname = "";

   for (i = ObjectsTotal(); i >= 0; i--) {
      objname = ObjectName(i);
      if (StringFind(objname, Pref, 0) > -1) ObjectDelete(objname);
   }
} /* RemoveObjects*/

//end

