Советники: Мониторинг котировок (пример для маппинга)

 

Мониторинг котировок (пример для маппинга):

Пример использования dll для работы с функциями File Mapping.

Author: o_O

 
спасибо за работу!
 
Превосходно! То, над чем я сам думал.
 

Вызов start() внутри init() - это техническая необходимость или предпочтения автора?

P.S. Спасибо - хорошая работа!

 

Подскажите для чайника (по С++): "Как передать между терминалами время?" (т.е. ещё один параметр).

Простое увеличение рабочих массивов (price[][4] и data[4]) на один индекс результатов не приносят. Я могу предположить, что не хватает размера ячейки памяти для переноса переменной.

Увеличение

#define SIZE                           16 // размер вектора для записи (3*int(4))

SIZE с 12 до 16 тоже не дало результатов.

Спасибо.

 
IgRU4ek:

Подскажите для чайника (по С++): "Как передать между терминалами время?" (т.е. ещё один параметр).

Простое увеличение рабочих массивов (price[][4] и data[4]) на один индекс результатов не приносят. Я могу предположить, что не хватает размера ячейки памяти для переноса переменной.

Увеличение

#define SIZE                           16 // размер вектора для записи (3*int(4))

SIZE с 12 до 16 тоже не дало результатов.

Спасибо.

В правильном направлении гребёте, Товарищ! - если всё сделали правильно, должно работать.

А вот результаты работы со временем на разных терминалах. Это принты одного и того же временного промежутка, но с разных терминалов.

Первый терминал:

