Что-то вроде этого:
Tabu31=((Month()==12)&&(Day()==31)&&(Hour()>=9)&&(Minute()>=0)); //Запрет на торговлю после 09:00 31 декабряСоветник считает канал по экстремумам
как сделать чтоб он пропускал бары которые выпадают по времени с 21:50 до 22:10? . Т.е будто их вообще нет ?
У меня вот так сделано для определения допустимого диапазона. Если в StringToTime подавать только время без даты, добавляется текущая дата, самое то, что надо.
input string StartTimeOpen = "01:00"; input string StopTimeOpen = "21:30"; // функция проверяет вхождение серверного времени в заданный диапазон // если есть вхождение есть, возвращает true, иначе false bool CheskForWorkTime(string startT, string stopT) { if (TimeCurrent() > StringToTime(startT) && TimeCurrent() < StrToTime(stopT)) return(true); return (false); } // функция проверяет вхождение серверного времени в заданный диапазон // если есть вхождение есть, возвращает true, иначе false bool CheskForWorkTime(datetime startT, datetime stopT) { if (TimeCurrent() > startT && TimeCurrent() < stopT) return(true); return (false); }
Если происходит в реалтайме. перед установкой ордера, то можно так :
bool IsTradingTime(const string shours = "0:30-23:30", const string sdays = "0-6") { string days[]; string hours[]; StringSplit(sdays, '-', days); StringSplit(shours, '-', hours); MqlDateTime o = {0}; datetime now = TimeCurrent(o); string day = string(o.year) + "." + string(o.mon) + "." + string(o.day); datetime H1 = StringToTime(day + " " + hours[0]); datetime H2 = StringToTime(day + " " + hours[ArraySize(hours) - 1]); int D1 = int(days[0]); int D2 = int(days[ArraySize(hours) - 1]); if (now >= H1 && now <= H2 && o.day_of_week >= D1 && o.day_of_week <= D2) return true; return false; } ... IsTradingTime("00:05-06:00") || IsTradingTime("22:00-23:30") // set orders only at night IsTradingTime("15:00-18:00", "1-4") // set orders on Monday, Tuesday, Wednesday, Thursday in American session only
Если надо пройтись по истории баров, то наверное только в цикле и на каждой итерации проверять время бара :
datetime times[]; int bars = CopyTime(..., times); for (int k = 0; k < bars; k++) { MqlDateTime now = {0}; TimeToStruct(times[k], now) if (now.hour > 21 && now.minute > 50 && now.hour < 22 && now.minute < 10) continue; // here goes your code with extremes }
Вообщем сделал так
int iTimes_Highest(int Count_Bars,int Start_Bar) { MqlDateTime t ={0}; int i=Start_Bar; if (i==0) i = 1; int HBar=0; int y=0; double Hmax=0.0; while(true) { datetime tBar=iTime(_Symbol,0,i+y); TimeToStruct(tBar,t); if((t.hour==21 && t.min>=57) || (t.hour==22 && t.min<=15)) { y++; continue; } if (iHigh(_Symbol,0,i+y)>Hmax) { HBar=i+y; Hmax= High[HBar]; } i++; if(i>=Start_Bar+Count_Bars) break; } if (Start_Bar==0 && ((Hour()<=21 && Minute()<=57) || (Hour()>22 && Minute()>15))) { if (High[0]>=Hmax) HBar=0; } return (HBar); }
Только ресурсы жрет - капец! Подскажите как сделать чтоб быстрей работало ?
Вообще надо профилировать, но так, на первый взгляд, можно получать все бары за пределами цикла, а внутри цикла проверять только их Time / High, тогда от использования обращения к серверу функциями iTime / iHigh можно избавиться
Для получения полной информации о всех барах за раз - CopyRates, ниже - импровизация, возможно где-то опечатался :)
MqlRates rates[]; int bars = CopyRates(symbol, 0, Start_Bar, Count_Bar, rates); while (bars-- >= 0) { datetime tBar = rates[bars].time; // replace iTime with just single item from rates array TimeToStruct(tBar, t); if((t.hour == 21 && t.min >= 57) || (t.hour == 22 && t.min <= 15)) { continue; } if (rates[bars].high > Hmax) // change iHigh to rates[bars].high too { HBar = bars; Hmax = High[HBar]; } } ...
смысл понятен. Но ты в своем коде логику изменил. Количество баров для расчета должно остаться одинаковым для всех отрезков времени. ТЫ просто решил не считать бары в указанном временном промежутке.
Профилировщик показывает, что самые большие затраты на
TimeToStruct(tBar,t);
Как от этого уйти ?

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Советник считает канал по экстремумам
как сделать чтоб он пропускал бары которые выпадают по времени с 21:50 до 22:10? . Т.е будто их вообще нет ?