//+------------------------------------------------------------------+
//|                                          TrainagleSpotProfit.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+


string ArbitrageRings[12][3];
extern int ArbRing=-1;

extern double LotSize=0.01;


extern double spread=0;

extern string tradeType="-1";

extern int startIndex=0;
extern int endIndex=0;
struct V_tradeObject{

int indexCurr1;
int indexCurr2;
int indexCurr3;
double open1;
double open2;
double open3;
int dirCurr1;
int dirCurr2;
int dirCurr3;
double profitCurr1;
double profitCurr2;
double profitCurr3;
string code;



};
color pallet[8]={DarkSlateGray,Blue,DarkGreen,Teal,FireBrick,Orange,Indigo,DarkTurquoise};

color Tens=Yellow;
color Fifties=Lime;
color Hundreds=Lime;

color EightyTwenty=Teal;

V_tradeObject backTradeObject;


void Brackets()
{
     double start=0.5;
     double end=2.5;
     double bidFac=0.0005;
     if(Bid > 50)
     {
         start=80;
         end=200;
         bidFac=0.1;
     }
      
      while(start <=end)
      {
      
            if(Period() <30)
            {
                  if(StringSubstr(DoubleToStr(start,6),5,1)=="0")
                  {
                           ObjectDelete("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5));
                           ObjectCreate("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJ_HLINE,0,0,start);
                           ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_STYLE,STYLE_DASHDOT);
                           ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_COLOR,Tens);
                           ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_BACK,true);
                           ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_ANCHOR,true);
                   }
                    if(StringSubstr(DoubleToStr(start,5),4,2)=="20"  ||StringSubstr(DoubleToStr(start,5),4,2)=="80" )
                  {
                        ObjectDelete("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5));
                        ObjectCreate("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJ_HLINE,0,0,start);
                        ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_STYLE,STYLE_DASHDOT);
                        ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_COLOR,EightyTwenty);
                        ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_BACK,true);
                        ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_ANCHOR,true);
                  }
                  
            }
            if(Period() <240)
            {
                  if(StringSubstr(DoubleToStr(start,5),4,2)=="00" )
                  {
                  ObjectDelete("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5));
                  ObjectCreate("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJ_HLINE,0,0,start);
                  ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_STYLE,STYLE_SOLID);
                  ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_COLOR,Hundreds);
                  ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_BACK,true);
                  ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_ANCHOR,true);
                  }
                  if(StringSubstr(DoubleToStr(start,5),4,2)=="50")
                  {
                        ObjectDelete("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5));
                        ObjectCreate("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJ_HLINE,0,0,start);
                        ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_STYLE,STYLE_DASHDOT);
                        ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_COLOR,Fifties);
                        ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_BACK,true);
                        ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_ANCHOR,true);
                  }
            
            }
            if(Period()>=240)
            {
                  if(StringSubstr(DoubleToStr(start,5),4,2)=="00" )
                  {
                  ObjectDelete("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5));
                  ObjectCreate("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJ_HLINE,0,0,start);
                  ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_STYLE,STYLE_SOLID);
                  ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_COLOR,Hundreds);
                  ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_BACK,true);
                  ObjectSet("ARJ-"+"Brk"+"Level:"+DoubleToStr(start,5),OBJPROP_ANCHOR,true);
                  }
            }
            
           
            
            start=start+bidFac;
      }
      
      return;


}



