Торговый эксперт Razvorot

Безындикаторный автоматический торговый эксперт для терминала MetraTrader 4

ATS Revolution

ATS Revolution - мультивалютная торговая система.

Тестер стратегий

Тестер поможет протестировать вашу ручную стратегию или проверить чужую.

Логин: Пароль:
Забыли пароль?Зарегистрироваться
Блоги Рейтинг брокеров Журнал Магазин Прогнозы Новости Каталог
 
Блоги
Добавить запись

Почему усреднение может изменить поведение торгового робота?

Торговый робот открыл сделку, но рынок пошёл в противоположную сторону. Вместо закрытия позиции алгоритм открывает дополнительный ордер по другой цене. Такой подход называется усреднением. Он меняет среднюю цену входа и одновременно влияет на объём...

Обзоры и аналитика рынка, 8 часов назад

ВладимирКоличество подписчиков745

Как рыночные условия влияют на работу торговых роботов?

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

Обзоры и аналитика рынка, 1 день назад

ВладимирКоличество подписчиков745

Торговый сигнал по WTI за 16.10.2026

Уважаемые коллеги, в VIP комьюнити ForexTimes был опубликован новый ТОРГОВЫЙ СИГНАЛ по WTI. RR 1:4.5 На каком уровне SL? На каком уровне TP? Ответы на эти и другие вопросы, вы найдете в VIP комьюнити ForexTimes!!! Торговые сигналы в VIP комьюнити...

Прогнозы и торговые сигналы, 1 день назад

PRO ForexTimesКоличество подписчиков1427

ForexTimes и комплексный анализ рынка

Только VIP комьюнити ForexTimes публикует стратегические целевые уровни ... Стратегические целевые уровни уровни, к которым цена торгового инструмента придёт с очень высокой вероятностью. ... и уровни/диапазоны поддержки/сопротивления, которые...

Прогнозы и торговые сигналы, 2 дня назад

PRO ForexTimesКоличество подписчиков1427

Оптимизация арендного портфеля CMWP: управление расходами и условиями размещения торговой сети

Управление арендными отношениями в торговой сети по своей структуре близко к управлению инвестиционным портфелем. Каждый объект это отдельная позиция с собственной доходностью, сроком, набором обязательств и уровнем риска. Пока объектов немного,...

Прочее, 2 дня назад

PRO МЕДИА ХИМИЯКоличество подписчиков4108

Пустой заголовок

Почему торговый робот показывает прибыль в тестере, но может вести себя иначе на реальном счёте? Вы запускаете тестирование торгового робота в MetaTrader, видите растущий баланс и привлекательную статистику. Результат выглядит убедительно:...

Обзоры и аналитика рынка, 2 дня назад

ВладимирКоличество подписчиков745

«КапДорСтрой-НН» наращивает контрактную базу и выручку

План дорожной деятельности в России на 2026-2031 годы строительство и реконструкция более 2 тысяч км федеральных и региональных дорог: свыше 330 объектов. С учётом стабильного спроса КапДорСтрой-НН сформировал существенную контрактную базу на...

Прочее, 2 дня назад

Юнисервис КапиталКоличество подписчиков3147

Торговая идея по AUDNZD за 16.10.2026

Коллеги, торговая идея по AUDNZD - снижение стоимости торгового инструмента в направлении технического уровня поддержки (1.1170). Не пропустите торговые сигналы. Присоединяйтесь к VIP ForexTimes!!! VIP комьюнити ForexTimes это: Торговые сигналы....

Прогнозы и торговые сигналы, 2 дня назад

PRO ForexTimesКоличество подписчиков1427

В 1 полугодии 2026 года ООО «Первый ювелирный ломбард» существенно нарастило финансовые результаты

По итогам 1 полугодия 2026 года ООО Первый ювелирный ломбард сохранило устойчивую динамику развития. Компания нарастила объём выдачи займов на 38%, увеличила сеть отделений до 25 точек и существенно повысила финансовые результаты, сохранив при этом...

Прочее, 2 дня назад

Юнисервис КапиталКоличество подписчиков3147

«Сибирское стекло» укрепляет партнерские связи с Узбекистаном

Генеральный директор ООО Сибирское стекло Антон Мор в составе официальной делегации Новосибирской области принял участие в Днях Сибири в рамках III Совета регионов России и Узбекистана. Развитие механизмов поддержки реального сектора экономики одно...

Прочее, 2 дня назад

Юнисервис КапиталКоличество подписчиков3147

 
Рубрикатор
Рейтинг блогеров
Популярные записи
F.A.Q.

Обзоры и аналитика рынка

Владимир → Обзоры и аналитика рынка
745
Почему усреднение может изменить поведение торгового робота?

Торговый робот открыл сделку, но рынок пошёл в противоположную сторону. Вместо закрытия позиции алгоритм открывает дополнительный ордер по другой цене. Такой подход называется усреднением. Он меняет среднюю цену входа и одновременно влияет на объём позиции, логику управления сделками и условия закрытия.

Как работает усреднение?

Предположим, советник открыл покупку по цене 1,1000, а затем цена снизилась до 1,0950. Алгоритм открывает вторую покупку такого же объёма. Средняя цена входа двух позиций теперь составляет 1,0975 без учёта торговых издержек.

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

Что меняется при добавлении ордеров?

Средняя цена входа. Каждый новый ордер влияет на цену, по которой оценивается совокупная позиция. Если объёмы сделок различаются, среднюю цену необходимо рассчитывать с учётом объёма каждого ордера.

Общий объём позиции. Дополнительные сделки увеличивают суммарный объём. Поэтому одинаковое движение цены может оказывать более сильное влияние на финансовый результат всей позиции.

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

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

Почему важно тестировать всю торговую серию?

При разработке советника недостаточно проверить только первоначальный вход. Необходимо изучить, как алгоритм ведёт себя после открытия нескольких ордеров, как меняется суммарный объём и при каких условиях закрывается вся серия.

В тестере стратегий MetaTrader стоит проверять разные сценарии движения цены, включая продолжительное движение против открытых позиций. Важно анализировать не только итоговую прибыль, но и количество накопленных ордеров, изменение объёма и логику закрытия.

Больше материалов о разработке торговых роботов и алгоритмической торговле можно найти на Trading-Go.

Вывод

Усреднение — это не просто открытие дополнительной сделки. Оно меняет взаимосвязь между ордерами и превращает управление отдельной позицией в задачу управления всей торговой серией.

Обсудить торговые алгоритмы и работу советников можно также в Telegram-канале Trading-Go.

Как вы считаете, что важнее в стратегии усреднения: правильно выбрать расстояние между ордерами или грамотно управлять всей серией позиций?

Опубликовано 8 часов назад
Перейти к комментариям
Владимир → Обзоры и аналитика рынка
745
Как рыночные условия влияют на работу торговых роботов?

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

Трендовый рынок и автоматическая торговля

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

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

Особенности бокового рынка

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

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

Пример реализации: VR Proton

VR Proton для MetaTrader 4 и MetaTrader 5 включает механизмы управления торговой серией, добавления позиций по направлению движения, перевода сделок в безубыток и трейлинг-стопа.

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

Для дальнейшего изучения автоматической торговли и разработки советников можно воспользоваться образовательными материалами на Trading-Go. Дополнительные публикации и материалы о трейдинге также доступны в русскоязычном Telegram-канале Trading-Go.

Понимание взаимосвязи между рыночными условиями и логикой управления позициями — важная часть изучения алгоритмической торговли.

#AlgorithmicTrading #TradingRobots #MetaTrader5 #MQL5 #ForexTrading #VRProton

Опубликовано 1 день назад
Перейти к комментариям
Владимир → Обзоры и аналитика рынка
745
Пустой заголовок

Почему торговый робот показывает прибыль в тестере, но может вести себя иначе на реальном счёте?

Вы запускаете тестирование торгового робота в MetaTrader, видите растущий баланс и привлекательную статистику. Результат выглядит убедительно: стратегия приносит прибыль, просадка кажется приемлемой, а сделки закрываются в плюс.

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

Почему так происходит? И означает ли это, что торговый робот работает неправильно?

Разберём основные причины, которые важно учитывать при оценке автоматических торговых систем.

Исторический тест — это модель, а не будущее

Тестер стратегий MetaTrader позволяет проверить алгоритм на исторических котировках. Это важный инструмент: он помогает оценить поведение стратегии, изучить статистику сделок и сравнить настройки.

Однако тестирование отвечает на вопрос: как алгоритм работал бы в заданных условиях на выбранных исторических данных? Оно не гарантирует, что в будущем результат повторится.

Рынок меняется. Периоды устойчивого тренда сменяются боковым движением, волатильность увеличивается и снижается, а торговые закономерности могут проявляться по-разному.

Стратегия, которая хорошо работала на одном участке истории, может столкнуться с трудностями на другом. Поэтому оценивать робота по единственному удачному тесту недостаточно.

1. Спред, проскальзывание и исполнение ордеров

Одна из причин расхождения результатов — различия между условиями тестирования и реальной торговлей.

Спред — разница между ценами покупки и продажи. Он влияет на результат каждой сделки, а при частой торговле его влияние может быть особенно заметным.

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

Кроме того, значение имеют комиссия брокера, скорость исполнения и ограничения торгового счёта.

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

Поэтому при тестировании важно учитывать реалистичные торговые условия, а не только движение цены на графике.

2. Переоптимизация параметров

Ещё одна распространённая проблема — чрезмерная подгонка настроек под исторические данные.

Представим, что трейдер многократно меняет параметры советника, пока не получает почти идеальную кривую баланса. На выбранном участке истории робот демонстрирует высокую прибыль и небольшую просадку.

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

Такое явление называют переоптимизацией.

Чтобы снизить этот риск, полезно разделять исторические данные на две части: одну использовать для подбора параметров, другую — для независимой проверки. Также стоит сравнивать результаты на разных периодах и оценивать, насколько сильно меняется поведение стратегии при небольшом изменении настроек.

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

3. Итоговая прибыль скрывает важные детали

Допустим, два робота заработали за период тестирования по 1 000 долларов. Можно ли считать их одинаково эффективными?

Не обязательно.

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

Поэтому при анализе торговой системы важно изучать не только прибыль, но и другие показатели:

  • Максимальная просадка — насколько глубоко снижался капитал относительно предыдущего максимума.
  • Эквити — изменение стоимости счёта с учётом плавающего результата открытых позиций.
  • Количество одновременно открытых сделок — помогает понять, как распределяется нагрузка на счёт.
  • Продолжительность убыточных периодов — показывает, как долго стратегия может не достигать новых максимумов.
  • Распределение результатов сделок — помогает понять, за счёт каких сделок формируется общая прибыль.

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

Одинаковая прибыль не означает одинакового поведения торговых систем.

4. Логика управления позициями имеет значение

При оценке робота важно понимать не только условия входа в рынок, но и то, что происходит после открытия сделки.

Одни советники используют отдельные сигналы для входа и закрывают позицию по заранее заданным условиям. Другие сопровождают открытые сделки, перемещают стоп-лосс или управляют сериями позиций.

Например, VR Proton — торговый робот, в логике которого используются управление сериями позиций и трейлинг-стоп. Это пример подхода, при котором алгоритм учитывает не только первоначальный сигнал, но и дальнейшее развитие открытых сделок.

Трейлинг-стоп позволяет перемещать уровень стоп-лосса вслед за благоприятным движением цены по заданным правилам. При этом результат зависит от рыночных условий и исполнения ордеров.

Другой подход представлен в VR Locker, где используется логика работы с торговыми замками. Такие решения требуют отдельного изучения правил управления открытыми позициями и условий завершения торговых операций.

Также можно рассмотреть VR Smart Grid как пример алгоритмической торговли с использованием сеточной логики.

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

Торгового робота стоит оценивать как целостную систему: от получения сигнала до окончательного закрытия позиции.

5. Зачем нужен демосчёт?

После исторического тестирования полезно проверить советника в текущих рыночных условиях на демосчёте.

Это позволяет наблюдать за реальной последовательностью действий алгоритма, проверить открытие и закрытие позиций, оценить работу торговых функций и выявить ситуации, которые не были очевидны в тестере.

При этом демосчёт не является окончательным доказательством эффективности. Условия исполнения и некоторые особенности реальной торговли могут отличаться. Кроме того, несколько удачных сделок не дают достаточной информации об устойчивости стратегии.

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

Как выстроить проверку торгового робота?

Последовательность проверки может выглядеть так:

  1. Историческое тестирование. Оценить прибыль, просадку, эквити и статистику сделок.
  2. Проверка на разных периодах. Изучить поведение стратегии в тренде, боковом движении и при изменении волатильности.
  3. Анализ настроек. Проверить, насколько чувствителен результат к изменению параметров.
  4. Учёт торговых издержек. Добавить реа
Опубликовано 2 дня назад
Перейти к комментариям
Владимир → Обзоры и аналитика рынка
745
Почему цена меняется каждую секунду, если ничего заметного не происходит?

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

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

Практический вывод: воспринимайте цену как вероятностный процесс, а не как набор предсказуемых сигналов. Учитывайте ликвидность и время торговли, привязывайте стоп и объём к текущей волатильности и проверяйте логику на реальных котировках с учётом спреда. Больше разборов по трейдингу и автоматизации — на https://trading-go.ru/

Идея иллюстрации: биржевой стакан с уровнями bid и ask и расширяющимся спредом, без текста.

Профиль автора: https://www.mql5.com/ru/users/voldemar

Опубликовано 3 дня назад
Перейти к комментариям
Владимир → Обзоры и аналитика рынка
745
Локальные и глобальные переменные в советнике

Полный разбор области видимости переменных в MQL5 для начинающего разработчикаКогда торговый советник растёт, всё чаще возникает один и тот же вопрос: где объявить переменную, чтобы она вела себя предсказуемо? Ответ зависит от области видимости (scope) — то есть от того, из какого места программы переменную можно видеть и как долго она существует. Понимание этого механизма отделяет аккуратный, надёжный робот от кода, который «иногда работает, а иногда нет». В этой статье мы подробно разберём локальные и глобальные переменные программы, особенность функции OnTick, отличие от глобальных переменных терминала и типичные ошибки, которые встречаются у новичков.

Что такое область видимости переменнойОбласть видимости определяет, в каких местах кода доступна переменная. В MQL5, как и в языке C, действует правило блочной видимости: переменная видна внутри того блока, где она объявлена, и во всех вложенных блоках. Блок — это код, заключённый в фигурные скобки: тело функции, ветка условия, тело цикла.

Из этого правила следуют два следствия. Первое: переменная, объявленная внутри функции, недоступна за её пределами — компилятор просто не знает о ней в другом месте. Второе: две переменные с одинаковым именем в разных блоках никак не связаны между собой. Область видимости — это не про тип данных и не про значение, а именно про то, где имя переменной «действует».

Глобальные переменные программыГлобальные переменные программы объявляются вне функций — обычно в самом начале файла советника. Их видит любая функция, а существуют они всё время, пока советник загружен в память терминала. Именно поэтому здесь удобно хранить настройки, счётчики и состояние робота.

// =============================================================================================== //// = Глобальные переменные программы: доступны всем функциям советника = //// =============================================================================================== //int g_openedTrades = 0; // счётчик открытых роботом сделокdouble g_lastTradePrice = 0.0; // цена последней сделкиbool g_enteredThisBar = false; // флаг входа в текущем баре

// === Функция увеличивает счётчик сделок ===void RegisterTrade(double price) { g_openedTrades++; g_lastTradePrice = price; Print("Сделок открыто: ", g_openedTrades, ", цена: ", g_lastTradePrice); }

Здесь переменные g_openedTrades, g_lastTradePrice и g_enteredThisBar объявлены вне функций, поэтому любые изменения, сделанные внутри RegisterTrade, сохраняются и видны другим функциям. Префикс g_ — популярное соглашение об именовании, которое сразу подсказывает, что переменная глобальная.

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

// =============================================================================================== //// = Локальные переменные живут только во время выполнения функции = //// =============================================================================================== //double CalcRiskMoney(double percent) { double balance = AccountInfoDouble(ACCOUNT_BALANCE); // локальная double riskMoney = balance * percent / 100.0; // локальная

// === Возвращаем результат, локальные переменные прекращают существование === return riskMoney; }

Переменные balance и riskMoney существуют только внутри CalcRiskMoney. Это хорошо: они не засоряют пространство имён и не могут быть случайно изменены из другого места программы. Обратная сторона — их значение нигде не сохраняется.

Почему в OnTick нельзя обойтись локальными переменнымиГлавная особенность советника — в том, как работает функция OnTick. Она вызывается терминалом заново на каждом новом тике. Каждый такой вызов — отдельный проход: вошли в функцию, выполнили код, вышли. Значит, обычная локальная переменная внутри OnTick при каждом вызове создаётся заново.

Посмотрите на типичную ошибку новичка:

// === НЕПРАВИЛЬНО: счётчик всегда покажет 1 ===void OnTick() { int counter = 0; // создаётся заново на каждом тике counter++; Print(counter); // всегда 1 }

Значение counter сбрасывается на каждом тике, поэтому счётчик бесполезен. Счётчики открытых сделок, флаг «уже входили в этом баре», время последней сделки — всё это относится к состоянию робота, которое должно пережить вызов функции. Хранить такое состояние в обычной локальной переменной нельзя: на следующем тике оно обнулится.

Как сохранить состояние: static-переменныеПервое решение — ключевое слово static. Статическая переменная объявляется внутри функции, но, в отличие от обычной локальной, создаётся один раз и сохраняет значение между вызовами. При этом снаружи функции её по-прежнему не видно.

// =============================================================================================== //// = static-переменная помнит значение между вызовами OnTick = //// =============================================================================================== //bool IsNewBar() { static datetime lastBar = 0; datetime currentBar = (datetime)SeriesInfoInteger(_Symbol, _Period, SERIES_LASTBAR_DATE);

// === Первый вызов: запоминаем бар === if (lastBar == 0) { lastBar = currentBar; return false; }

// === Бар изменился — значит, новый === if (currentBar != lastBar) { lastBar = currentBar; return true; }

return false; }

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

Поля класса как альтернативаВторое решение — хранить состояние в полях класса. Когда советник оформлен как класс, его поля существуют вместе с объектом и доступны всем методам. Это более структурированный подход, чем разрозненные глобальные переменные.

// =============================================================================================== //// = Класс хранит состояние робота в своих полях = //// =============================================================================================== //class CTradeState {private: int m_trades; // число открытых сделок datetime m_lastTrade; // время последней сделки bool m_enteredBar; // входили ли в текущем баре

public: CTradeState() { m_trades = 0; m_lastTrade = 0; m_enteredBar = false; }

// === Метод обновляет состояние при открытии сделки === void OnTradeOpened() { m_trades++; m_lastTrade = TimeCurrent(); m_enteredBar = true; } };

Поля класса m_trades, m_lastTrade и m_enteredBar живут столько, сколько живёт объект класса. Такой код проще читать: видно, какие данные относятся к состоянию робота, а какие — временные.

Глобальные переменные терминала — это другой механизмОтдельно существуют глобальные переменные терминала. Несмотря на похожее название, это совершенно другой инструмент. Они хранятся не в памяти советника, а в самом терминале MetaTrader, доступны разным программам и переживают перезапуск. Для работы с ними есть отдельные функции: GlobalVariableSet, GlobalVariableGet, GlobalVariableCheck, GlobalVariableDel.

// =============================================================================================== //// = Глобальные переменные терминала: хранятся в терминале и переживают перезапуск = //// =============================================================================================== //void SaveState() { GlobalVariableSet("MyEA_Trades", 5); // записать значение }

// === Чтение значения с проверкой существования ===int ReadTrades() { if (GlobalVariableCheck("MyEA_Trades")) return (int)GlobalVariableGet("MyEA_Trades"); return 0; }

// === Удаление переменной терминала ===void ClearState() { GlobalVariableDel("MyEA_Trades"); }

Важно не путать эти два уровня. Глобальная переменная программы (g_openedTrades) существует только пока советник загружен, и её не видит никакая другая программа. Глобальная переменная терминала (MyEA_Trades) живёт в терминале, её видит любой советник и скрипт, и она сохраняется после перезапуска. Первые — для состояния внутри одного робота, вторые — для обмена данными и долговременного хранения.

Инициализация переменныхГлобальные переменные программы инициализируются один раз — в момент загрузки советника, ещё до первого вызова OnTick. Если при объявлении не задать значение, целочисленные переменные получат ноль, вещественные — тоже ноль, а строки останутся пустыми. Но полагаться на это не стоит: начальные значения лучше присваивать явно, чтобы намерение было очевидным.

Чего делать нельзя, так это инициализировать глобальную переменную значением, которое зависит от рыночных данных, прямо в строке объявления. Записать в глобальную переменную текущую цену инструмента при объявлении не получится надёжно: на момент запуска торговые данные могут быть ещё не готовы. Для таких значений служит функция OnInit — она вызывается при инициализации советника, в том числе после смены настроек и таймфрейма.

// =============================================================================================== //// = Инициализация глобального состояния в OnInit, а не при каждом тике = //// =============================================================================================== //datetime g_sessionStart = 0;double g_startPrice = 0.0;

// === OnInit вызывается один раз при загрузке советника ===int OnInit() { g_sessionStart = TimeCurrent(); g_startPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); Print("Старт сессии: ", g_sessionStart, ", цена: ", g_startPrice); return INIT_SUCCEEDED; }

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

Префиксы и правила именованияАккуратные префиксы почти полностью снимают риск перекрытия имён. Договоритесь с собой о простых правилах: глобальные переменные программы начинайте с g_, поля класса — с m_, а параметры функций и локальные переменные оставляйте без префикса. Тогда даже в большом проекте по одному имени видно, где и как долго живёт переменная.

Полезно отражать в имени смысл, а не тип. Переменная g_tradesOpened читается лучше, чем g_count, а m_lastTradeTime понятнее, чем m_time. Компилятор не подскажет, что g_count считает именно сделки, — а вам через полгода это может понадобиться.

И наоборот, никогда не давайте двум сущностям одно имя. Именно так и рождается эффект перекрытия: локальная переменная с именем глобальной молча скрывает её внутри функции, и вы меняете не то, что думали.

Типичные ошибки при работе с переменнымиПерекрытие имён (shadowing)Если локальная переменная названа так же, как глобальная, локальная «затеняет» глобальную внутри своей функции. Это классическая ловушка.

// === ОПАСНО: локальная переменная перекрывает глобальную ===int g_count = 100;

void Shadow() { int g_count = 0; // эта переменная перекрывает глобальную g_count++; // изменяется только локальная копия, глобальная остаётся 100 }

Чтобы избежать путаницы, придерживайтесь префиксов g_ для глобальных и m_ для полей класса, а локальным переменным давайте говорящие имена.

Случайное обнуление состоянияСамая частая ошибка — держать состояние робота в обычной локальной переменной внутри OnTick. Значение сбрасывается на каждом тике, и робот ведёт себя непредсказуемо. Всегда проверяйте: должна ли эта переменная помнить, что было на предыдущем тике? Если да — она обязана быть глобальной, статической или полем класса.

Конфликты при перезапускеЕсли хранить состояние в глобальных переменных программы, при перезапуске советника они сбрасываются. Если робот уже имел открытые позиции, его «внутренняя память» о них пропадёт. В таких случаях состояние лучше восстанавливать по фактическим позициям терминала или хранить в глобальных переменных терминала. При этом помните про конфликты: два экземпляра советника с одинаковыми именами глобальных переменных терминала будут мешать друг другу.

Глобальные переменные там, где нужны поля классаРазрозненные глобальные переменные удобны в маленьком советнике, но плохо масштабируются. Когда их становится десятки, отследить, кто и когда их изменяет, очень трудно. Если состояние логически связано с объектом стратегии, его стоит держать в полях класса, давая осмысленные имена.

Практические примерыСчётчик открытых сделокРоботу часто нужно ограничить число одновременных позиций. Надёжнее не хранить счётчик в памяти, а восстанавливать его из фактического состояния терминала.

// =============================================================================================== //// = Считаем число позиций робота по Magic Number = //// =============================================================================================== //int CountOwnPositions(long magic) { int count = 0;

// === Перебираем позиции терминала === for (int i = 0; i < PositionsTotal(); i++) { if (PositionGetTicket(i) == 0) continue; if (PositionGetInteger(POSITION_MAGIC) == magic) count++; }

return count; }

Такой счётчик не теряет данные при перезапуске, потому что каждый раз берётся из реальных позиций, а не из переменной в памяти.

Флаг «уже входили в этом баре»Часто нужно входить не более одного раза за свечу. Флаг должен сбрасываться при появлении нового бара и сохраняться между тиками, поэтому его держат глобально.

// === Глобальный флаг входа в текущем баре ===bool g_enteredThisBar = false;

void OnTick() { static datetime lastBar = 0; datetime currentBar = (datetime)SeriesInfoInteger(_Symbol, _Period, SERIES_LASTBAR_DATE);

// === Новый бар — сбрасываем флаг === if (currentBar != lastBar) { lastBar = currentBar; g_enteredThisBar = false; }

// === Вход только один раз за бар === if (!g_enteredThisBar) { // === ... здесь логика входа === g_enteredThisBar = true; } }

Время последней сделкиЕщё одно частое состояние — время последней сделки. Оно позволяет выдерживать паузу между входами.

// === Хранение времени последней сделки между тиками ===datetime g_lastTradeTime = 0;

// =============================================================================================== //// = Проверяем, прошёл ли заданный интервал с момента последней сделки = //// =============================================================================================== //bool CanTrade(int minSeconds) { return (TimeCurrent() - g_lastTradeTime >= minSeconds); }

Переменная g_lastTradeTime объявлена глобально, поэтому значение не теряется между тиками. После открытия очередной сделки достаточно присвоить ей TimeCurrent().

Что выбрать: глобальные переменные, поля класса или staticНебольшой советник вполне обходится глобальными переменными программы — это просто и наглядно. Когда логика усложняется, состояние стоит переносить в поля класса: так данные сгруппированы и защищены от случайных изменений. Статические переменные идеальны для небольших локальных «памятей» внутри одной функции, например для времени последнего бара. А для обмена данными между программами и хранения, не зависящего от жизненного цикла советника, используйте глобальные переменные терминала.

ЗаключениеОбласть видимости — это фундамент, на котором держится надёжность советника. Глобальные переменные программы видны всем функциям и живут, пока робот загружен. Локальные существуют только во время выполнения блока. Из-за того, что OnTick вызывается на каждом тике заново, состояние — счётчики, флаги, время — нельзя держать в обычных локальных переменных; для этого подходят глобальные переменные, статические переменные и поля класса. А глобальные переменные терминала — отдельный механизм для межпрограммного обмена и долговременного хранения.

Разберитесь с этими понятиями один раз, и вы перестанете удивляться «магическому» поведению робота: код станет предсказуемым, а ошибки с обнулением состояния исчезнут. Больше учебных материалов — на https://max.ru/channel_mqlmasters, а короткие практические разборы выходят в Телеграме: https://t.me/mqlmasters.

#MQL5 #переменные #программирование #MetaTrader5 #MQLMaster

Опубликовано 4 дня назад
Перейти к комментариям
Подпишитесь на наш канал @fxmag в Telegram
Рейтинг брокеров 2026 ( TOP10 )
Публикующихся на сайте FXMAG.RU
1 Tickmill
tickmill.fxmag.ru
2 FreshForex
freshforex.fxmag.ru
3 Instaforex
instaforexanalytics.fxmag.ru
4 FXOpen
fxopen.fxmag.ru
5 NordFX
roman_butko.fxmag.ru
6 JustForex
justforex.fxmag.ru
7 ForexMart
forexmart.fxmag.ru
8 ФГ "Калита - Финанс"
kalita_finance.fxmag.ru
9 Альпари
alpari.fxmag.ru
10 MTrading
mtrading.fxmag.ru
Форекс-объявления:
Показано форекс-объявлений:
в декабре: 11 033 625;
вчера: 1 038 695 на 260 сайтах;
Разместить объявление от 10 коп. за переход
 
Новости компаний
Добавить новость

Сервис Bitbanker: покупка стейблкоинов (пресс-релиз)

В трейдинге и финансах есть железное правило: если сделка кажется сомнительной не лезь. С P2P-обменом стейблкоинов та же история. Вы ищете выгодный курс, а находите блокировку карты по 115-ФЗ. Банк видит перевод от серого контрагента и привет,...

Опубликовано: 3 месяца назад

МЕДИА ХИМИЯКоличество подписчиков4108

FRTX обзор: лицензия MISA, условия счета, отзывы (пресс-релиз)

В 2026 году вокруг брокера FRTX сформировалась разнородная информационная выдача: от положительных обзоров до материалов с жёсткой критикой. Официальный сайт frtx.global публикует данные о компании FRTX Ltd (регистрационный номер HV01125482,...

Опубликовано: 4 месяца назад

МЕДИА ХИМИЯКоличество подписчиков4108

Лучший форекс-брокер июнь 2026: как правильно выбрать брокера и на что смотреть (пресс-релиз)

В финансах и трейдинге нет универсального ответа на вопрос что лучше . Лучший актив для одного инвестора катастрофа для другого. То же самое с брокерами. В 2026 году рынок переполнен предложениями, и фраза лучший форекс-брокер потеряла всякий...

Опубликовано: 5 месяцев назад

МЕДИА ХИМИЯКоличество подписчиков4108

Для NPBFX 2025 год рекордов и проверок на прочность: чем запомнился уходящий год

Для трейдеров 2025 год стал одним из самых сложных за последние годы, и форекс-брокеру NPBFX пришлось работать в условиях постоянно растущего рыночного давления. Повышенная волатильность, перегретые ожидания, череда громких банкротств в...

Опубликовано: 9 месяцев назад

МЕДИА ХИМИЯКоличество подписчиков4108

Своя траектория роста: как развивается Freedom Finance в 2025 году (мнение)

Финансовый сектор редко прощает ошибки, но иногда умеет награждать тех, кто не боится перестраивать себя под новые реалии. История Freedom Finance хороший пример того, как локальная брокерская компания за относительно короткий срок может стать...

Опубликовано: 10 месяцев назад

МЕДИА ХИМИЯКоличество подписчиков4108

Как выбрать криптовалютный обменник по данным мониторинга и отзывам

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

Опубликовано: 11 месяцев назад

МЕДИА ХИМИЯКоличество подписчиков4108

Первый и непобедимый: как листинг Freedom Holding Corp. на Nasdaq открыл новую эру для финансового рынка СНГ

В истории финансового пространства Содружества Независимых Государств есть знаковые вехи, которые навсегда меняют правила игры. Одной из таких стал листинг холдинга Тимура Турлова на американской бирже Nasdaq. Это событие, к которому компания шла...

Опубликовано: 11 месяцев назад

МЕДИА ХИМИЯКоличество подписчиков4108

Чем занимается холдинг СИБУР: от переработки газа до производства современных материалов

Холдинг СИБУР это ведущая нефтехимическая компания России, которая преобразует углеводородное сырье в продукцию, необходимую в повседневной жизни и промышленности. От упаковки и медицинских изделий до строительных материалов и компонентов для...

Опубликовано: 1 год назад

МЕДИА ХИМИЯКоличество подписчиков4108

Белсмета Онлайн База: Умное управление финансами и сметами в один клик (пресс-релиз)

Представляем вашему вниманию пресс-релиз сервиса "Белсмета". Материал подготовлен представителями сервиса и носит исключительно в информационно-справочных целях - его ни в коем случае не следует рассматривать в качестве нашей рекомендации и (или)...

Опубликовано: 1 год назад

МЕДИА ХИМИЯКоличество подписчиков4108

Знакомьтесь, база семян Семяныча (пресс-релиз)

Представляем вашему вниманию пресс-релиз сервиса "Семяныч". Информация предоставлена представителями сервиса - текст, пунктуация и орфография сохранены полностью. Информация публикуется исключительно с информационно-справочными целями и ее ни в коем...

Опубликовано: 1 год назад

МЕДИА ХИМИЯКоличество подписчиков4108

 Forex Magazine © 2004-2026