//+------------------------------------------------------------------+
//|                                Convergance-Divergence EURUSD.mq4 |
//|                               Copyright © 2010, Nondisclosure007 |
//|                                               http://no.link.yet |
//+------------------------------------------------------------------+


#property copyright "Copyright © 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern bool varStopEA=false;
extern double varRisk=3.0;
extern int    varStopLoss=2000;
extern int    varTakeProfit=60;
extern int    varSlippage=30;

int varOrderMagicNumber;
string varOrderComment=" ";
double varSynBid,varSynAsk;

int init()
  {
   varOrderMagicNumber=funcGenerateMagicNumber(Period(),Symbol());
   if (varOrderMagicNumber==0) 
   {
      varStopEA=true; 
	   Alert("The EA will not Operate due to the Symbol() not being found in the funcSymbol2Val function");
	   return(0);
   }
   return(0);
  }

int deinit()
  {
   return(0);
  }

int start()
  {
   while (IsTradeAllowed())
   {
      if (varStopEA) {return(0);}
      //bool varNewBar=funcIsNewBar(Period());
      bool varNoOrder=true;
      procGetSyns();
//      Comment("varSynAsk: ",NormalizeDouble(varSynAsk,5),"\n","varSynBid: ",NormalizeDouble(varSynBid,5));
      for (int i=0; i<OrdersTotal(); i++)
      {//1 +cycle by orders search
         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if (OrderSymbol()!=Symbol()) continue;
         varNoOrder=funcCloseOrder(OrderType());
      }
      if (varNoOrder) {procOpenOrder();}
      Sleep(500);
   }
   return(0);
  }
//+---end start()------------------------------------------------------------------+

bool funcCloseOrder(int varOrderType)
{
   bool varFridayOK=funcFridayOK();   
   bool varReturnValue=false;
   double varPrice=0;
   color varColor;
   if ((OrderType()==OP_BUY && varSynAsk<Bid && (Bid-varSynAsk)/Point>100) || 
       (OrderType()==OP_SELL && varSynBid>Ask && (varSynBid-Ask)/Point>100) ||
        !varFridayOK) 
       {
         if (OrderType()==OP_BUY) {varPrice=Bid; varColor=Blue;}
         if (OrderType()==OP_SELL) {varPrice=Ask; varColor=Red;}
         varReturnValue=OrderClose(OrderTicket(),OrderLots(),varPrice,varSlippage,varColor);
       }
   return(varReturnValue);
}

void procOpenOrder()
{
   int varTicket=0;
   double varTempSL=0, varTempTP=0;
//   double varLots=MM(Symbol(),varRisk);
   double varLots=1.0;
   bool varFridayOK=funcFridayOK();
   bool varTimeOK=funcCheckTime();
   if (!varFridayOK || !varTimeOK) {return(0);}
   if (varSynBid>Ask && (varSynBid-Ask)/Point>100) 
   {
      varTempSL=NormalizeDouble(Bid-(MathAbs(varStopLoss)*Point),Digits);
      varTempTP=NormalizeDouble(Ask+(MathAbs(varTakeProfit)*Point),Digits);
      varTicket=OrderSend(Symbol(),OP_BUY,varLots,Ask,varSlippage,varTempSL,varTempTP,varOrderComment,varOrderMagicNumber,0,Blue);
   }
   if (varSynAsk<Bid && (Bid-varSynAsk)/Point>100) 
   {
      varTempSL=NormalizeDouble(Ask+(MathAbs(varStopLoss)*Point),Digits);
      varTempTP=NormalizeDouble(Bid-(MathAbs(varTakeProfit)*Point),Digits);
      varTicket=OrderSend(Symbol(),OP_SELL,varLots,Bid,varSlippage,varTempSL,varTempTP,varOrderComment,varOrderMagicNumber,0,Red);
   }
}

void procDrawSyns(string varName, double varPrice, color varColor)
{
   ObjectDelete(varName);
   ObjectCreate(varName,OBJ_HLINE,0,0,varPrice);
   ObjectSet(varName,OBJPROP_COLOR,varColor);
}

void procGetSyns()
{
   double varGBPBid=funcSyn("EURGBP","GBPUSD",MODE_BID);
   double varAUDBid=funcSyn("EURAUD","AUDUSD",MODE_BID);
   double varNZDBid=funcSyn("EURNZD","NZDUSD",MODE_BID);
   double varCHFBid=funcSyn1("EURCHF","USDCHF",MODE_BID);
   double varCADBid=funcSyn1("EURCAD","USDCAD",MODE_BID);
   varSynBid=(varGBPBid+varAUDBid+varNZDBid+varCHFBid+varCADBid)/5;
   procDrawSyns("SynBid",varSynBid,Blue);
   double varGBPAsk=funcSyn("EURGBP","GBPUSD",MODE_ASK);
   double varAUDAsk=funcSyn("EURAUD","AUDUSD",MODE_ASK);
   double varNZDAsk=funcSyn("EURNZD","NZDUSD",MODE_ASK);
   double varCHFAsk=funcSyn1("EURCHF","USDCHF",MODE_ASK);
   double varCADAsk=funcSyn1("EURCAD","USDCAD",MODE_ASK);
   varSynAsk=(varGBPAsk+varAUDAsk+varNZDAsk+varCHFAsk+varCADAsk)/5;
   procDrawSyns("SynAsk",varSynAsk,Tomato);
}


double funcSyn(string varAB, string varBC, int varPriceType)
{
   double varSynABBid=MarketInfo(varAB,varPriceType);
   double varSynBCBid=MarketInfo(varBC,varPriceType);
   double varSynBid=varSynABBid*varSynBCBid;
   return(varSynBid);
}

double funcSyn1(string varAB, string varBC, int varPriceType)
{
   double varSynABBid=MarketInfo(varAB,varPriceType);
   double varSynBCBid=MarketInfo(varBC,varPriceType);
   double varSynBid=varSynABBid*(1/varSynBCBid);
   return(varSynBid);
}

bool funcFridayOK()
{
   bool varReturnFridayValue=true;
   datetime curtime=Time[0];
   int theday=TimeDayOfWeek(curtime);
//   int themonth=TimeMonth(curtime);
//   int theyear=TimeYear(curtime);
   int thehour=TimeHour(curtime);
//   int theminute=TimeMinute(curtime);
   if (theday==5 && thehour>18) {varReturnFridayValue=false;}
   return(varReturnFridayValue);
}

bool funcCheckTime()
{
   //see Forex Trading and Probabilites for Times to trade.
   bool varReturnTime=false;
   datetime curtime=Time[0];
   datetime lasttime=Time[5];
   double PeriodSeconds=5*Period()*60;
   if ((curtime-lasttime)<=PeriodSeconds) {varReturnTime=true;}
   return(varReturnTime);  
}

int funcGenerateMagicNumber(int vartempTimeframe, string varSym)
{
   int vartempTimeframeval=funcTimeFrame_Const2Val(vartempTimeframe);
   int vartempSymbol=funcSymbol2Val(varSym);
   if (vartempSymbol==00) {return(vartempSymbol);}
   return(vartempTimeframeval+vartempSymbol);    
}
//+------------------------------------------------------------------+
//| Time frame interval appropriation  function                      |
//+------------------------------------------------------------------+
int funcTimeFrame_Const2Val(int varConstant) 
{
   switch(varConstant) 
   {
      case 1:  
         return(1000);
      case 5:  
         return(2000);
      case 15:
         return(3000);
      case 30:
         return(4000);
      case 60:
         return(5000);
      case 240:
         return(6000);
      case 1440:
         return(7000);
      case 10080:
         return(8000);
      case 43200:
         return(9000);
   }
}

int funcSymbol2Val(string varSymbol) 
{
   string varMySymbol = StringSubstr(Symbol(),0,6);
	if(varMySymbol=="AUDCAD") return(1);
	if(varMySymbol=="AUDJPY") return(2);
	if(varMySymbol=="AUDNZD") return(3);
	if(varMySymbol=="AUDUSD") return(4);
	if(varMySymbol=="CHFJPY") return(5);
	if(varMySymbol=="EURAUD") return(6);
	if(varMySymbol=="EURCAD") return(7);
	if(varMySymbol=="EURCHF") return(8);
	if(varMySymbol=="EURGBP") return(9);
	if(varMySymbol=="EURJPY") return(10);
	if(varMySymbol=="EURUSD") return(11);
	if(varMySymbol=="GBPCHF") return(12);
	if(varMySymbol=="GBPJPY") return(13);
	if(varMySymbol=="GBPUSD") return(14);
	if(varMySymbol=="NZDUSD") return(15);
	if(varMySymbol=="USDCAD") return(16);
	if(varMySymbol=="USDCHF") return(17);
	if(varMySymbol=="USDJPY") return(18);
	if(varMySymbol=="NZDJPY") return(19);
	if(varMySymbol=="AUDCHF") return(20);	
	if(varMySymbol=="EURNZD") return(21);
	if(varMySymbol=="GBPNZD") return(22);	
	if(varMySymbol=="NZDCHF") return(23);	
	if(varMySymbol=="USDGSD") return(24);	
	if(varMySymbol=="USDZAR") return(25);
	if(varMySymbol=="USDMXN") return(26);
	if(varMySymbol=="GBPAUD") return(27);
	if(varMySymbol=="CADJPY") return(28);
	if(varMySymbol=="GBPCAD") return(29);	
	return(00);
}

