13 апреля 2019 г.

Index 10.0. Большое обновление

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

Список изменений

v10.0:
  • исправлено: паттерны [1] и [2] работают неверно для нефорексных символов
  • поддержка двух вариантов формул: с логарифмированием и без него
  • автоматическое определение числа знаков
  • псевдонимы-исключения для индексов (в коде, см. index_aliases_)
v9.x:
  • исправлено: спецсимволы не обрабатывались как формулы (например, нельзя было посмотреть индекс NG через формулу !NG)
  • валюты кроссов теперь учитываются при расчёте индексов (например, AUDUSD*USD без AUD в CalcCurrs будет давать другой результат)
  • все элементы формулы теперь рассчитываются через кроссы с USD (существенно быстрее для формул с более чем одним элементом)
  • необходимые для расчёта инструменты теперь не попадают автоматически в обзор рынка
  • убраны параметры для усреднения и вычитания средней, выполняющих роль индикатора MACD поверх Index: MAPeriod, DiffMAPeriod, MAMethod
  • убран параметр AppliedPrice, типы цен кроме цены закрытия либо неинтересны (Open), либо приводят к искажениям
  • убран параметр LogScale, формула теперь всегда считается с логарифмическим масштабом (поведение будет изменено в следующей версии - 10.0)
  • изменён формат формул, возможность использовать множители для отдельных элементов
  • параметры Power и Scale заменены одним фиксированным масштабом 1.0, при необходимости множитель можно добавить к каждому элементу формулы
  • значения после логарифмирования теперь не умножаются на 100
Далее подробнее о некоторых изменениях.

Формат формулы

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

Formula = EURUSD^1.5 * USD^2 / EUR * JPY^2

Каждый элемент может быть как со степенью, так и без неё.

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

Formula = EURUSD*1.5 + USD*2 - EUR + JPY*2


В этом варианте веса (множители) можно ставить либо сзади, либо спереди:

Formula = 1.5*EURUSD + USD*2 - EUR - 2*JPY

Псевдонимы индексов 

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

Для помощи индикатору в такой непростой задаче добавлена возможность указать псевдонимы индексов в формата "индекс: список пар с USD". Так можно указать "XAU: GOLD", и теперь формула "!XAU" будет расшифрована, т.к. для XAU существует пара с USD с именем GOLD. См. глобальную переменную index_aliases_ в коде.

Исправленные ошибки

Нефорексные инструменты обрабатывались неверно, из-за чего нельзя было посмотреть индекс CFD (NG, SPX500 и т.п.). Изначально такая функциональность работала, но отвалилась в процессе последующих обновлений. Теперь можно посмотреть как сам инструмент, например указав просто "NG", так и его индекс, добавив в начале восклицательный знак, например "!NG". С валютами подобной путаницы не происходит, поэтому по-прежнему достаточно написать USD, чтобы получить индекс USD.

Если взять формулу USD/USDRUB, то можно ожидать в результате просто RUB (индекс рубля). Однако в старой версии сам рубль не попадал в список валют для расчёта индекса, поэтому формула для индекса рубля давала другой результат. Теперь все валюты в формуле попадают в набор для расчёта индексов, и USD/USDRUB даст в точности то же самое, что и просто RUB.

Сокращение формул

Так как теперь все множители в формуле завязаны на один набор валют, можно сокращать формулы, избавляясь от лишних цепочек. Например, от такой: EURUSD*USDCHF/EURCHF=1. Раньше эту цепочку индикатор вычислял полностью и выдавал в итоге всё равно ту же единицу. Сейчас индикатор сразу сокращает формулу так, чтобы было меньше расчётов и используемых рыночных инструментов.

Более того, индикатор стал приводить все кроссы к парам с USD. По этим инструментам обычно доступна более глубокая история, что есть плюс. Минус в том, что для некоторых формул (например, EURCHF, т.е. пара без USD) вычислений и обращений к истории становится больше, но такие случаи достаточно редки, обычно выгода в переходе на пары с USD есть.

Масштаб

Посмотрим на старые параметры Power (общая степень для всей формулы), Scale (общий масштаб - множитель) и LogScale (опция для логарифмирования всей формулы).

Индикатор в логарифмической шкале (LogScale=true) выглядит почти точно так же, как и в обычной (для него), все уровни и трендовые линии, максимумы и минимумы остаются на том же месте, форма кривой, а значит и производные от неё (индикаторы) также не меняются или меняются очень слабо. Поэтому этот параметр можно отбросить, что и было сделано в версии 9, сделав все расчёты только с логарифмами (в десятке вновь стали доступны оба варианта, но в другом виде, см. выше "Формат формулы").

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

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

Прочие излишества

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

Следующие исключенные параметры - MAPeriod, DiffMAPeriod, MAMethod. Эти параметры выполняли роль индикатора MACD поверх Index. Это уже специфичная тема, далеко не каждому интересная. Если нужен MACD, всегда можно написать MACD, который будет брать в качестве исходных данных индекс.

И осталось в итоге всего два параметра, без которых уже никак нельзя - собственно формула (Formula) и набор валют, в котором все вычисления и происходят.

Общие изменения

Кроме того, произойдут изменения для всех новых версий моих скриптов:
  1. Код будет храниться на GitLab.com с использованием системы контроля версий Git и системы обсуждений/багтрекера GitLab (Issues).
  2. Код будет распространяться под лицензией GPL v3.0 (раньше была BSD 3-clause).
  3. Новый код из-за существенных изменений в используемой кодо-базе будет значительно отличаться от старого.
  4. В большинстве случаев будет использоваться унифицированный MQL4/MQL5 код. Это значит, что код будет написан так, что он будет компилироваться в обеих версиях компилятора с одинаковым результатом, насколько это позволяют различия в MT4 и MT5.
  5. Будет изменён метод публикации. Раньше весь код был в одном файле. Теперь код будет публиковаться в виде папки со скриптом и всеми зависимостями (кроме стандартной библиотеки), которую достаточно будет скопировать в соответствующую поддиректорию MQL4/MQL5 (без растаскивания файлов include вручную).
---

Новая версия доступна в хранилище: https://gitlab.com/fxcoder/mt-script.

См. также Индикатор Index.

Комментариев нет:

Отправка комментария