şundan çatallanmış antekov/mt5-manager
- оформить комментарии и заголовки функций по замечаниям модератора - обновить листинги и версию сервиса до 1.01 - подготовить MQL5.zip без EX5 и личных реквизитов - сохранить исправленную редакцию статьи и правила оформления
//+------------------------------------------------------------------+
| |
//| OnStart: точка входа сервиса |
| |
//+------------------------------------------------------------------+
| |
void OnStart()
| |
{
| |
PrintFormat("Запуск сервиса для экземпляра '%s'", InstanceFolder());
| |
| |
//--- Разброс интервала, чтобы записи разных сервисов не совпадали по фазе
| |
MathSrand((int)TimeLocal() + (int)GetTickCount());
| |
| |
const int interval_ms = InpIntervalSec * 1000;
| |
| |
while(!IsStopped())
| |
{
| |
//--- 1. Подключаемся к базе, если ещё не подключены
| |
if(g_db == INVALID_HANDLE)
| |
{
| |
if(!OpenDatabase())
| |
{
| |
Sleep(interval_ms);
| |
continue;
| |
}
| |
g_terminal_id = -1;
| |
}
| |
| |
//--- 2. Регистрируем терминал, если ещё не зарегистрирован
| |
if(g_terminal_id < 0)
| |
{
| |
g_terminal_id = RegisterTerminal();
| |
if(g_terminal_id < 0)
| |
{
| |
Sleep(interval_ms);
| |
continue;
| |
}
| |
}
| |
| |
//--- 3. Записываем текущее состояние
| |
if(!StoreState())
| |
{
| |
g_skipped++;
| |
if(g_skipped % 10 == 0)
| |
PrintFormat("Пропущено записей: %d, последняя ошибка: %d",
| |
g_skipped, GetLastError());
| |
}
| |
| |
//--- 4. Ждём до следующей итерации, добавляя небольшой случайный разброс
| |
int pause = interval_ms;
| |
if(InpJitterMs > 0)
| |
pause += (int)(MathRand() % InpJitterMs);
| |
Sleep(pause);
| |
}
| |
| |
if(g_db != INVALID_HANDLE)
| |
DatabaseClose(g_db);
| |
}
|