Вопрос к разработчикам

 
Вопрос к разработчикам
Методом научного тыка я выяснил, что ограничение на частоту обращений также установлено для
AddSimbol - 1 секунда
Хотя вы ничего об этом не говорили

Просьба ответить наконец на вопрос
https://www.metaquotes.net/cgi-bin/mf.cgi

и сообщить в каких еще функциях установлено ограничение.
 
мы перечислили ВСЕ явные лимиты, которые отслеживаются в апи
скажите пожалуйста, зачем каждую секунду добавлять символ? кстати, Вы видели в наших примерах задержку в цикле по добавлению символов? почему Вы не можете реализовывать ту логику, которая представлена в наших примерах?
 
Так я ваши примеры почти один в один скопировал, особенно в этом месте....
void __fastcall CMetaTraderAPIS::Login()
{
int err;
TListItem *it;
//UpdateData();
//---- логин
TestSleep(SLEEP_Login,&Last_Login); //5 секунд
if ((err = m_api.Login(acc.login,acc.password)) > RET_OK_NONE)
{
ShowMessage(m_api.GetErrorDescription(err));
return;
}
//---- обновим инструменты
TestSleep(SLEEP_RefreshSecurities,&Last_RefreshSecurities); //5 секунд
if ((err = m_api.RefreshSecurities()) > RET_OK_NONE)
{
ShowMessage(m_api.GetErrorDescription(err));
return;
}
m_bLogined=TRUE;

// важно не забыть освободить буферы при помощи функции ::HeapFree
if (g_pSecs != NULL) ::HeapFree(::GetProcessHeap(), 0, g_pSecs);

//---- получим доступные инструменты
g_pSecs = m_api.GetSecurities(&g_nSecs);
for (int i = 0; i < g_nSecs; i++) AddSecurity(i);
...
}

void __fastcall CMetaTraderAPIS::AddSecurity(int isec)
{
int err;
//Без этой паузы в 1 секунду не работает, а их много!!!
TestSleep(SLEEP_AddSimbol,&Last_AddSimbol);
if ((err = m_api.AddSymbol(g_pSecs[isec].name)) > RET_OK_NONE)
{
ShowMessage(m_api.GetErrorDescription(err));
return;
}
//---- unused[0] сигнализирует о том, что сивол выбран
g_pSecs[isec].unused[0] = 1;
//----
}
 
не делайте лишних вызовов, думайте головой
Не делайте лишних вызовов(перед каждым вызовом думайте- нужен ли он). Тупое переписывание нашего примера в код для множества соединений недопустимо. Если нужен список инструментов - запросите его в каком-то одном соединении, а не пытайтесь запрашивать в каждом.
 
я Вам одну интересную вещь скажу
функция AddSymbol вообще не обращается к серверу. она только копирует инструмент из общего списка в список выбранных инструментов.
интересно, если Вы не поставите секундную паузу, то какой код возврата Вы получаете?
Вы ведь приводили нашу цитату, где говорится, что "AddSymbol лучше вызывать после RefreshSecurities, но до SetPumpingMode". это связано с тем, что заранее приготовленный список выбранных инструментов отдаётся серверу при переходе в режим подкачки. и изменения в этом списке тоже передаются серверу в процессе подкачки данных.
 
Я именно так и делаю. AddSymbol вызываю после RefreshSecurities и до SetPumpingMode
 
и зачем же тогда секундная задержка??? и что за код возврата если её не поставить?
 
Позволю не согласиться
>Если нужен список инструментов - запросите его в каком-то одном соединении, а не пытайтесь запрашивать в каждом.

Во первых, RefreshSecurities это метод класса экземпляры которого не должны зависеть от других и могут не "знать" о существовании других. Нагружать класс собственным методом копирования данных из других экземпляров категорически неправильно.

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

>Тупое переписывание нашего примера в код для множества соединений недопустимо.

Не такое уж и тупое. Для соединений я сделал класс "обертку" над MTAPI.
Приведите пример допустимого кода, на любом языке...
Я пока не стал реализовывать на Билдере многопоточность - в потоке вываливается сообщение "некоторая ошибка". Делаю без потоков, поочередно, однократно и всего для 3 соединений.
 
использование функций
>> Во первых, RefreshSecurities это метод класса экземпляры
>> которого не должны зависеть от других и могут не "знать" о
>> существовании других. Нагружать класс собственным методом
>> копирования данных из других экземпляров категорически
>> неправильно.

Если Вы не желаете играть по нашим правилам, то, вероятно, Вам доступ может быть запрещен. Нас не интересует что Вы у себя напишете в классах. Но сильно интересует минимизация запросов на сервер и количество соединений.

Понятно объясняем? Пишите так как надо, а не "по правилам ООП". Попытка сделать программу попроще для себя может вылится в запрет доступа.
 
Спасибо всем за помощь. Разобрался.
Причина обращения: