
#property indicator_separate_window

extern string InitialPricePeriod     =       "H1";
extern string InitialPricePosition   =    "Close";
extern int    InitialPriceOffset     =          1;

extern string PricePeriod            =       "H1";
extern string PricePosition          =    "Close";
extern int    PriceOffset            =          0;



color  PositiveColor          =       Lime;
color  NegativeColor          =        Red;
string   Font          = "Tahoma";
string   FXHSI_LS[][14];
string   Columns[2][6] = {"200"};
int IPP  = PERIOD_D1;
int IPos = PRICE_OPEN;
int CPP  = PERIOD_H1;
int CPos = PRICE_OPEN;

int FxHedgeSim(  string FxHedgeSimList[][14],
                  
                  int   FxHedgeSimInitialPricePeriod,
                  
                  int   FxHedgeSimInitialPricePosition,
                  
                  int   FxHedgeSimInitialPriceOffset,
                  
                  int   FxHedgeSimPricePeriod,
                  
                  int   FxHedgeSimPricePosition,
                  
                  int   FxHedgeSimPriceOffset  ){
                  
  string s[2][7] = {"GBPUSD",
                    "EURGBP",
                    "GBPJPY",
                    "USDCHF",
                    "NZDUSD",
                    "AUDJPY",
                    "EURJPY",
                          
                    "EURUSD",
                    "USDJPY",
                    "AUDUSD",
                    "NZDJPY",
                    "GBPCHF",
                    "CHFJPY",
                    "EURCHF"};
                          
  string   ls[5][14]  = {"","","","","","","","","","","","","",""  ,
                         "","","","","","","","","","","","","",""  ,
                         "","","","","","","","","","","","","",""  ,
                         "","","","","","","","","","","","","",""  ,
                         "","","","","","","","","","","","","",""};
  double   pr[2][7]  = {0,0,0,0,0,0,0  ,  0,0,0,0,0,0,0};
  double   cp[2][7]  = {0,0,0,0,0,0,0  ,  0,0,0,0,0,0,0};
  int      pg[2][7]  = {0,0,0,0,0,0,0  ,  0,0,0,0,0,0,0};
  int      pgt[2]    = {0,0};
  int a, b, c, d, e, f, lastp;
  double p, h, l, o, cl, di;
  string ts[][7], lasts;
  for(a=0;a<=1;a++){
    for(b=0;b<=6;b++){
      h  = iHigh(s[a][b],FxHedgeSimInitialPricePeriod,FxHedgeSimInitialPriceOffset);
      l  = iLow(s[a][b],FxHedgeSimInitialPricePeriod,FxHedgeSimInitialPriceOffset);
      o  = iOpen(s[a][b],FxHedgeSimInitialPricePeriod,FxHedgeSimInitialPriceOffset);
      cl = iClose(s[a][b],FxHedgeSimInitialPricePeriod,FxHedgeSimInitialPriceOffset);
      di = MarketInfo(s[a][b],MODE_DIGITS);
      if(FxHedgeSimInitialPricePosition==PRICE_HIGH){
        pr[a][b] = NormalizeDouble(h,di);
      }else if(FxHedgeSimInitialPricePosition==PRICE_CLOSE){
        pr[a][b] = NormalizeDouble(cl,di);
      }else if(FxHedgeSimInitialPricePosition==PRICE_LOW){
        pr[a][b] = NormalizeDouble(l,di);
      }else if(FxHedgeSimInitialPricePosition==PRICE_OPEN){
        pr[a][b] = NormalizeDouble(o,di);
      }else if(FxHedgeSimInitialPricePosition==PRICE_MEDIAN){
        pr[a][b] = NormalizeDouble((h+l)/2,di);
      }else if(FxHedgeSimInitialPricePosition==PRICE_TYPICAL){
        pr[a][b] = NormalizeDouble((h+l+cl)/3,di);
      }else{
        pr[a][b] = NormalizeDouble((h+l+o+cl)/4,di);
      }
      p          = MarketInfo(s[a][b],MODE_POINT);
      h = iHigh(s[a][b],FxHedgeSimPricePeriod,FxHedgeSimPriceOffset);
      l = iLow(s[a][b],FxHedgeSimPricePeriod,FxHedgeSimPriceOffset);
      o = iOpen(s[a][b],FxHedgeSimPricePeriod,FxHedgeSimPriceOffset);
      if(FxHedgeSimPriceOffset==0){
        cl = MarketInfo(s[a][b],MODE_BID);
      }else{
        cl = iClose(s[a][b],FxHedgeSimPricePeriod,FxHedgeSimPriceOffset);
      }
      if(FxHedgeSimPricePosition==PRICE_HIGH){
        cp[a][b] = NormalizeDouble(h,di);
      }else if(FxHedgeSimPricePosition==PRICE_CLOSE){
        cp[a][b] = NormalizeDouble(cl,di);
      }else if(FxHedgeSimPricePosition==PRICE_LOW){
        cp[a][b] = NormalizeDouble(l,di);
      }else if(FxHedgeSimPricePosition==PRICE_OPEN){
        cp[a][b] = NormalizeDouble(o,di);
      }else if(FxHedgeSimPricePosition==PRICE_MEDIAN){
        cp[a][b] = NormalizeDouble((h+l)/2,di);
      }else if(FxHedgeSimPricePosition==PRICE_TYPICAL){
        cp[a][b] = NormalizeDouble((h+l+cl)/3,di);
      }else{
        cp[a][b] = NormalizeDouble((h+l+o+cl)/4,di);
      }
      if(cp[a][b]>pr[a][b]){
        c = (NormalizeDouble(cp[a][b]-pr[a][b],di))/p;
        if(a==0){
          pg[a][b] = c;
          pgt[0]+=c;
        }else{
          pg[a][b] = -(c);
          pgt[1]-=c;
        }
      }else if(cp[a][b]<pr[a][b]){
        c = (NormalizeDouble(pr[a][b]-cp[a][b],di))/p;
        if(a==0){
          pg[a][b] = -(c);
          pgt[0]-=c;
        }else{
          pg[a][b] = c;
          pgt[1]+=c;
        }
      }
    }
  }
  ArrayCopy(ts,s);
  a    = 0;
  d    = NULL;
  e    = NULL;
  lastp = NULL;
  lasts = "";
  while(a<=13){
    for(b=0;b<=1;b++){
      for(c=0;c<=6;c++){
        if(lasts==""&&ts[b][c]!=""){
          lasts = ts[b][c];
          lastp = pg[b][c];
        }
        if(ts[b][c]!=""){
          if(pg[b][c]>=lastp||lastp==NULL){
            lasts = ts[b][c];
            lastp = pg[b][c];
            d = b;
            e = c;
          }
        }
      }
    }

    ls[4][a] = lastp;
    ts[d][e] =    "";
    lasts    =    "";
    lastp    =  NULL;
    a++;
  }
  ArrayCopy(FxHedgeSimList, ls);
  return(pgt[0]-pgt[1]);
}

void CreateListObjects(){
  int a, b, ypos;
  string info;
  for(a=0;a<=5;a++){

    }
  
  ObjectCreate("GainsTotal", OBJ_LABEL, 0, 0, 0);
  ObjectSetText("GainsTotal", "T = -", 22, Font, PositiveColor);
  ObjectSet("GainsTotal", OBJPROP_CORNER, 1);
  ObjectSet("GainsTotal", OBJPROP_XDISTANCE, 20);
  ObjectSet("GainsTotal", OBJPROP_YDISTANCE, ypos+5);
  }

void DeleteListObjects(){
  int a, b;
  ObjectDelete("FxHedgeSim");
  for(a=0;a<=5;a++){
  ObjectDelete(Columns[0][a]);
  for(b=0;b<=13;b++) ObjectDelete(Columns[0][a]+"_"+b);
  }
  ObjectDelete("GainsTotal");
}

void UpdateListObjects(){
  color cc;
  int a, b, gains;
  gains = FxHedgeSim(  FXHSI_LS,
                       IPP,
                       IPos,
                       InitialPriceOffset,
                       CPP,
                       CPos,
                       PriceOffset);
  for(a=0;a<=13;a++){
    cc = PositiveColor;
    if(StrToInteger(FXHSI_LS[4][a])<0)
      cc = NegativeColor;
   
  }
  cc = PositiveColor;
  if(gains<0)
    cc = NegativeColor;
  ObjectSetText("GainsTotal", "T = "+gains, 22, Font, cc);
}

int init(){
  if(InitialPricePeriod=="MN"){
    IPP=PERIOD_MN1;
  }else if(InitialPricePeriod=="W1"){
    IPP=PERIOD_W1;
  }else if(InitialPricePeriod=="D1"){
    IPP=PERIOD_D1;
  }else if(InitialPricePeriod=="H4"){
    IPP=PERIOD_H4;
  }else if(InitialPricePeriod=="H1"){
    IPP=PERIOD_H1;
  }else if(InitialPricePeriod=="M30"){
    IPP=PERIOD_M30;
  }else if(InitialPricePeriod=="M15"){
    IPP=PERIOD_M15;
  }else if(InitialPricePeriod=="M5"){
    IPP=PERIOD_M5;
  }else if(InitialPricePeriod=="M1"){
    IPP=PERIOD_M1;
  }else{
    InitialPricePeriod =      "H1";
    IPP                = PERIOD_H1;
  }
  if(PricePeriod=="MN"){
    CPP=PERIOD_MN1;
  }else if(PricePeriod=="W1"){
    CPP=PERIOD_W1;
  }else if(PricePeriod=="D1"){
    CPP=PERIOD_D1;
  }else if(PricePeriod=="H4"){
    CPP=PERIOD_H4;
  }else if(PricePeriod=="H1"){
    CPP=PERIOD_H1;
  }else if(PricePeriod=="M30"){
    CPP=PERIOD_M30;
  }else if(PricePeriod=="M15"){
    CPP=PERIOD_M15;
  }else if(PricePeriod=="M5"){
    CPP=PERIOD_M5;
  }else if(PricePeriod=="M1"){
    CPP=PERIOD_M1;
  }else{
    PricePeriod =      "H1";
    CPP         = PERIOD_H1;
  }
  if(InitialPricePosition=="High"){
    IPos=PRICE_HIGH;
  }else if(InitialPricePosition=="Low"){
    IPos=PRICE_LOW;
  }else if(InitialPricePosition=="Open"){
    IPos=PRICE_OPEN;
  }else if(InitialPricePosition=="Close"){
    IPos=PRICE_CLOSE;
  }else if(InitialPricePosition=="Median"){
    IPos=PRICE_MEDIAN;
  }else if(InitialPricePosition=="Typical"){
    IPos=PRICE_TYPICAL;
  }else if(InitialPricePosition=="Weighted"){
    IPos=PRICE_WEIGHTED;
  }else{
    InitialPricePosition =     "Weighted";
    IPos                 = PRICE_WEIGHTED;
  }
  if(PricePosition=="High"){
    CPos=PRICE_HIGH;
  }else if(PricePosition=="Low"){
    CPos=PRICE_LOW;
  }else if(PricePosition=="Open"){
    CPos=PRICE_OPEN;
  }else if(PricePosition=="Close"){
    CPos=PRICE_CLOSE;
  }else if(PricePosition=="Median"){
    CPos=PRICE_MEDIAN;
  }else if(PricePosition=="Typical"){
    CPos=PRICE_TYPICAL;
  }else if(PricePosition=="Weighted"){
    CPos=PRICE_WEIGHTED;
  }else{
    PricePosition =      "Weighted";
    CPos          = PRICE_WEIGHTED;
  }
  CreateListObjects();
  UpdateListObjects();
  return(0);
}

int start(){
  UpdateListObjects();
  return(0);
}

int deinit(){
  DeleteListObjects();
  return(0);
}

