NewsTrader_v2_usdchf_tp100





//+------------------------------------------------------------------+
//|                                                NewsTrader_v2.mq4 |
//|                           Copyright © 2006, TrendLaboratory Ltd. |
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |
//|                                   E-mail: igorad2003@yahoo.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, TrendLaboratory Ltd."
#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"


#include <stdlib.mqh>

//---- input parameters
extern string     ExpertName       = "NewsTrader_v2";

extern int        Magic            = 44445;
extern int        Slippage         = 6;

extern string     Main_Parameters  = " Trade Volume & Trade Method";
extern double     Lots             =     0.2; // Lot size
extern bool       StopTrade        =   false; // Stop of Trade switch

extern string     Data = " Input Data ";

extern int        TimeZone         =       0; // Difference between server time and local time   
extern int        TimeGap          =       5; // Time Gap between News Time and Order Open Time in min 
extern int        OrderDuration    =      15; // Order Duratiton Time in min
extern int        ProcessTime      =       2; // Order processing Time in min
extern int        SessionEnd       =      23; // Session End Time
extern string     CalendarName     = "CalendarNFP07ja.txt";
extern double     TakeProfit       =     100; // Take Profit in pips       	
extern double     TrailingStop     =       30; // Trailing Stop in pips      
extern double     InitialStop      =      50; // Initial Stop in pips 
extern double     BreakEven        =       0; // Breakeven in pips  
extern double     PendOrdGap       =      20; // Gap for Pending Orders from current price in pips
extern bool       DisplayLine      =   false; // Display Line Option (Visualization mode) 
extern bool       DisplayText      =   false; // Display Text Option (Visualization mode)

extern string     MM_Parameters    = " MoneyManagement by L.Williams ";
extern bool       MM               =   false; // ÌÌ Switch
extern double     MMRisk           =    0.15; // Risk Factor
extern double     LossMax          =    1000; // Maximum Loss by 1 Lot


int      cnt=0, ticket, mode=0, digit=0, numords;
double   SellProfit=0,BuyProfit=0;
double   BuyStop=0, SellStop=0, Lotsi=0;
bool     BuyInTrade=false, SellInTrade=false;
datetime FinTime=0;
string   sDate[100];          // Date
string   sTime[100];          // Time
string   sCurrency[100];      // Currency
string   sDescription[100];   // Description
string   sRating[100];        // Rating
datetime dt[100];
int      NewsNum, TriesNum=5;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
//---- 
   ReadnPlotCalendar();   
//----
return(0);
}
  
// ---- Money Management
double MoneyManagement ( bool flag, double Lots, double risk, double maxloss)
{
   Lotsi=Lots;
	    
   if ( flag ) Lotsi=NormalizeDouble(Lots*AccountFreeMargin()*risk/maxloss,1);   
     
   if (Lotsi<0.1) Lotsi=0.1;  
   return(Lotsi);
}   

// ---- Trailing Stops
void TrailStops()
{
   bool result = false;
   
   for (cnt=0;cnt<OrdersTotal();cnt++)
   { 
   OrderSelect(cnt, SELECT_BY_POS);   
   int mode=OrderType();    
      if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) 
      {
         if (mode==OP_BUY) 
         {
			BuyStop = Bid - TrailingStop*Point;
			if ( BreakEven > 0 && Bid-OrderOpenPrice()>Point*BreakEven ) BuyStop = OrderOpenPrice();   
			   if( OrderOpenPrice() <= BuyStop || OrderStopLoss() == 0 ) 
            {   
			      if ( BuyStop > OrderStopLoss() ) 
			      {
			      result = OrderModify(OrderTicket(),OrderOpenPrice(),
			                           NormalizeDouble(BuyStop, Digits),
			                           OrderTakeProfit(),0,LightGreen);
			         if( !result )
                  {
                  Print("BUY: OrderModify failed with error #",GetLastError());
                  }
			      //return(0);
               }            
            }
         }   
// - SELL Orders          
         if (mode==OP_SELL)
         {
         SellStop = Ask + Point * TrailingStop;   
         if ( BreakEven > 0 && OrderOpenPrice()-Ask>Point*BreakEven ) SellStop = OrderOpenPrice();   
            if( OrderOpenPrice() >= SellStop) 
            {
               if( OrderStopLoss() > SellStop || OrderStopLoss() == 0 ) 
               {
               result = OrderModify(OrderTicket(), OrderOpenPrice(),
                                    NormalizeDouble(SellStop, Digits),
			                           OrderTakeProfit(),0,DarkOrange);
                  if( !result )
                  {
                  Print("SELL: OrderModify failed with error #",GetLastError());
                  }
               //return(0);
               }   
   			}	    
         }
      }
   }     
}


// ---- Open Sell Orders
void SellOrdOpen()
{		     

		  double SellPrice= Bid - PendOrdGap*Point;
		  
		  if (InitialStop   > 0) SellStop=SellPrice + InitialStop*Point; else SellStop=0;
        if (TakeProfit > 0)    SellProfit=SellPrice - TakeProfit*Point; else SellProfit=0;
	     //Print(" SellPrice=", SellPrice);  
		  ticket = OrderSend( Symbol(),OP_SELLSTOP,Lotsi,
		                      NormalizeDouble(SellPrice, Digits),
		                      Slippage,
		                      NormalizeDouble(SellStop , Digits),
		                      NormalizeDouble(SellProfit   , Digits),
		                      ExpertName+" SELL",Magic,0,Red);
            
                    
            
            if(ticket<0)
            Print("SELLSTOP: OrderSend failed with error #",GetLastError());
                  
            else
            if(ticket>0)
            SellInTrade=false;
   return(0);
}
// ---- Open Buy Orders
void BuyOrdOpen()
{		     

		  double BuyPrice =Ask + PendOrdGap*Point;
		  
		  if (InitialStop > 0) BuyStop = BuyPrice - InitialStop*Point; else BuyStop=0;
        if (TakeProfit>0) BuyProfit=BuyPrice + TakeProfit*Point; else BuyProfit=0;  
		 
		  ticket = OrderSend(Symbol(),OP_BUYSTOP, Lotsi,
		                     NormalizeDouble(BuyPrice, Digits),
		                     Slippage,
		                     NormalizeDouble(BuyStop , Digits), 
		                     NormalizeDouble(BuyProfit  , Digits),
		                     ExpertName+" BUY",Magic,0,Blue);
       
            if(ticket<0)
            Print("BUYSTOP: OrderSend failed with error #",GetLastError());
            else
            if(ticket>0)
            BuyInTrade=false;
            
   return(0);
}      
// ---- Delete Extra Orders
void ExtraOrdDel()
{
   int total = OrdersTotal();
   for (cnt=0;cnt<total;cnt++)
   { 
   OrderSelect(cnt, SELECT_BY_POS);   
   mode=OrderType();
      if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic )     
      {
         if (mode==OP_BUY  && !BuyInTrade ) BuyInTrade =true;
         if (mode==OP_SELL && !SellInTrade) SellInTrade=true;
            
         if (mode > OP_SELL && (BuyInTrade || SellInTrade)) 
         OrderDelete(OrderTicket());
      }
   }        
}
// ---- Scan Trades
int ScanTrades()
{   
   int total = OrdersTotal();
   numords = 0;
      
   for(cnt=0; cnt<total; cnt++) 
   {        
   OrderSelect(cnt, SELECT_BY_POS);            
   if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == Magic) 
   numords++;
   }
   return(numords);
}

datetime FinishTime(int Duration)
{   
   int total = OrdersTotal();
   datetime ftime=0;
         
   for(cnt=0; cnt<total; cnt++) 
   {        
   OrderSelect(cnt, SELECT_BY_POS);            
   if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == Magic) 
   ftime=OrderOpenTime()+ Duration*60;
   }
   return(ftime);
}

// Closing of Pending Orders      
void PendOrdDel(int mode)
{
   for (int i=0; i<OrdersTotal(); i++)  
   {
   
   OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if ( Symbol()==OrderSymbol() && OrderMagicNumber()==Magic)     
      {
         if((mode==0 || mode==1) && OrderType()==OP_BUYSTOP)
         {     
         bool result = OrderDelete(OrderTicket());
            if(!result)
            {
            Print("BUYSTOP: OrderDelete failed with error #",GetLastError());
         //return(0);
            }
      //Print("total=",OrdersTotal()," i=",i);
         }
         else
         if((mode==0 || mode==2) && OrderType()==OP_SELLSTOP)
         {     
         result = OrderDelete( OrderTicket() );  
            if(!result)
            {
            Print("SELLSTOP: OrderDelete failed with error #",GetLastError());
         //return(0);
            }
         }
      }
   }      
return(0);
}    

