//+------------------------------------------------------------------+
//|                                           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 6
#property indicator_color1 Lime
#property indicator_color2 Lime
#property indicator_color3 Lime
#property indicator_color4 Red
#property indicator_color5 Red
#property indicator_color6 Red

//---- input parameters
//extern bool buy_all = false;
extern int tf=15;
extern int look_back= 16;
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;

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 LongPipsBuyBuffer[];
double ShortPipsBuyBuffer[];
double CombinedPipsBuyBuffer[];
double LongPipsSellBuffer[];
double ShortPipsSellBuffer[];
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);
   SetIndexBuffer(0,LongPipsBuyBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ShortPipsBuyBuffer);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,CombinedPipsBuyBuffer);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,LongPipsSellBuffer);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexBuffer(4,ShortPipsSellBuffer);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexBuffer(5,CombinedPipsSellBuffer);
   
//---- name for DataWindow and indicator subwindow label
   short_name="BuySellBasket";
   IndicatorShortName(short_name);
   SetIndexLabel(0,"LongPipsBuy");
   SetIndexLabel(1,"ShortPipsBuy");
   SetIndexLabel(2,"CombinedPipsBuy");
   SetIndexLabel(3,"LongPipsSell");
   SetIndexLabel(4,"ShortPipsSell");
   SetIndexLabel(5,"CombinedPipsSell");
//----

   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)
     {
     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)/dPoint(long_basket1);
      GBPUSDm_pipsSell = (GBPUSDm-GBPUSDm_now)/dPoint(long_basket1);

      EURGBPm_pipsBuy = (EURGBPm_now-EURGBPm)/dPoint(long_basket2);
      EURGBPm_pipsSell = (EURGBPm-EURGBPm_now)/dPoint(long_basket2);

      GBPJPYm_pipsBuy = (GBPJPYm_now-GBPJPYm)/dPoint(long_basket3);
      GBPJPYm_pipsSell = (GBPJPYm-GBPJPYm_now)/dPoint(long_basket3);

      USDCHFm_pipsBuy = (USDCHFm_now-USDCHFm)/dPoint(long_basket4);
      USDCHFm_pipsSell = (USDCHFm-USDCHFm_now)/dPoint(long_basket4);

      NZDUSDm_pipsBuy = (NZDUSDm_now-NZDUSDm)/dPoint(long_basket5);
      NZDUSDm_pipsSell = (NZDUSDm-NZDUSDm_now)/dPoint(long_basket5);

      AUDJPYm_pipsBuy = (AUDJPYm_now-AUDJPYm)/dPoint(long_basket6);
      AUDJPYm_pipsSell = (AUDJPYm-AUDJPYm_now)/dPoint(long_basket6);

      EURJPYm_pipsBuy = (EURJPYm_now-EURJPYm)/dPoint(long_basket7);
      EURJPYm_pipsSell = (EURJPYm-EURJPYm_now)/dPoint(long_basket7);

long_pipsBuy = GBPUSDm_pipsBuy + EURGBPm_pipsBuy + GBPJPYm_pipsBuy + USDCHFm_pipsBuy + NZDUSDm_pipsBuy + AUDJPYm_pipsBuy + EURJPYm_pipsBuy;
   LongPipsBuyBuffer[i] = long_pipsBuy;
long_pipsSell = GBPUSDm_pipsSell + EURGBPm_pipsSell + GBPJPYm_pipsSell + USDCHFm_pipsSell + NZDUSDm_pipsSell + AUDJPYm_pipsSell + EURJPYm_pipsSell;
   LongPipsSellBuffer[i] = long_pipsSell;
   
   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)/dPoint(short_basket1);
      EURUSDm_pipsSell = (EURUSDm-EURUSDm_now)/dPoint(short_basket1);

      USDJPYm_pipsBuy = (USDJPYm_now-USDJPYm)/dPoint(short_basket2);
      USDJPYm_pipsSell = (USDJPYm-USDJPYm_now)/dPoint(short_basket2);

      AUDUSDm_pipsBuy = (AUDUSDm_now-AUDUSDm)/dPoint(short_basket3);
      AUDUSDm_pipsSell = (AUDUSDm-AUDUSDm_now)/dPoint(short_basket3);

      NZDJPYm_pipsBuy = (NZDJPYm_now-NZDJPYm)/dPoint(short_basket4);
      NZDJPYm_pipsSell = (NZDJPYm-NZDJPYm_now)/dPoint(short_basket4);

      GBPCHFm_pipsBuy = (GBPCHFm_now-GBPCHFm)/dPoint(short_basket5);
      GBPCHFm_pipsSell = (GBPCHFm-GBPCHFm_now)/dPoint(short_basket5);

      CHFJPYm_pipsBuy = (CHFJPYm_now-CHFJPYm)/dPoint(short_basket6);
      CHFJPYm_pipsSell = (CHFJPYm-CHFJPYm_now)/dPoint(short_basket6);

      EURCHFm_pipsBuy = (EURCHFm_now-EURCHFm)/dPoint(short_basket7);
      EURCHFm_pipsSell = (EURCHFm-EURCHFm_now)/dPoint(short_basket7);

short_pipsBuy = EURUSDm_pipsBuy + USDJPYm_pipsBuy + AUDUSDm_pipsBuy + NZDJPYm_pipsBuy + GBPCHFm_pipsBuy + CHFJPYm_pipsBuy + EURCHFm_pipsBuy;
      ShortPipsBuyBuffer[i] = short_pipsBuy;
short_pipsSell = EURUSDm_pipsSell + USDJPYm_pipsSell + AUDUSDm_pipsSell + NZDJPYm_pipsSell + GBPCHFm_pipsSell + CHFJPYm_pipsSell + EURCHFm_pipsSell;
      ShortPipsSellBuffer[i] = short_pipsSell;
      CombinedPipsBuyBuffer[i] = short_pipsBuy+long_pipsBuy;
      CombinedPipsSellBuffer[i] = short_pipsSell+long_pipsSell;
   
      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);
}
//+------------------------------------------------------------------+