2012.01.20 10:29:59	e-PSI@Monitor_v1.0 EURUSD,M1: 14227: Time[07:29:59] = 10:29:59 | Close[0] = 1.29680 | Open[1] = 1.29660 | High[1] = 1.29690 | Low[1] = 1.29660
2012.01.20 10:29:59	e-PSI@Monitor_v1.0 EURUSD,M1: 79319: Time[07:29:59] = 08:30:00 | Close[0] = 1.29680 | Open[1] = 1.29660 | High[1] = 1.29690 | Low[1] = 1.29660
2012.01.20 10:29:09	e-PSI@Monitor_v1.0 EURUSD,M1: 14227: Time[07:29:09] = 10:29:09 | Close[0] = 1.29660 | Open[1] = 1.29680 | High[1] = 1.29680 | Low[1] = 1.29650
2012.01.20 10:29:09	e-PSI@Monitor_v1.0 EURUSD,M1: 79319: Time[07:29:09] = 08:29:10 | Close[0] = 1.29650 | Open[1] = 1.29680 | High[1] = 1.29680 | Low[1] = 1.29650
2012.01.20 10:28:08	e-PSI@Monitor_v1.0 EURUSD,M1: 14227: Time[07:28:08] = 10:28:08 | Close[0] = 1.29680 | Open[1] = 1.29640 | High[1] = 1.29680 | Low[1] = 1.29630
2012.01.20 10:28:08	e-PSI@Monitor_v1.0 EURUSD,M1: 79319: Time[07:28:08] = 08:28:09 | Close[0] = 1.29680 | Open[1] = 1.29640 | High[1] = 1.29680 | Low[1] = 1.29630
2012.01.20 10:27:19	e-PSI@Monitor_v1.0 EURUSD,M1: 14227: Time[07:27:19] = 10:27:18 | Close[0] = 1.29640 | Open[1] = 1.29620 | High[1] = 1.29650 | Low[1] = 1.29620
2012.01.20 10:27:19	e-PSI@Monitor_v1.0 EURUSD,M1: 79319: Time[07:27:19] = 08:27:20 | Close[0] = 1.29630 | Open[1] = 1.29620 | High[1] = 1.29640 | Low[1] = 1.29620
2012.01.20 10:25:58	e-PSI@Monitor_v1.0 EURUSD,M1: 14227: Time[07:25:58] = 10:25:58 | Close[0] = 1.29620 | Open[1] = 1.29640 | High[1] = 1.29660 | Low[1] = 1.29610
2012.01.20 10:25:58	e-PSI@Monitor_v1.0 EURUSD,M1: 79319: Time[07:25:58] = 08:26:00 | Close[0] = 1.29610 | Open[1] = 1.29650 | High[1] = 1.29660 | Low[1] = 1.29610
2012.01.20 10:25:00	e-PSI@Monitor_v1.0 EURUSD,M1: 14227: Time[07:25:00] = 10:25:00 | Close[0] = 1.29640 | Open[1] = 1.29660 | High[1] = 1.29660 | Low[1] = 1.29640
2012.01.20 10:25:00	e-PSI@Monitor_v1.0 EURUSD,M1: 79319: Time[07:25:00] = 08:25:02 | Close[0] = 1.29640 | Open[1] = 1.29660 | High[1] = 1.29660 | Low[1] = 1.29640
2012.01.20 10:24:04	e-PSI@Monitor_v1.0 EURUSD,M1: 14227: Time[07:24:04] = 10:24:04 | Close[0] = 1.29670 | Open[1] = 1.29630 | High[1] = 1.29690 | Low[1] = 1.29630
2012.01.20 10:24:04	e-PSI@Monitor_v1.0 EURUSD,M1: 79319: Time[07:24:04] = 08:24:06 | Close[0] = 1.29670 | Open[1] = 1.29640 | High[1] = 1.29690 | Low[1] = 1.29640
2012.01.20 10:23:05	e-PSI@Monitor_v1.0 EURUSD,M1: 14227: Time[07:23:05] = 10:22:41 | Close[0] = 1.29630 | Open[1] = 1.29600 | High[1] = 1.29640 | Low[1] = 1.29600
2012.01.20 10:23:05	e-PSI@Monitor_v1.0 EURUSD,M1: 79319: Time[07:23:05] = 08:23:06 | Close[0] = 1.29650 | Open[1] = 1.29610 | High[1] = 1.29650 | Low[1] = 1.29600
2012.01.20 10:21:58	e-PSI@Monitor_v1.0 EURUSD,M1: 14227: Time[07:21:58] = 10:21:58 | Close[0] = 1.29600 | Open[1] = 1.29610 | High[1] = 1.29620 | Low[1] = 1.29600
2012.01.20 10:21:58	e-PSI@Monitor_v1.0 EURUSD,M1: 79319: Time[07:21:58] = 08:22:00 | Close[0] = 1.29600 | Open[1] = 1.29610 | High[1] = 1.29620 | Low[1] = 1.29590
2012.01.20 10:21:05	e-PSI@Monitor_v1.0 EURUSD,M1: 14227: Time[07:21:05] = 10:21:05 | Close[0] = 1.29610 | Open[1] = 1.29610 | High[1] = 1.29620 | Low[1] = 1.29600
2012.01.20 10:21:05	e-PSI@Monitor_v1.0 EURUSD,M1: 79319: Time[07:21:05] = 08:21:06 | Close[0] = 1.29610 | Open[1] = 1.29610 | High[1] = 1.29620 | Low[1] = 1.29600
2012.01.20 10:20:01	e-PSI@Monitor_v1.0 EURUSD,M1: 14227: Time[07:20:01] = 10:20:01 | Close[0] = 1.29610 | Open[1] = 1.29630 | High[1] = 1.29640 | Low[1] = 1.29610
2012.01.20 10:20:01	e-PSI@Monitor_v1.0 EURUSD,M1: 79319: Time[07:20:01] = 08:20:02 | Close[0] = 1.29620 | Open[1] = 1.29630 | High[1] = 1.29640 | Low[1] = 1.29610

Второй терминал:

