//+------------------------------------------------------------------+
//|                                           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 3
#property indicator_color1 DeepSkyBlue
#property indicator_color2 Orange
#property indicator_color3 Yellow
//---- 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_pips,EURGBPm_pips,GBPJPYm_pips,USDCHFm_pips,NZDUSDm_pips,AUDJPYm_pips,EURJPYm_pips;
double EURUSDm_pips,USDJPYm_pips,AUDUSDm_pips,NZDJPYm_pips,GBPCHFm_pips,CHFJPYm_pips,EURCHFm_pips;
double highest_long_pips=0, highest_short_pips=0,long_pips, short_pips;

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 LongPipsBuffer[];
double ShortPipsBuffer[];
double CombinedPipsBuffer[];
//+------------------------------------------------------------------+
//| 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,LongPipsBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ShortPipsBuffer);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,CombinedPipsBuffer);
   
//---- name for DataWindow and indicator subwindow label
   short_name="BuySellBasket";
   IndicatorShortName(short_name);
   SetIndexLabel(0,"LongPips");
   SetIndexLabel(1,"ShortPips");
   SetIndexLabel(2,"CombinedPips");
//----

   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, look_back);else GBPUSDm=price1;
     if (price2==0)EURGBPm= iOpen(long_basket2, tf, look_back);else EURGBPm=price2;
     if (price3==0)GBPJPYm= iOpen(long_basket3, tf, look_back);else GBPJPYm=price3;
     if (price4==0)USDCHFm= iOpen(long_basket4, tf, look_back);else USDCHFm=price4;
     if (price5==0)NZDUSDm= iOpen(long_basket5, tf, look_back);else NZDUSDm=price5;
     if (price6==0)AUDJPYm= iOpen(long_basket6, tf, look_back);else AUDJPYm=price6;
     if (price7==0)EURJPYm= iOpen(long_basket7, tf, look_back);else EURJPYm=price7;
     if (price8==0)EURUSDm= iOpen(short_basket1, tf, look_back);else EURUSDm=price8;
     if (price9==0)USDJPYm= iOpen(short_basket2, tf, look_back);else USDJPYm=price9;
     if (price10==0)AUDUSDm= iOpen(short_basket3, tf, look_back);else AUDUSDm=price10;
     if (price11==0)NZDJPYm= iOpen(short_basket4, tf, look_back);else NZDJPYm=price11;
     if (price12==0)GBPCHFm= iOpen(short_basket5, tf, look_back);else GBPCHFm=price12;
     if (price13==0)CHFJPYm= iOpen(short_basket6, tf, look_back);else CHFJPYm=price13;
     if (price14==0)EURCHFm= iOpen(short_basket7, tf, 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);
   if (buy_all)
      GBPUSDm_pips = (GBPUSDm_now-GBPUSDm)/dPoint(long_basket1);
   else
      GBPUSDm_pips = (GBPUSDm-GBPUSDm_now)/dPoint(long_basket1);

   if (buy_all)
      EURGBPm_pips = (EURGBPm_now-EURGBPm)/dPoint(long_basket2);
   else
      EURGBPm_pips = (EURGBPm-EURGBPm_now)/dPoint(long_basket2);

   if (buy_all)
      GBPJPYm_pips = (GBPJPYm_now-GBPJPYm)/dPoint(long_basket3);
   else
      GBPJPYm_pips = (GBPJPYm-GBPJPYm_now)/dPoint(long_basket3);

   if (buy_all)
      USDCHFm_pips = (USDCHFm_now-USDCHFm)/dPoint(long_basket4);
   else
      USDCHFm_pips = (USDCHFm-USDCHFm_now)/dPoint(long_basket4);

   if (buy_all)
      NZDUSDm_pips = (NZDUSDm_now-NZDUSDm)/dPoint(long_basket5);
   else
      NZDUSDm_pips = (NZDUSDm-NZDUSDm_now)/dPoint(long_basket5);

   if (buy_all)
      AUDJPYm_pips = (AUDJPYm_now-AUDJPYm)/dPoint(long_basket6);
   else
      AUDJPYm_pips = (AUDJPYm-AUDJPYm_now)/dPoint(long_basket6);

   if (buy_all)
      EURJPYm_pips = (EURJPYm_now-EURJPYm)/dPoint(long_basket7);
   else
      EURJPYm_pips = (EURJPYm-EURJPYm_now)/dPoint(long_basket7);

long_pips = GBPUSDm_pips + EURGBPm_pips + GBPJPYm_pips + USDCHFm_pips + NZDUSDm_pips + AUDJPYm_pips + EURJPYm_pips;
   LongPipsBuffer[i] = long_pips;
   
   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);
   if (buy_all)
      EURUSDm_pips = (EURUSDm_now-EURUSDm)/dPoint(short_basket1);
   else
      EURUSDm_pips = (EURUSDm-EURUSDm_now)/dPoint(short_basket1);

   if (buy_all)
      USDJPYm_pips = (USDJPYm_now-USDJPYm)/dPoint(short_basket2);
   else
      USDJPYm_pips = (USDJPYm-USDJPYm_now)/dPoint(short_basket2);

   if (buy_all)
      AUDUSDm_pips = (AUDUSDm_now-AUDUSDm)/dPoint(short_basket3);
   else
      AUDUSDm_pips = (AUDUSDm-AUDUSDm_now)/dPoint(short_basket3);

   if (buy_all)
      NZDJPYm_pips = (NZDJPYm_now-NZDJPYm)/dPoint(short_basket4);
   else
      NZDJPYm_pips = (NZDJPYm-NZDJPYm_now)/dPoint(short_basket4);

   if (buy_all)
      GBPCHFm_pips = (GBPCHFm_now-GBPCHFm)/dPoint(short_basket5);
   else
      GBPCHFm_pips = (GBPCHFm-GBPCHFm_now)/dPoint(short_basket5);

   if (buy_all)
      CHFJPYm_pips = (CHFJPYm_now-CHFJPYm)/dPoint(short_basket6);
   else
      CHFJPYm_pips = (CHFJPYm-CHFJPYm_now)/dPoint(short_basket6);

   if (buy_all)
      EURCHFm_pips = (EURCHFm_now-EURCHFm)/dPoint(short_basket7);
   else
      EURCHFm_pips = (EURCHFm-EURCHFm_now)/dPoint(short_basket7);

short_pips = EURUSDm_pips + USDJPYm_pips + AUDUSDm_pips + NZDJPYm_pips + GBPCHFm_pips + CHFJPYm_pips + EURCHFm_pips;
      ShortPipsBuffer[i] = short_pips;
      CombinedPipsBuffer[i] = short_pips+long_pips;
   
      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);
}
//+------------------------------------------------------------------+