![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Это последняя версия библиотеки?
Да.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: MT4Orders
fxsaber, 2017.02.16 15:16
С помощью этого скрипта удалось найти проблемы с исполнением в MT5. Рекомендую проверять свою связку Терминал+Торговый Сервер и, в случае проблем, сообщать в Сервисдеск.
Обновленный скрипт в приложении. Быстро находит, например, такие проблемы
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: MT4Orders
Andrey Khatimlianskii, 2018.06.06 01:53
Работа с длинной историей теперь просто летает!
Результат без Generic
Результат с Generic
На истории с 10К сделок и 20К ордеров Generic-вариант в ~30 раз быстрее. Чем больше торговая история, тем заметнее ускорение.
Извините, я не могу говорить по-русски. Я использую Google переводчик.
Несколько дней назад я нашел эту очень интересную библиотеку. Но у меня есть одна проблема: я отправляю рыночный ордер через OrderSend () и сохраняю билет, возвращенный OrderSend (). Через некоторое время ударяют стоп-лоссы или получают прибыль. Затем я пытаюсь выбрать заказ через OrderSelect(билет, SELECT_BY_TICKET) с этим билетом. В MQL4 порядок будет найден в истории. Но используя эту библиотеку с MQL5, OrderSelect не удастся.
Я немного посмотрел в коде MT4orders.mqh. MT4ORDERS::SelectByTicket () вызывает SelectByExistingTicket(), который терпит неудачу, а затем SelectByHistoryTicket(), который я ожидаю добиться. В SelectByHistoryTicket() функция HistoryDealSelect() обычно возвращает false (кроме, может быть, в тесте), потому что билет является идентификатором позиции, а не билетом сделки. ::HistoryOrderSelect () возвращает true, потому что билет совпадает с билетом in-order (и идентификатором позиции) (я использую MT5 в режиме хеджирования). Но MT4HISTORY::IsMT4Order(Ticket) возвращает false. Я ожидаю, что он вернется. Функция вернет true, если идентификатор позиции будет равен нулю. Но я вижу, что как в тесте, так и в реальном счете идентификатор позиции не равен нулю и равен биту заказа в порядке.
Любая помощь приветствуется.
Несколько дней назад я нашел эту очень интересную библиотеку. Но у меня есть одна проблема: я отправляю рыночный ордер через OrderSend () и сохраняю билет, возвращенный OrderSend (). Через некоторое время ударяют стоп-лоссы или получают прибыль. Затем я пытаюсь выбрать заказ через OrderSelect(билет, SELECT_BY_TICKET) с этим билетом. В MQL4 порядок будет найден в истории. Но используя эту библиотеку с MQL5, OrderSelect не удастся.
Все правильно. Подробности описаны здесь.
Вы можете сделать PositionTicket = OrderSend(OP_BUY, 2 lots) и OrderClose(0.2 lots) + OrderClose(0.3 lots). Тогда получите в Истории торгов две закрытые "позиции" (0.2/0.3 lots) и одну еще открытую позицию (1.5 lots) с тикетом равным PositionTicket. Это особенность MT5. Поэтому неправильно в режиме SELECT_BY_TICKET+MODE_HISTORY выбирать позицию по ее POSITION_ID в Истории торгов.
Запоминание тикетов - это плохой стиль, хоть и популярен. Правильно - когда на каждом событии торговый робот считывает все окружение с чистого листа.
ЗЫ Вот здесь показана примерно такая же ситуация, как описана выше
Forum on trading, automated trading systems and testing trading strategies
Libraries: MT4Orders
fxsaber, 2018.04.14 09:10
Example
Result
В результатах видно, что была открыта позиция с тикетом == 2. Затем она дважды закрылась, создав тем самым две закрытые "позиции" в Истории торгов. Их тикеты другие, но при этом у обеих этих "позиций" OrderTicketOpen == 2. Т.е. Вы должны понимать, что если в MT5 закрываете позицию, то ее исторический тикет не совпадает с real-time.
Обратите внимание, что в MT5 даже коментарии при закрытии одной и той же real-time позиции разные: "Hello World!" и "tp 1.23614".
Извините, я не могу говорить по-русски. Я использую Google переводчик.
Несколько дней назад я нашел эту очень интересную библиотеку. Но у меня есть одна проблема: я отправляю рыночный ордер через OrderSend () и сохраняю билет, возвращенный OrderSend (). Через некоторое время ударяют стоп-лоссы или получают прибыль. Затем я пытаюсь выбрать заказ через OrderSelect(билет, SELECT_BY_TICKET) с этим билетом. В MQL4 порядок будет найден в истории. Но используя эту библиотеку с MQL5, OrderSelect не удастся.
Я немного посмотрел в коде MT4orders.mqh. MT4ORDERS::SelectByTicket () вызывает SelectByExistingTicket(), который терпит неудачу, а затем SelectByHistoryTicket(), который я ожидаю добиться. В SelectByHistoryTicket() функция HistoryDealSelect() обычно возвращает false (кроме, может быть, в тесте), потому что билет является идентификатором позиции, а не билетом сделки. ::HistoryOrderSelect () возвращает true, потому что билет совпадает с билетом in-order (и идентификатором позиции) (я использую MT5 в режиме хеджирования). Но MT4HISTORY::IsMT4Order(Ticket) возвращает false. Я ожидаю, что он вернется. Функция вернет true, если идентификатор позиции будет равен нулю. Но я вижу, что как в тесте, так и в реальном счете идентификатор позиции не равен нулю и равен биту заказа в порядке.
Любая помощь приветствуется.
To fully understand your machine translation, please attach the text in English.
I have found this very interesting library some days ago. But I have one problem: I send a market order via OrderSend() and store the ticket returned by OrderSend(). After some time the stop loss or take profit is hit. Then I try to select the order via
OrderSelect(ticket, SELECT_BY_TICKET) with this ticket. In MQL4 the order would be found in the history. But using this library with MQL5, OrderSelect doesn't succeed.
I looked a bit in the code of MT4orders.mqh . MT4ORDERS::SelectByTicket() calls SelectByExistingTicket() which fails and then SelectByHistoryTicket() which I would expect to succeed. In SelectByHistoryTicket() the function HistoryDealSelect() generally returns false (except maybe in the tester) because the ticket is the position identifier and not the deal ticket. ::HistoryOrderSelect() returns true because the ticket is the same as the ticket of the in-order (and the position identifier) (I use MT5 in hedging mode). But MT4HISTORY::IsMT4Order(Ticket) returns false. I would expect it to return true. The function would return true if the position identifier would be zero. But I see that both in the tester and in a real account the position identifier is not zero - and equal to the order ticket of the in-order.
In other words: I don't understand why in the function MT4HISTORY::IsMT4Order() is the following code (returns true if the position id is zero):
In the following I attach my test code:
PrintChangesOfMQL5OrderSystemState() is a streightforward function that prints the state of the MQL5 order system each time when a change has been detected.
Here is the output of the test code (run on the tester):
You can see that HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) returns 2 and not zero. This is the reason why MT4HISTORY::IsMT4Order() returns false.
Any help is appreciated.In other words: I don't understand why in the function MT4HISTORY::IsMT4Order() is the following code (returns true if the position id is zero):
In the following I attach my test code:
PrintChangesOfMQL5OrderSystemState() is a streightforward function that prints the state of the MQL5 order system each time when a change has been detected.
Here is the output of the test code (run on the tester):
You can see that HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) returns 2 and not zero. This is the reason why MT4HISTORY::IsMT4Order() returns false.
Вы совсем не понимаете, что ордер в MT5 и в MT4 - разные сущности.
Вам был дан ответ выше.
Вы совсем не понимаете, что ордер в MT5 и в MT4 - разные сущности.
I understand the order systems of MQL5 and of MQL4 and their differences.
Поэтому неправильно в режиме SELECT_BY_TICKET+MODE_HISTORY выбирать позицию по ее POSITION_ID в Истории торгов.
Yes, I know that the MQL5 function HistoryOrderSelect() expects a ticket and not a position identifier.
But my test code is valid MQL4 code (except for the calls of MQL5 functions HistoryOrderSelect() and HistoryDealSelect())
and in MQL4 the function OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) returns true as expected.
As far as I know, the purpose of the library is to emulate the MQL4 order system as good as possible on MQL5. So, I would expect that with
the library the function OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) also returns true.
I have looked at the code and tried to find out why it returns false.
First: As I work on a MQL5 hedging System, the function
ticket = OrderSend(Symbol(), OP_BUY, 1.0, ask, 10, bid - 3*Point, bid + 3*Point);
assigns to the variable 'ticket' the order ticket that is equal to the (future) position identifier in MQL5 hedge. This can be seen in the code
of the function MT4OrderSend(). The following is returned:
When analysing what the library does when executing the code
I see that the function SelectByHistoryTicket() is executed with the ticket that I have stored in the variable 'ticket'.
In this function the function HistoryOrderSelect(ticket) is called - with the ticket that is equal to the order ticket and the position identifier.
With my MQL4 OrderSelect() call I do not call HistoryOrderSelect(ticket) myself - it's in the library.
Only in my test code I call HistoryOrderSelect(ticket) and HistoryDealSelect(ticket) directly in order to see what happens inside of the library:
To make it short: According to the return value of OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) the library does not emulate the
MQL4 order system on MQL5 correctly.
MQL4 the function OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) returns true as expected.
As far as I know, the purpose of the library is to emulate the MQL4 order system as good as possible on MQL5. So, I would expect that with
the library the function OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) also returns true.
I have looked at the code and tried to find out why it returns false.
Вы ошибаетесь. Запустите этот советник в Тестере
Результат