Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Мой советник, который сейчас участвует на Чемпионате, выполняет неправильные действия из-за неверной работы стандартной библиотеки CTrade.
Использую функцию PositionClose для закрытия позиций. Но вместе с закрытием позиций эта функцию сама ОТКРЫВАЕТ сделки!
Функция используется так:
В итоге PositionClose открывает иногда лишние ордеры.
Здесь сделка Buy сначала была закрыта, а потом была открыта лишняя сделка Sell такого же объема. Более того, AccountInfoDouble(ACCOUNT_FREEMARGIN) не заметил этой лишней сделки. Поскольку следом была открыта сделка с увеличенным лотом, хотя средств для этого согласно используемого ММ было не достаточно с учетом открытой лишней сделки.
Я понимаю, что, возможно, не оптимально использую функции MQL. Но то что функция из фирменной библиотеки MQL, предназначенная для закрытия сделок, будет сама открывать сделки, не укладывается в мое представление о допустимом поведении функций.
Я понимаю, что, возможно, не оптимально использую функции MQL. Но то что функция из фирменной библиотеки MQL, предназначенная для закрытия сделок, будет сама открывать сделки, не укладывается в мое представление о допустимом поведении функций.
Почитайте статью Торговые события в MetaTrader 5:
Сообщения о торговых событиях и об изменениях в торговой истории поступают по независимым каналам. При отправке запроса на покупку функцией OrderSend() можно сразу же узнать тикет ордера, который был создан при успешном результате проверки запроса. Но в то же время сам ордер еще может не появиться в клиентском терминале и попытка выбрать его с помощью функции OrderSelect() окажется неуспешной.
Почитайте статью Торговые события в MetaTrader 5:
А также статья Ордерa, позиции и сделки в MetaTrader 5Я не использовал функцию OrderSend. Используется функция PositionClose из стандартной библиотеки MQL, предназначенной для работы с ордерами.
В справке по этой функции не описано, что она может открывать сделки.
Цитата из справки:
PositionClose
Закрывает позицию по указанному символу.
bool PositionClose(
const string symbol, // символ
ulong deviation=ULONG_MAX // отклонение
)
Параметры
symbol
[in] Наименование торгового инструмента, по которому предполагается закрыть позицию.
deviation=ULONG_MAX
[in] Максимальное отклонение от текущей цены (в пунктах).
Возвращаемое значение
true - в случае успешной базовой проверки структур, иначе false.
Примечание
Успешное окончание работы метода PositionClose(...) не всегда означает успешное совершение торговой операции. Необходимо проверять результат выполнения торгового запроса (код возврата торгового сервера) вызовом метода ResultRetcode().
Я не использовал функцию OrderSend. Используется функция PositionClose из стандартной библиотеки MQL, предназначенной для упрощений работы с ордерами.
В справке по этой функции не описано, что она может открывать сделки.
Цитата из справки:
PositionClose
Закрывает позицию по указанному символу.
bool PositionClose(
const string symbol, // символ
ulong deviation=ULONG_MAX // отклонение
)
Параметры
symbol
[in] Наименование торгового инструмента, по которому предполагается закрыть позицию.
deviation=ULONG_MAX
[in] Максимальное отклонение от текущей цены (в пунктах).
Возвращаемое значение
true - в случае успешной базовой проверки структур, иначе false.
Примечание
Успешное окончание работы метода PositionClose(...) не всегда означает успешное совершение торговой операции. Необходимо проверять результат выполнения торгового запроса (код возврата торгового сервера) вызовом метода ResultRetcode().
Ошибки в библиотечной функции PositionClose(...) ни какой нет. А вот в коде у вас есть. Вот вы сами привели цитату из справки.
Я вот например не вижу у вас в коде этой проверки.
Я не использовал функцию OrderSend. Используется функция PositionClose из стандартной библиотеки MQL, предназначенной для работы с ордерами.
В справке по этой функции не описано, что она может открывать сделки.
А вы посмотрите реализацию функции PositionClose:
Полагал, что мне не нужно изучать исходный код стандартных библиотек.
В справке возможность открытия сделок функцией PositionClose не описана. Проверки и защиту от открытия сделок функция PositionClose, которая разработана вашей командой, должна содержать сама. Полагаю, что стандартные библиотеки - это идеальный код, который должен служить образцом для других. Поэтому разбирать код библиотек перед их использованием не должно требоваться.
Цитата:
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
Полагал, что мне не нужно изучать исходный код стандартных библиотек.
В справке возможность открытия сделок функцией PositionClose не описана. Проверки и защиту от открытия сделок функция PositionClose, которая разработана вашей командой, должна содержать сама. Полагаю, что стандартные библиотеки - это идеальный код, который должен служить образцом для других. Поэтому разбирать код библиотек перед их использованием не должно требоваться.
Незнание законов не освобождает от ответственности. Где в вашем коде проверка того, что позиция закрылась?
Выражение
R == true
говорит только об успешном выполнении функции PositionClose(), но не о закрытии позиции:
Примечание
Успешное окончание работы метода PositionClose(...) не всегда означает успешное совершение торговой операции. Необходимо проверять результат выполнения торгового запроса (код возврата торгового сервера) вызовом метода ResultRetcode().
А второе выражение
эквивалентно
и также не дает гарантии при асинхронности торговых операций. Позиция уже закрылась на торговом сервере, а до терминала сообщение об этом еще не дошло. Вот и получается, что вы своими руками создали баг в коде.
В жизни не все так гладко как в тестере, бывают и небольшие задержки между отправкой торгового запроса и результатом его выполнения. Каждый сам решает эту проблему, для начала не мешало бы проверять код возврата с помощью функции ResultRetcode(), как это написано в справке.
Повторюсь.
Я понимаю, что, возможно, не оптимально использую функции MQL. Но то что функция из фирменной библиотеки MQL, предназначенная для закрытия сделок, будет сама открывать сделки, не укладывается в мое представление о допустимом поведении функций.Все что вы говорите, относится к закрытию сделок. Да, советник не оптимально проверяет закрытие позиции. Но это не разрешает функции, предназначенной для закрытия, открывать самостоятельно сделки.
В справке сказано:
PositionClose
Закрывает позицию по указанному символу.
Ни каких условий не описано, что функция может открыть сделку. Рекомендация о проверке кода возврата тоже служит только для дополнительной проверки закрылась или не закрылась сделка.
Повторюсь.
Я понимаю, что, возможно, не оптимально использую функции MQL. Но то что функция из фирменной библиотеки MQL, предназначенная для закрытия сделок, будет сама открывать сделки, не укладывается в мое представление о допустимом поведении функций.Нет функции закрытия позиции, есть только функции отправки запроса на покупку или продажу (а что будет в результате - открытие или закрытие позиции - неизвестно). В Вашем случае из-а алгоритмической ошибки повторные запросы отсылаются без проверки выполнения предыдущего запроса.
В справке такая функция есть
Справочник MQL5 / Стандартная библиотека / Торговые классы / CTrade / PositionClose
Закрывает позицию по указанному символу.
Как реализовано выполнение функции на низком уровне пользователя не должно волновать. Раз уж такая функция есть, то, полагаю, MetaQuotes гарантировал, что у нее не будет нестандартного поведения неописанного в справке.
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.