какой магик у ручных ордеров

О магическом номере (magic number)

Магический номер (magic, magic number) – это числовой идентификатор сделки, предназначенный для того, чтобы советник мог узнать какие сделки – его, а какие – нет. В том числе, и отличать сделки, открытые советником, от сделок, совершенных вручную (у таких ручных сделках magic всегда равен нулю).

Многие авторы пишут, что нет надобности изменять магик на каждой валютной паре. Например, такой авторитетный автор, как Павел Власов (ака Tradelikeapro), пишет:

«Менять Magic Number, если валютные пары разные – не нужно!

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

Но я на этот счет придерживаюсь другого мнения.

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

У меня был печальный опыт на эту тему, подтверждающий мой тезис.

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

Я полез в журнал терминала МТ4 и не поверил своим глазам: каждую секунду происходило несколько модификаций каждого ордера. Счет таких обращений к серверу брокера шел на десятки и сотни каждую секунду! Конечно, тут любой брокер взбесится: так можно и сервер положить.

В попытке найти причину, я обратил внимание на то, что тейк-профит каждого ордера беспрерывно изменяется: 1.06234 – 0.78691 — 1.06234 — 0.78691 — 1.06234 и т.д. Оказалось, что тейк-профит 0.78691 относится к одной валютной паре, а ТР 1.06234 – к другой. Поскольку у них был один и тот же магик, то советник не знал, какой ТР к какой паре относится и беспрерывно их менял один на другой.

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

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

Теперь я ВСЕГДА делаю так. После установки любого советника на все запланированные валютные пары, по очереди открываю их и меняю магики – уж очень мне не хочется понапрасну рисковать депозитом.

У первой пары оставляю тот magic number, который идет по умолчанию или — в авторском сет-файле, например, 189. Во второй паре дописываю 01 (получается 18901), в третьей – 02 (18902), в четвертой – 03 (18903) и т.д. Нолик служит как бы для определения того, что это дописано мной. Вы можете использовать любую другую систему определения магиков. Главное – за две минуты работы вы обезопасите свой счет от повторения ситуаций, которую я описал выше. Береженого Бог бережет!

Источник

Скрипт для открытия рыночных ордеров с заданным Magic Number

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

Функция выставления собственного комментария поможет сразу найти этот ордер среди всех других, особенно удобно, когда торговых ордеров много.

Также скрипт может автоматически высчитать необходимый торговый лот в зависимости от заложенного пользователем риска в процентах и Стоп Лосса.

Настройки скрипта:

Magic Number Необходимый магик номер для открытия ордера. Если выставить его равным 0, то данный ордер будет считаться, как открытый вручную.
Order Comment Комментарий, который будет присвоен открытому ордеру.
Choose Order Direction Выбор направления открываемого ордера: на покупку или продажу.
Lot Торговый лот для открываемого ордера.
Auto Risk % При значении больше 0 торговый лот будет высчитываются в заданном проценте риска от депозита, при условии, что Stop Loss у ордера будет установлен.
Slippage Проскальзывание ордера в старых пунктах
Take Profit Размер Тейк-Профита в старых пунктах
Stop Loss Размер Стоп-Лосса в старых пунктах

Пример работы скрипта:

Установим скрипт с такими настройками:

Магик номер равен 1111, комментарий «DaVinci FX», риск 5% на сделку.

Данный ордер сразу видно среди других ордеров из-за комментария с именем нашей команды, а также с торговым лотом 0,79, что при данном значении Стоп Лосса составит приблизительно 5% убытка для баланса в 4461$, если эта просадка будет достигнута. Как видно, цели у ордера тоже выставились. Теперь, если нужно закрыть данный ордер, это можно без проблем сделать с помощью нашего скрипта Close all trading orders, указав ваш установленный магик.

Также удобно с помощью скрипта «подсовывать» свои ордера другим советникам. К примеру, у вас есть советник, который открывает ордера, сопровождает сделку и выходит из нее по фильтрам. Вы видите, что сейчас есть сигнал в рынок, кидаете скрипт с магиком этого советника, как только ордеров будет открыт, установленный советник сразу же начнет его сопровождать в рынке и закроет, когда у него будет свой сигнал.

Источник

После выхода на рынок четвертой и пятой версий популярной платформы МетаТрейдер спрос на автоматические торговые системы значительно вырос. Рост востребованности советников Форекс связан не только с возможностью получения прибыли без вмешательства человека, но и с упрощением работы с роботами и управления ими. В настройках практически любого советника вы встретите такой параметр, как Magic Number. Что он обозначает и для чего используется? Какая цифра должна стоять напротив «магического» параметра? Что нужно знать трейдеру перед началом торговли с помощью автоматической торговой системы?

Что такое Magic Number?

Magic Number (в переводе — магический номер) — специальный идентификатор, который позволяет советнику различать ордера, открытые им, от других сделок. Значимость параметра играет роль только для тех трейдеров, которые на одном торговом счете торгуют как вручную, так и с помощью роботов, или же совмещают торговлю несколькими советниками на одном аккаунте. Если у вас для каждого робота предусмотрен отдельный счет, магическая цифра не имеет никакого значения.

Читайте также:  hyper m 2 x16 что это в биосе

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

В четвертой версии МТ4 был введен идентификатор — Magic Number. Достаточно установить в поле напротив него цифру, отличную от нуля, и советник будет видеть исключительно свои сделки. При этом параллельно трейдер может торговать вручную на одном и том же аккаунте без страха, что робот закроет по ошибке его операции. В настройках советника параметр Magic Number выглядит таким образом:

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

Из скрина видно, что в терминале сохранилась вся информация о сделке — каким советником она была открыта и закрыта, его ID. Это и есть цифра, указанная в разделе настроек как Magic Number.

Настройка Magic Number

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

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

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

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

Ответы на вопросы пользователей

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

Как поведут себя эксперты, если у них будут одинаковые идентификаторы? Здесь все просто. Советник А будет закрывать ордера советника Б и наоборот, что полностью нарушит алгоритм работы как одного, так и второго робота. Во избежание этого следует обязательно перепроверить параметр Magic Number перед запуском двух автоматических торговых систем одновременно при работе на реальных деньгах. Впрочем, лучше предварительно протестировать корректность работы на демонстрационном счете.

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

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

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

Источник

Магическое число (Magic Number): как его использовать в MQL4?

Магическое число (Magic Number) — это идентификатор, который можно назначить ордеру с помощью MQL4.

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

Чем может быть полезно магическое число (Magic number)?

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

Когда вы автоматизируете свою торговлю через MQL4 с помощью Magic Number, необходимо выбрать, с какими ордерами она будет работать.

Магическое число можно использовать для:

Чтобы привести пример, предположим, что у вас есть два советника, которые вы хотите запустить на EURUSD.

Один советник — скальпер, которые работает на 15-минутном графике, а другой будет работать на 1-часовом графике. Вы сможете назначить различные магические числа для ордеров, открываемых этими двумя советниками. Это позволит советникам работать только со своими ордерами.

Metatrader не позволяет работать с Magic Numbers в своем графическом интерфейсе. Вы можете работать с Magic Numbers только с помощью MQL4.

Как использовать магические числа?

В MQL4 есть встроенные функции для назначения и чтения магических чисел.

При открытии ордера с помощью функции OrderSend() одним из необязательных параметров является магическое число. Таким образом, с помощью этой функции вы связываете магическое число с ордером, который вы открываете. Когда вы выбираете ордер с помощью функции OrderSelect(), вы можете получить магическое число для выбранного заказа, используя функцию OrderMagicNumber().

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

Источник

Использование ORDER_MAGIC для торговли разными экспертами на одном инструменте

Введение

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

Читайте также:  что делать если ганг бест лагает

Тип ulong самый длиииииииииннннннннннный

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

-9 223 372 036 854 775 808

9 223 372 036 854 775 807

18 446 744 073 709 551 615

Таблица 1. Свойства типов данных long и ulong

но тип ulong переплюнул и его за счёт объединения положительной и отрицательной мантиссы.

Итак, длина задана огромная, но как она использовалась раньше?

По опыту работы на mql4, я частенько обращал внимание на бессмысленность кодирования магика многими разработчиками. Нет, магик использовался осмысленно, но вот его кодировка вызывала, по меньшей мере, улыбку. Что можно сказать об индивидуальности магика 12345, такой магик использует практически половина пишущей братии. Вторая половина пользуется магиками 55555, 33333 и 77777, вот, пожалуй, исчерпывающий набор. Хочу обратить внимание читателя, что на его компьютере вряд ли установлено более 1000 советников, так что заветное число 1000 будет достаточно для кодирования индивидуального имени всех ваших советников.

Что же говорит всезнайка Вики о слове код:

Код — правило (алгоритм) сопоставления каждому конкретному сообщению строго определённой комбинации символов (знаков) (или сигналов).

Значит, будем составлять правила. Предлагаю прописать в коде магика не только сам идентификатор советника, но и инструмент, на котором он запущен. Ведь то, что советник запущен, к примеру, на EURUSD, совсем не означает, что советник будет выставлять ордера только по этому инструменту. Также, думаю, будет полезно прописать код взаимодействия советников, что-то вроде «свой/чужой», чтобы советник, проверяя позиции, мог понять, что текущий приказ выставлен дружественным советником. Думаю, этого будет достаточно для создания очень сложной системы.

Итак, подведём итог: какие возможности мы закладываем в систему:

Итак, задача поставлена, приступим к реализации.

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

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

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

Рисунок 1. Работа одного советника на одном инструменте

Теперь попробуем запустить этот советник, но на разных таймфреймах одного инструмента (для опытов мы выбрали первый попавшийся инструмент, первым попался EURUSD :o)

Рисунок 2. Конфликт двух советников на одном инструменте на разных таймфреймах

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

Позиция или виртуальная позиция?

Поскольку в MetaTrader 5 разработчики вместо учёта ордеров перешли на учёт позиций, то имеет смысл более детально рассмотреть функции, связанные с учётом позиций.

Идентификаторы перечислений для функций получения запроса соответствующих свойств позиций PositionGetDouble, PositionGetInteger и PositionGetString приведены в таблицах 2-4.

Уровень Stop Loss для открытой позиции

Уровень Take Profit для открытой позиции

Текущая цена по символу

Таблица 2. Значения перечисления ENUM_POSITION_PROPERTY_DOUBLE

Время открытия позиции

Magic number для позиции (смотри ORDER_MAGIC)

Таблица 3. Значения перечисления ENUM_POSITION_PROPERTY_INTEGER

Символ, по которому открыта позиция

Комментарий к позиции

Таблица 4. Значения перечисления ENUM_POSITION_PROPERTY_STRING

Раз уж мы имеем возможность работать с ООП, то объявим еще и собственную структуру (заодно и попрактикуемся писать объектно).

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

Класс CPositionVirtualMagic же мы разберём подробно:

К классу придана структура:

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

Далее следуют два метода класса:

Эти методы объявлены как public, а значит, будут доступны через вызывающую переменную класса в любом месте программы, и предназначены для вывода значений структуры в затребованном месте.

В этой же секции объявлен метод:

Это основная функция класса, именно её мы разберём наиболее подробно, а пока, забегая наперёд, опишу функцию под спецификатором доступа private:

Этот метод производит запись тикетов сделок в массив, по сути, является циклом, и мог быть описан в вызываемой функции, но уж больно хотелось уменьшить размер (для увеличения читабельности кода) функции PositionVirtualMagic(), поэтому я вынес этот цикл за её пределы, а заодно и продемонстрировал, как пользоваться спецификатором доступа private.

Итак, вернёмся к PositionVirtualMagic(), функция в самом своём начале имеет однострочное вычисление точности, до которой требуется округлять double-значение объёма рассчитанной позиции.

Требуется это для проведения операции сравнения с нулём, иначе какой-нибудь остаток в 8 знаке после запятой не даст приравнять значение нулю и вызовет ошибку исполнения.

Округляется же объём позиции до минимального шага. И если минимальный шаг больше 1, то округление идёт до целочисленной части. Далее идёт цикл while, но используется он по-новому (не так, как в mql4), т.к. проверка выражения истинности производиться не в начале цикла, а в конце:

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

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

Думаю, стоит объяснить используемую мной систему выбора имён переменных.

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

Разбирая код дальше, мы видим, что после подгрузки истории идёт вызов функции:

с сохранением количества сделок в переменную. По тому же условию будет проводиться проверка на выход из цикла. Зачем эта проверка? И почему нельзя просто подгрузить историю и затем запрашивать из неё сделки?

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

К слову сказать, может это не самая лучшая проверка, но вполне рабочая. Итак, продолжим. В самом цикле мы вызываем метод класса, который заносит значения тикетов сделок в заранее отведённый буфер. После вызова функции prHistory_Deals() снова производиться подгрузка истории.

Так организована проверка того, не было ли за время работы функции prHistory_Deals() изменений в истории сделок. Если изменений не было, то переменная History_Total_Deals будет равна HistoryDealsTotal() и произойдёт выход из цикла за один проход. Если же изменения были, система пойдёт на повтор, и так до тех пор, пока не будет загружена история тикетов без ошибок (и не забываем «;» в конце ставить):

Читайте также:  apple magic mouse что это

Далее в цикле for идёт подсчёт виртуальной позиции.

Если сделка успешно прошла ряд фильтров (время совершения сделки и магик сделки), то её объем увеличивает ту часть виртуальной позиции, типу которого принадлежит сделка.

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

Именно поэтому мы просто суммируем все сделки, совершённые советником на Buy и отдельно на Sell, потом их сравниваем и получаем общую позицию (собственно, этим и занимается остальная часть разбираемой функции).

Подсчёт объёма позиции:

Распознавание типа позиции с выводом значения в структуру:

Вывод объёма в структуру:

Вывод значения функции: если объём позиции 0 то false, иначе, если позиция существует, то true:

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

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

Запустим этот советник трижды на одном инструменте, но разных таймфреймах при этом зададим всем разные магики:

Рисунок 3. Зададим разные магики двум одинаковым советникам, (один инструмент, разные таймфреймы) старт первого советника

Рисунок 4. Зададим разные магики двум одинаковым советникам, (один инструмент, разные таймфреймы) старт второго советника

Рисунок 5. Результат бесконфликтной работы советников на одном инструменте с различными магиками

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

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

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

Для этого повторим условия кодирования (так сказать, техническое задание на разработку):

Перечисление работает просто: вы описываете через запятую имена, а компилятор присваивает им числа по порядку.

Во-первых, если зададите переменную другого типа (к числам это не относится) при указании параметра из перечисления, при компиляции вы получите предупреждение об ошибке, а во-вторых, появляется наглядность: вы не просто присваиваете 0, а даёте команду присвоить ENUM_DIGITAL_NAME.

Как и при создании структуры или класса, имя перечисления я выбирал просто, к общему выбранному имени прибавляю E, получилось Emagic, соответственно структура будет Smagic а класс Cmagic.

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

Далее создадим структуру для хранения наших кодов.

После чего объявим класс Cmagic в котором пропишем все методы по кодированию и декодированию магика, кстати, включим в этот класс и методы из предыдущего советника (просто объявим их в нашем классе и перепишем заголовки)

Теперь разработаем методы.

Первый метод в классе:

Этод метод получает два значения: цифровое имя советника и код взаимодействия.

И сразу их проверяет на корректность:

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

Далее идёт присвоение в структуру входных данных, которые пользователь задаёт, однако символ инструмента не задаётся, а получается из приватного метода:

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

И, наконец, главная строка всего метода:

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

Следующий публичный метод класса:

Собственно, этот метод является просто оболочкой, распределяющей по структуре результаты трёх вызовов одного private-метода. Объявление под таким спецификатором хорошо тем, что при вызове переменной класса во всплывающей подсказке их нет, т.е. создаётся впечатление, что всю работу сделала public-функция.

Но вернёмся к нашим приватам:

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

с последующим разбором отдельных компонентов строки.

Далее следуют две похожих функции, которые по своей сути являются переключателем switch, и отличаются лишь типом выходного значения:

В функции GetMagic_result() всё организовано просто, она распределяет значения структуры по веткам switch, тогда как в sGetMagic_result() немного сложней. Каждая ветка case вызывает табличную функцию, которая и переводит значение структуры в наглядную форму. Таким образом, если значение mag.expert_symbol=1 то первая функция выдаст 1, а вторая EURUSD.

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

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

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

Теперь главный метод:

не только объявлен как метод класса Cmagic но и имеет другой набор параметров.

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

Что это даёт? Теперь можно одновременно фильтровать сделки, которые были открыты по другому инструменту, но этим же советником. При этом они не будут путаться с таким же советником, запущенным на другом инструменте. Вообще, описать все варианты использования новой системы учёта сложно. И читатель сам сможет выбрать, для чего ему нужна такая усложнённая система. Я же ратую лишь за то, что не нужно усложнять там, где можно писать просто, и не стоит бояться усложнения, если простота растёт как снежный ком.

Что ж, раз класс разработан, нужно его опробовать на новом советнике:

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

Рисунок 6. Установка трех советников с разными магиками на различные графики

Рисунок 7. Результат бесконфликтной торговли трех советников с разными магиками

Как видно из распринтовки в сообщениях экспертов, все три участника стартовали успешно и конфликтностью не отличаются.

Заключение

Источник

Сказочный портал