Количество открытых сокетов mtapi.dll

 
Количество открытых сокетов mtapi.dll
Господа разработчики!
Ответьте пожалуйста на такой вопрос. Какое максимальное количество сокетов я могу открыть в своем клиенте? Я, конечно, понимаю, что открывать 100 сокетов не имеет смысла, даже 10 для модема, думаю, будет многовато. Но вот 3-5 для себя считаю оптимальным (может, конечно, для MT - это число будет другим, спорить не буду), но все же? Какое количество не будет возбраняться хозяевами сервера? Надо же мне в клиенте ввести ограничения на это дело!

А размеры окошка для набора сообщения в форуме так и не поправили...

Спасибо...
 
кол-во сокетов
Как обычно работает клиентский терминал MetaTrader:
1) один главный сокет запущен в пассивной подкачке данных (котировки, позиции, новости, почта,...)
2) при необходимости подкачать историю графиков - запускается еще один временный(!) сокет. после отработки закрывается.
3) при необходимости закачать тело новости - запускается временный(!) сокет для подкачки тела новости. после отработки закрывается.
4) тоже самое для подкачки account history.
5) при совершении сделки открывается временный сокет и в нем совершаются операции запроса цен, подтверждения. после чего сокет закрывается.

В обычном режиме клиентский терминал должен/рекомендуется иметь один пассивный сокет. Не рекомендуется открывать дополнительный сокет и держать его открытым (на всякий случай) для совершения дополнительны операций. Можно держать дополнительный сокет непродолжительное время. Например в течение 30 секунд оставлять его открытым (вдруг еще понадобится?), но потом закрывать.
Сам сервер контролирует все открытые коннекты и если в течение 3х минут нет никакой активности в сокете, то сокет принудительно закрывается. Но не рекомендуем доводить дело до такого состояния.

Также не рекомендуем производить частые реконнекты к серверу за короткие промежутки времени. В сервере есть система автоматического распознавания DoS атак, которая просто заблокирует ваш IP адрес.

Сам MetaTrader API имеет жесткое ограничение на одновременную работу не более 10 сокетов.

ps: мы открыли API и надеемся, что программисты будут писать корректные и экономичные программы, которые не будут нагружать сервер.

А форум поправим, просто времени нет, готовимся в выставке.
 
Пример - ?
Т.е. если я открываю 10 сокетов, один перевожу в PumpingMode, а через остальные 9 качаю историю котировок по разным инструментам/периодам, а не новости, почту и историю трейдов, то это допустимо и не возбраняется. Так? И в этом случае 10 параллельных (одновременных) логинов подряд не будут считаться за "частые реконнекты к серверу за короткие промежутки времени"? Я все правильно понял?
Естественно, я понимаю, что сохранение этой истории лежит на мне и завтра я ее качать уже не буду, только недостающие со вчерашнего дня бары.
Спасибо.
 
запрещается!
Зачем открывать 9 коннектов?
Откройте один временный сокет, через который и качайте историю по графикам один за другим. Еще раз прочтите пост: https://www.metaquotes.net/cgi-bin/mf.cgi
Используйте максимум 2-3 коннекта в своей работе, только один из которых должен быть постоянным(pumping), остальные открываются на 20-30 секунд и они должны закрываться сразу же после использования.

Не открывайте множество коннектов!
В следующих версиях сервера будет встроена система, отслеживающая количество коннектов, созданных с помощью API.
При нерациональном использовании API будет запрещен для некоторых программ, написанных с использованием API. К сожалению, это придется сделать, если будут создаваться нерациональные/неэкономные программы.

Просьба использовать правильную работу с историческими данными, как предлагается в нашем варианте. Да, это сложнее чем абсолютно простой способ "запросим базы каждые 5 секунд и всех делов-то! и не надо думать о построение чартов".
 
Быть может я непонятно выразился...
Я перечитал уже по нескольку раз все посты по этой теме, и Ваши, и свои. Попробую объяснить свою заинтересованность и несообразительность в данном вопросе.

1.1. Заинтересованность: (начну издалека). Насколько мне известно, любая ОС (естественно я не говорю про DOS) каждому потоку из имеющих одинаковые приоритеты выделяет одинаковые кванты времени (это наиболее логичное решение, я не знаю про "любую ОС", но думаю, что это так). Поэтому я предполагаю, что сервер мне уделит в два раза больше времени, если я открою 2 сокета в сравнении с одним открытым сокетом. И если мое подключение мне это позволяет, то почему бы этим не воспользоваться? Например, работая по модему, я открываю 5-6 окон IE и вроде меня это устраивает. Но иногда приходится открывать 10-15, и кое-где начинаю зрить "The Web site cannot be found". Т.е. в данном примере 6 - это вроде нормально.
Теперь про 10 коннектов к серверу MetaTrader. Такая ситуация: я запускаю клиента, он загружает то состояние, в котором он был вчера, и вот, что получается. История до вчерашнего дня естественно имеется. Было открыто, например, 15 окон с разными инструментами/периодами. Клиент раздает команды классу-диспетчеру, что будет использоваться PumpingMode, а также, что нужно подкачать 15 историй, начиная со вчерашнего дня такого-то времени. И если я решил что для моей линии 10 коннектов нормально, то естественно мне хотелось бы побыстрее получить свои данные. Класс-диспетчер создает эти 10 коннектов в 10 потоках, один (главный, основной) переводит в пассивный режим, а остальным 9-ти раздает задания на докачку историй. Как только сокет освобождается, он не закрывается, если имеется для него очередное задание (ведь у нас еще 6 историй не грузится). Если в это время приходят уведомления о приходе новостей, почты и др., в очередь диспетчера встают новые задания. И как только очередь очищается, и сокет больше не нужен, сокет закрывается! В итоге, когда будут выполнены все задачи, останется открытым только один сокет в пассивном режиме, что и требуется. По-моему здесь ничто не противоречит Вашему посту "кол-во сокетов (mf.cgi?th=2050&ms=1)"

1.2. Несообразительность: В упомянутом выше посте практически обо всем было написано "рекомендуется" или "не рекомендуется". Описано, как работает сам терминал MetaTrader, но не написано, что именно так должны работать все клиенты. И что совсем сбило с толку, это фраза: "Сам MetaTrader API имеет жесткое ограничение на одновременную работу не более 10 сокетов". Значит все же разрешено открывать 10 сокетов в случае необходимости?

Это были мои объяснения, почему я задавал такие вопросы. Ну а теперь кое-какие решения.

2.1. Я так начинаю понимать, что Вы все же настаиваете, чтобы одна и та же функция не занимала 2 и более сокетов? Т.е. если я заранее решил, что мне надо обновить 3 графика, то я должен это сделать по очереди через один и тот же сокет. И только, если пришло уведомление о письме, новости, или мне потребовалось запросить котировку и выставить ордер, я имею право открыть еще по одному сокету на каждую из этих задач? Если это так, то предлагаю жестко закрепить это условие, что функции Mt...1 и Mt...2 не имеют права выполняться одновременно, занимая разные сокеты. В новую версию api ввести соответствующую ошибку RET_xx, которую возвращали бы функции, отслеживая, что какая-то функция из их группы уже занимает другой сокет. В этом случае и ограничение этой версии api на 10 сокетов станет еще меньше.

2.2. Поскольку Вы собираетесь выпускать новую версию api, то в целях ужесточения соблюдения правил, Вам придется заставить клиентов использовать новые версии api. Каким образом? Наверное, выдачей ошибки RET_OLD_VERSION на MtConnect? Тогда могу предложить еще включить функцию MtCheckDownloadVersion с выдачей номера версии, а также ее URL. И функцию MtDownload(m_handle, fromPath, toPath). Хотя, это уже можно отнести к второстепенным сервисным функциям, а значит не являющихся необходимыми. Поэтому только предлагаю, а не прошу.

2.3. Чтобы в дальнейшем уберечь себя или программистов (точно даже не знаю, кого больше) от проблем с неправильным использованием mtapi, Вам надо бы его написать более интеллектуальным. Я сейчас как раз этим и занимаюсь (просто мне это очень надо). Поэтому и выясняю у Вас, что же я имею право делать, а чего делать нельзя. Как закончу, собираюсь выложить его для всеобщего доступа. Думаю, подобная "благотворительность" будет и мне полезна, это не тот код, который стоит "зажимать". Так вот, было бы неплохо, если идеи или даже уже готовый алгоритм был бы уже встроен в mtapi, а не существовал бы в клиентской части приложения. Единственная здесь проблема (а может и не проблема это вовсе), что пишу я на Delphi. Ценность этого кода, конечно же, определять Вам, так что, решайте сами принимать данное предложение или нет.

2.4. Данные постинги, думаю, еще будут интересны другим людям в более позднее время. Но по истории сообщений форума далеко не все ищут ответы на интересующие их вопросы. Поэтому, как мне кажется, Вам же на руку было бы неплохо организовать FAQ, побить его на соответствующие темы и поместить туда ценные на Ваш взгляд вопросы/ответы форума.
 
ни в коем случае
1.1 абсолютная ошибка. открыв 10 сокетов вы не будете в 10 раз быстрее закачивать данные, но будете в 10 раз больше загружать сервер. еще раз повторю - не создавайте лишних коннектов. сколько раз это надо повторять? хотите чтобы жестко встало ограничение в 3 коннекта на API?

1.2 к сожалению, вы нас не поняли правильно, поэтому напишем "вы _не имеете право_ открывать более 3 сокетов одновременно".

2.1 мы настаиваем на этом, потому что большинство программистов хотят пойти по самому легкому пути, не желая писать экономичные программы. явное ограничение будет выставлено на 3 сокета.

2.3 мы хотим чтобы люди имели возможность писать свои программы с использованием API, но совершенно против программ, которые будут создавать массу соединений к серверу.

2.4 да, FAQ придется создать.

Просьба/рекомендация/требование - пишите экономичные программы, не открывайте множество сокетов.
 
Спасибо, я все понял. Я хочу и буду писать экономичные программы. При возникновении еще вопросов лучше спрошу у Вас.
Причина обращения: