Code Snipset to Filter Order Placement by Weekly Timeframe
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….
