Trace_History





//+------------------------------------------------------------------+
//|                                        _US-HEDGE_CloseOrders.mq4 |
//|                                       Copyright © 2008, LEGRUPO. |
//|                                           http://www.legrupo.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, LEGRUPO."
#property link      "http://www.legrupo.com"

#property indicator_chart_window

// NEWS.CSV file must exist in: \metatrader 4\experts\files
extern   string   FileName          = "gbpjpy_2007.csv";   // News file name
extern   int      VertSpacing       = 5;            // # pips spacing between symbols plotted against same bar
extern   int      SymbolSize        = 2;            // size of symbols being plotted on the chart

// Filters (set parameter to FALSE to suppress plot):
extern   datetime FromDate          = D'2007.12.01 00:00';
extern   datetime ThruDate          = D'2007.12.31 23:59';
extern   bool     Plot_High         = TRUE;         // High impact   = 3 (red plot)
extern   bool     Plot_Medium       = TRUE;         // Medium impact = 2 (orange plot)
extern   bool     Plot_Low          = TRUE;         // Low impact    = 1 (yellow plot)
extern   bool     Plot_USD          = TRUE;         // USD = 1 (wingding character #140)
extern   bool     Plot_CAD          = TRUE;         // CAD = 2 (wingding character #141)
extern   bool     Plot_EUR          = TRUE;         // EUR = 3 (wingding character #142)
extern   bool     Plot_GBP          = TRUE;         // GBP = 4 (wingding character #143)
extern   bool     Plot_CHF          = TRUE;         // CHF = 5 (wingding character #144)
extern   bool     Plot_JPY          = TRUE;         // JPY = 6 (wingding character #145)
extern   bool     Plot_AUD          = TRUE;         // AUD = 7 (wingding character #146)
extern   bool     Plot_NZD          = TRUE;         // NZD = 8 (wingding character #147)

int      handle;

int      eCount;              // Event counter
datetime eTime[9999];         // Event date/time, format = yyyy.mm.dd<space>hh:mm
int      eNumber[9999];       // Event seq# (same date/time use ascending seq#s)
int      eWingding[9999];     // Wingding code for implicated currency, as above
int      eImpact[9999];       // 1=low impact; 2=medium impact; 3=high impact
string   eCurrency[9999];     // Currency/ies on whose charts object will display; ALL = all currencies 
string   ePeriods[9999];      // Time period settings on which object will display (M1,M5,M15,M30,H1,H4,D1,W1,MTH; 0=no, 1=yes)
string   eText1[9999];        // First descr line, format = hh:mm XXX Y "event description"
                              //   where XXX=currency; Y=H/M/L impact
string   eText2[9999];        // Second descr line, shows Actual, Forecast, Previous values

//----
extern color color1 = Red;
extern color color2 = White;
extern color color3 = Red;
extern color color4 = White;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
SetIndexStyle(0,DRAW_HISTOGRAM, 0, 1, color1);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1, color2);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3, color3);
   SetIndexBuffer(2, ExtMapBuffer3);
   SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3, color4);
   SetIndexBuffer(3, ExtMapBuffer4);
//----
   SetIndexDrawBegin(0,10);
   SetIndexDrawBegin(1,10);
   SetIndexDrawBegin(2,10);
   SetIndexDrawBegin(3,10);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexBuffer(3,ExtMapBuffer4);
//---- initialization done

//---- indicators

   string objname, sym1, sym2, cmp1, cmp2;
   int    barno, dir1, h;
   double vertpos;

   handle = FileOpen(FileName, FILE_CSV|FILE_READ,',');          // Open NEWS.CSV
   if(handle < 1) {
      Comment("File "+FileName+" not found.");
   }
   double haOpen, haHigh, haLow, haClose;
   string output = "From "+TimeToStr(FromDate)+" to "+TimeToStr(ThruDate)+":\n";
   Comment("");
   while ( !FileIsEnding(handle)) 
   {
      string date = FileReadString(handle);
      string time = FileReadString(handle);
      double open = StrToDouble(FileReadString(handle));
      double high = StrToDouble(FileReadString(handle));
      double low  = StrToDouble(FileReadString(handle));
      double close = StrToDouble(FileReadString(handle));
      int volume  = StrToInteger(FileReadString(handle));
      //Comment(date,",",time,",",open,",",high,",",low,",",close,",",volume);
      haOpen=(ExtMapBuffer3[h+1]+ExtMapBuffer4[h+1])/2;
      haClose=(Open[h]+High[h]+Low[h]+Close[h])/4;
      haHigh=MathMax(High[h], MathMax(haOpen, haClose));
      haLow=MathMin(Low[h], MathMin(haOpen, haClose));
      //Comment(date,",",time,",",haOpen,",",haHigh,",",haLow,",",haClose,",",volume);
      
      // here we plot objects based on configuration
      //if ((StringFind(date, "11|12") > 0)) {
      if (StrToTime(date+" "+time) >= FromDate && StrToTime(date+" "+time) <= ThruDate) {
         output = output+ "Date: "+date+" ";
         output = output+ "Open: "+NormalizeDouble(open, Digits)+" ";
         output = output+ "High: "+NormalizeDouble(high, Digits)+" ";
         output = output+ "Low: "+NormalizeDouble(low, Digits)+" ";
         output = output+ "Close:  "+NormalizeDouble(close, Digits)+"\n";
         Comment(output);
      }
      
      
      if (haOpen<haClose) 
        {
         ExtMapBuffer1[h]=haLow;
         ExtMapBuffer2[h]=haHigh;
        } 
      else
        {
         ExtMapBuffer1[h]=haHigh;
         ExtMapBuffer2[h]=haLow;
        } 
      ExtMapBuffer3[h]=haOpen;
      ExtMapBuffer4[h]=haClose;
      h++;
   }
   FileClose(handle);

   /*for(eCount = 0; !FileIsEnding(handle); eCount++)              // Read from NEWS.CSV; one line per event
   {
      eTime[eCount]     = StrToTime(FileReadString(handle));     // Event date/time
      eNumber[eCount]   = StrToInteger(FileReadString(handle));  // Event seq# (same date/time have ascending seq#s)
      eWingding[eCount] = StrToInteger(FileReadString(handle));  // Wingding code denoting implicated currency
      eImpact[eCount]   = StrToInteger(FileReadString(handle));  // Impact: 1=low; 2=medium; 3=High
      eCurrency[eCount] = FileReadString(handle);                // Currency/ies on whose charts object will display; ALL = all currencies
      ePeriods[eCount]  = FileReadString(handle);                // Time period settings on which object will display (M1,M5,M15,M30,H1,H4,D1,W1,MTH; 0=no, 1=yes)
      eText1[eCount]    = FileReadString(handle);                // First line of description
      eText2[eCount]    = FileReadString(handle);                // Second line of description

      if (eNumber[eCount] == 0 )      continue;                  // Invalid entry, or EOF
//    if (eWingding[eCount] == 0 )    continue;
//    if (eImpact[eCount] == 0 )      continue;

      if (eTime[eCount] < FromDate) continue;                    // Skip if outside entered date range
      if (eTime[eCount] > ThruDate) continue;
      
      if (eImpact[eCount] == 1 && Plot_Low == FALSE)    continue;                     // Skip if impact outside entered values
      if (eImpact[eCount] == 2 && Plot_Medium == FALSE) continue;
      if (eImpact[eCount] == 3 && Plot_High == FALSE)   continue;
      
      if (eWingding[eCount] == 140 && Plot_USD == FALSE)   continue;                  // Skip if currency outside entered values
      if (eWingding[eCount] == 141 && Plot_CAD == FALSE)   continue;
      if (eWingding[eCount] == 142 && Plot_EUR == FALSE)   continue;
      if (eWingding[eCount] == 143 && Plot_GBP == FALSE)   continue;
      if (eWingding[eCount] == 144 && Plot_CHF == FALSE)   continue;
      if (eWingding[eCount] == 145 && Plot_JPY == FALSE)   continue;
      if (eWingding[eCount] == 146 && Plot_AUD == FALSE)   continue;
      if (eWingding[eCount] == 147 && Plot_NZD == FALSE)   continue;

      if ( StringSubstr(ePeriods[eCount],0,1) == "0" && Period() == PERIOD_M1  )   continue;    // Skip if not to be shown on this period's chart
      if ( StringSubstr(ePeriods[eCount],1,1) == "0" && Period() == PERIOD_M5  )   continue;
      if ( StringSubstr(ePeriods[eCount],2,1) == "0" && Period() == PERIOD_M15 )   continue;
      if ( StringSubstr(ePeriods[eCount],3,1) == "0" && Period() == PERIOD_M30 )   continue;
      if ( StringSubstr(ePeriods[eCount],4,1) == "0" && Period() == PERIOD_H1  )   continue;
      if ( StringSubstr(ePeriods[eCount],5,1) == "0" && Period() == PERIOD_H4  )   continue;
      if ( StringSubstr(ePeriods[eCount],6,1) == "0" && Period() == PERIOD_D1  )   continue;
      if ( StringSubstr(ePeriods[eCount],7,1) == "0" && Period() == PERIOD_W1  )   continue;
      if ( StringSubstr(ePeriods[eCount],8,1) == "0" && Period() == PERIOD_MN1 )   continue;

      bool skipflag = FALSE;                                                          // Skip if currency outside entered values
      if (eCurrency[eCount] != "ALL")
        {
          skipflag = TRUE;
          sym1 = StringSubstr(Symbol(),0,3);
          sym2 = StringSubstr(Symbol(),3,3);
          cmp1 = StringSubstr(eCurrency[eCount],0,3);
          if (StringLen(eCurrency[eCount]) > 3) 
          {
            cmp2 = StringSubstr(eCurrency[eCount],3,3);
            if ((cmp1 == "ALL" || cmp1 == sym1 || cmp1 == sym2) && (cmp2 == "ALL" || cmp2 == sym1 || cmp2 == sym2)) skipflag = FALSE;   
          }
          else
          {
            if (cmp1 == "ALL" || cmp1 == sym1 || cmp1 == sym2) skipflag = FALSE;   
          }  
        }
      if (skipflag == TRUE) continue;  

      objname = eText1[eCount];                                                       // Set object name = first descr line
      barno = iBarShift(NULL,0,eTime[eCount],FALSE);                                  // Number of bars back from current
//    if (eWingding[eCount] == 0) barno++;

      dir1 = 1;
      if (eNumber[eCount] < 0) dir1 = -1;
      
      if (VertSpacing * eNumber[eCount] > 0) 
        vertpos = iLow(NULL,0,barno) - VertSpacing * eNumber[eCount] * Point;         // Plot object VertSpacing pips x seq# below low of relevant bar
      else
        vertpos = iHigh(NULL,0,barno) - VertSpacing * (eNumber[eCount]+dir1) * Point;    // Plot object VertSpacing pips x seq# above high of relevant bar
      if (eWingding[eCount] == 0)
       {  
        ObjectCreate(objname,OBJ_TEXT,0,eTime[eCount],vertpos);                
        ObjectSet(objname,OBJPROP_ANGLE,0);
        ObjectSetText(objname,eText2[eCount],9,"Verdana",White);                      // Set object descr = second descr line
       } 
      else
       {
        ObjectCreate(objname,OBJ_ARROW,0,eTime[eCount],vertpos);                
        ObjectSet(objname,OBJPROP_ARROWCODE,eWingding[eCount]);                       // Set wingding code
        ObjectSet(objname,OBJPROP_WIDTH,SymbolSize);                                  // Set size of object
        ObjectSetText(objname,eText2[eCount]);                                        // Set object descr = second descr line
       } 
      ObjectSet(objname,OBJPROP_COLOR,White);                                         // Default color
      if (eImpact[eCount] == 1) ObjectSet(objname,OBJPROP_COLOR,Yellow);              // Low impact = yellow
      if (eImpact[eCount] == 2) ObjectSet(objname,OBJPROP_COLOR,Orange);              // Medium impact = orange
      if (eImpact[eCount] == 3) ObjectSet(objname,OBJPROP_COLOR,Red);                 // High impact = red
      if (eImpact[eCount] == 4) ObjectSet(objname,OBJPROP_COLOR,LimeGreen);           // Allow other primary colors
      if (eImpact[eCount] == 5) ObjectSet(objname,OBJPROP_COLOR,DodgerBlue);        
      if (eImpact[eCount] == 6) ObjectSet(objname,OBJPROP_COLOR,Magenta);        
      if (eImpact[eCount] == 7) ObjectSet(objname,OBJPROP_COLOR,Aqua);        
      if (eImpact[eCount] == 8) ObjectSet(objname,OBJPROP_COLOR,Goldenrod);        
      if (eImpact[eCount] == 9) ObjectSet(objname,OBJPROP_COLOR,Plum);        
      if (eImpact[eCount] == 10) ObjectSet(objname,OBJPROP_COLOR,Silver);        

   }
 
   int debug, i;
   debug=FileOpen("debug.txt", FILE_CSV|FILE_WRITE, '|');
   for( i=0; i<eCount; i++)
     FileWrite(debug,i,TimeToStr(eTime[i]),eNumber[i],eWingding[i],eImpact[i],eCurrency[i],eText1[i],eText2[i]);
   FileClose(debug);*/
//----
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{
//----
   int i;                                  // Delete created objects when indicator is removed
   for(i=0;i<eCount;i++)
     ObjectDelete(eText1[i]);
//----
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
//----

  
//----
   return(0);
}






Sample





Analysis



Market Information Used:

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


Indicator Curves created:

Implements a curve of type DRAW_HISTOGRAM


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:

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