#property indicator_chart_window
#property indicator_buffers 0

#import "user32.dll"
  int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
#import

#define WM_COMMAND 0x0111

#define LB_OFFSET -32
#define BEGIN_OFFSET 148

#define REFRESH_CODE 33324

extern string BuyPairs = "";
extern string SellPairs = "AUDCAD";
extern int timeframe = 15;

double open, low, high, close, volume;
int handle, PrevTime;
string SymbolName;
string BuyBasketPairs[];
string SellBasketPairs[];
int nBuyPairs, nSellPairs;

void GetSymbolName()
{
    SymbolName = "#BSB#";
  return;
}

bool GetBarPrices( int Pos )
{  
  string com;
  double kk=100;
  double sum_A_Pair_C=0;
  double sum_A_Pair_H=0;
  double sum_A_Pair_L=0;
  double sum_A_Pair_O=0;
  double sum_A_Pair_V=0;
  double sum_B_Pair_C=0;
  double sum_B_Pair_H=0;
  double sum_B_Pair_L=0;
  double sum_B_Pair_O=0;
  double sum_B_Pair_V=0;

  if (nBuyPairs>0)
    {
      for (int j=0;j<nBuyPairs;j++)
        {
          sum_A_Pair_C = sum_A_Pair_C  + (iClose(BuyBasketPairs[j],timeframe,Pos));
          sum_A_Pair_H = sum_A_Pair_H  + (iHigh(BuyBasketPairs[j],timeframe,Pos));
          sum_A_Pair_L = sum_A_Pair_L  + (iLow(BuyBasketPairs[j],timeframe,Pos));
          sum_A_Pair_O = sum_A_Pair_O  + (iOpen(BuyBasketPairs[j],timeframe,Pos));
          sum_A_Pair_V = sum_A_Pair_V  + (iVolume(BuyBasketPairs[j],timeframe,Pos));
        }
    }

  if (nSellPairs>0)
    {
      for (int k=0;k<nSellPairs;k++)
        {
          sum_B_Pair_C = sum_B_Pair_C  - (iClose(SellBasketPairs[k],timeframe,Pos));
          sum_B_Pair_H = sum_B_Pair_H  - (iHigh(SellBasketPairs[k],timeframe,Pos));
          sum_B_Pair_L = sum_B_Pair_L  - (iLow(SellBasketPairs[k],timeframe,Pos));
          sum_B_Pair_O = sum_B_Pair_O  - (iOpen(SellBasketPairs[k],timeframe,Pos));
          sum_B_Pair_V = sum_B_Pair_V  + (iVolume(SellBasketPairs[k],timeframe,Pos));
        }
    }

  open = kk+ sum_A_Pair_O + sum_B_Pair_O;
  high = kk+sum_A_Pair_H + sum_B_Pair_H;
  low = kk+sum_A_Pair_L + sum_B_Pair_L;
  close = kk+sum_A_Pair_C + sum_B_Pair_C;
  volume = sum_A_Pair_V + sum_B_Pair_V;
  com = StringConcatenate(com,"Buy Prices: ",sum_A_Pair_O," ",sum_A_Pair_H," ",sum_A_Pair_L," ",sum_A_Pair_C," ",sum_A_Pair_V,"\n");
  com = StringConcatenate(com,"Sell Prices: ",sum_B_Pair_O," ",sum_B_Pair_H," ",sum_B_Pair_L," ",sum_B_Pair_C," ",sum_B_Pair_V,"\n");
  com = StringConcatenate(com,"Combined Prices: ",open," ",high," ",low," ",close," ",volume,"\n");
  Comment(com);
  return;
}

void WriteBar( int STime, double SOpen, double SHigh, double SLow, double SClose, double SVolume )
{
  FileWriteInteger(handle, STime);
  FileWriteDouble(handle, SOpen);
  FileWriteDouble(handle, SLow);
  FileWriteDouble(handle, SHigh);
  FileWriteDouble(handle, SClose);
  FileWriteDouble(handle, SVolume);
  
  FileFlush(handle);
  
  return;
}

void WriteBars( int Pos )
{
  Pos--;
  
  while (Pos >= 0)
  {
    GetBarPrices(Pos);
    WriteBar(Time[Pos], open, high, low, close, volume);
    Pos--;  
  }
  
  return;
}

void ModifyLastBar( int Pos )
{
  GetBarPrices(Pos);
  
  FileSeek(handle, LB_OFFSET, SEEK_CUR);

  FileWriteDouble(handle, low);
  FileWriteDouble(handle, high);
  FileWriteDouble(handle, close);
  FileWriteDouble(handle, volume);
  
  FileFlush(handle);
  
  return;
}

void CreateHandle()
{
  string FileName;
  int Tmp[15], TmpTime;

  GetSymbolName();
  FileName = SymbolName + timeframe + ".hst";
  handle = FileOpenHistory(FileName, FILE_BIN|FILE_WRITE);
  
  FileWriteInteger(handle, 400);
  FileWriteString(handle, "Created by " + WindowExpertName(), 64);
  FileWriteString(handle, SymbolName, 12);
  FileWriteInteger(handle, timeframe);
  FileWriteInteger(handle, Digits);
  FileWriteArray(handle, Tmp, 0, 15);
  
  return;
}

void RefreshChart()
{
  int hwnd = WindowHandle(SymbolName, timeframe);

  PostMessageA(hwnd, WM_COMMAND, REFRESH_CODE, 0);
    
  return;
}

int Get_Trade_Pairs()
  {
               ArrayResize(BuyBasketPairs,0);
               nBuyPairs = ParseSymbols(BuyPairs, BuyBasketPairs);
               ArrayResize(SellBasketPairs,0);
               nSellPairs = ParseSymbols(SellPairs, SellBasketPairs);
   return(0);
  }
  
int ParseSymbols(string Symbols, string& ResultArray[])
{
    int ii;
    string Pair_suffix=StringTrimLeft(StringTrimRight(StringSubstr(Symbol(),6,StringLen(Symbol())-6)));

    Symbols = StringTrimLeft(Symbols);
    Symbols = StringTrimRight(Symbols);

    if (StringLen(Symbols) == 0) return (0);

    if (StringSubstr(Symbols, StringLen(Symbols) - 1) != ",")
    {
        Symbols = StringConcatenate(Symbols, ",");
    }

    ii = StringFind(Symbols, ",");
    while (ii != -1)
    {
        int size = ArraySize(ResultArray);
        ArrayResize(ResultArray, size + 1);
        ResultArray[size] = StringSubstr(Symbols, 0, ii)+Pair_suffix;
        Symbols = StringSubstr(Symbols, ii + 1);
        ii = StringFind(Symbols, ",");
    }

    return(ArraySize(ResultArray));
}

void init()
{  
  CreateHandle();
  
  PrevTime = Time[0];

  Get_Trade_Pairs();
  
  return;
}

void deinit()
{
  FileClose(handle);
  
  return;
}

void start()
{
  static int PrevBars = 0;
  static int Pos;
  
  if (PrevTime != Time[0])
  {
    Pos = iBarShift(Symbol(), timeframe, PrevTime);
    
    ModifyLastBar(Pos);
    WriteBars(Pos);
    
    PrevTime = Time[0];
    PrevBars = Bars;
  }
  else
  {
    if (PrevBars != Bars)
    {
      FileSeek(handle, BEGIN_OFFSET, SEEK_SET);
      
      WriteBars(Bars);
      
      PrevBars = Bars;
    }
    else
      ModifyLastBar(0);
  }

  RefreshChart();        

  return;
}