//-----
void ReadnPlotCalendar()
{    
   int i,handle;
     
   handle=FileOpen(CalendarName,FILE_CSV|FILE_READ,';');
      if(handle<1)
      {
      Print("File not found ", GetLastError());
      return(false);
      }
   i=0;
   while(!FileIsEnding(handle))
   {
   sDate[i]=FileReadString(handle);          // Date
   sTime[i]=FileReadString(handle);          // Time
   sCurrency[i]=FileReadString(handle);      // Currency
   sDescription[i]=FileReadString(handle);   // Description
   sRating[i]=FileReadString(handle);        // Rating
        
   FileReadString(handle); // null
    
   dt[i] = StrToTime(sDate[i]+" "+sTime[i])+TimeZone*3600;
    
   color c=Yellow ;
 
   if (sCurrency[i] == "JPY") c = Yellow;            
   if (sCurrency[i] == "USD") c = Brown;         
   if (sCurrency[i] == "CHF") c = Green;
   if (sCurrency[i] == "EUR") c = Blue;            
   if (sCurrency[i] == "GBP") c = Orange;
   if (sCurrency[i] == "CAD") c = Gray;
   if (sCurrency[i] == "AUD") c = DarkViolet;
   if (sCurrency[i] == "NZD") c = Lime;
   
   string info = i+"_"+sDate[i]+" "+sTime[i]+" "+sCurrency[i]+" "+" "+sDescription[i]+" ";
   Print( info + "c=",c);
      if (DisplayText)
      {
      ObjectCreate("NTT"+i, OBJ_TEXT, 0, dt[i], Close[0]);
      ObjectSet("NTT"+i, OBJPROP_COLOR, c);          
      ObjectSetText("NTT"+i,sCurrency[i] + " " + sDescription[i] + " ",8);          
      ObjectSet("NTT"+i, OBJPROP_ANGLE, 90);          
      }
          
      if (DisplayLine)
      {         
      ObjectCreate("NTL"+i, OBJ_VLINE, 0, dt[i], Close[0]);
      ObjectSet("NTL"+i, OBJPROP_COLOR, c);                    
      ObjectSet("NTL"+i, OBJPROP_STYLE, STYLE_DOT);                    
      ObjectSet("NTL"+i, OBJPROP_BACK, true);          
      ObjectSetText("NTL"+i,sDescription[i] + " · ",8);          
      }
   i++;
   }
   NewsNum = i;
return(0);
}

//----
void ObjDel()
{
   int _GetLastError;
   if(DisplayLine && DisplayText) int obtotal = 0.5*ObjectsTotal(); else obtotal = ObjectsTotal();
   for ( int i = 0; i < obtotal; i ++ )
   {
      if (DisplayLine)
      if ( !ObjectDelete( StringConcatenate( "NTL", i ) ) )
      {
      _GetLastError = GetLastError();
      Print( "ObjectDelete( \"", StringConcatenate( "NTL", i ),"\" ) - Error #", _GetLastError );
      }
      
      if (DisplayText)
      if( !ObjectDelete( StringConcatenate( "NTT", i ) ) )
      {
      _GetLastError = GetLastError();
      Print( "ObjectDelete( \"", StringConcatenate( "NTT", i ),"\" ) - Error #", _GetLastError );
      }
   }
}

//---- Close of Orders

void CloseOrder(int mode)  
{
   bool result=false; 
   int  total=OrdersTotal();
   
   for (int i=0; i<=total; i++)  
   {
   OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderMagicNumber() == Magic && OrderSymbol() == Symbol()) 
      {
      if ((mode == 0 || mode ==1) && OrderType()==OP_BUY ) result=CloseAtMarket(OrderTicket(),OrderLots(),Aqua);
      if ((mode == 0 || mode ==2) && OrderType()==OP_SELL) result=CloseAtMarket(OrderTicket(),OrderLots(),Pink);
      }
   }
}


bool CloseAtMarket(int ticket,double lot,color clr) 
{
   bool result = false; 
   int  ntr;
      
   int tries=0;
   while (!result && tries < TriesNum) 
   {
      ntr=0; 
      while (ntr<5 && !IsTradeAllowed()) { ntr++; Sleep(5000); }
      RefreshRates();
      result=OrderClose(ticket,lot,OrderClosePrice(),Slippage,clr);
      tries++;
   }
   if (!result) Print("Error closing order : ",ErrorDescription(GetLastError()));
   return(result);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   ObjDel();
 
//----
   
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   if(Bars < 1) {Print("Not enough bars for this strategy");return(0);}
   
   if(AccountFreeMargin()<(1000*Lots)){
   Print("We have no money. Free Margin = ", AccountFreeMargin());
   return(0);}
   
//---- 
   if (!StopTrade && ScanTrades()<1)
   { 
      for (int i=0; i<=NewsNum; i++)
      { 
      datetime OpenTime = dt[i] - TimeGap*60;
   
         if((TimeCurrent()>= OpenTime && TimeCurrent() <= OpenTime+ProcessTime*60))
         {
         Lotsi = MoneyManagement ( MM, Lots, MMRisk, LossMax);
   
         BuyOrdOpen(); 
         SellOrdOpen();
         }
      }
   }
   
   if (ScanTrades()>0) 
   { 
   ExtraOrdDel();
   datetime FinTime = FinishTime(OrderDuration); 
   if (TimeCurrent()>=FinTime && TimeCurrent()<=FinTime+ProcessTime*60) PendOrdDel(0); 
   
   datetime EndTime = StrToTime(SessionEnd+":00"); 
   bool EOD = false;
   EOD = TimeCurrent()>= EndTime;
   if(EOD) {CloseOrder(0);PendOrdDel(0);}  
   if (TrailingStop>0 || BreakEven>0) TrailStops();
   } 
   
 return(0);
}//int start
//+------------------------------------------------------------------+









Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders
It can change open orders parameters, due to possible stepping strategy
It Closes Orders by itself

Other Features:


Uses files from the file system
It reads information from a file