Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
if (err==146)
{
while (IsTradeContextBusy())
{
if (IsTradeAllowed()) break;
else
Sleep(1000*1,1);
}}
Мне кажется это более быстрое решение.Я работаю так . Прокоментируйте.
Спасибо.
А как вы отнесётесь к такому варианту:
Мне кажется это более быстрое решение.Я работаю так . Прокоментируйте.
Спасибо.
Нормально отнесусь. С пониманием. Пауза меньше, работает быстрее... Но есть в Вашем варианте неоправданная избыточность.
Функция IsTradeContextBusy возвращает флаг занятости торгового потока. До 195-го билда этой функции вообще не было. И мы пользовались функцией IsTradeAllowed, которая возвращает признак того, что эксперту разрешено торговать и торговый поток свободен.
Разрешение торговать эксперту даётся установкой галочки "Разрешить советнику торговать" в диалоговом окне настройки свойств советника (клавиша F7).
К ошибке 146 (Торговый поток занят) разрешение советнику торговать не имеет отношения. Поэтому рассмотрим свойства функции IsTradeAllowed в части, относящейся только к торговому потоку.
Итак, торговый поток свободен, функция IsTradeAllowed возвращает True. Торговый поток занят, функция IsTradeAllowed возвращает False. Теперь рассмотрим значения, возвращаемые функцией IsTradeContextBusy. Торговый поток свободен, функция IsTradeContextBusy возвращает False. Торговый поток занят, функция IsTradeContextBusy возвращает True. Мы видим, что для одних и тех же состояний торгового потока значения функций IsTradeAllowed и IsTradeContextBusy противоположны. Более того, эти функции относительно состояния торгового потока не дополняют друг друга, а дублируют. Поэтому одну из них можно исключить. Какую? Функция IsTradeAllowed, как я уже упоминал, кроме флага состояния торгового потока ещё возвращает флаг разрешения советнику торговать, который в данной ситуации, то есть в обработке ошибки 146 (Торговый поток занят), нам не нужен. Следовательно, необходимым и достаточным будет использование только одной функции IsTradeContextBusy. Если выполнить вышеуказанные сокращения, то Ваш код сведётся к моему:
с единственной разницей в размере паузы. Но это уже дело вкуса, личных предпочтений, торгового стиля и прочего. Можно поставить паузу 0,1 сек. Непринципиально... Просто я предпочитаю 11 сек.В функции SetOrder обнаружились две ошибки:
Внимание! Пост с функцией SetOrder для онлайн-торговли исправлен. Функция получилась немного длиннее. В пост целиком не входила, поэтому её пришлось вынести в прицеп.
В этом посте я решил дать основные моменты, поясняющие работу функции SetOrder. Сам я с ордерами не работаю, то есть тут я на чужой территории. Возможно, кто-то разобравшись в работе функции SetOrder, предложит улучшения или найдёт ошибки.
1. В первых строках кода объявление локальных переменных и инициализация некоторых из них. Например, в lsComm записывается наименование эксперта и наименование тайфрейма, возвращаемое функцией GetNameTF. Кстати, на таких функциях, как GetNameOP, GetNameTF, Message и других мелких я сам останавливаться не буду, только если по ним у кого-то возникнут вопросы.
2. Проверка принятых параметров. Если sy пустая, то она инициализируется наименованием текущего инструмента. По типу операции инициализируется переменная для цвета значка на графике. Если ненулевой срок истечения ордера меньше текущего времени, то он обнуляется.
3. Тело цикла торговых попыток, количество которых ограничено значением глобальной переменной NumberOfTry. Дальше идут операции, выполняемые внутри главного цикла функции SetOrder.
4. Если функция SetOrder выполняется не в тестере, то реализуется возможность прервать её работу. Тут же выполняется цикл ожидания освобождения торгового потока. Обновляются переменные рыночного окружения и фиксируется текущее время.
5. Отправка запроса на торговый сервер. Если тикет положительный, то завершение работы функции SetOrder.
6. При отрицательном тикете выполняется обработка ошибок исполнения.
7. При ошибках 128 (Истек срок ожидания совершения сделки), 142 (Ордер поставлен в очередь) и 143 (Ордер принят дилером к исполнению) выполняется пауза, длительностью 66 секунд. После паузы с помощью функции ExistOrders (на ней остановимся чуть позже) проверяется, а не установился ли ордер в промежутке времени между запросом к серверу и текущим моментом. Если ордер был установлен, то выход из функции.
8. В локальных переменных запоминаются размер пункта и цены Bid и Ask.
9. При ошибке 130 (Неправильные стопы) по возможности выполняется корректировка ценовых уровней установки ордера, стопа и тейка.
10. В протокол выводятся сведения, которые могут впоследствии помочь решить проблему или найти ошибку.
11. Ну и в конце выполняется обработка прочих ошибок. Одни натыкаются на длительную паузу (5 минут), другие блокируют работу советника, третьи разрешают продолжить торговые попытки и т.д.
Всё! Конец описания!
Функция ExistOrders().
Возвращает флаг существования ордера. Ответит на вопрос, установлен ордер или нет. С помощью этой функции можно запросить как любой ордер, так и более конкретный. Фильтра запроса настраивается с помощью параметров функции:
Примеры использования функции ExistOrders().
1. Проверить наличие любого ордера
2. Проверить наличие любого ордера по инструменту текущего графика
3. Проверить наличие ордера BuyLimit по любому инструменту
4. Проверить наличие ордера SellStop с магиком 123456 по EURUSD
5. Проверить наличие любого ордера с временем установки не ранее 2-х часов назад
В прицепе скрипт для тестирования функции ExistOrders. Первые 4 примера в скрипте закомментированы.Внимание! В посте от 12.03.2008 07:24 я заменил вложение SetOrder.mq4