Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 320

 

Уважаемые программисты, подскажите пожалуйста, кто знает!

Есть эксперт для MT4, который закрывает пачку ордеров (500-2500) при достижении суммарного профита. И как я заметил, он закрывает ордера поочередно, сортируя их по магику - от меньшего к большему.

Так вот и сам вопрос: возможно ли в эксперт добавить функция запуска скрипта, при начале закрытия ордеров, который будет так же закрывать ордера, только сортируя по магику с конца - от большего к меньшему?

И ускорит ли данная идея скорость закрытия ордеров?

Где то мне подсказали, что на сервер можно отправлять одновременно до 4 запросов.
 
Tapochun:
Тогда нужно код смотреть... возможно дело в нем... там есть подобная строчка в принтах?
Нету. Раньше все тестировалось без вопросов... подскажите что еще может быть?


 
Novikov:

Уважаемые программисты, подскажите пожалуйста, кто знает!

Есть эксперт для MT4, который закрывает пачку ордеров (500-2500) при достижении суммарного профита. И как я заметил, он закрывает ордера поочередно, сортируя их по магику - от меньшего к большему.

Так вот и сам вопрос: возможно ли в эксперт добавить функция запуска скрипта, при начале закрытия ордеров, который будет так же закрывать ордера, только сортируя по магику с конца - от большего к меньшему?

И ускорит ли данная идея скорость закрытия ордеров?

Где то мне подсказали, что на сервер можно отправлять одновременно до 4 запросов.

Запустить скрипт из эксперта нельзя. На сервер действительно можно отправить несколько запросов от разных экспертов одновременно. Если синхронизировать несколько экспертов, то действительно возможно получить некоторый прирост производительности.

Но на Вашем месте я не стал бы биться лбом в открытую дверь. Лучше переходите на MetaTrader5. Там есть функция OrderSendAsync которая позволяет закрывать позиции сразу пачками на невероятной скоросит 100-200 ордеров за пару секунд:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Разработчики! Ошибка 10024 (Слишком частые запросы)

C-4, 2014.11.07 15:55

В общем подвожу итог своего небольшого исследования. 

Удалось протолкнуть 50 заявок за 50 миллисекунд; 100 заявок за 180 мсек.; 200 за 2100 мсек; 500 заявок за 9000 мсек; 1000 заявок за 23000 мсек. (время указано среднее). Т.е. чем больше нужно протолкнуть тем больше требуется на это времени. Возможно дело в неграмотном составлении кода. 

Фактическое время исполнения пучка заявок конечно больше. Это время по всей видимости равно худшему варианту Время отправки заявки + время исполнения заявки. Но в любом случае в пределе оно стремится к среднему времени исполнения заявки биржой + времени которое уходит на общение с торговым сервером. Если заявок меньше 60, то общаться с торговым сервером не надо, отправили все заявки и ждем их исполнения. На саму отправку уходит миллисекунд 40-60. Если заявок больше - здесь сложней. Нужно дождаться ответа сервера, снова включить отправку заявок, дождаться отказа и т.д. Т.е. идет такой обмен сообщениями по сети. Когда заявок много пул освобождается постепенно, по мере исполнения заявок. Последующие отправки идут маленькими порциями, по одной две заявки, а это сеть. Следовательно время растет. В общем похоже код работает правильно, просто нужно понимать механизм отправки/получения заявок.

Код тестирующий такую отправку прикрепил ниже. 

p.s. Резюмируя можно сказать что 60 заявок - более чем достаточно даже для HFT торговли. Ведь фактически требуется осознанный анализ торговых действий - отправили заявку, получили результат, проанализировали торговое окружение, в случае необходимости отправили новую. Весь цикл явно будет превышать масштаб 40-60 миллисекунд + среднее время исполнения 1 заявки.


 
R0MAN:
Нету. Раньше все тестировалось без вопросов... подскажите что еще может быть?


Попробуйте протестировать на свежих данных. В другом терминале пробовали запускать?
 
Tapochun:
Попробуйте протестировать на свежих данных. В другом терминале пробовали запускать?
Нет. Сегодня установил  новый с бкс. На нем пробовал тестить. Попробую на другом... напишу сюда результат.
 
C-4:

Запустить скрипт из эксперта нельзя. На сервер действительно можно отправить несколько запросов от разных экспертов одновременно. Если синхронизировать несколько экспертов, то действительно возможно получить некоторый прирост производительности.

Но на Вашем месте я не стал бы биться лбом в открытую дверь. Лучше переходите на MetaTrader5. Там есть функция OrderSendAsync которая позволяет закрывать позиции сразу пачками на невероятной скоросит 100-200 ордеров за пару секунд:



Причем здесь МТ5 и тем более 100-200 ордеров? И какие еще 100-200 ордеров в МТ5? Это 100-200 торговых инструментов в МТ5! Ведь на 1 инструменте может быть открыт только 1 ордер - если я не ошибаюсь!

А у меня накопление большого количества ордеров происходит на 28 инструментах и при этом частично с локами!

Есть что подсказать по теме вопроса - буду благодарен, а советовать что-то, не относящееся к вопросу - лишнее и не конструктивное!

 
C-4:

Запустить скрипт из эксперта нельзя. На сервер действительно можно отправить несколько запросов от разных экспертов одновременно. Если синхронизировать несколько экспертов, то действительно возможно получить некоторый прирост производительности.

Но на Вашем месте я не стал бы биться лбом в открытую дверь. Лучше переходите на MetaTrader5. Там есть функция OrderSendAsync которая позволяет закрывать позиции сразу пачками на невероятной скоросит 100-200 ордеров за пару секунд:


О! Василий, если здесь, глянь плиз по моему вопросу, благодарю.

 
R0MAN:
О! Василий, если здесь, глянь плиз по моему вопросу, благодарю.

Привет! Глянул. К сожалению с такой ошибкой некогда не сталкивался. Единственное, что приходит на ум проверить папку history у тестера например здесь y:\MetaTrader 5\tester\bases\AdmiralMarkets-MT5\history\. Если файлов по нужному инструменту нет, попробовать скопировать данные вручную из основного каталога y:\MetaTrader 5\Bases\AdmiralMarkets-MT5\ и перезапустить тестер. Пока других идей нет.

з.ы. Хотя странно все это. Тестер должен автоматом копировать историю. Но мало ли что. 

 
C-4:
Привет! Глянул. К сожалению с такой ошибкой некогда не сталкивался. Единственное, что приходит на ум проверить папку history у тестера например здесь y:\MetaTrader 5\tester\bases\AdmiralMarkets-MT5\history\. Если файлов по нужному инструменту нет, попробовать скопировать данные вручную из основного каталога y:\MetaTrader 5\Bases\AdmiralMarkets-MT5\ и перезапустить тестер. Пока других идей нет.
Благодарю. Приеду к кампу займусь... сейчас с мобильного.
 
Novikov:

Причем здесь МТ5 и тем более 100-200 ордеров? И какие еще 100-200 ордеров в МТ5? Это 100-200 торговых инструментов в МТ5! Ведь на 1 инструменте может быть открыт только 1 ордер - если я не ошибаюсь!

А у меня накопление большого количества ордеров происходит на 28 инструментах и при этом частично с локами!

Есть что подсказать по теме вопроса - буду благодарен, а советовать что-то, не относящееся к вопросу - лишнее и не конструктивное!

Еще раз (читайте внимательно):

В MetaTrader4 можно закрывать ордера лишь последовательно: отправили приказ на закрытие ордера, дождались его исполнения, перешли к следующему ордеру и т.д. По этой причине  время на закрытие пачки ордеров в MetaTrader4 значительно и тривиальным путем его нельзя снизить. Однако, можно загрузить несколько экспертов каждый на свой график и сделать так, что бы они могли обмениваться информацией друг с другом и по общей команде закрывали ордера. Каждый эксперт закрывал бы ордера только на своем инструменте. Благодаря тому, что торговых потоков в MetaTrader4 несколько, они бы не блокировали друг друга и отправляли приказы параллельно друг другу, за счет чего общая скорость существенно бы возросла. Однако, организация такого пула экспертов сложна, и судя по вашему уровню знаний советовать Вам нечто подобное я бы не стал.

Если по-прежнему Вам кажется что я написал слишком много букафф, вот краткое резюме:

1. ответ на ваш вопрос отрицательный, запустить скрипт из эксперта нельзя. 

2. Повысить скорость исполнения торговых приказов в MetaTrader4 не прибегая к сложным методам нельзя.

3. Нормальное решение вашего вопроса возможно только с помощью функции OrderSendAsync, которой в MetaTrader4 нет.

Причина обращения: