grail23_nolimitorder_5digits

Author: Copyright � 2009, finimej
Price Data Components
Series array that contains open time of each bar
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It automatically opens orders when conditions are reached
Indicators Used
Indicator of the average true rangeMoving average indicator
0 Views
0 Downloads
0 Favorites
grail23_nolimitorder_5digits
//EA original from Grail_2.mq4 at http://articles.mql4.com/163
//total tailormade by finimej for used at FXCH broker

#property copyright "Copyright © 2009, finimej"
#property link      "www.formulatrader.com"
extern bool  useATR_SL=true;
extern double Percentage_ATR_SL = 8; 
//extern double Percentage_ATR_LOT = 300 ; 
extern bool UseHourTrade = false;
extern int  FromHourTrade = 6;
extern int  ToHourTrade = 18;
extern int     Slippage = 3;
extern bool    UseMoneyManagement = false;
extern double  DecreaseFactor = 5; 
extern int     Risk = 10;
extern double  InitialLot=0.1;
extern bool    AccountIsMicro=false;
extern int     pipsaway = 5; 
extern int     brokerworsefill=0.0001;
extern int     MA_dis_pips = 10;
extern int     SL = 1800;   
extern int     SLreal = 1800;                                                                   
extern int     MA_period = 6;
extern int     TP_pips = 20;
extern bool   TradeperBar=false;
// int     TP_Faked=5; 
extern double  MyMaxLot=50;  //==0, then use the system lots 1000, >0 then using this lots as max lot.
extern bool UseTimeCut=true;
extern int LimitTime_1 = 20; //if position hold more than than this minutes, cut!
int      BL_ticket;
int      SL_ticket;
int      HasBuyLimitOrder = 0;
int      HasSellLimitOrder = 0;
int      HasBuyOrder = 0;
int      HasSellOrder = 0;
double   stoploss;
double   stoplossReal;
double   LimitEntryDistance;
double   MAMinDist;
double   Mode_stop_level;
double   BL_openprice;
double   SL_openprice;
double   TakeProfit;
double   TakeProfitFaked;
double   MA;
double   Spread;
double   LotSize;
bool     BuyLimitOrderEntered=false;
double   BuyLiMitOpenprice=0.0;
bool     SellLimitOrderEntered=true;
double   SellLiMitOpenprice=0.0;
double   TakeProfitsFaked;            
string Expert_Name="grail2";
int  MagicBase = 626898;
int OrderAttemps=3;
//avoid news Extern & Global variables
extern bool    Avoid_News = false;
extern int     MinsBeforeNews = 30;
extern int     MinsAfterNews = 30;

int
   New_Bar,                                              // 0/1 The fact of new bar forming
   Time_0,                                               // The new bar beginning time
   ret,                                                  // Intersection direction
   total;                                                // Count of open orders
extern string  hd = " --Delay time--";
extern int     useDelay = 1;
extern int     MinutesToDelay = 5;
datetime StopTime;                 // Time to wait after a trade is stopped out
bool StoppedOut=false;
extern int accoutlimit=1900;
void init() 
   {
      MagicBase = 3000 + func_Symbol2Val(Symbol())*100 + func_TimeFrame_Const2Val(Period()); 
      Mode_stop_level = MarketInfo(Symbol(), MODE_STOPLEVEL);
      if (Mode_stop_level==0) Mode_stop_level=5;
      Mode_stop_level = (Mode_stop_level + 1.0) * Point;                                  // this is the MODESTOPLEVEL setting
      stoploss = SL * Point;
      LimitEntryDistance = pipsaway * Point;
      MAMinDist = MA_dis_pips * Point;
      //TakeProfitFaked = TP_Faked * Point;
      TakeProfit=TP_pips*Point;
      Spread = Ask - Bid;
      stoplossReal=SLreal* Point;
   }

