#property copyright "Copyright 2012, FrXTrader.com LLC"
#property link      "http: //www. FrXTrader.com"

extern int smaPeriod = 200;
extern double macdSigDiff = 5.0;
extern int waitForBars = 10;
extern int macdFastPeriod = 12;
extern int macdSlowPeriod = 26;
extern int macdSignalPeriod = 9;
extern double risk = 2.0;
extern double tpMultFactor = 2.0;
extern double minPipSL = 10.0;
extern double currencyAmountToRisk = 400.0;
int gi_136 = 3;
double gd_140 = 100.0;
int gi_148 = 60;
string gs_152 = "";
int gi_160 = 5;
double gd_164;
double gd_180 = 0.1;
double gd_188;
datetime gt_196;
bool gi_200 = FALSE;
bool gi_204 = FALSE;
int gi_208;
double gd_212;
double gd_220;
int gi_228 = 342516;
bool gi_232 = FALSE;
int gi_236 = -1;
bool gi_240 = FALSE;
bool gi_244 = FALSE;

int init() {
   gs_152 = Symbol();
   RefreshRates();
   gd_164 = MarketInfo(gs_152, MODE_POINT);
   gi_160 = MarketInfo(gs_152, MODE_DIGITS);
   if (gd_164 == 0.001) {
      gd_164 = 0.01;
      gi_160 = 3;
   } else {
      if (gd_164 == 0.00001) {
         gd_164 = 0.0001;
         gi_160 = 5;
      }
   }
   gd_188 = Open[0];
   gt_196 = Time[0];
   return (0);
}
		   			  	 	      	 		    	  	  				   	 	 	 	    	 	 							  				 	     			 				   			  	     	 		 	     				 						    	 	     			      	 			   	 		 	       			 					 	  		 
int deinit() {
   return (0);
}
	   	 		 		  	   	 		 	  	 				   		 	  			  		  	 		  		 		    	 			    	 	   		 	 						 			     	 		  	    		  		  	  	 		    	 	     	   					   			    		    			 			  					 
int start() {
   double ld_0 = iCustom(NULL, 0, "TrendWave", 6, 1);
   double ld_8 = iCustom(NULL, 0, "TrendWave", 7, 1);
   if (gi_232) f0_1("buySellDots", "buyDot =" + f0_3(ld_0, 5) + " sellDot = " + f0_3(ld_8, 5), 10, 110, 3, White, 11);
   double ld_16 = iMA(NULL, 0, smaPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
   double ld_24 = iCustom(NULL, 0, "Fractals", 0, 2);
   double ld_32 = iCustom(NULL, 0, "Fractals", 1, 2);
   double ld_40 = iMACD(NULL, 0, macdFastPeriod, macdSlowPeriod, macdSignalPeriod, PRICE_CLOSE, MODE_MAIN, 0);
   double ld_48 = iMACD(NULL, 0, macdFastPeriod, macdSlowPeriod, macdSignalPeriod, PRICE_CLOSE, MODE_SIGNAL, 0);
   if (ld_24 != 0.0) gd_212 = ld_24;
   if (ld_32 != 0.0) gd_220 = ld_32;
   double ld_56 = 100.0 * (ld_40 - ld_48) / MathAbs(ld_40);
   if (gi_232) {
      f0_1("macdSignalDiff", "%Diff =" + f0_3(ld_56, 1), 10, 10, 3, White, 11);
      f0_1("macdSignalVal", "macdVal =" + f0_3(ld_40, 8) + " Sig Val = " + f0_3(ld_48, 8), 10, 30, 3, White, 11);
      f0_1("barCnt", "BarCntr =" + gi_208, 10, 50, 3, White, 11);
      f0_1("buySellSetup", "BuySetup =" + gi_200 + " SellSetup = " + gi_204, 10, 70, 3, White, 11);
      f0_1("lastFracts", "lastUpFVal =" + f0_3(gd_212, 5) + " lastDnFVal = " + f0_3(gd_220, 5), 10, 130, 3, White, 11);
   }
   if (gd_188 != Open[0]) {
      gd_188 = Open[0];
      if (gi_208 > 0) gi_208--;
      else {
         gi_200 = FALSE;
         gi_204 = FALSE;
      }
      if (gi_236 == 1) gi_236 = 0;
   }
   if (f0_5(gs_152, gi_228) == 0) {
      if (gi_232) f0_1("buySellLogic", "buyDot =" + f0_3(ld_0, 5) + " SMA200 = " + f0_3(ld_16, 5) + " Close0 = " + f0_3(Close[0], 5), 10, 90, 3, White, 11);
      if (ld_0 > -1000.0 && ld_0 < 0.0 && ld_0 != EMPTY_VALUE && Close[0] > ld_16) {
         gi_200 = TRUE;
         gi_204 = FALSE;
         gi_208 = waitForBars;
      }
      if (ld_8 > -1000.0 && ld_8 > 0.0 && ld_8 != EMPTY_VALUE && Close[0] < ld_16) {
         gi_200 = FALSE;
         gi_204 = TRUE;
         gi_208 = waitForBars;
      }
      if (ld_56 > macdSigDiff && gi_208 > 0 && gi_200 && (!gi_240)) {
         gi_240 = TRUE;
         gi_244 = FALSE;
         gi_236 = 1;
      }
      if (ld_56 < (-macdSigDiff) && gi_208 > 0 && gi_204 && (!gi_244)) {
         gi_240 = FALSE;
         gi_244 = TRUE;
         gi_236 = 1;
      }
      if (gi_240 && gi_236 == 0) {
         gi_200 = FALSE;
         gi_208 = 0;
         gd_140 = (Ask - gd_220) / gd_164;
         if (gd_140 > minPipSL) {
            gi_148 = gd_140 * tpMultFactor;
            gd_180 = f0_2(gs_152, risk);
            f0_4(gs_152, gd_180, "BUY");
            EmailOnce("BUY @ "+Symbol()+" @ "+PeriodToText(), gs_152 + " ," + Period(), 0);
            //SendMail("BUY @ "+Symbol()+" @ "+PeriodToText(), OrderOpenPrice() + " ," + gs_152 + " ," + Period());
            if (gi_232) Print("BUY @ ", OrderOpenPrice() + " ," + gs_152 + " ," + Period());
         }
         gi_240 = FALSE;
         gi_236 = -1;
      }
      if (gi_244 && gi_236 == 0) {
         gi_204 = FALSE;
         gi_208 = 0;
         gd_140 = (gd_212 - Bid) / gd_164;
         if (gd_140 > minPipSL) {
            gd_180 = f0_2(gs_152, risk);
            gi_148 = gd_140 * tpMultFactor;
            f0_0(gs_152, gd_180, "SELL");
            EmailOnce("SELL @ "+Symbol()+" @ "+PeriodToText(), gs_152 + " ," + Period(), 1);
            //SendMail("SELL @ "+Symbol()+" @ "+PeriodToText(), OrderOpenPrice() + " ," + gs_152 + " ," + Period());
            if (gi_232) Print("SELL @ ", OrderOpenPrice() + " ," + gs_152 + " ," + Period());
         }
         gi_244 = FALSE;
         gi_236 = -1;
      }
   }
   return (0);
}
							 	  	   		 	 					 	 	 				     	   	  			 	 		   	   	 	 	  		 		 	  	   	 		 	   	 	  				   			 		 		 		   				 	 		 		 	  	 		 		  	   		  	 					  			  			  		 	 	 	
string f0_3(double ad_0, int ai_8) {
   return (DoubleToStr(ad_0, ai_8));
}
	   		  			   				 			 			 		  		 		  		 		    			 				   		 			  								 	 		   	 	    	 		 			  	   			   	  	 		 	 			 							 	 					       	      	   	 			 				     		   	
int f0_4(string as_0, double ad_8, string as_16) {
   double ld_40;
   double ld_48;
   double ld_60;
   double ld_68;
   int li_24 = -1;
   int li_28 = 0;
   bool li_32 = FALSE;
   int li_36 = 0;
   while (!li_32) {
      while (IsTradeContextBusy()) Sleep(10);
      RefreshRates();
      ld_40 = NormalizeDouble(MarketInfo(as_0, MODE_ASK), gi_160);
      ld_48 = NormalizeDouble(MarketInfo(as_0, MODE_BID), gi_160);
      li_24 = OrderSend(as_0, OP_BUY, ad_8, ld_40, gi_136, 0.0, 0.0, as_16, gi_228, 0, Green);
      li_28 = GetLastError();
      switch (li_28) {
      case 135/* PRICE_CHANGED */: continue;
      case 138/* REQUOTE */: continue;
      case 0/* NO_ERROR */:
         li_32 = TRUE;
         if (!(OrderSelect(li_24, SELECT_BY_TICKET))) break;
         if (gd_140 > 0.0) ld_60 = NormalizeDouble(ld_48 - gd_140 * gd_164, gi_160);
         else ld_60 = 0.0;
         if (gi_148 > 0) ld_68 = NormalizeDouble(ld_40 + gi_148 * gd_164, gi_160);
         else ld_68 = 0;
         OrderModify(li_24, OrderOpenPrice(), ld_60, ld_68, 0, Green);
         break;
      case 4/* SERVER_BUSY */:
      case 6/* NO_CONNECTION */:
      case 129/* INVALID_PRICE */:
      case 136/* OFF_QUOTES */:
      case 137/* BROKER_BUSY */:
      case 146/* TRADE_CONTEXT_BUSY */:
         li_36++;
         break;
      case 130/* INVALID_STOPS */:
         li_32 = TRUE;
         Print("Invalid Stops");
         break;
      case 131/* INVALID_TRADE_VOLUME */:
         li_32 = TRUE;
         Print("Invalid Lots");
         break;
      case 132/* MARKET_CLOSED */:
         li_32 = TRUE;
         Print("Market Close");
         break;
      case 133/* TRADE_DISABLED */:
         li_32 = TRUE;
         Print("Trades Disabled");
         break;
      case 134/* NOT_ENOUGH_MONEY */:
         li_32 = TRUE;
         Print("Not Enough Money");
         break;
      case 148/* TRADE_TOO_MANY_ORDERS */:
         li_32 = TRUE;
         Print("Too Many Orders");
         break;
      case 1/* NO_RESULT */:
      default:
         li_32 = TRUE;
         Print("Unknown Error - " + li_28);
      }
      if (li_36 > 10) li_32 = TRUE;
   }
   return (li_24);
}
	 		  		 	 			   		   	  		  		     		  		 				  		    		   	   	        		 	  		  	 						  	    	 			  				 		    	 	  		      		 	    															  		 	        			 	  			 
int f0_0(string as_0, double ad_8, string as_16) {
   double ld_40;
   double ld_48;
   double ld_60;
   double ld_68;
   int li_24 = -1;
   int li_28 = 0;
   bool li_32 = FALSE;
   int li_36 = 0;
   while (!li_32) {
      while (IsTradeContextBusy()) Sleep(10);
      RefreshRates();
      ld_40 = NormalizeDouble(MarketInfo(as_0, MODE_ASK), gi_160);
      ld_48 = NormalizeDouble(MarketInfo(as_0, MODE_BID), gi_160);
      li_24 = OrderSend(as_0, OP_SELL, ad_8, ld_48, gi_136, 0.0, 0.0, as_16, gi_228, 0, Red);
      li_28 = GetLastError();
      switch (li_28) {
      case 135/* PRICE_CHANGED */: continue;
      case 138/* REQUOTE */: continue;
      case 0/* NO_ERROR */:
         li_32 = TRUE;
         if (!(OrderSelect(li_24, SELECT_BY_TICKET))) break;
         if (gd_140 > 0.0) ld_60 = NormalizeDouble(ld_40 + gd_140 * gd_164, gi_160);
         else ld_60 = 0.0;
         if (gi_148 > 0) ld_68 = NormalizeDouble(ld_48 - gi_148 * gd_164, gi_160);
         else ld_68 = 0;
         OrderModify(li_24, OrderOpenPrice(), ld_60, ld_68, 0, Red);
         break;
      case 4/* SERVER_BUSY */:
      case 6/* NO_CONNECTION */:
      case 129/* INVALID_PRICE */:
      case 136/* OFF_QUOTES */:
      case 137/* BROKER_BUSY */:
      case 146/* TRADE_CONTEXT_BUSY */:
         li_36++;
         break;
      case 130/* INVALID_STOPS */:
         li_32 = TRUE;
         Print("Invalid Stops");
         break;
      case 131/* INVALID_TRADE_VOLUME */:
         li_32 = TRUE;
         Print("Invalid Lots");
         break;
      case 132/* MARKET_CLOSED */:
         li_32 = TRUE;
         Print("Market Close");
         break;
      case 133/* TRADE_DISABLED */:
         li_32 = TRUE;
         Print("Trades Disabled");
         break;
      case 134/* NOT_ENOUGH_MONEY */:
         li_32 = TRUE;
         Print("Not Enough Money");
         break;
      case 148/* TRADE_TOO_MANY_ORDERS */:
         li_32 = TRUE;
         Print("Too Many Orders");
         break;
      case 1/* NO_RESULT */:
      default:
         li_32 = TRUE;
         Print("Unknown Error - " + li_28);
      }
      if (li_36 > 10) li_32 = TRUE;
   }
   return (li_24);
}
	  	   								 		      		   	  	 	 			  					  		    		  	 	 	   	   	 		  	 		  		 	 	 	   		 	   		  		 		  		 	 	   		    	 		  	 	 		 			 	 	 			 		  	 		 	 	    	     	 		
double f0_2(string as_0, double ad_8) {
   double ld_16 = MarketInfo(as_0, MODE_MINLOT);
   double ld_24 = MarketInfo(as_0, MODE_MAXLOT);
   double ld_32 = AccountLeverage();
   double ld_40 = MarketInfo(as_0, MODE_LOTSIZE);
   double ld_48 = MarketInfo(as_0, MODE_LOTSTEP);
   double ld_56 = MarketInfo(as_0, MODE_TICKVALUE);
   double ld_64 = MathMin(AccountBalance(), AccountEquity());
   int li_72 = 0;
   double ld_76 = 0.0;
   if (ld_48 == 0.01) li_72 = 2;
   if (ld_48 == 0.1) li_72 = 1;
   if (gi_232) {
      f0_1("AccBal", "AccountBalance =" + f0_3(AccountBalance(), 1), 10, 10, 2, White, 11);
      f0_1("lotSzLeverage", "lotSize =" + f0_3(ld_40, 2) + " leverage =" + f0_3(ld_32, 2), 10, 30, 2, White, 11);
      f0_1("tickSL", "pipValue =" + f0_3(10.0 * ld_56, 2) + " SL = " + f0_3(gd_140 + (Ask - Bid) / gd_164, 2), 10, 50, 2, White, 11);
   }
   ld_76 = currencyAmountToRisk / (10.0 * ((gd_140 + (Ask - Bid) / gd_164) * ld_56));
   ld_76 = NormalizeDouble(ld_76, li_72);
   if (ld_76 < ld_16) ld_76 = ld_16;
   if (ld_76 > ld_24) ld_76 = ld_24;
   return (ld_76);
}
			   	     		 	  		  		  		 			 	 			 		   				  		    		 		  			 	   	  			   		   		 	 		 	 	 							  	 	 	  	 		 		  		   	  			  	  	 			 	 	 			  		  	 	 	 	  	 				 		  
int f0_5(string as_0, int ai_8) {
   int li_12 = 0;
   for (int li_16 = OrdersTotal() - 1; li_16 >= 0; li_16--) {
      OrderSelect(li_16, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber() == ai_8) {
         if (OrderSymbol() == as_0) {
            if (OrderType() == OP_BUY) {
               li_12++;
               continue;
            }
            if (OrderType() == OP_SELL) li_12++;
         }
      }
   }
   return (li_12);
}
			  			    	     		 		   		  	  	 		   	   	 	   		 	 			 			  		 	 	    				 			    			 		     				 	   	 				 	 				   		 	    				    	 	 			 	 	 		 		      	 	 							  		 
void f0_1(string as_0, string as_8, int ai_16, int ai_20, int ai_24, color ai_28, int ai_32) {
   ObjectDelete(as_0);
   ObjectCreate(as_0, OBJ_LABEL, 0, 0, 0);
   ObjectSetText(as_0, as_8, ai_32, "Trebuchet MS", ai_28);
   ObjectSet(as_0, OBJPROP_CORNER, ai_24);
   ObjectSet(as_0, OBJPROP_XDISTANCE, ai_16);
   ObjectSet(as_0, OBJPROP_YDISTANCE, ai_20);
}

string PeriodToText(int period=0)
{
   if(period==0) period=Period();
   
   switch (period)
   {
      case 1:
            return("M1");
            break;
      case 5:
            return("M5");
            break;
      case 15:
            return("M15");
            break;
      case 30:
            return("M30");
            break;
      case 60:
            return("H1");
            break;
      case 240:
            return("H4");
            break;
      case 1440:
            return("D1");
            break;
      case 10080:
            return("W1");
            break;
      case 43200:
            return("MN1");
            break;
   }
}
//+------------------------------------------------------------------+
void EmailOnce(string subject, string body, int ref=0)
{  
   static int LastAlert[5];
   
   if( LastAlert[ref] == 0 || LastAlert[ref] < Bars)
   {
      if(!IsTesting()) SendMail(subject,body);
      else Print("Mail >> ",subject," >> ",body);
      LastAlert[ref] = Bars;
      return (true);
   }
}
//+------------------------------------------------------------------+