int OnInit()
  {
//---
         
          ArbitrageRings[0][0]="EURJPY";
         ArbitrageRings[0][1]="EURUSD";
         ArbitrageRings[0][2]="USDJPY";
         // 2. GBPJPY,GBPUSD,USDJPY
         ArbitrageRings[1][0]="GBPJPY";
         ArbitrageRings[1][1]="GBPUSD";
         ArbitrageRings[1][2]="USDJPY";
         // 3. EURUSD,EURGBP,GBPUSD
         ArbitrageRings[2][0]="EURUSD";
         ArbitrageRings[2][1]="GBPUSD";
         ArbitrageRings[2][2]="EURGBP";
         // 4. EURUSD,AUSUSD, EURAUD
         ArbitrageRings[3][0]="EURUSD";
         ArbitrageRings[3][1]="AUSUSD";
         ArbitrageRings[3][2]="EURAUD";
         
         // 5. GBPCHF,GBPUSD,USDCHF
         ArbitrageRings[4][0]="GBPCHF";
         ArbitrageRings[4][1]="GBPUSD";
         ArbitrageRings[4][2]="USDCHF";
         // 6. GBPUSD,GBPAUD,AUDUSD
         ArbitrageRings[5][0]="GBPUSD";
         ArbitrageRings[5][1]="GBPAUD";
         ArbitrageRings[5][2]="AUDUSD";
         // 7. EURJPY,CADJPY,EURCAD
         ArbitrageRings[6][0]="EURJPY";
         ArbitrageRings[6][1]="CADJPY";
         ArbitrageRings[6][2]="EURCAD";
         // 8.GBPJPY, GBPCHF,CHFJPY
         ArbitrageRings[7][0]="GBPJPY";
         ArbitrageRings[7][1]="GBPCHF";
         ArbitrageRings[7][2]="CHFJPY";
         // 9.EURJPY, EURCHF,CHFJPY
         ArbitrageRings[8][0]="EURJPY";
         ArbitrageRings[8][1]="EURCHF";
         ArbitrageRings[8][2]="CHFJPY";
         // 10.USDJPY, USDCHF,CHFJPY
         ArbitrageRings[9][0]="USDJPY";
         ArbitrageRings[9][1]="USDCHF";
         ArbitrageRings[9][2]="CHFJPY";
         
         
	      ArbitrageRings[10][0]="EURCHF";
         ArbitrageRings[10][1]="EURUSD";
         ArbitrageRings[10][2]="USDCHF";
         
         ArbitrageRings[11][0]="USDCHF";
         ArbitrageRings[11][1]="USDCAD";
         ArbitrageRings[11][2]="CADCHF";
         
// 9. GBPJPY,GBPCAD ,CADJPY
         
         if(ArbRing==-1)
         {
            int j=0;
            while (Symbol()!=ArbitrageRings[j][0])
            {
                  j++;
                  if(j>11)
                  {
                     break;
                  }
            }
            
            ArbRing=j;
         }
          Brackets();
          open_V_Trade(startIndex,tradeType);
          
          
         ObjectCreate("ARJ-Spot", OBJ_LABEL, 0, 0, 0);
         ObjectSet("ARJ-Spot", OBJPROP_CORNER, 1);
         ObjectSet("ARJ-Spot", OBJPROP_XDISTANCE, 10);
         ObjectSet("ARJ-Spot", OBJPROP_YDISTANCE, 20);
         ObjectSetText("ARJ-Spot","Current Spread:"+DoubleToString(spread,5), 10, "Courier", Yellow);      
         
         ObjectCreate("ARJ-Start", OBJ_LABEL, 0, 0, 0);
         ObjectSet("ARJ-Start", OBJPROP_CORNER, 1);
         ObjectSet("ARJ-Start", OBJPROP_XDISTANCE, 10);
         ObjectSet("ARJ-Start", OBJPROP_YDISTANCE, 40);
         ObjectSetText("ARJ-Start","Start Index:"+ IntegerToString(startIndex), 10, "Courier", Lime);
         
         ObjectCreate("ARJ-End", OBJ_LABEL, 0, 0, 0);
         ObjectSet("ARJ-End", OBJPROP_CORNER, 1);
         ObjectSet("ARJ-End", OBJPROP_XDISTANCE, 10);
         ObjectSet("ARJ-End", OBJPROP_YDISTANCE, 60);
         ObjectSetText("ARJ-End","End Index:"+IntegerToString(endIndex), 10, "Courier", Red);
        
        ObjectCreate("ARJ-Type", OBJ_LABEL, 0, 0, 0);
         ObjectSet("ARJ-Type", OBJPROP_CORNER, 1);
         ObjectSet("ARJ-Type", OBJPROP_XDISTANCE, 10);
         ObjectSet("ARJ-Type", OBJPROP_YDISTANCE, 80);
         ObjectSetText("ARJ-Type","Trade Type:"+tradeType, 10, "Courier", Purple);
         
         
         ObjectCreate("ARJ-Ring", OBJ_LABEL, 0, 0, 0);
         ObjectSet("ARJ-Ring", OBJPROP_CORNER, 2);
         ObjectSet("ARJ-Ring", OBJPROP_XDISTANCE, 350);
         ObjectSet("ARJ-Ring", OBJPROP_YDISTANCE, 10);
         ObjectSetText("ARJ-Ring","Ring Symbols:"+" : "+ArbitrageRings[ArbRing][0]+" : "+ArbitrageRings[ArbRing][1]+ " : "+ArbitrageRings[ArbRing][2], 14, "Courier", White);
         
        
         
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
           int i, ot=ObjectsTotal()-1;
         string id;

         for(i=ot;i>=0;i--)
         {    
             id=ObjectName(i);
             if(StringSubstr(id,0,4)=="ARJ-")
             {
               ObjectDelete(id);
              }
         }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   
  }
//+------------------------------------------------------------------+

double V_MaxNegative=0;
int V_TradeCount=0;
double V_Profit=0;

void open_V_Trade(int index,string Type)
{
     double vals[6];
     if(Type !="-1")
     {       
                        backTradeObject.code=Type;
                        backTradeObject.dirCurr1=StringToInteger( StringSubstr(Type,0,1));
                        backTradeObject.dirCurr2=StringToInteger( StringSubstr(Type,1,1));
                        backTradeObject.dirCurr3=StringToInteger( StringSubstr(Type,2,1));
                        
                        backTradeObject.indexCurr1=index;
                        backTradeObject.indexCurr2=index;
                        backTradeObject.indexCurr3=index;
                        
                        backTradeObject.open1=iOpen(ArbitrageRings[ArbRing][0],Period(),index);
                        backTradeObject.open2=iOpen(ArbitrageRings[ArbRing][1],Period(),index);
                        backTradeObject.open3=iOpen(ArbitrageRings[ArbRing][2],Period(),index);
                        
                        V_Profit_Check(index);
                        
      }                
       return;
      
}


void V_Profit_Check(int index)
 {
      string profitBreakup="";
      double close1=iClose(ArbitrageRings[ArbRing][0],Period(),endIndex);
      double close2=iClose(ArbitrageRings[ArbRing][1],Period(),endIndex);
      double close3=iClose(ArbitrageRings[ArbRing][2],Period(),endIndex);
      
      double p1=(MathAbs(backTradeObject.open1-close1)/MarketInfo(ArbitrageRings[ArbRing][0],MODE_POINT))*LotSize;
      double p2=(MathAbs(backTradeObject.open2-close2)/MarketInfo(ArbitrageRings[ArbRing][1],MODE_POINT))*LotSize;
      double p3=(MathAbs(backTradeObject.open3-close3)/MarketInfo(ArbitrageRings[ArbRing][2],MODE_POINT))*LotSize;
      
      double s1=((MarketInfo(ArbitrageRings[ArbRing][0],MODE_ASK)-MarketInfo(ArbitrageRings[ArbRing][0],MODE_BID))/MarketInfo(ArbitrageRings[ArbRing][0],MODE_POINT))*LotSize;
      double s2=((MarketInfo(ArbitrageRings[ArbRing][1],MODE_ASK)-MarketInfo(ArbitrageRings[ArbRing][1],MODE_BID))/MarketInfo(ArbitrageRings[ArbRing][1],MODE_POINT))*LotSize;
      double s3=((MarketInfo(ArbitrageRings[ArbRing][2],MODE_ASK)-MarketInfo(ArbitrageRings[ArbRing][2],MODE_BID))/MarketInfo(ArbitrageRings[ArbRing][2],MODE_POINT))*LotSize;
      if(spread==0)
      {
         spread=s1+s2+s3;
        
      }
       ObjectSetText("ARJ-Spot","Current Spread:"+DoubleToString(spread,5), 7, "Courier", Yellow);  
     
      
      if(backTradeObject.dirCurr1==1)
      {
            
            
            if(close1 > backTradeObject.open1)
            {
                  backTradeObject.profitCurr1=p1;
            }
            if(close1 < backTradeObject.open1)
            {
                  backTradeObject.profitCurr1=p1*-1;
            }
            
      }
       if(backTradeObject.dirCurr1==0)
      {
            
            if(close1 > backTradeObject.open1)
            {
                backTradeObject.profitCurr1=p1*-1;
            }
            if(close1 < backTradeObject.open1)
            {
               backTradeObject.profitCurr1=p1;
            }
      }
       if(backTradeObject.dirCurr2==1)
      {
            
            if(close2 > backTradeObject.open1)
            {
                  backTradeObject.profitCurr2=p2;
            }
            if(close2 < backTradeObject.open2)
            {
                  backTradeObject.profitCurr2=p2*-1;
            }
      }
       if(backTradeObject.dirCurr2==0)
      {
            
            if(close2 > backTradeObject.open2)
            {
                backTradeObject.profitCurr2=p2*-1;
            }
            if(close2 < backTradeObject.open2)
            {
               backTradeObject.profitCurr2=p2;
            }
      }
       if(backTradeObject.dirCurr3==1)
      {
            
            if(close3 > backTradeObject.open3)
            {
                  backTradeObject.profitCurr3=p3;
            }
            if(close3 < backTradeObject.open3)
            {
                  backTradeObject.profitCurr3=p3*-1;
            }
      }
       if(backTradeObject.dirCurr3==0)
      {
            
            if(close3 > backTradeObject.open3)
            {
                backTradeObject.profitCurr3=p3*-1;
            }
            if(close3 < backTradeObject.open3)
            {
               backTradeObject.profitCurr3=p3;
            }
      }
      
      
       double profit= backTradeObject.profitCurr1+backTradeObject.profitCurr2+backTradeObject.profitCurr3;
       
     Print("Profit Breakup index:"+index+"  1:"+ DoubleToString(backTradeObject.profitCurr1,2)+"  2:"+DoubleToString(backTradeObject.profitCurr2,2)+"  3:"+ DoubleToString( backTradeObject.profitCurr3,2));  
     if(profit < V_MaxNegative)
     {
        
     
         V_MaxNegative=profit;
         //Print("Loss -ve Max Profit",profit," OpenTime:",iTime(Symbol(),Period(),backTradeObject.indexCurr1)," CLose:",close1, " CLose Time:",iTime(Symbol(),Period(),index)," Trade Code:",backTradeObject.code);
     }
      
         ObjectDelete("ARJ-Profit");
         ObjectCreate("ARJ-Profit", OBJ_LABEL, 0, 0, 0);
         ObjectSet("ARJ-Profit", OBJPROP_CORNER, 1);
         ObjectSet("ARJ-Profit", OBJPROP_XDISTANCE, 10);
         ObjectSet("ARJ-Profit", OBJPROP_YDISTANCE, 100);
         
     
      if(profit > 0)
      {
            ObjectSetText("ARJ-Profit","Profit:"+DoubleToString(profit,5), 10, "Courier", Lime);
            
      }
        if(profit < 0)
      {
            ObjectSetText("ARJ-Profit","Profit:"+DoubleToString(profit,5), 10, "Courier", FireBrick);
      }
      
         ObjectDelete("ARJ-ProfitDelta");
         ObjectCreate("ARJ-ProfitDelta", OBJ_LABEL, 0, 0, 0);
         ObjectSet("ARJ-ProfitDelta", OBJPROP_CORNER, 1);
         ObjectSet("ARJ-ProfitDelta", OBJPROP_XDISTANCE, 10);
         ObjectSet("ARJ-ProfitDelta", OBJPROP_YDISTANCE, 120);
         profitBreakup="Profit Breakup 1:: "+DoubleToString(backTradeObject.profitCurr1,2)+ " 2:: "+DoubleToString(backTradeObject.profitCurr2,2)+"  3:: "+DoubleToString(backTradeObject.profitCurr3,2);
         ObjectSetText("ARJ-ProfitDelta",profitBreakup, 10, "Courier", PowderBlue);
      
            
            
         Print("Profit= ",profit," OpenTime:",iTime(Symbol(),Period(),backTradeObject.indexCurr1)," Close:",close1, " Close Time:",iTime(Symbol(),Period(),index)," Trade Code:",backTradeObject.code);
         Print(profitBreakup);
            ObjectDelete("ARJ-TradeLineD"+V_TradeCount);
            ObjectCreate(ChartID(),"ARJ-TradeLineD"+V_TradeCount,OBJ_TREND,0,iTime(Symbol(),Period(),backTradeObject.indexCurr1),backTradeObject.open1,iTime(Symbol(),Period(),endIndex),close1);
            ObjectSetInteger(ChartID(),"ARJ-TradeLineD"+V_TradeCount,OBJPROP_COLOR,White);
            ObjectSetInteger(ChartID(),"ARJ-TradeLineD"+V_TradeCount,OBJPROP_RAY,false);
            ObjectSetInteger(ChartID(),"ARJ-TradeLineD"+V_TradeCount,OBJPROP_WIDTH,1);
            ObjectSetInteger(ChartID(),"ARJ-TradeLineD"+V_TradeCount,OBJPROP_STYLE,STYLE_DASHDOTDOT);
             ObjectCreate(ChartID(),"ARJ-TradeTextA"+V_TradeCount,OBJ_TEXT,0,iTime(Symbol(),Period(),backTradeObject.indexCurr1),backTradeObject.open1);
            ObjectSetInteger(ChartID(),"ARJ-TradeTextA"+V_TradeCount,OBJPROP_COLOR,Yellow);
            ObjectSetText("ARJ-TradeTextA"+V_TradeCount,"Trade:"+V_TradeCount +":"+backTradeObject.code, 10, "TimesNewRoman", Yellow);
            
            
      
 }