Code Snipset to Filter Order Placement by Weekly Timeframe

By: yogi triana @ January 1, 2008 12:46 am

mql4wizard.gif

Previously we write a simple code to filter order placement by daily timeframe. This version modify the previous code, to provide filtering facility base on weekly time frame.

With this simple script you will be able to filter base on weekly time frame such as preventing order placement in the week end or for others specific purposes

Add following code on your EA:

extern bool    filter_time_enable  = true;
extern string  filter_time_range   = "sun 00:00 - sat 23:59;";

int atimestart[10];
int atimestop[10];
int timerangecount = 0;

int day_enum(string day) {
  if (day == "sun") { return(0); }
  else if (day == "mon") { return (1); }
  else if (day == "tue") { return (2); }
  else if (day == "wed") { return (3); }
  else if (day == "thu") { return (4); }
  else if (day == "fri") { return (5); }
  else if (day == "sat") { return (6); }
  else return (-1);
}

int second_in_week (string time) {
   string day = StringSubstr(time, 0, 3);
   string strtime = StringSubstr(time, 4, 0);
   int day_val = day_enum(day);
   if (day_val == -1) {
      return (-1);
   }
   int time_val =
       (StrToInteger(StringSubstr(strtime, 0,2)) * 60 * 60) +
       (StrToInteger(StringSubstr(strtime, 3,2)) * 60);

   if (time_val < 0) {
      return (-1);
   }   

   return ((day_val * 24 * 60 * 60) + time_val);   

}

int init_time_filter() {
   /* on this initialization function we parse the parameters
      and make an array contains
      an array of allowed trading time */
   string strt = trim(filter_time_range);
   int start = 0;
   int len = StringLen(strt);
   string range_token;
   while (start < len) {

      int tokensemicolon = StringFind(strt, ";", start);
      if (tokensemicolon == -1) {
        if (len - start < 19) {
           MessageBox(
            "Parameter filter_time_range contains error!");
           break;
        }
        range_token = trim(StringSubstr(strt, start,0));
      } else {
        range_token = trim(StringSubstr(
                           strt, start, tokensemicolon));
      }

      int tokendash = StringFind(range_token, "-", 0);
      if ((tokendash == -1) || (tokendash > tokensemicolon)) {
         MessageBox(
           "Parameter filter_time_range contains error!");
         break;
      }

      string timestart =
            trim(StringSubstr(range_token, 0, tokendash));
      string timestop  =
            trim(StringSubstr(range_token, tokendash + 1,0));
      if ((StringLen(timestart) < 9 ) ||
            (StringLen(timestop) < 9 )) {
        MessageBox(
            "Parameter prm_trade_timeframe contains error!");
        break;
      }

      int dd_start = second_in_week(timestart);
      int dd_stop = second_in_week(timestop);

      if ((dd_start < 0) || (dd_stop < 0) ||
          (dd_start >= dd_stop)) {
        MessageBox(
            "Parameter filter_time_range contains error!");
        break;
      }

      atimestart[timerangecount] = dd_start;
      atimestop[timerangecount] = dd_stop;
      timerangecount++;
      start = tokensemicolon + 1; // process next time
   }
   return(0);
}

int deinit_time_filter() {
   return(0);
}

bool is_trading_time(datetime time){
  int theday = TimeDayOfWeek(time);
  int thetime =  (TimeHour(time) * 60 * 60) +
                 (TimeMinute(time) * 60 ) +
                 TimeSeconds(time);
  int trade_time = (theday * 24 * 60 * 60) + thetime;

  /* search if this time exists in the array */
  int idx;
  bool found = false;
  for (idx = 0; idx < timerangecount; idx ++) {
     found = ((atimestart[idx] <= trade_time) &&
              (atimestop[idx] >= trade_time));
     if (found) {
        break;
     }
  }

  return(found);
}

int init() {

   if (filter_time_enable) {
      init_time_filter();
   }

   /* your code here ... */

   return(0);
}

int deinit() {
   if (filter_time_enable) {
      deinit_time_filter();
   }

   /* your code here ... */
   return(0);
}

int start() {

   /* your code goes here .... */

   /* when performing filter call like this .... */

   if ((filter_time_enable) && (is_trading_time(Time[0])) {
      /* your code goes here .... */
   }

   /* your code goes here .... */

   return (0);
}

Enjoy….

Filed under: Script Snipset

Leave a Reply