2012.01.20 10:30:00     e-PSI@Monitor_v1.0 EURUSD,H1: 14227: Time[07:30:00] = 10:30:00 | Close[1] = 1.29680 | Open[0] = 1.29680 | Open[1] = 1.29660 | High[1] = 1.29690 | Low[1] = 1.29660
2012.01.20 10:30:00     e-PSI@Monitor_v1.0 EURUSD,H1: 79319: Time[07:30:00] = 08:30:02 | Close[1] = 1.29670 | Open[0] = 1.29670 | Open[1] = 1.29650 | High[1] = 1.29690 | Low[1] = 1.29650
2012.01.20 10:29:07     e-PSI@Monitor_v1.0 EURUSD,H1: 14227: Time[07:29:07] = 10:29:07 | Close[1] = 1.29650 | Open[0] = 1.29660 | Open[1] = 1.29670 | High[1] = 1.29670 | Low[1] = 1.29650
2012.01.20 10:29:07     e-PSI@Monitor_v1.0 EURUSD,H1: 79319: Time[07:29:07] = 08:29:09 | Close[1] = 1.29650 | Open[0] = 1.29650 | Open[1] = 1.29670 | High[1] = 1.29670 | Low[1] = 1.29650
2012.01.20 10:28:09     e-PSI@Monitor_v1.0 EURUSD,H1: 14227: Time[07:28:09] = 10:28:09 | Close[1] = 1.29680 | Open[0] = 1.29670 | Open[1] = 1.29640 | High[1] = 1.29680 | Low[1] = 1.29630
2012.01.20 10:28:09     e-PSI@Monitor_v1.0 EURUSD,H1: 79319: Time[07:28:09] = 08:28:10 | Close[1] = 1.29670 | Open[0] = 1.29670 | Open[1] = 1.29630 | High[1] = 1.29680 | Low[1] = 1.29630
2012.01.20 10:27:16     e-PSI@Monitor_v1.0 EURUSD,H1: 14227: Time[07:27:16] = 10:27:16 | Close[1] = 1.29630 | Open[0] = 1.29640 | Open[1] = 1.29630 | High[1] = 1.29650 | Low[1] = 1.29630
2012.01.20 10:27:16     e-PSI@Monitor_v1.0 EURUSD,H1: 79319: Time[07:27:16] = 08:27:18 | Close[1] = 1.29630 | Open[0] = 1.29630 | Open[1] = 1.29620 | High[1] = 1.29640 | Low[1] = 1.29620
2012.01.20 10:26:03     e-PSI@Monitor_v1.0 EURUSD,H1: 14227: Time[07:26:03] = 10:26:03 | Close[1] = 1.29620 | Open[0] = 1.29630 | Open[1] = 1.29650 | High[1] = 1.29660 | Low[1] = 1.29610
2012.01.20 10:26:03     e-PSI@Monitor_v1.0 EURUSD,H1: 79319: Time[07:26:03] = 08:26:04 | Close[1] = 1.29620 | Open[0] = 1.29620 | Open[1] = 1.29650 | High[1] = 1.29660 | Low[1] = 1.29610
2012.01.20 10:25:00     e-PSI@Monitor_v1.0 EURUSD,H1: 14227: Time[07:25:00] = 10:25:00 | Close[1] = 1.29640 | Open[0] = 1.29650 | Open[1] = 1.29660 | High[1] = 1.29660 | Low[1] = 1.29640
2012.01.20 10:25:00     e-PSI@Monitor_v1.0 EURUSD,H1: 79319: Time[07:25:00] = 08:25:02 | Close[1] = 1.29640 | Open[0] = 1.29650 | Open[1] = 1.29670 | High[1] = 1.29670 | Low[1] = 1.29640
2012.01.20 10:24:04     e-PSI@Monitor_v1.0 EURUSD,H1: 14227: Time[07:24:04] = 10:24:04 | Close[1] = 1.29670 | Open[0] = 1.29660 | Open[1] = 1.29640 | High[1] = 1.29690 | Low[1] = 1.29640
2012.01.20 10:24:04     e-PSI@Monitor_v1.0 EURUSD,H1: 79319: Time[07:24:04] = 08:24:05 | Close[1] = 1.29670 | Open[0] = 1.29670 | Open[1] = 1.29640 | High[1] = 1.29690 | Low[1] = 1.29640
2012.01.20 10:23:13     e-PSI@Monitor_v1.0 EURUSD,H1: 14227: Time[07:23:13] = 10:23:13 | Close[1] = 1.29630 | Open[0] = 1.29640 | Open[1] = 1.29600 | High[1] = 1.29640 | Low[1] = 1.29600
2012.01.20 10:23:13     e-PSI@Monitor_v1.0 EURUSD,H1: 79319: Time[07:23:13] = 08:23:14 | Close[1] = 1.29640 | Open[0] = 1.29640 | Open[1] = 1.29600 | High[1] = 1.29650 | Low[1] = 1.29600
2012.01.20 10:22:00     e-PSI@Monitor_v1.0 EURUSD,H1: 14227: Time[07:22:00] = 10:22:01 | Close[1] = 1.29610 | Open[0] = 1.29600 | Open[1] = 1.29600 | High[1] = 1.29620 | Low[1] = 1.29600
2012.01.20 10:22:00     e-PSI@Monitor_v1.0 EURUSD,H1: 79319: Time[07:22:00] = 08:22:02 | Close[1] = 1.29600 | Open[0] = 1.29600 | Open[1] = 1.29610 | High[1] = 1.29620 | Low[1] = 1.29590
2012.01.20 10:21:16     e-PSI@Monitor_v1.0 EURUSD,H1: 14227: Time[07:21:16] = 10:21:16 | Close[1] = 1.29610 | Open[0] = 1.29600 | Open[1] = 1.29610 | High[1] = 1.29620 | Low[1] = 1.29600
2012.01.20 10:21:16     e-PSI@Monitor_v1.0 EURUSD,H1: 79319: Time[07:21:16] = 08:21:17 | Close[1] = 1.29610 | Open[0] = 1.29610 | Open[1] = 1.29620 | High[1] = 1.29620 | Low[1] = 1.29600
2012.01.20 10:20:01     e-PSI@Monitor_v1.0 EURUSD,H1: 14227: Time[07:20:01] = 10:20:01 | Close[1] = 1.29620 | Open[0] = 1.29610 | Open[1] = 1.29640 | High[1] = 1.29640 | Low[1] = 1.29610
2012.01.20 10:20:01     e-PSI@Monitor_v1.0 EURUSD,H1: 79319: Time[07:20:01] = 08:20:02 | Close[1] = 1.29620 | Open[0] = 1.29620 | Open[1] = 1.29630 | High[1] = 1.29640 | Low[1] = 1.29610
Небольшие пояснения. Принт производится на момент появления нового M1 бара в "локальном" терминале. Сначала в скобках идёт время GMT, затем текущее время терминала (TimeCurrent()), а затем зафиксированные за этот промежуток времени (м\у открытиями баров) цены.

