![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
конечно если было бы достаточно отсутсвия открытого ордера или ордеров по определенному инструменту
====================================================================
я пробовал писать с OrdersTotal когда он "0" и когда Orders < или >до закрытия (работа с одним ордером) по всякому все равно проблема оставалась работает - работает потом пропустит работает пропустит в общем не получилось
if (Orders!=OrdersTotal()){if(OrdersTotal()<Orders){Orders=OrdersTotal();
Сейчас и функцию переделал на цикл из примеров учебника:
while(true){ RefreshRates(); // Цикл закрытия орд.
if (OrdersTotal()==0){Print (" Нечего удалять ");break;} // Если орд. нет выход из цикла закр
price = MarketInfo (OrderSymbol(),MODE_ASK);
Print("Попытка закрыть SE ",LotSE,". Ожидание ответа..");
Ans=OrderClose (OrderTicket(),OrderLots(),price,3,0);// Закрытие BU
if (Ans==true) {Print ("Закрыт ордер SE ",LotSE);}// Получилось :)
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
break;} // Выход из while
Работает в тестере. Но логика такова , что нельзя работать советнику пока нет достоверной информации о ЗАКРЫТОМ ордере то что Вы посоветовали прописал осталось только подождать "тиков" от сервера
и еще вопрос . если эксперт послал команду на закрытие ордера а потом верхняя часть кода будет запирать остальную часть кода до тех пор пока не появится тикер в экаунт хистори. то не может ли быть так что этот тикер так и не окажется в историческом списке из- за какой нибудь ошибки при отправки приказа на закрытиии..эксперт встанет как вкопанный .что тогда делать ?
Да надо думать, пока просматривал советника пришла еще мысль , кажется даже попроще , она только не решает вопрос
""""встанет как вкопанный .что тогда делать ?""""" :мысль - раз послан сигнал на закрытие ордера из while с обработкой ошибок и задержек на всякий случай , то он обязательно уйдет, Ans=OrderClose (OrderTicket(),OrderLots(),price,3,0);// Закрытие BU
значит должен обязательно(?) прийти ответ
вот здесь if (Ans==true) { ...... Closing =true; ....... Print ("Закрыт ордер BU ",LotBU);}// Получилось :)
Что-то я совсем запарился а зачем тогда он нужен будет этот Closing==false с ретурном? надо наверно перерывчик сделать, мозги кипят!
Да надо думать, пока просматривал советника пришла еще мысль , кажется даже попроще , она только не решает вопрос
""""встанет как вкопанный .что тогда делать ?""""" :мысль - раз послан сигнал на закрытие ордера из while с обработкой ошибок и задержек на всякий случай , то он обязательно уйдет, Ans=OrderClose (OrderTicket(),OrderLots(),price,3,0);// Закрытие BU
значит должен обязательно(?) прийти ответ
вот здесь if (Ans==true) { ...... Closing =true; ....... Print ("Закрыт ордер BU ",LotBU);}// Получилось :)
присваиваем Closing =true; и ждем наверху if(Closing==false) return(0); как только процедура закрытия закончится и прийдет ответ не взирая на тики полагаю сразу на верху будет ждать Closing==false с ретурномЧто-то я совсем запарился а зачем тогда он нужен будет этот Closing==false с ретурном? надо наверно перерывчик сделать, мозги кипят!
у меня еще 22-00 но третьи сутки в придачу! на свежую голову надо будет все просмотреть.
Александр.
P.S. // ответ "Ans=" с сервера в справочнике написано Ans=OrderClose (Orde
==================================================================
if (Ans==true) { ...... Closing =true; ....... Print ("Закрыт ордер BU ",LotBU);}// Получилось :)
===================================================================
не пойдет --- ручная торговля в пролете
у меня еще 22-00 но третьи сутки в придачу! на свежую голову надо будет все просмотреть.
Александр.
P.S. // ответ "Ans=" с сервера в справочнике написано Ans=OrderClose (Orde
==================================================================
if (Ans==true) { ...... Closing =true; ....... Print ("Закрыт ордер BU ",LotBU);}// Получилось :)
===================================================================
не пойдет --- ручная торговля в пролете
в случае успешной отправки приказа на закрытие сделки, функция OrderClose() заканчивает свою работу после того, как дождется ответа с сервера ....по логике так и должно быть поскольку эта функция выдает два ответа после завершения своей работы true либо false..например, если ее фунция ограничивалась только тем, чтобы отправить сигнал или приказ на сервер то после отправки эта функция всегда выдавала бы только один ответ true и, отсутсвие связи с сервером, как частный случай не в счет. поэтому после завершения работы функции OrderClose(), когда она возвращает true , одновременно ( не дожидаясь тика ) появляется соответствующая запись в журнале и в базе закрытых и удаленных ордеров ..стало быть сразу же, после окончания работы функции ордерклоуз когда она возвращает true уже можно заглянуть в базу закрытых ордеров и посмотреть не появился ли там наш ордер не выходя из цикла while ( true ), где происходит закрытие ордера
эта проблема решается если не использовать магический номер ордера . эксперт будет работать и с ордерами выставленные вручную и со своми тоже. если нет то используйте номер магический.
Магик я не рассматривал по умолчанию, а вопрос в том что сигнал на закрытие происходит не из эксперта и он не знает в этом случае что пошел сигнал на закрытие. Опять же "искать в журнале " что там появился новый удаленный ордер.
Мысль понял , а если его там нет, то поспим "Sleep(100);" немного не выходя из while и опять проверим , и так в принципе дождемся-таки его там и дальше в работу не надо будет вначале чего-то городить типа if(Closing==false) return(0);. Надо проверять. Но для ручного закрытия все равно надо будет копаться в истории.
Здесь просьба есть к Вам: не соображу как добавить этот "Sleep(100);" в обработке ошибок свои номера ошибок, а мне как добавить свой номер ошибки. Может как по другому. Эта функция опять из учебника.
int Fun_Error(int Error) // Ф-ия обработ ошибок
{
// Error // Номер ошибки
if(Error==0)return(0); // Нет ошибки
//--------------------------------------------------------------- 3 --
switch(Error)
{ // Преодолимые ошибки
case 4: Alert("Торговый сервер занят. Пробуем ещё раз..");
Sleep(1000); // Простое решение
return(1); // Выход из функции
case 135:Alert("Цена изменилась. Пробуем ещё раз..");
RefreshRates(); // Обновим данные
return(1); // Выход из функции
case 136:Alert("Нет цен. Ждём новый тик..");
while(RefreshRates()==false) // До нового тика
Sleep(1); // Задержка в цикле
return(1); // Выход из функции
case 137:Alert("Брокер занят. Пробуем ещё раз..");
Sleep(1000); // Простое решение
return(1); // Выход из функции
case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
Sleep(500); // Простое решение
return(1); // Выход из функции
// Критические ошибки
case 2: Alert("Общая ошибка.");
return(0); // Выход из функции
case 133:Alert("Торговля запрещена.");
return(0); // Выход из функции
case 134:Alert("Недостаточно денег для совершения операции.");
return(0); // Выход из функции
default: Alert("Возникла ошибка ",Error); //Другие варианты
return(0); // Выход из функции
}
}