//+------------------------------------------------------------------+
//|                                           BuySellBasketTotal.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Lime
#property indicator_color2 Gold
#property indicator_color3 Red
//#property indicator_color4 FireBrick
//#property indicator_color5 Red

//---- input parameters
//extern bool buy_all = false;
extern int tf=15;
extern int look_back= 0;
extern int DisplayBars = 500;
extern string long_basket= "enter 7 long symbols";
extern string mlong_basket1= "GBPUSD";
extern double price1= 0;
extern string mlong_basket2= "EURGBP";
extern double price2= 0;
extern string mlong_basket3= "GBPJPY";
extern double price3= 0;
extern string mlong_basket4= "USDCHF";
extern double price4= 0;
extern string mlong_basket5= "NZDUSD";
extern double price5= 0;
extern string mlong_basket6= "AUDJPY";
extern double price6= 0;
extern string mlong_basket7= "EURJPY";
extern double price7= 0;

extern string short_basket= "enter 7 short symbols";
extern string mshort_basket1= "EURUSD";
extern double price8= 0;
extern string mshort_basket2= "USDJPY";
extern double price9= 0;
extern string mshort_basket3= "AUDUSD";
extern double price10= 0;
extern string mshort_basket4= "NZDJPY";
extern double price11= 0;
extern string mshort_basket5= "GBPCHF";
extern double price12= 0;
extern string mshort_basket6= "CHFJPY";
extern double price13= 0;
extern string mshort_basket7= "EURCHF";
extern double price14= 0;

double GBPUSDm,EURGBPm,GBPJPYm,USDCHFm,NZDUSDm,AUDJPYm,EURJPYm;
double EURUSDm,USDJPYm,AUDUSDm,NZDJPYm,GBPCHFm,CHFJPYm,EURCHFm;
double GBPUSDm_now,EURGBPm_now,GBPJPYm_now,USDCHFm_now,NZDUSDm_now,AUDJPYm_now,EURJPYm_now;
double EURUSDm_now,USDJPYm_now,AUDUSDm_now,NZDJPYm_now,GBPCHFm_now,CHFJPYm_now,EURCHFm_now;
double GBPUSDm_pipsBuy,EURGBPm_pipsBuy,GBPJPYm_pipsBuy,USDCHFm_pipsBuy,NZDUSDm_pipsBuy,AUDJPYm_pipsBuy,EURJPYm_pipsBuy;
double EURUSDm_pipsBuy,USDJPYm_pipsBuy,AUDUSDm_pipsBuy,NZDJPYm_pipsBuy,GBPCHFm_pipsBuy,CHFJPYm_pipsBuy,EURCHFm_pipsBuy;
double GBPUSDm_pipsSell,EURGBPm_pipsSell,GBPJPYm_pipsSell,USDCHFm_pipsSell,NZDUSDm_pipsSell,AUDJPYm_pipsSell,EURJPYm_pipsSell;
double EURUSDm_pipsSell,USDJPYm_pipsSell,AUDUSDm_pipsSell,NZDJPYm_pipsSell,GBPCHFm_pipsSell,CHFJPYm_pipsSell,EURCHFm_pipsSell;
double highest_long_pips=0, highest_short_pips=0,long_pipsBuy, short_pipsBuy,long_pipsSell, short_pipsSell;
double long_pips_buy_usd, short_pips_buy_usd, long_pips_buy_jpy, short_pips_buy_jpy, long_pips_buy_oth, short_pips_buy_oth;

string long_basket1, long_basket2, long_basket3, long_basket4, long_basket5, long_basket6, long_basket7;
string short_basket1, short_basket2, short_basket3, short_basket4, short_basket5, short_basket6, short_basket7;
int    spread1,spread2,spread3,spread4,spread5,spread6,spread7;
int    spread8,spread9,spread10,spread11,spread12,spread13,spread14;

//---- buffers
double CombinedPipsBuyUSD[];
double CombinedPipsBuyJPY[];
double CombinedPipsBuyBuffer[];
double CombinedPipsBuyOthers[];
double CombinedPipsSellBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 2 additional buffers are used for counting.
//   IndicatorBuffers(3);
//---- indicator line
   SetIndexStyle(0,DRAW_LINE,STYLE_DOT);
   SetIndexBuffer(0,CombinedPipsBuyUSD);
   SetIndexStyle(1,DRAW_LINE,STYLE_DOT);
   SetIndexBuffer(1,CombinedPipsBuyJPY);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,CombinedPipsBuyBuffer);
//   SetIndexStyle(3,DRAW_NONE,STYLE_DOT);
//   SetIndexBuffer(3,CombinedPipsBuyOthers);
//   SetIndexStyle(4,DRAW_LINE);
//   SetIndexBuffer(4,CombinedPipsSellBuffer);
   
//---- name for DataWindow and indicator subwindow label
   short_name="BuySellBasket";
   IndicatorShortName(short_name);
   SetIndexLabel(0,"CombinedPipsBuyUSD");
   SetIndexLabel(1,"CombinedPipsBuyJPY");
   SetIndexLabel(2,"CombinedPipsBuy");
//----

   GetCorrectPairs();
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| BuySellBasket Total                                              |
//+------------------------------------------------------------------+
int start() 
  {
   int    i,counted_bars=IndicatorCounted();
   double rel,negative,positive;
   static bool HaveSpreads = false;
//----
//----
   if (DisplayBars < 1)
     i=Bars-1;
   else
     i = DisplayBars;
   
   if (!HaveSpreads)
   {
     GetSpreads();
     HaveSpreads = true;
   }
   while(i>=0)
     {
     long_pips_buy_usd =0;
     short_pips_buy_usd=0;

     long_pips_buy_jpy =0;
     short_pips_buy_jpy=0;

     long_pips_buy_oth =0;
     short_pips_buy_oth=0;

     if (price1==0)GBPUSDm= iOpen(long_basket1, tf, i + look_back);else GBPUSDm=price1;
     if (price2==0)EURGBPm= iOpen(long_basket2, tf, i + look_back);else EURGBPm=price2;
     if (price3==0)GBPJPYm= iOpen(long_basket3, tf, i + look_back);else GBPJPYm=price3;
     if (price4==0)USDCHFm= iOpen(long_basket4, tf, i + look_back);else USDCHFm=price4;
     if (price5==0)NZDUSDm= iOpen(long_basket5, tf, i + look_back);else NZDUSDm=price5;
     if (price6==0)AUDJPYm= iOpen(long_basket6, tf, i + look_back);else AUDJPYm=price6;
     if (price7==0)EURJPYm= iOpen(long_basket7, tf, i + look_back);else EURJPYm=price7;
     if (price8==0)EURUSDm= iOpen(short_basket1, tf, i + look_back);else EURUSDm=price8;
     if (price9==0)USDJPYm= iOpen(short_basket2, tf, i + look_back);else USDJPYm=price9;
     if (price10==0)AUDUSDm= iOpen(short_basket3, tf, i + look_back);else AUDUSDm=price10;
     if (price11==0)NZDJPYm= iOpen(short_basket4, tf, i + look_back);else NZDJPYm=price11;
     if (price12==0)GBPCHFm= iOpen(short_basket5, tf, i + look_back);else GBPCHFm=price12;
     if (price13==0)CHFJPYm= iOpen(short_basket6, tf, i + look_back);else CHFJPYm=price13;
     if (price14==0)EURCHFm= iOpen(short_basket7, tf, i + look_back);else EURCHFm=price14;
     GBPUSDm_now= iClose(long_basket1, 0, i);
     EURGBPm_now= iClose(long_basket2, 0, i);
     GBPJPYm_now= iClose(long_basket3, 0, i);
     USDCHFm_now= iClose(long_basket4, 0, i);
     NZDUSDm_now= iClose(long_basket5, 0, i);
     AUDJPYm_now= iClose(long_basket6, 0, i);
     EURJPYm_now= iClose(long_basket7, 0, i);

     GBPUSDm_pipsBuy = (GBPUSDm_now-GBPUSDm)/(iClose(long_basket1, 0, i));
     EURGBPm_pipsBuy = (EURGBPm_now-EURGBPm)/(iClose(long_basket2, 0, i));
     GBPJPYm_pipsBuy = (GBPJPYm_now-GBPJPYm)/(iClose(long_basket3, 0, i));
     USDCHFm_pipsBuy = (USDCHFm_now-USDCHFm)/(iClose(long_basket4, 0, i));
     NZDUSDm_pipsBuy = (NZDUSDm_now-NZDUSDm)/(iClose(long_basket5, 0, i));
     AUDJPYm_pipsBuy = (AUDJPYm_now-AUDJPYm)/(iClose(long_basket6, 0, i));
     EURJPYm_pipsBuy = (EURJPYm_now-EURJPYm)/(iClose(long_basket7, 0, i));   

     long_pipsBuy = GBPUSDm_pipsBuy + EURGBPm_pipsBuy + GBPJPYm_pipsBuy + USDCHFm_pipsBuy + NZDUSDm_pipsBuy + AUDJPYm_pipsBuy + EURJPYm_pipsBuy;
   
     EURUSDm_now= iClose(short_basket1, 0, i);
     USDJPYm_now= iClose(short_basket2, 0, i);
     AUDUSDm_now= iClose(short_basket3, 0, i);
     NZDJPYm_now= iClose(short_basket4, 0, i);
     GBPCHFm_now= iClose(short_basket5, 0, i);
     CHFJPYm_now= iClose(short_basket6, 0, i);
     EURCHFm_now= iClose(short_basket7, 0, i);

     EURUSDm_pipsBuy = (EURUSDm_now-EURUSDm)/iClose(short_basket1, 0, i);
     USDJPYm_pipsBuy = (USDJPYm_now-USDJPYm)/iClose(short_basket2, 0, i);
     AUDUSDm_pipsBuy = (AUDUSDm_now-AUDUSDm)/iClose(short_basket3, 0, i);
     NZDJPYm_pipsBuy = (NZDJPYm_now-NZDJPYm)/iClose(short_basket4, 0, i);
     GBPCHFm_pipsBuy = (GBPCHFm_now-GBPCHFm)/iClose(short_basket5, 0, i);
     CHFJPYm_pipsBuy = (CHFJPYm_now-CHFJPYm)/iClose(short_basket6, 0, i);
     EURCHFm_pipsBuy = (EURCHFm_now-EURCHFm)/iClose(short_basket7, 0, i);

      short_pipsBuy = EURUSDm_pipsBuy + USDJPYm_pipsBuy + AUDUSDm_pipsBuy + NZDJPYm_pipsBuy + GBPCHFm_pipsBuy + CHFJPYm_pipsBuy + EURCHFm_pipsBuy;

      CombinedPipsBuyBuffer[i] = (short_pipsBuy+long_pipsBuy)/14;
//      CombinedPipsSellBuffer[i] = 0;

      CombinedPipsBuyUSD[i] = (GBPUSDm_pipsBuy - USDCHFm_pipsBuy + NZDUSDm_pipsBuy + EURUSDm_pipsBuy - USDJPYm_pipsBuy + AUDUSDm_pipsBuy)/6;
      CombinedPipsBuyJPY[i] = (GBPJPYm_pipsBuy + AUDJPYm_pipsBuy + EURJPYm_pipsBuy + USDJPYm_pipsBuy + NZDJPYm_pipsBuy + CHFJPYm_pipsBuy)/6;

      //CombinedPipsBuyOthers[i] = 0;
   
      i--;
     }
//----
   return(0);
  }

double dPoint(string sym)
{
  double _Point = MarketInfo(sym, MODE_POINT);
  if (StringFind(sym, "JPY")>=0)
      _Point=0.01;
  
  if (_Point==0) _Point=0.0001; 
  
  return (_Point);
}


void GetCorrectPairs()
{
   long_basket1 = GetCorrectSymbol(mlong_basket7);
   long_basket2 = GetCorrectSymbol(mlong_basket7);
   long_basket3 = GetCorrectSymbol(mlong_basket7);
   long_basket4 = GetCorrectSymbol(mlong_basket7);
   long_basket5 = GetCorrectSymbol(mlong_basket7);
   long_basket6 = GetCorrectSymbol(mlong_basket7);
   long_basket7 = GetCorrectSymbol(mlong_basket7);
   
   short_basket1 = GetCorrectSymbol(mshort_basket1);
   short_basket2 = GetCorrectSymbol(mshort_basket2);
   short_basket3 = GetCorrectSymbol(mshort_basket3);
   short_basket4 = GetCorrectSymbol(mshort_basket4);
   short_basket5 = GetCorrectSymbol(mshort_basket5);
   short_basket6 = GetCorrectSymbol(mshort_basket6);
   short_basket7 = GetCorrectSymbol(mshort_basket7);
}

string GetCorrectSymbol(string pair)
{
   string AddChar, myPair;
   
   myPair = pair;
   if (StringLen(pair) > 0)
   {
   if (StringLen(Symbol()) == 7)
     {
      AddChar = StringSubstr(Symbol(), 6, 1);
      myPair = pair + AddChar;
     }
   }
   return(myPair);
   
}

void GetSpreads()
{
  spread1=MarketInfo(long_basket1,MODE_SPREAD);
  spread2=MarketInfo(long_basket2,MODE_SPREAD);
  spread3=MarketInfo(long_basket3,MODE_SPREAD);
  spread4=MarketInfo(long_basket4,MODE_SPREAD);
  spread5=MarketInfo(long_basket5,MODE_SPREAD);
  spread6=MarketInfo(long_basket6,MODE_SPREAD);
  spread7=MarketInfo(long_basket7,MODE_SPREAD);
  spread8=MarketInfo(short_basket1,MODE_SPREAD);
  spread9=MarketInfo(short_basket2,MODE_SPREAD);
  spread10=MarketInfo(short_basket3,MODE_SPREAD);
  spread11=MarketInfo(short_basket4,MODE_SPREAD);
  spread12=MarketInfo(short_basket5,MODE_SPREAD);
  spread13=MarketInfo(short_basket6,MODE_SPREAD);
  spread14=MarketInfo(short_basket7,MODE_SPREAD);
}
//+------------------------------------------------------------------+