Особенности языка mql5, тонкости и приёмы работы - страница 332

 
Sergey Gridnev #:
А символы ':', ';', '<', '=', '>', '?' и те, у кого коды в диапазоне 70..7F, нормально парсятся? Или они тоже цифры?
Только цифры.

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Bibliotecas: JSON Library for LLMs

fxsaber, 2026.02.19 23:12

bool IsDigit( const uchar Char )
{
//  return((Char >= '0') && (Char <= '9'));

//  return((Char ^ (UCHAR_MAX - '1')) >= (UCHAR_MAX - 9));
//  return((Char ^ '1') <= 9);

//  return((Char ^ (UCHAR_MAX - '0')) >= (UCHAR_MAX - 9));
  return((Char ^ '0') <= 9);
}
 

В приемы работы

сейчас ssd m2 продаются на 16gb intel optane(оригинал), новые 150 запись без снижения, и чтение около 900, ресурс почти вечный для 16gb - 180tb

если кому хватает 16gb для тестера и слот есть (или в PCI через переходник) хороший решение

цена чуть меньше 400р! искать на озоне M10 16gb


кто-то под кеш системы берет, ресурс почти вечный

 

Нужно создать копию реального символа в кастомный. Для этого нужно перенести в кастомный всю баровую историю.


И нужно знать, возможно это сделать или нет. Для этого написал такую функцию.

datetime GetMonth( const datetime time )
{
  MqlDateTime sTime;

  TimeToStruct(time, sTime);

  const MqlDateTime sTime2 = {sTime.year, sTime.mon, 1};

  return(StructToTime(sTime2));
}

// Возвращает true, если есть доступ к певому бару всей имеющейся истории символа:
// Реальный символ: Bases\ServerName\history\SymbolName\*.hcc
// Каcтомный символ: Bases\Custom\history\SymbolName\*.hcc
bool IsFullAccess( const string Symb = NULL )
{    
  const datetime FirstDateM1 = (datetime)SeriesInfoInteger(Symb, PERIOD_M1, SERIES_FIRSTDATE);
  const datetime MonthM1 = GetMonth(FirstDateM1);
  
  datetime FirstDateMN1 = (datetime)SeriesInfoInteger(Symb, PERIOD_MN1, SERIES_FIRSTDATE);

  MqlRates RatesMN1[1] = {{FirstDateMN1}};
  MqlRates RatesM1[1];
  
  return(((FirstDateMN1 <= MonthM1) || (CopyRates(Symb, PERIOD_MN1, MonthM1, 1, RatesMN1) > 0)) &&
         (RatesMN1[0].time == MonthM1) &&
         (RatesMN1[0].open || CopyRates(Symb, PERIOD_MN1, MonthM1, 1, RatesMN1) > 0) &&
         (CopyRates(Symb, PERIOD_M1, FirstDateM1, 1, RatesM1) > 0) &&
         (RatesMN1[0].open == RatesM1[0].open));
}

Есть вариант более изящный, чтобы выяснить, доступны все бары или нет?

 
Тема: Feature Request: Внедрение обработчика события OnChartSwitch для мониторинга всего терминала

Описание:
В настоящее время в MQL5 советник строго привязан к графику, на котором он работает. Не существует собственного, управляемого событиями способа обнаружить, когда пользователь переключает фокус (кликает) между разными вкладками графиков в терминале, если только советник не присутствует на каждом графике.

Хотя высокочастотный OnTimer (например, 50 мс) может опрашивать CHART_BRING_TO_TOP, это неэффективно и отнимает много ресурсов при управлении большим количеством графиков.

Предлагаемое решение:
Ввести новый обработчик события: void OnChartSwitch(long focusedChartID, string symbol, ENUM_TIMEFRAME period).

Это событие должно:

Срабатывать каждый раз, когда пользователь щелкает на другой вкладке графика в терминале.

Быть доступным для любого советника, запущенного в терминале, независимо от того, к какому графику советник физически привязан (или, по крайней мере, предоставлять глобальное свойство графика, доступное через OnChartEvent).

Пример использования:

Многосимвольные приборные панели: Позволяет одному советнику-контроллеру синхронизировать внешние инструменты (через DLL/Named Pipes) или панели GUI мгновенно, когда трейдер перемещается по своему Market Watch или открытым графикам.

Динамический анализ: Синхронизация внешних систем управления ордерами (OMS) с текущим символом без необходимости прикреплять советника к десяткам открытых окон.

Преимущества:
Значительное снижение нагрузки на процессор по сравнению с опросом на основе таймера и гораздо более отзывчивая архитектура "Push" для современных торговых установок.
 
Stefano Cerbioni #:
Тема: Feature Request: Внедрение обработчика события OnChartSwitch для мониторинга всего терминала

Описание:
В настоящее время в MQL5 советник строго привязан к графику, на котором он работает. Не существует собственного, управляемого событиями способа обнаружить, когда пользователь переключает фокус (кликает) между разными вкладками графиков в терминале, если только советник не присутствует на каждом графике.

Хотя высокочастотный OnTimer (например, 50 мс) может опрашивать CHART_BRING_TO_TOP, это неэффективно и отнимает много ресурсов при управлении большим количеством графиков.

Предлагаемое решение:
Ввести новый обработчик события: void OnChartSwitch(long focusedChartID, string symbol, ENUM_TIMEFRAME period).

Это событие должно:

Срабатывать каждый раз, когда пользователь щелкает на другой вкладке графика в терминале.

Быть доступным для любого советника, запущенного в терминале, независимо от того, к какому графику советник физически привязан (или, по крайней мере, предоставлять глобальное свойство графика, доступное через OnChartEvent).

Пример использования:

Многосимвольные приборные панели: Позволяет одному советнику-контроллеру синхронизировать внешние инструменты (через DLL/Named Pipes) или панели GUI мгновенно, когда трейдер перемещается по своему Market Watch или открытым графикам.

Динамический анализ: Синхронизация внешних систем управления ордерами (OMS) с текущим символом без необходимости прикреплять советника к десяткам открытых окон.

Преимущества:
Значительное снижение нагрузки на процессор по сравнению с опросом на основе таймера и гораздо более отзывчивая архитектура "Push" для современных торговых установок.

1 - Вы можете после установки советника сохранить шаблон и затем применить шаблон к другим графикам

2 - Вы можете создать сервис для мониторинга активности окон

 
Vladimir Pastushak #:

1 - Вы можете сохранить шаблон после установки советника и затем применить его к другим графикам

2 - Вы можете создать службу для мониторинга активности окна

Владимир, спасибо, что нашли время ответить.

Однако, мне кажется, есть недопонимание основного требования. Запрос функции не о том, как развернуть советник на нескольких графиках, не о запуске фонового кода - он о том, чтобы **получать событие в момент, когда пользователь переключает фокус между вкладками графиков**, без необходимости запускать советник на каждом графике и без использования неэффективного опроса.

Позвольте мне объяснить, почему предложенные обходные пути не решают реальную потребность:

1. **Шаблоны** - Сохранение шаблона с советником и применение его к другим графикам просто устанавливает советник на каждый график. Это **не** дает единому, центральному советнику никаких знаний о том, на каком графике пользователь только что щелкнул. Потребуется способ передачи информации о смене фокуса между экземплярами (например, через глобальные переменные или файлы), что добавляет сложности и по-прежнему не делает обнаружение событийно-управляемым.

2. **Сервис** - Сервис работает независимо, но он не может напрямую знать, какой график находится на переднем плане, без постоянного опроса всех открытых графиков с помощью `ChartGetInteger(..., CHART_BRING_TO_TOP)`. Это точно такие же накладные расходы, как и опрос от эксперта. Более того, сервису придется передавать эту информацию обратно в советник (например, через глобальные переменные), что вносит дополнительные задержки и сложности. Это тяжелое, обходное решение, которое все еще полагается на опрос.

Да, я знаю, что можно реализовать цикл опроса с помощью `OnTimer` и `CHART_BRING_TO_TOP`. Но это именно то, чего хочет избежать запрос функции: **опрос требует много ресурсов**, особенно если трейдер держит открытыми много графиков, и он гораздо менее отзывчив, чем настоящее событие на основе push. Запрос на встроенное событие `OnChartSwitch` даст нам эффективное уведомление в реальном времени прямо из терминала, без лишних затрат процессора.

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

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