int start() 
   {
   if (AccountEquity()<accoutlimit) 
   {ForceCloseAll();
    return (0);
    }
   if (Avoid_News==true) 
    { if (GetNews()==true) 
         {ForceCloseAll();
            return (0);
         }
     }    
    
    
      if (useDelay == 1)
      {
      StoppedOut = LastTradeStoppedOut();
      if  (CurTime() < StopTime)
     {
       Comment("Last trade stopped out, No Trades Until : " + TimeToStr(StopTime,TIME_DATE|TIME_MINUTES));
      return(0);
     }
    }
      if (UseHourTrade) 
         {
            if (!(Hour() >= FromHourTrade && Hour() <= ToHourTrade)) 
               {
                  Comment("This is not trading time.");
                  return (0);
               }
         }
      New_Bar=0;                                            // First zeroize
      if (Time_0 != Time[0])                                // If the bar beginning time changed
      {
      New_Bar= 1;                                        // Here we have a new bar
      Time_0 = Time[0];                                  // Remember the new bar beginning time
      }    

      ScreenComments();
      HasBuyLimitOrder = false;
      HasSellLimitOrder = false;
      HasBuyOrder = false;
      HasSellOrder = false;
      if (useATR_SL==true)
      {  if (stoploss<=1*Percentage_ATR_SL*iATR(NULL,15,14,0))
         stoploss= 1*Percentage_ATR_SL*iATR(NULL,15,14,0);
      // Print("stoploss is "+DoubleToStr(stoploss,4));
       }
       OpenLimitOrder();
       if (BuyLimitOrderEntered==true) 
                     {
                        BL_openprice = NormalizeDouble(BuyLiMitOpenprice, Digits);
                        HasBuyLimitOrder = true;
                     }
                                                     
       if (SellLimitOrderEntered==true) 
                     {
                        SL_openprice = NormalizeDouble(SellLiMitOpenprice, Digits);
                        HasSellLimitOrder = true;
                     }     
      MA = iMA(NULL, 0, MA_period, 0, MODE_LWMA, PRICE_TYPICAL, 0); //SMA on close price of current bar on current time frame.
      Modify_order();                         
       for (int k = OrdersTotal(); k >= 0; k--) 
         {
            if (OrderSelect(k, SELECT_BY_POS) == true && OrderSymbol() == Symbol()&& (OrderMagicNumber() == MagicBase)) 
               {
                  if (OrderType() == OP_BUY) 
                     {
                        HasBuyOrder = true;
                        Close_B(OrderTicket(), OrderLots());
                     }
         
                  if (OrderType() == OP_SELL) 
                     {
                        HasSellOrder = true;
                        Close_S(OrderTicket(), OrderLots());
                     }
               }
         }
     if( TradeperBar==true)
     {    
    if (Avoid_News==true) 
    { if (GetNews()!=true&&New_Bar==1&&AccountEquity()>accoutlimit)         
      OpenMarketOrder();}
    if (Avoid_News==false) 
    {  if (New_Bar==1&&AccountEquity()>accoutlimit)
      OpenMarketOrder();}
    }
    else
       {    
    if (Avoid_News==true) 
    { if (GetNews()!=true&&AccountEquity()>accoutlimit)         
      OpenMarketOrder();}
    if (Avoid_News==false) 
    { if (AccountEquity()>accoutlimit) OpenMarketOrder();}
    }
      
      return;
   
   } // end of start
int CloseOrder(int ticket,double numLots, double price)
{
   int CloseCnt, err; 
        
    CloseCnt = 0;
    while (CloseCnt < 3)// try to close 3 Times
    {
       if (!OrderClose(ticket,numLots,price,3,Yellow))
       {
         err=GetLastError();
         Print(CloseCnt," Error closing order : (", err , ") " + ErrorDescription(err));
         if (err > 0) CloseCnt++;
       }
       else
       {
         CloseCnt = 3;
       }
    }
}
void Close_B(int ticket, double lot) 
   {
    bool closecondition=false;
     if (UseTimeCut==true)
        closecondition=NormalizeDouble(Bid - OrderOpenPrice(), Digits) >= TakeProfit||NormalizeDouble(OrderOpenPrice()-Bid, Digits)>stoplossReal||TimeCurrent() - OrderOpenTime() > 60 * LimitTime_1;
     else
       closecondition=NormalizeDouble(Bid - OrderOpenPrice(), Digits) >= TakeProfit||NormalizeDouble(OrderOpenPrice()-Bid, Digits)>stoplossReal;
      if (closecondition==true) 
         {
            CloseOrder(ticket, lot, Bid);
            //OrderClose(ticket, lot, Bid, 1, Yellow);
            HasBuyOrder = false;
         }
   }

void Close_S(int ticket, double lot) 
   {
     bool closecondition=false;
     if (UseTimeCut==true)
            closecondition=NormalizeDouble(OrderOpenPrice() - Ask, Digits) >= TakeProfit||NormalizeDouble(Ask-OrderOpenPrice(), Digits)>stoplossReal||TimeCurrent() - OrderOpenTime() > 60 * LimitTime_1;
     else
            closecondition=NormalizeDouble(OrderOpenPrice() - Ask, Digits) >= TakeProfit||NormalizeDouble(Ask-OrderOpenPrice(), Digits)>stoplossReal;
            
      if (closecondition==true) 
         {
            CloseOrder(ticket, lot, Ask);
            //OrderClose(ticket, lot, Ask, 1, Yellow);
            HasSellOrder = false;
         }
   }

void Modify_order() 
   {
      double AveragePrice = 0;
      
      if (HasBuyLimitOrder == true) 
         {
            AveragePrice = MA - MAMinDist;
            
            if (MathAbs(BL_openprice - AveragePrice) > Point / 2.0) 
            BuyLiMitOpenprice=AveragePrice;
            BL_openprice=BuyLiMitOpenprice;
            
              // OrderModify(BL_ticket, AveragePrice, AveragePrice - stoploss, AveragePrice + LimitEntryDistance, 0, DeepSkyBlue);
         }
      
      if (HasSellLimitOrder == true) 
         {
            AveragePrice = MA + Spread + MAMinDist;
            if (MathAbs(SL_openprice - AveragePrice) > Point / 2.0) 
              SellLiMitOpenprice=AveragePrice;
              SL_openprice=SellLiMitOpenprice;
              // OrderModify(SL_ticket, AveragePrice, AveragePrice + stoploss, AveragePrice - LimitEntryDistance, 0, Pink);
         }
   }

void OpenLimitOrder() 
   {
      double AveragePrice = 0;
      double SL = 0;
      double MA_dis_pips = 0;
      
      if (HasBuyOrder == false && HasBuyLimitOrder == false) 
         {
            AveragePrice = MA - Spread - MAMinDist;
            SL = AveragePrice - stoploss; 
            MA_dis_pips = AveragePrice + LimitEntryDistance;
            
            if (AveragePrice > Ask - MA_dis_pips) 
               AveragePrice = Ask - MA_dis_pips;
      
            AveragePrice = NormalizeDouble(AveragePrice, Digits);
            BuyLimitOrderEntered=true;
            BuyLiMitOpenprice=AveragePrice;
            
            //OrderSend(Symbol(), OP_BUYLIMIT, Lots(), AveragePrice, Slippage, SL, MA_dis_pips, "ISEA_Buy", MagicBase, 0, Blue);
            HasBuyLimitOrder = true;
         }
         
      if (HasSellOrder == false && HasSellLimitOrder == false) 
         {
            AveragePrice = MA + Spread + MAMinDist;
            SL = AveragePrice + stoploss; 
            MA_dis_pips = AveragePrice - LimitEntryDistance;
      
            if (AveragePrice < Bid + MA_dis_pips) 
               AveragePrice = Bid + MA_dis_pips;
            
            AveragePrice = NormalizeDouble(AveragePrice, Digits);
            SellLimitOrderEntered=true;
            SellLiMitOpenprice=AveragePrice;
            //OrderSend(Symbol(), OP_SELLLIMIT, Lots(), AveragePrice, Slippage, SL, MA_dis_pips, "ISEA_Sell", MagicBase, 0, Red);
            HasSellLimitOrder = true;
         }
   }


void OpenBuyOrder()
{
   int err,ticket;
   int cnt=0;
   
     // while (OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slippage,Ask-stoploss,Ask+TakeProfitFaked,"",MagicBase,0,Green)==FALSE&&cnt<OrderAttemps)
      while (OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slippage,Ask-stoploss,0,"",MagicBase,0,Green)<=0&&cnt<OrderAttemps)
       {
       err = GetLastError();
       Print("Error Modify BUY order: (" + err + ") " + ErrorDescription(err));
       cnt++;
       Sleep(100);
     }         
 }

void OpenSellOrder()
{
   int err, ticket;
    int cnt=0;


      //while (OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slippage,Bid+stoploss,Bid-TakeProfitFaked,"",MagicBase,0,Red)<=0 && cnt<OrderAttemps)
      while (OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slippage,Bid+stoploss,0,"",MagicBase,0,Red)<=0 && cnt<OrderAttemps)
       {
       err = GetLastError();
       Print("Error Modify SELL order : (" + err + ") " + ErrorDescription(err));
       cnt++;
       Sleep(100);   
       }           
}
void OpenMarketOrder()
{
 //buy at ask, sell at bid
if (Ask<(BuyLiMitOpenprice-brokerworsefill) && HasBuyOrder==false)
 { OpenBuyOrder();
   BuyLimitOrderEntered=false;
   BL_openprice=0.0;
   BuyLiMitOpenprice=0.0;
 }
   
if (Bid>(SellLiMitOpenprice+brokerworsefill)&&HasSellOrder==false)
   {
   OpenSellOrder();
   SellLimitOrderEntered=false;
   SL_openprice=0.0;
   SellLiMitOpenprice=0.0;
   }
}

double Lots()
{
   if(UseMoneyManagement==false) return(InitialLot);
   double lots;
   int orders=HistoryTotal();
   int losses=0;
   int decimalPlaces=1;
   if(AccountIsMicro==true) decimalPlaces=2;

   lots=NormalizeDouble((AccountFreeMargin()*Risk/1000.0)/100,decimalPlaces);
   //lots=lots/(Percentage_ATR_LOT*iATR(NULL,15,14,0)); 
   StoppedOut = LastTradeStoppedOut();
   if (StoppedOut==true)
   {
   if(AccountIsMicro==false) lots=0.1;
   if(AccountIsMicro==true) lots=0.01;
   }
   if(lots<0.1 && AccountIsMicro==false) lots=0.1;
   if(lots<0.01 && AccountIsMicro==true) lots=0.01;
   double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);
      if (MyMaxLot>0)
      { 
        if (lots>MyMaxLot) 
        return (MyMaxLot);
       }   
      if(lots>maxlot) lots=maxlot-1;
      return(lots);
}


void ScreenComments()
{
string Msg;
   if (UseHourTrade) {
      if (!(Hour() >= FromHourTrade && Hour() <= ToHourTrade)) 
            Msg= "\n        " + Expert_Name + "\n\n  TRADE SESSION";   
      else Msg= "\n        " + Expert_Name + "\n\n           OUT OF SESSION";
      
   }
   
Comment(Msg + "\n"
         + "------------------------------------------------------" 
         + "\n" 
         + "Broker:  " + AccountCompany() 
         + "\n" 
         + "Broker Time            = ", Hour() + " : " + Minute() 
         + "\n"
         + "Time Start Trading   = ", FromHourTrade 
         + "\n"
         + "Time Stop Trading   = ", ToHourTrade 
         + "\n" 
         + "-------------------------------------------------------" 
         + "\n" 
         + "ACCOUNT INFORMATION:" 
         + "\n" 
         + "Account Name:          " + AccountName() 
         + "\n" 
         + "Account Number:       " + AccountNumber() 
         + "\n" 
         + "Account Leverage:     " + DoubleToStr(AccountLeverage(), 0)
         + "\n" 
         + "Account Balance:       " + DoubleToStr(AccountBalance(), 2) 
         + "\n"                               
         + "Account Equity:         " + DoubleToStr(AccountEquity(), 2) 
         + "\n" 
         + "Used Margin:            " + DoubleToStr(AccountMargin(), 2) 
         + "\n"
         + "------------------------------------------------------"          
         + "\n"
         + "LOTS:  " + DoubleToStr(Lots(), 2)
         + "\n" 
         + "------------------------------------------------------"
         + "\n"
         + "SPREAD:  " + DoubleToStr(GetSpread(),1) + "  pips"
         + "\n"
         + "------------------------------------------------------" );                            
   
}
int func_Symbol2Val(string symbol)
 {
   string mySymbol = StringSubstr(symbol,0,6);
	if(mySymbol=="AUDCAD") return(1);
	if(mySymbol=="NZDCAD") return(19);
	if(mySymbol=="AUDCHF") return(20);
	if(mySymbol=="AUDJPY") return(2);
	if(mySymbol=="AUDNZD") return(3);
	if(mySymbol=="AUDUSD") return(4);
	if(mySymbol=="CHFJPY") return(5);
	if(mySymbol=="EURAUD") return(6);
	if(mySymbol=="EURCAD") return(7);
	if(mySymbol=="EURCHF") return(8);
	if(mySymbol=="EURGBP") return(9);
	if(mySymbol=="EURJPY") return(10);
	if(mySymbol=="EURUSD") return(11);
	if(mySymbol=="GBPCHF") return(12);
	if(mySymbol=="GBPJPY") return(13);
	if(mySymbol=="GBPUSD") return(14);
	if(mySymbol=="NZDUSD") return(15);
	if(mySymbol=="USDCAD") return(16);
	if(mySymbol=="USDCHF") return(17);
	if(mySymbol=="USDJPY") return(18);
   Comment("unexpected Symbol");
	return(19);
}

int func_TimeFrame_Const2Val(int Constant ) {
   switch(Constant) {
      case 1:  // M1
         return(1);
      case 5:  // M5
         return(2);
      case 15:
         return(3);
      case 30:
         return(4);
      case 60:
         return(5);
      case 240:
         return(6);
      case 1440:
         return(7);
      case 10080:
         return(8);
      case 43200:
         return(9);
   }
}
double GetSpread()
{
double Spread;
 if (Point == 0.00001) // Calculate the spread in pips for symbols quoted to 5 decimal places
      {
      Spread = (Ask - Bid) / (Point*10);  // Current Spread price for this CurrencyPair in pip form.
      }
      
   if (Point == 0.0001) // Calculate the spread in pips for symbols quoted to 4 decimal places
      {
      Spread = (Ask - Bid) / (Point);  // Current Spread price for this CurrencyPair in pip form.
      }

   if (Point == 0.001) // Calculate the spread in pips for symbols quoted to 3 decimal places
      {
      Spread = (Ask - Bid) / (Point*10);  // Current Spread price for this CurrencyPair in pip form.
      }
      
   if (Point == 0.01) // Calculate the spread in pips for symbols quoted to 2 decimal places
      {
      Spread = (Ask - Bid) / (Point);  // Current Spread price for this CurrencyPair in pip form.
      }
   return(Spread);
}   
//+------------------------------------------------------------------+
//| return error description                                         |
//+------------------------------------------------------------------+
string ErrorDescription(int error_code)
  {
   string error_string;
//----
   switch(error_code)
     {
      //---- codes returned from trade server
      case 0:
      case 1:   error_string="no error";                                                  break;
      case 2:   error_string="common error";                                              break;
      case 3:   error_string="invalid trade parameters";                                  break;
      case 4:   error_string="trade server is busy";                                      break;
      case 5:   error_string="old version of the client terminal";                        break;
      case 6:   error_string="no connection with trade server";                           break;
      case 7:   error_string="not enough rights";                                         break;
      case 8:   error_string="too frequent requests";                                     break;
      case 9:   error_string="malfunctional trade operation";                             break;
      case 64:  error_string="account disabled";                                          break;
      case 65:  error_string="invalid account";                                           break;
      case 128: error_string="trade timeout";                                             break;
      case 129: error_string="invalid price";                                             break;
      case 130: error_string="invalid stops";                                             break;
      case 131: error_string="invalid trade volume";                                      break;
      case 132: error_string="market is closed";                                          break;
      case 133: error_string="trade is disabled";                                         break;
      case 134: error_string="not enough money";                                          break;
      case 135: error_string="price changed";                                             break;
      case 136: error_string="off quotes";                                                break;
      case 137: error_string="broker is busy";                                            break;
      case 138: error_string="requote";                                                   break;
      case 139: error_string="order is locked";                                           break;
      case 140: error_string="long positions only allowed";                               break;
      case 141: error_string="too many requests";                                         break;
      case 145: error_string="modification denied because order too close to market";     break;
      case 146: error_string="trade context is busy";                                     break;
      //---- mql4 errors
      case 4000: error_string="no error";                                                 break;
      case 4001: error_string="wrong function pointer";                                   break;
      case 4002: error_string="array index is out of range";                              break;
      case 4003: error_string="no memory for function call stack";                        break;
      case 4004: error_string="recursive stack overflow";                                 break;
      case 4005: error_string="not enough stack for parameter";                           break;
      case 4006: error_string="no memory for parameter string";                           break;
      case 4007: error_string="no memory for temp string";                                break;
      case 4008: error_string="not initialized string";                                   break;
      case 4009: error_string="not initialized string in array";                          break;
      case 4010: error_string="no memory for array\' string";                             break;
      case 4011: error_string="too long string";                                          break;
      case 4012: error_string="remainder from zero divide";                               break;
      case 4013: error_string="zero divide";                                              break;
      case 4014: error_string="unknown command";                                          break;
      case 4015: error_string="wrong jump (never generated error)";                       break;
      case 4016: error_string="not initialized array";                                    break;
      case 4017: error_string="dll calls are not allowed";                                break;
      case 4018: error_string="cannot load library";                                      break;
      case 4019: error_string="cannot call function";                                     break;
      case 4020: error_string="expert function calls are not allowed";                    break;
      case 4021: error_string="not enough memory for temp string returned from function"; break;
      case 4022: error_string="system is busy (never generated error)";                   break;
      case 4050: error_string="invalid function parameters count";                        break;
      case 4051: error_string="invalid function parameter value";                         break;
      case 4052: error_string="string function internal error";                           break;
      case 4053: error_string="some array error";                                         break;
      case 4054: error_string="incorrect series array using";                             break;
      case 4055: error_string="custom indicator error";                                   break;
      case 4056: error_string="arrays are incompatible";                                  break;
      case 4057: error_string="global variables processing error";                        break;
      case 4058: error_string="global variable not found";                                break;
      case 4059: error_string="function is not allowed in testing mode";                  break;
      case 4060: error_string="function is not confirmed";                                break;
      case 4061: error_string="send mail error";                                          break;
      case 4062: error_string="string parameter expected";                                break;
      case 4063: error_string="integer parameter expected";                               break;
      case 4064: error_string="double parameter expected";                                break;
      case 4065: error_string="array as parameter expected";                              break;
      case 4066: error_string="requested history data in update state";                   break;
      case 4099: error_string="end of file";                                              break;
      case 4100: error_string="some file error";                                          break;
      case 4101: error_string="wrong file name";                                          break;
      case 4102: error_string="too many opened files";                                    break;
      case 4103: error_string="cannot open file";                                         break;
      case 4104: error_string="incompatible access to a file";                            break;
      case 4105: error_string="no order selected";                                        break;
      case 4106: error_string="unknown symbol";                                           break;
      case 4107: error_string="invalid price parameter for trade function";               break;
      case 4108: error_string="invalid ticket";                                           break;
      case 4109: error_string="trade is not allowed";                                     break;
      case 4110: error_string="longs are not allowed";                                    break;
      case 4111: error_string="shorts are not allowed";                                   break;
      case 4200: error_string="object is already exist";                                  break;
      case 4201: error_string="unknown object property";                                  break;
      case 4202: error_string="object is not exist";                                      break;
      case 4203: error_string="unknown object type";                                      break;
      case 4204: error_string="no object name";                                           break;
      case 4205: error_string="object coordinates error";                                 break;
      case 4206: error_string="no specified subwindow";                                   break;
      default:   error_string="unknown error";
     }
//----
   return(error_string);
  }  
  
bool GetNews() 
{
   static int PrevMinute = -1;
   bool b.NewsTime=false;   
   

   int MinSinceNews = iCustom(NULL, 0, "FFCal", 0, 0, 1, 1, 1, 1, 20, 20, 0, 0, 0, 1, 10, 13882323, 3329330, 255, 42495, 65535, 21, 600, 600, 16748574, 12632256, 10, 3, 0, 1, 0);
   int Min2News = iCustom(NULL, 0, "FFCal", 0, 0, 1, 1, 1, 1, 20, 20, 0, 0, 0, 1, 10, 13882323, 3329330, 255, 42495, 65535, 21, 600, 600, 16748574, 12632256, 10, 3, 0, 1, 1);

  //now compaire how many minuetes left for the time.

     if (Minute() != PrevMinute)
     {
         PrevMinute = Minute();
         b.NewsTime = false;
         if ((Min2News <= MinsBeforeNews) || (MinSinceNews <= MinsAfterNews))
             b.NewsTime = true;    
     }
    return(b.NewsTime);   
}

datetime LastTradeStoppedOut()
{
   int cnt, total;
   datetime NextTime;
   bool Stopped=false;
   
   NextTime = 0;
   
   total = HistoryTotal();
   for (cnt = total - 1; cnt >= 0; cnt--)
   {
      OrderSelect (cnt, SELECT_BY_POS, MODE_HISTORY);
      
      if(OrderSymbol()==Symbol() && OrderMagicNumber() == MagicBase)
      {
        Stopped = false;
        if (OrderType() == OP_BUY)
        {
          if (OrderClosePrice() - OrderOpenPrice() < 0)
          {
             Stopped = true;
          }
          cnt = 0;
        }
        if (OrderType() == OP_SELL)
        {
          if (OrderOpenPrice() - OrderClosePrice() < 0)
          {
             Stopped = true;
          }
          cnt = 0;
        }
      }
   }
   
   if (Stopped)
   {
      StopTime = OrderCloseTime() + MinutesToDelay*60;
   }
   
   return (Stopped);
}

void ForceCloseAll() 
{
   for (int i = 0; i < OrdersTotal(); i++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicBase) {
         if (OrderType() == OP_BUY) Close_B(OrderTicket(), OrderLots());
         if (OrderType() == OP_SELL) Close_S(OrderTicket(), OrderLots());
         if (OrderType()==OP_SELLLIMIT||OrderType()==OP_BUYLIMIT) OrderDelete(OrderTicket());          
      }
   }
}


Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---