Была задача не открывать повторных ордеров в одном и том же таймфрейме. Для этого в условии открытия следующего ордера вычислялся номер бара закрытия предыдущего ордера с помощью OrderSelect(0, SELECT_BY_POS, MODE_HISTORY) && iBarShift(NULL,0,OrderCloseTime())!=0. Не помогло. Вывел значение iBarShift(NULL,0,OrderCloseTime()) в журнал через Print. Т.е., если предыдущий ордер был закрыт и в этом же таймфрейме есть сигнал на открытие нового ордера, то значение iBarShift(NULL,0,OrderCloseTime()) для последнего закрытого ордера должно быть равно 0. Но оно почему-то никогда не бывает равно 0. Решил для проверки сделать по-другому, чтобы новый ордер не открывался в течение 30 минут от закрытия предыдущего. Поставил условие: OrderSelect(0, SELECT_BY_POS, MODE_HISTORY) && TimeCurrent()-OrderCloseTime()>1800. Тоже не помогло. Вывел значение OrderCloseTime() в журнал через Print. Оказалось, что для всех закрытых ордеров это значение одно и то же. Не пойму, в чем дело. Кто-нибудь сталкивался с подобным?
- Проблема с повторным открытием ордеров
- Вопросы от начинающих MQL4 MT4 MetaTrader 4
- функция перебора ордеров
Вам нужно искать время не OrderCloseTime(), а время бара ближайшего к OrderCloseTime().
Проверил, правда странно ведёт пример кода по функции iBarShift не работает а подправленный пожалуйста:
оригинал как в справке
datetime some_time=D'2009.03.21 12:00'; int shift=iBarShift("EUROUSD",PERIOD_M1,some_time); Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift);
после правки
datetime some_time=D'2009.03.21 12:00'; int shift=iBarShift(NULL,0,some_time); Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift);
это уже к метаквотам.
Все намного проще - сначпла фильтруете ордера по времени закрытия - получаете время в абсолюте потом сравниваете его с временем открытия последнего бара, и так уже решаете что делать
и iBarShift() тут советшенно не причем ....
bool ifLastOrderCloseBar(int tf=0,int magic=0){int time; for(int i=0;i<OrdersHistoryTotal();i++){ if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==magic){ if(OrderCloseTime()>time){ time=OrderCloseTime(); } } } } } if(time!=0){ if(time>iTime(Symbol(),tf,0)){return(true);} } return(false); }
как то криво правка работает....
Я столкнулся с такой проблемой. iBarShift в тестере работает неправильно. Решил проблему записью всех баров в файл в експерте и перенес их в папку тестера, теперь при тестировании советник берет номера баров из файла.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь