//+------------------------------------------------------------------+
//|                                          _Strongest_Pairs v1.mq4 |
//|                                                       Brad Parks |
//+------------------------------------------------------------------+

#property indicator_chart_window
//#property strict

extern string NY_CloseDate = "2016.12.30";   // This should be the EST/DST date of the NY close.
// add note showing format: yyyy.mm.dd

extern int Timezone_Offset = 7;  // Difference (in hours) between New York and Broker.
// SHOW IN PARAMETER LIST:
// NY Close + timezone offset = Broker time of NY Close
// 1700 EST + 7 = 0000 GMT+2 (FXCM Metatrader)
// Adjust Timezone Offset between US/UK time changes:
//   US EDT begins 2nd Sunday in March, UK begins Last Sunday in March
//   US EST begins 1st Sunday in November, UK begins Last Sunday in October

extern ENUM_TIMEFRAMES    ma_TF=PERIOD_H4;
extern int                ma_Period=200;
extern int                ma_Shift=0;
extern ENUM_MA_METHOD     ma_Method=MODE_SMA;
extern ENUM_APPLIED_PRICE ma_Apply=PRICE_CLOSE;

extern int      DisplayCorner = 0;
extern int      HorizPos      = 5;
extern int      VertPos       = 14;
extern int      font_size     = 8;
extern color    font_color    = Black;

extern string pairPrefix = "";
extern string pairSuffix = "";

string pairsJpy[8];
double pipPrice[8], smaPrice[8], strength[8];
double aStrength[8][4];

int hourClosed;
datetime timeClosed;
bool bOutputToLog = True;

int deinit() {
  DeleteObjects();
  return(0);
}

void CreateObjects() {
  DeleteObjects();
  
  ObjectCreate("strongestLine1", OBJ_LABEL, 0, 0, 0);
  ObjectSet("strongestLine1", OBJPROP_CORNER, 0);
  ObjectSet("strongestLine1", OBJPROP_XDISTANCE, HorizPos);
  ObjectSet("strongestLine1", OBJPROP_YDISTANCE, VertPos);
  ObjectSet("strongestLine1", OBJPROP_BACK, FALSE);
  
  ObjectCreate("strongestLine2", OBJ_LABEL, 0, 0, 0);
  ObjectSet("strongestLine2", OBJPROP_CORNER, 0);
  ObjectSet("strongestLine2", OBJPROP_XDISTANCE, HorizPos);
  ObjectSet("strongestLine2", OBJPROP_YDISTANCE, VertPos+font_size+4);
  ObjectSet("strongestLine2", OBJPROP_BACK, FALSE);

  ObjectCreate("strongestLine3", OBJ_LABEL, 0, 0, 0);
  ObjectSet("strongestLine3", OBJPROP_CORNER, 0);
  ObjectSet("strongestLine3", OBJPROP_XDISTANCE, HorizPos);
  ObjectSet("strongestLine3", OBJPROP_YDISTANCE, VertPos+((font_size+4)*2));
  ObjectSet("strongestLine3", OBJPROP_BACK, FALSE);

}

void DeleteObjects() {
  if(ObjectFind("strongestLine1") > -1) ObjectDelete("strongestLine1");
  if(ObjectFind("strongestLine2") > -1) ObjectDelete("strongestLine2");
  if(ObjectFind("strongestLine3") > -1) ObjectDelete("strongestLine3");
}

int init() {
  CreateObjects();

  datetime closeDate = StringToTime(NY_CloseDate);
  hourClosed = 16 + Timezone_Offset;  // NY Close is 1700 EST: Bar Open is 1600 + offset_hours = Broker Open of 1600 EST bar
  if (hourClosed > 23) {
    hourClosed -= 24;
    closeDate = closeDate + 86400;  //  24*60*60 = 86400 seconds in a day.
  }  

  MqlDateTime strDate1;
  TimeToStruct(closeDate,strDate1);
  strDate1.hour = hourClosed;
  strDate1.min = 59;
   
// Add code here...to set NY CloseDate to yesterday, when blank or invalid date
// if (strDate.year == 1970) strDate.year = ; strDate.mon = ; strDate.day = ;
  
  timeClosed = StructToTime(strDate1);
  
  //Comment(StringFormat("\n\n\nChart Close Time: %d.%d.%d %d:%d    Hour Closed: %d",strDate1.year,strDate1.mon,strDate1.day,strDate1.hour,strDate1.min,hourClosed));
  //Comment(StringFormat("\n\n\nChart Close Time: %d.%d.%d %d:%d    Hour Closed: %d",TimeYear(timeClosed),TimeMonth(timeClosed),TimeDay(timeClosed),TimeHour(timeClosed),TimeMinute(timeClosed),hourClosed));

  pairsJpy[0] = pairPrefix + "AUDJPY" + pairSuffix;
  pairsJpy[1] = pairPrefix + "CADJPY" + pairSuffix;
  pairsJpy[2] = pairPrefix + "CHFJPY" + pairSuffix;
  pairsJpy[3] = pairPrefix + "EURJPY" + pairSuffix;
  pairsJpy[4] = pairPrefix + "GBPJPY" + pairSuffix;
  pairsJpy[5] = pairPrefix + "NZDJPY" + pairSuffix;
  pairsJpy[6] = pairPrefix + "USDJPY" + pairSuffix;
  pairsJpy[7] = "JPY";

  bOutputToLog = True;
  return(0);
}

int start() {
  Sleep(2000);  // Pause (milliseconds)
  
  int iPair = 0;
  while(iPair < 7) {
    //Print("Current bar for USDCHF H1: ",iTime("USDCHF",PERIOD_H1,0),", ", iOpen("USDCHF",PERIOD_H1,0),", ", iHigh("USDCHF",PERIOD_H1,0),", ",
    //                                    iLow("USDCHF",PERIOD_H1,0),", ", iClose("USDCHF",PERIOD_H1,0),", ", iVolume("USDCHF",PERIOD_H1,0));
  
    //int h1Index=iBarShift(pairsJpy[iPair],PERIOD_H1,timeClosed,true);
    int h4Index=iBarShift(pairsJpy[iPair],ma_TF,timeClosed,true);
  
    //Comment(StringFormat("\n\n\nChart Close Time: %d.%d.%d %d:%d    Hour Closed: %d",TimeYear(timeClosed),TimeMonth(timeClosed),TimeDay(timeClosed),TimeHour(timeClosed),TimeMinute(timeClosed),hourClosed));
    //Comment("\n\n\nTime Closed ",TimeToStr(timeClosed),"    H1 bar index: ",h1Index,"  H4 bar index: ",h4Index);
    //Comment(StringFormat("\n\n\nH1 bar: %d   open: %G   close: %G \nH4 bar: %d   open: %G   close: %G",h1Index,iOpen(pairsJpy[iPair],PERIOD_H1,h1Index),iClose(pairsJpy[iPair],PERIOD_H1,h1Index),h4Index,iOpen(pairsJpy[iPair],PERIOD_H4,h4Index),iClose(pairsJpy[iPair],PERIOD_H4,h4Index)));

    // Calculation: (Price - smaPrice) / Price = % above/below 200-sma
    // Note: Calculation taken at NY Close on H4 chart. JPY is always 0.00%.

    pipPrice[iPair] = iClose(pairsJpy[iPair],ma_TF,h4Index);
    smaPrice[iPair] = iMA(pairsJpy[iPair],ma_TF,ma_Period,0,ma_Method,ma_Apply,h4Index);
    strength[iPair] = (pipPrice[iPair] - smaPrice[iPair]) / pipPrice[iPair] * 100;

    aStrength[iPair][0] = strength[iPair];
    aStrength[iPair][1] = iPair;
    aStrength[iPair][2] = pipPrice[iPair];
    aStrength[iPair][3] = smaPrice[iPair];
  
    //Comment(StringFormat("\n\n\nH1 bar: %d   open %G   close %G \nH4 bar: %d   open %G   close %G   Price %G   sma %G",
    //h1Index,iOpen(pairsJpy[iPair],PERIOD_H1,h1Index),iClose(pairsJpy[iPair],PERIOD_H1,h1Index),h4Index,iOpen(pairsJpy[iPair],PERIOD_H4,h4Index),
    //           iClose(pairsJpy[iPair],PERIOD_H4,h4Index),pipPrice[iPair]),smaPrice[iPair]);
  
    iPair++;
  }

  // Set last array element to JPY
  aStrength[7][0] = 0; aStrength[7][1] = 7; aStrength[7][2] = 0; aStrength[7][3] = 0;

  ArraySort(aStrength,WHOLE_ARRAY,0,MODE_DESCEND);   // Sort strength array from strongest to weakest

  string strDate = "NY Close " + NY_CloseDate + " = " + TimeToString(timeClosed) + " Broker Time ";
  string strPairs, strStrength;  // for output in chart window
  string priceOut, strengthOut;  // for output to MT4 Terminal Experts Tab (right-click copy) for paste into Excel

  // Add NY Close Date to StrengthOut var
  MqlDateTime strDate1;
  TimeToStruct(StringToTime(NY_CloseDate),strDate1);
  strDate1.hour = hourClosed;
  strDate1.min = 59;
  strengthOut = StringFormat("\t%d/%d/%d",strDate1.mon,strDate1.day,strDate1.year);
  
  int i = 0;
  iPair = 0;

  for (i=0;i<8;i++) {
    iPair = aStrength[i][1];
    strPairs += StringSubstr(pairsJpy[iPair],0,3) + "    ";
    strStrength += DoubleToStr(aStrength[i][0],2) + "   ";
    priceOut += "\t" + DoubleToStr(aStrength[i][2],2);
    strengthOut += "\t" + StringSubstr(pairsJpy[iPair],0,3);
  }
  
  priceOut += "\n\t";     // Add line feed & tab
  strengthOut += "\n\t\t";  // Add line feed & tab
  
  for (i=0;i<8;i++) {
    priceOut += "\t" + DoubleToStr(aStrength[i][3],2);
    strengthOut += "\t" + DoubleToStr(aStrength[i][0],2);
  }
  
  ObjectSetText("strongestLine1", strDate, 7, "Verdana", font_color);
  ObjectSetText("strongestLine2", strPairs, 7, "Verdana", font_color);
  ObjectSetText("strongestLine3", strStrength, 7, "Verdana", font_color);
  
  // Output to MT4 Terminal Experts Tab (right-click & copy) for paste into Excel
  if (bOutputToLog) {
    Print(priceOut);
    Print(strengthOut);
    bOutputToLog = False;
  }
  
  return(0);
}
  