Смотрю, что терминалу +- 20 секунд закрыть бар - "Не вопрос!".

Очень интересный инструмент для исследований!

Ещё раз автору СПАСИБО!!!

 
Подскажите пожалуйста как его запускать? Закинул в 2 терминалах на одну и ту же пару. Ничего не происходит. Ошибок в сообщениях нет
 

А кто-нибудь подскажет!? Во избежания повторной регистрации одного и того же терминала будет ли корректно записать так:

             if (hmem > 0) // если открыли
             {
                  Print ("open OK h = ", hmem);
                  int r = MemRead (hmem, head, 0, HEAD, err);
                  bool lb_double = false;
                  //---- Исключаем повторную регистрацию терминала
                  for (int i = 0; i < head[1] + 1; i++)
                  {
                      //---- Считываем данные с серверов
                      r = MemRead (hmem, data, HEAD + i * SIZE, SIZE, err);
                      if (r < SIZE || err[0] != 0) continue;
                      if (AccountNumber() == data[1])
                      {
                          lb_double = true;
                          Print ("Terminal is registered, continue...");
                          adr = i;
                          head[0]++;
                          Print ("read head uses = ", head[0], "  adr = ", adr, " | r = ", r, "  err = ", err[0]);
                          break;
                      }
                  }
                  //---- Если регистрируемся впервые
                  if (!lb_double)
                  {
                      Print ("read head uses = ", head[0], "  adr = ", head[1], " | r = ", r, "  err = ", err[0]);
                      head[0]++; head[1]++;
                      adr = head[1]; // число использования файла и адрес текущего терминала в файле
                      hmem = MemGrows (hmem, file, HEAD + (adr + 1) * SIZE, err);
                      Print ("grows to ", (HEAD + (adr + 1) * SIZE), " | h = ", hmem + "  err = ", err[0]);
                  }
                  int w = MemWrite (hmem, head, 0, HEAD, err);
                  Print ("write head w = ", w, "  err = ", err[0]);
             }

Меня в первую очередь интересует получить правильный адрес (adr) в файле памяти - тот, который и был.

 

добавил на 20 окон, терминал грузит проц на 50%.

если добавить ещё один терминал(а смысл советника именно в этом), то загрузка уже под 100%.

при этом оперативы жрёт очень мало.

как бы изменить приоритеты?) проц у меня слабенький, а озу много.

а вообще спасибо. интересная штуковина.

 

Все забываю сказать...

Спасибо, Алекс, за качественный код!

ps: в ссылке на MT5 нужно убрать "draft/".

 
Код советника глючноватый. Понятно, что пример. Автор нагородил какой-то огород в логике где регистрируются и дерегистрируются подключенные терминалы, там где количество клиентов и адреса записей клиентов (которые на самом деле индексы). Автор запутался и слегка накосячил. Если использовать "аз-из" не нужно отключать и подключать терминалы, а только подключить все и всё. Если разобраться и починить - надо добавить поле "активный" поставщик и слегка переписать кусок с деактивацией эксперта или сделать реаллокацию индексов для каждого клиента, что наверное более трудоемко и неоправдано в примере. Ну и динамическая ре-аллокация массивов на каждом тике ни к чему. Автор поймет.
Причина обращения: