//==================================================================================================
// 2012-07-15 by Capella at http://www.worldwide-invest.org
// - Removed protection
// - Cleaned code
// - Renamed functions ot their ori8ginal names
// - Added news-filter - requires indicator FFCal
// 2013-12-05 by Vlad (vlad123) at http://forexsystems.ru/sovetniki/72210-testirovanie-sovetnikov-46.html
// - added PipStarter_Threshold, PipStarter_ThresholdPips, PipStarter_Booster
// - added current Symbol() verification while scanning open Orders
//==================================================================================================

#property copyright "ForexHacked 2.5"
#property link      "http://www.ForexHacked.com"

extern string _________ = "Magic Number Must be UNIQUE for each chart!";
extern int MagicNumber = 133714;
extern double Lots = 0.01;
extern double TakeProfit = 45.0;
extern double Booster = 1.7;
extern int MaxBuyOrders = 9;
extern int MaxSellOrders = 9;
extern bool AllowiStopLoss = FALSE;
extern int iStopLoss = 300;
extern int StartHour = 0;
extern int StartMinute = 0;
extern int StopHour = 23;
extern int StopMinute = 55;
extern int StartingTradeDay = 0;
extern int EndingTradeDay = 7;
extern int slippage = 3;
extern bool allowTrending = FALSE;
extern int trendTrigger = 3;
extern int trendPips = 5;
extern int trendStoploss = 5;
extern double StopLossPct = 100.0;
extern double TakeProfitPct = 100.0;
extern bool PauseNewTrades = FALSE;
extern int StoppedOutPause = 600;
extern bool SupportECN = TRUE;
extern bool MassHedge = FALSE;
extern double MassHedgeBooster = 1.01;
extern int TradesDeep = 5;
extern string EA_Name = "ForexHacked 2.5";
extern int PipStarter = 31;
extern int PipStarter_Threshold = 9;
extern int PipStarter_ThresholdPips = 0;
extern double PipStarter_Booster = 1.0;
bool UseNewsFilter = FALSE;
int MinsBeforeNews = 60; 
int MinsAfterNews  = 60;
int NewsImpact = 3;

double earnings = 0.0;
double priceadd = 0.0;
int stoploss = 0;
int gi_208 = 5000;
double gd_244;
bool gi_260;
int imaaverage = 7;
int imamashift = 0;
int imamamethod = MODE_LWMA;
int imaappliedprice = PRICE_WEIGHTED;
double isarstep = 0.25;
double isarmax = 0.2;
int previoustime;
double point;
int lotround;
bool gi_384;
bool gi_388;
bool gi_392;
bool gi_396;
int ticket;
int command;
string hedgetext = " hedged";
int filename;

void Log(string as_0) 
{
   if (filename >= 0) 
		FileWrite(filename, TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS) + ": " + as_0);
}

double CalcLots(double a_minlot_0) 
{
   double minlot_32;
   double ld_8 = AccountEquity() - gi_208;
   double ld_16 = 0;
   double ld_24 = 0;
   minlot_32 = a_minlot_0;
   if (minlot_32 < 0.0) 
		Print("ERROR tmp=" + ld_8 + ",a=" + ld_16 + ",b=" + ld_24 + ",AccountEquity()=" + AccountEquity());
   Log("Equity=" + AccountEquity() + ",lots=" + minlot_32);
   return (minlot_32);
}

int deinit() 
{
   FileClose(filename);
   return (0);
}

int init() 
{
   if (Digits == 3) 
	{
      priceadd = 10.0 * TakeProfit;
      stoploss = 10.0 * iStopLoss;
      point = 0.01;
   } 
	else 
	{
      if (Digits == 5) 
		{
         priceadd = 10.0 * TakeProfit;
         stoploss = 10.0 * iStopLoss;
         point = 0.0001;
      } 
		else 
		{
         priceadd = TakeProfit;
         stoploss = iStopLoss;
         point = Point;
      }
   }
   if (Digits == 3 || Digits == 5) 
	{
      trendTrigger = 10 * trendTrigger;
      trendPips = 10 * trendPips;
      trendStoploss = 10 * trendStoploss;
   }
   lotround = MathRound((-MathLog(MarketInfo(Symbol(), MODE_LOTSTEP))) / 2.302585093);
   gi_384 = FALSE;
   gi_388 = FALSE;
   gi_392 = FALSE;
   gi_396 = FALSE;
   ticket = -1;
   gi_260 = FALSE;
   filename = FileOpen(WindowExpertName() + "_" + Time[0] + "_" + Symbol() + "_" + MagicNumber + ".log", FILE_WRITE);
   command = -1;
   return (0);
}

int IsTradeTime() 
{
   int li_8;
   if (DayOfWeek() < StartingTradeDay || DayOfWeek() > EndingTradeDay) 
		return (0);
   int li_0 = 60 * TimeHour(TimeCurrent()) + TimeMinute(TimeCurrent());
   int li_4 = 60 * StartHour + StartMinute;
   li_8 = 60 * StopHour + li_8;
   if (li_4 == li_8) 
		return (1);
   if (li_4 < li_8) {
      if (!(li_0 >= li_4 && li_0 < li_8)) 
			return (0);
      return (1);
   }
   if (li_4 > li_8) 
	{
      if (li_0 >= li_4 || li_0 < li_8) 
			return (1);
   } 
	else 
		return (0);
   return (0);
}

double GetLastLotSize(int ai_0) 
{
   for (int pos_4 = OrdersTotal() - 1; pos_4 >= 0; pos_4--) 
	{
      if (!OrderSelect(pos_4, SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != MagicNumber) continue;
      if (StringFind(OrderComment(), hedgetext) == -1) 
		{
         Log("GetLastLotSize " + ai_0 + ",OrderLots()=" + OrderLots());
         return (OrderLots());
      }
   }
   Log("GetLastLotSize " + ai_0 + " wasnt found");
   return (0);
}

int OpenBuy(bool ai_0 = FALSE) 
{
   int ticket_4;
   double lots_40;
   double price_8 = 0;
   double price_16 = 0;
   string ls_24 = "";
   bool li_ret_32 = TRUE;
   if (TimeCurrent() - previoustime < 60) 
		return (0);
   if (ai_0 && (!gi_392)) 
		return (0);
   if (!GlobalVariableCheck("PERMISSION")) 
	{
      GlobalVariableSet("PERMISSION", TimeCurrent());
      if (!SupportECN) 
		{
         if (ai_0) 
			{
            if (OrderSelect(ticket, SELECT_BY_TICKET)) 
					price_16 = OrderTakeProfit() - MarketInfo(Symbol(), MODE_SPREAD) * Point;
         } 
			else 
				price_8 = Ask + priceadd * Point;
      }
      if (ai_0) 
			ls_24 = hedgetext;
      if (AllowiStopLoss == TRUE) 
			price_16 = Ask - stoploss * Point;
      if (ai_0) 
			lots_40 = NormalizeDouble(GetLastLotSize(1) * MassHedgeBooster, 2);
      else 
			lots_40 = CalcLots(gd_244);
      if (!SupportECN) 
			ticket_4 = OrderSend(Symbol(), OP_BUY, lots_40, Ask, slippage, price_16, price_8, EA_Name + ls_24, MagicNumber, 0, Green);
      else {
         ticket_4 = OrderSend(Symbol(), OP_BUY, lots_40, Ask, slippage, 0, 0, EA_Name + ls_24, MagicNumber, 0, Green);
         Sleep(1000);
         OrderModify(ticket_4, OrderOpenPrice(), price_16, price_8, 0, Black);
      }
      previoustime = TimeCurrent();
      if (ticket_4 != -1) 
		{
         if (!ai_0) 
			{
            ticket = ticket_4;
            Log("BUY hedgedTicket=" + ticket);
         } 
			else 
			{
            Log("BUY Hacked_ticket=" + ticket_4);
            command = 0;
         }
      } 
		else 
		{
         Log("failed sell");
         li_ret_32 = FALSE;
      }
   }
   GlobalVariableDel("PERMISSION");
   return (li_ret_32);
}

int OpenSell(bool ai_0 = FALSE) 
{
   int ticket_4;
   double lots_36;
   double price_8 = 0;
   double price_16 = 0;
   string ls_24 = "";
   bool li_ret_32 = TRUE;
   if (TimeCurrent() - previoustime < 60) 
		return (0);
   if (ai_0 && (!gi_396)) 
	return (0);
   if (!GlobalVariableCheck("PERMISSION")) 
	{
      GlobalVariableSet("PERMISSION", TimeCurrent());
      if (!SupportECN) 
		{
         if (ai_0) 
			{
            if (OrderSelect(ticket, SELECT_BY_TICKET)) 
					price_16 = OrderTakeProfit() + MarketInfo(Symbol(), MODE_SPREAD) * Point;
         } 
			else 
				price_8 = Bid - priceadd * Point;
      }
      if (ai_0) 
			ls_24 = hedgetext;
      if (AllowiStopLoss == TRUE) 
			price_16 = Bid + stoploss * Point;
      if (ai_0) 
			lots_36 = NormalizeDouble(GetLastLotSize(0) * MassHedgeBooster, 2);
      else 
			lots_36 = CalcLots(gd_244);
      if (!SupportECN) 
			ticket_4 = OrderSend(Symbol(), OP_SELL, lots_36, Bid, slippage, price_16, price_8, EA_Name + ls_24, MagicNumber, 0, Pink);
      else 
		{
         ticket_4 = OrderSend(Symbol(), OP_SELL, lots_36, Bid, slippage, 0, 0, EA_Name + ls_24, MagicNumber, 0, Pink);
         Sleep(1000);
         OrderModify(ticket_4, OrderOpenPrice(), price_16, price_8, 0, Black);
      }
      previoustime = TimeCurrent();
      if (ticket_4 != -1) 
		{
         if (!ai_0) 
			{
            ticket = ticket_4;
            Log("SELL hedgedTicket=" + ticket);
         } 
			else 
			{
            Log("SELL Hacked_ticket=" + ticket_4);
            command = 1;
         }
      } 
		else 
		{
         Log("failed sell");
         li_ret_32 = FALSE;
      }
   }
   GlobalVariableDel("PERMISSION");
   return (li_ret_32);
}

void ManageBuy() 
{
   int datetime_0 = 0;
   double order_open_price_4 = 0;
   double order_lots_12 = 0;
   double order_takeprofit_20 = 0;
   int cmd_28 = -1;
   int ticket_32 = 0;
   int pos_36 = 0;
   int count_40 = 0;
   double myTotalLots = 0, myAvgOpenPrice = 0, myAvgTP = 0;
   for (pos_36 = 0; pos_36 < OrdersTotal(); pos_36++) 
	{
      if (!OrderSelect(pos_36, SELECT_BY_POS, MODE_TRADES)) continue;
      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber) && (OrderType() == OP_BUY))
		{
         count_40++;
         if (OrderOpenTime() > datetime_0) 
			{
            datetime_0 = OrderOpenTime();
            order_open_price_4 = OrderOpenPrice();
            cmd_28 = OrderType();
            ticket_32 = OrderTicket();
            order_takeprofit_20 = OrderTakeProfit();
         }
         if (OrderLots() > order_lots_12)  order_lots_12 = OrderLots();
         myAvgOpenPrice += OrderOpenPrice() * OrderLots();
         myTotalLots += OrderLots();
      }
   }
   if (myTotalLots > 0) myAvgOpenPrice = NormalizeDouble(myAvgOpenPrice / myTotalLots, Digits);
   myAvgTP = myAvgOpenPrice + priceadd * Point;
   int li_44 = MathRound(MathLog(order_lots_12 / Lots) / MathLog(Booster)) + 1.0;
   if (li_44 < 0) 
		li_44 = 0;
   gd_244 = NormalizeDouble(Lots * MathPow(Booster, li_44), lotround);
   if (li_44 == 0 && StrategySignal() == 1 && IsTradeTime() && !(UseNewsFilter && NewsTime())) 
	{
      if (OpenBuy() == TRUE)
         if (MassHedge) 
				gi_384 = TRUE;
   } 
	else 
	{
	  int currPipStarter = PipStarter;
	  int myOrdersCount = getOrdersCount(OP_BUY);
      if (myOrdersCount >= PipStarter_Threshold) {
         currPipStarter = PipStarter * MathPow(PipStarter_Booster, myOrdersCount);
         if (PipStarter_ThresholdPips > 0) currPipStarter = PipStarter_ThresholdPips;
      }
      if (order_open_price_4 - Ask > currPipStarter * point && order_open_price_4 > 0.0 && count_40 < MaxBuyOrders) 
		{
         if (!(OpenBuy())) 
				return;
         if (!(MassHedge)) 
				return;
         gi_384 = TRUE;
         return;
      }
   }
   for (pos_36 = 0; pos_36 < OrdersTotal(); pos_36++) 
	{
      if (!OrderSelect(pos_36, SELECT_BY_POS, MODE_TRADES)) continue;
      //if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber) || (OrderType() != OP_BUY) || (OrderTakeProfit() == order_takeprofit_20) || (order_takeprofit_20 == 0.0)) continue;
      //OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), order_takeprofit_20, 0, Pink);
      //Sleep(1000);
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber) || (OrderType() != OP_BUY) || (OrderTakeProfit() == myAvgTP) || (myAvgTP == 0.0)) continue;
      OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), myAvgTP, 0, Pink);
   }
}

int StrategySignal() 
{
   double isar_0 = iSAR(NULL, 0, isarstep, isarmax, 0);
   double ima_8 = iMA(NULL, 0, imaaverage, imamashift, imamamethod, imaappliedprice, 0);
   if (isar_0 > ima_8) 
		return (-1);
   if (isar_0 < ima_8) 
		return (1);
   return (0);
}

void ManageSell() 
{
   int datetime_0 = 0;
   double order_open_price_4 = 0;
   double order_lots_12 = 0;
   double order_takeprofit_20 = 0;
   int cmd_28 = -1;
   int ticket_32 = 0;
   int pos_36 = 0;
   int count_40 = 0;
   double myTotalLots = 0, myAvgOpenPrice = 0, myAvgTP = 0;
   for (pos_36 = 0; pos_36 < OrdersTotal(); pos_36++) 
	{
      if (!OrderSelect(pos_36, SELECT_BY_POS, MODE_TRADES)) continue;
      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber) && (OrderType() == OP_SELL)) 
		{
         count_40++;
         if (OrderOpenTime() > datetime_0) 
			{
            datetime_0 = OrderOpenTime();
            order_open_price_4 = OrderOpenPrice();
            cmd_28 = OrderType();
            ticket_32 = OrderTicket();
            order_takeprofit_20 = OrderTakeProfit();
         }
         if (OrderLots() > order_lots_12)  order_lots_12 = OrderLots();
         myAvgOpenPrice += OrderOpenPrice() * OrderLots();
         myTotalLots += OrderLots();
      }
   }
   if (myTotalLots > 0) myAvgOpenPrice = NormalizeDouble(myAvgOpenPrice / myTotalLots, Digits);
   myAvgTP = myAvgOpenPrice - priceadd * Point;
   int li_44 = MathRound(MathLog(order_lots_12 / Lots) / MathLog(Booster)) + 1.0;
   if (li_44 < 0) 
		li_44 = 0;
   gd_244 = NormalizeDouble(Lots * MathPow(Booster, li_44), lotround);
   if (li_44 == 0 && StrategySignal() == -1 && IsTradeTime() && !(UseNewsFilter && NewsTime()))
	{
      if (OpenSell() == TRUE)
         if (MassHedge) 
				gi_388 = TRUE;
   } 
	else 
	{
	  int currPipStarter = PipStarter;
	  int myOrdersCount = getOrdersCount(OP_SELL);
      if (myOrdersCount >= PipStarter_Threshold) {
         currPipStarter = PipStarter * MathPow(PipStarter_Booster, myOrdersCount);
         if (PipStarter_ThresholdPips > 0) currPipStarter = PipStarter_ThresholdPips;
      }
      if (Bid - order_open_price_4 > currPipStarter * point && order_open_price_4 > 0.0 && count_40 < MaxSellOrders) 
		{
         if (!(OpenSell())) 
				return;
         if (!(MassHedge)) 
				return;
         gi_388 = TRUE;
         return;
      }
   }
   for (pos_36 = 0; pos_36 < OrdersTotal(); pos_36++) 
	{
      if (!OrderSelect(pos_36, SELECT_BY_POS, MODE_TRADES)) continue;
      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber) && (OrderType() == OP_SELL)) 
		{
         //if (OrderTakeProfit() == order_takeprofit_20 || order_takeprofit_20 == 0.0) continue;
         //OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), order_takeprofit_20, 0, Pink);
         if (OrderTakeProfit() == myAvgTP || myAvgTP == 0.0) continue;
         OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), myAvgTP, 0, Pink);
      }
   }
}

int start() 
{
   double order_takeprofit_20;
   double price_28;
   double price_36;
   if (allowTrending) 
	{
      for (int pos_0 = 0; pos_0 < OrdersTotal(); pos_0++) 
		{
         if (!OrderSelect(pos_0, SELECT_BY_POS)) continue;
         if ((OrderSymbol() == Symbol()) && (MagicNumber == OrderMagicNumber())) 
			{
            if (OrderType() == OP_BUY)
               if (OrderTakeProfit() - Bid <= trendTrigger * Point && Bid < OrderTakeProfit()) 
						OrderModify(OrderTicket(), 0, Bid - trendStoploss * Point, OrderTakeProfit() + trendPips * Point, 0, White);
            if (OrderType() == OP_SELL)
               if (Ask - OrderTakeProfit() <= trendTrigger * Point && Ask > OrderTakeProfit()) 
						OrderModify(OrderTicket(), 0, Ask + trendStoploss * Point, OrderTakeProfit() - trendPips * Point, 0, White);
         }
      }
   }
   int count_4 = 0;
   int count_8 = 0;
   for (int pos_12 = 0; pos_12 < OrdersTotal(); pos_12++) 
	{
      if (!OrderSelect(pos_12, SELECT_BY_POS, MODE_TRADES)) continue;
      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber)) 
		{
         if (StringFind(OrderComment(), hedgetext) == -1) 
			{
            if (OrderType() == OP_BUY) 
				{
               count_4++;
               continue;
            }
            if (OrderType() == OP_SELL) 
					count_8++;
         }
      }
   }
   if (count_4 >= TradesDeep) 
	{
      if (!gi_396) 
		{
         Log("Allow long hedge! trades=" + count_4 + ",TradesDeep=" + TradesDeep);
         gi_396 = TRUE;
      }
   }
   if (count_8 >= TradesDeep) 
	{
      if (!gi_392) 
		{
         Log("Allow short hedge! trades=" + count_8 + ",TradesDeep=" + TradesDeep);
         gi_392 = TRUE;
      }
   }
   bool li_16 = FALSE;
   if ((100 - StopLossPct) * AccountBalance() / 100.0 >= AccountEquity()) 
	{
      Log("AccountBalance=" + AccountBalance() + ",AccountEquity=" + AccountEquity());
      gi_260 = TRUE;
      li_16 = TRUE;
   }
   if ((TakeProfitPct + 100.0) * AccountBalance() / 100.0 <= AccountEquity()) gi_260 = TRUE;
   if (gi_260) 
	{
      for (pos_0 = OrdersTotal() - 1; pos_0 >= 0; pos_0--) 
		{
         if (!OrderSelect(pos_0, SELECT_BY_POS)) continue;
         if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber)) 
			{
            Log("close #" + OrderTicket());
            if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), MarketInfo(Symbol(), MODE_SPREAD), White)) 
				{
               Log("error");
               return (0);
            }
         }
      }
      gi_260 = FALSE;
      if (li_16) 
		{
         Sleep(1000 * StoppedOutPause);
         li_16 = FALSE;
      }
      gi_396 = FALSE;
      gi_392 = FALSE;
   }
   if (SupportECN) 
	{
      order_takeprofit_20 = 0;
      if (OrderSelect(ticket, SELECT_BY_TICKET)) order_takeprofit_20 = OrderTakeProfit();
      for (pos_0 = 0; pos_0 < OrdersTotal(); pos_0++) 
		{
         if (!OrderSelect(pos_0, SELECT_BY_POS)) continue;
         if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber)) 
			{
            if (OrderTakeProfit() == 0.0 && StringFind(OrderComment(), hedgetext) == -1) 
				{
               if (OrderType() == OP_BUY) 
					{
                  OrderModify(OrderTicket(), 0, OrderStopLoss(), OrderOpenPrice() + priceadd * Point, 0, White);
                  continue;
               }
               if (OrderType() != OP_SELL) 
						continue;
               OrderModify(OrderTicket(), 0, OrderStopLoss(), OrderOpenPrice() - priceadd * Point, 0, White);
               continue;
            }
            if (StringFind(OrderComment(), hedgetext) != -1 && command == OrderType()) 
				{
               price_28 = order_takeprofit_20 - MarketInfo(Symbol(), MODE_SPREAD) * Point;
               price_36 = order_takeprofit_20 + MarketInfo(Symbol(), MODE_SPREAD) * Point;
               if (OrderStopLoss() == 0.0 || (OrderType() == OP_BUY && OrderStopLoss() != price_28) || (OrderType() == OP_SELL && OrderStopLoss() != price_36)) 
					{
                  if (OrderType() == OP_BUY) 
						{
                     OrderModify(OrderTicket(), 0, price_28, OrderTakeProfit(), 0, White);
                     continue;
                  }
                  if (OrderType() == OP_SELL) 
							OrderModify(OrderTicket(), 0, price_36, OrderTakeProfit(), 0, White);
               }
            }
         }
      }
   }
   if (Check() != 0) 
	{
      ManageBuy();
      ManageSell();
      if ((!PauseNewTrades) && IsTradeTime() && !(UseNewsFilter && NewsTime())) 
		{
         if (gi_388)
            if (OpenBuy(1) == TRUE) 
					gi_388 = FALSE;
         if (gi_384)
            if (OpenSell(1) == TRUE) 
					gi_384 = FALSE;
      }
      ChartComment();
      return (0);
   }
   return (0);
}

void ChartComment() 
{
   string dbl2str_0 = DoubleToStr(BalanceDeviation(2), 2);
	if (UseNewsFilter && NewsTime()) 
	{
      Comment ("Pending news event...");
   }
   earnings = 0;
   
   for (int pos_8 = 0; pos_8 < OrdersHistoryTotal(); pos_8++)
      if (OrderSelect(pos_8, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && OrderType() <= OP_SELL) 
			earnings += OrderProfit() + OrderCommission() + OrderSwap();
   Comment(" \nForexHacked V2.5 Loaded Successfully� ", 
      "\nAccount Leverage  :  " + "1 : " + AccountLeverage(), 
      "\nAccount Type  :  " + AccountServer(), 
      "\nServer Time  :  " + TimeToStr(TimeCurrent(), TIME_SECONDS), 
      "\nAccount Equity  = ", DoubleToStr(AccountEquity(), 2), 
      "\nFree Margin     = ", DoubleToStr(AccountFreeMargin(), 2), 
   "\nDrawdown  :  ", dbl2str_0, " \n" + Symbol(), " Earnings  :  " + DoubleToStr(earnings, 2));
}

int Check() 
{
   return (1);
}

double BalanceDeviation(int ai_0) 
{
   double ld_ret_4;
   if (ai_0 == 2) 
	{
      ld_ret_4 = (AccountEquity() / AccountBalance() - 1.0) / (-0.01);
      if (ld_ret_4 <= 0.0) 
			return (0);
      return (ld_ret_4);
   }
   if (ai_0 == 1) 
	{
      ld_ret_4 = 100.0 * (AccountEquity() / AccountBalance() - 1.0);
      if (ld_ret_4 <= 0.0) 
			return (0);
      return (ld_ret_4);
   }
   return (0.0);
}

bool NewsTime() 
{
   bool News = false;
   static int PrevMinute = -1;
   if (Minute() != PrevMinute && !IsTesting()) 
	{
      PrevMinute = Minute();
      int minutesSincePrevEvent = iCustom(NULL, 0, "FFCal", true, true, false, true, true, 1, 0);
      int minutesUntilNextEvent = iCustom(NULL, 0, "FFCal", true, true, false, true, true, 1, 1);
      if ((minutesUntilNextEvent <= MinsBeforeNews) || (minutesSincePrevEvent <= MinsAfterNews)) 
		{
         int impactOfNextEvent = iCustom(NULL, 0, "FFCal", true, true, false, true, true, 2, 1);
         if (impactOfNextEvent >= NewsImpact) 
			{
            News = true;
            }
         }
      }
   return(News);
}
int getOrdersCount(int inOrderType) {
   int myRetVal = 0;
   for (int i=0; i<OrdersTotal(); i++) {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != MagicNumber) continue;
      if (OrderType() != inOrderType) continue;
      myRetVal++;
   }
   return(myRetVal);
}