Скачать MetaTrader 5

Случайные леса предсказывают тренды

29 сентября 2014, 16:07
СанСаныч Фоменко
112
8 850

Введение

Изначально целью построения торговой системы является предсказание поведения некоторого рыночного инструмента, например, валютной пары. Цели предсказания могут быть разными, мы же ограничимся предсказанием трендов, а точнее предсказанием роста («лонгов») или падения («шортов») значений котировки валютной пары.

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

В данной статье рассмотрим автоматический выбор паттернов и их предварительную оценку с помощью пакета Rattle из системы статистического анализа R.


1. О Rattle

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

Rattle (the R Analytical Tool To Learn Easily) объединяет множество пакетов R, которые важны для построения торговых систем, но каждый по отдельности нелегки для использования новичком. Понимание R не требуется, чтобы начать с Rattle. Но результатом работы с Rattle будет код на R, который может быть использован при построении реальной торговой системы. На этом этапе знание R будет необходимо.

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

Rattle (Уильямс, 2009) является бесплатным программным обеспечением с открытым исходным кодом, созданным в рамках статистического пакета программного обеспечения R (R Рабочая группа Разработки, 2011). Как бесплатное программное обеспечение, исходный код Rattle и R доступен всем без ограничения. Исходный код Rattle написан на языке С и всем разрешено (и поощряется) рассмотрение исходного кода для обучения, его понимания, проверки и расширения.


2. Описание исходных данных

В основе расчетов, произведенных в статье, лежит набор данных, содержащий котировки шести валютных пар EURUSD, GBPUSD, USDCHF, USDJPY, EURGBP, USDCAD с ценами закрытия на таймфрейме Н1 за период с 10.01.2011 по 24.12.2013 – всего свыше 18 тысяч бар, что является достаточным для доверия произведенным расчетам. На основе указанных валютных пар был создан набор данных, который использовался для поиска паттернов, предсказывающих «лонги-шорты».

Набор данных с исходными котировками дан в приложении к статье с именем kot60_110101_131231_UA.txt.


2.1. Создание целевой переменной

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

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

Из определения тренда: «тренд растущий, если следующая цена больше предыдущей цены» и, наоборот, для падающего тренда. Из определения следует, что необходимо предсказывать цену валютной пары. Было 1.3500 для EURUSD, предсказали 1.3550 – растущий тренд, покупаем.

Но базовыми приказами являются приказы «купить» и «продать», а предсказана величина цены. Величина цены используется, к примеру, в торговых системах на пробой уровня. Чтобы реализовать план по торговле трендов, надо будет произвести дополнительное действие по сравнению цен. При этом очевидно, что мы предсказываем не то, что собирались торговать!

Поэтому, если планировалась трендовая торговая система, то модель должна сразу предсказывать тренд. Учить модель надо трендам, целевая переменная должна принимать только два значения «купить» и «продать» или в закодированном (категориальном) виде «1» и «-1».

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

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

По предсказательным моделям классификационного типа вычисляется класс, к которому будет отнесена совокупность поступивших на момент предсказания исходных данных. В качестве таковых примем два класса «лонг» и «шорт». Как в любой другой модели классификационного типа эти два класса не имеют конкретной величины, «лонг» нельзя сравнивать с «шортом». Хотя в дальнейшем закодируем для удобства «лонг» как «1» и «шорт» как «0», но из этого не следует, что «лонг» больше «шорта». Чтобы подчеркнуть это обстоятельство в R и, соответственно, в Rattle, для таких качественных переменных имеется специализированный тип – категориальные (номинальные) переменные.

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

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

Для построения целевой переменной использовался ZigZag с параметром «расстояние между разворотами», равным 0.0035 долларов. На рис. 1 представлен результат.

Рис.1. Индикатор ZigZag

Рис.1. Индикатор ZigZag

Осталось преобразовать значения индикаторов в категорическую величину, в которой «лонг» = 1, а «шорт» = 0. 

Результат представлен на рис. 2.

Рис.2. Индикатор ZigZag в категорическом виде

Рис.2. Индикатор ZigZag в категорическом виде

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

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

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


2.2. Создание независимых переменных

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

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

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

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

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

Применим следующие индикаторы: скользящие средние с периодами 5,10 и 15; MACD(12,26,9), RSI с периодами 14,21,28. Кроме этого, используем приращение котировок и скользящих средних. Все эти преобразования применим ко всем шести котировкам валютных пар.

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

Таким образом, создано 88 независимых переменных плюс одна целевая переменная и плюс одна служебная переменная (ZigZag). Количество данных по каждой из переменных равно 18083.

Весь этот набор переменных оформлен в виде рабочей области R и доступен в приложении к статье с именем TC.RData. Использовать этот набор данных можно следующим образом:

  • загружаем R;
  • загружаем библиотеку Rattle;
  • вкладка Файл/Рабочее пространство;
  • ищем на диске файл TC.RData и загружаем его.

3. Интеллектуальный анализ исходных данных

Пакет Rattle предлагает набор средств для предварительной, иногда говорят, интеллектуальной обработки данных или data mining.

3.1. Ввод и предварительный просмотр

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

Результатом будет картинка, показанная на рис. 3.

Рис. 3. Стартовый экран Rattle

Рис.3. Стартовый экран Rattle

Построение моделей в Rattle соответствует движению от вкладки Data до вкладки Log.

Первая вкладка Rattle – Data, в соответствии со своим названием «Данные» позволяет загрузить данные, с которыми в дальнейшем можно будет производить манипуляции.

Для нас представляют интерес две кнопки: Spreadsheets и R Dataset.

Кнопка Spreadsheets позволяет загружать файлы, имеющие формат Excel. Читатель, пожелавший проверить свои идеи, может подготовить собственный экселевский файл и затем применить возможности Rattle.

Для повторения действий, описанных в данной статье или каких-либо дополнительных действий с явно избыточным файлом, приложенным к статье, следует использовать кнопку R Dataset. Эта кнопка загружает файл в формате R, который называется «Рабочее пространство» или «Рабочий файл». Они имеют расширение на диске .RData. Этот файл должен быть загружен в R, после чего он станет доступен по этой кнопке.

Загрузим наш заранее заготовленный файл и получим верхнюю часть картинки на рис. 4 и нижнюю часть картинки на рис. 5.

Рис.4. Верхняя часть исходного файла

Рис.4. Верхняя часть исходного файла

Рис. 5. Нижняя часть исходного файла

Рис.5. Нижняя часть исходного файла



3.2. Корреляция целевой переменной с независимыми переменными

Замечание. Кнопка «Выполнить» играет решающую роль: вначале подготавливается действие, но не производится. Чтобы любое действие было выполнено, необходимо нажать кнопку «Выполнить». Это следует делать везде при повторении действий, указанных в данной статье.

На рис. 4 можно увидеть перечень переменных, их характеристики, а также роль этих переменных в их использовании. Так как мы не собираемся и в принципе не можем использовать индикатор ZigZag в моделях, то перед построением моделей отметим его как Ignore – игнорируемый.

Остальные переменные у нас используются как входные, кроме последней переменной, которая используется как целевая переменная – Target.

Важное значение для обоснования уровня доверия к результатам моделирования имеет кнопка Partition, с помощью которой исходный набор данных можно разделить на три части, или не делить вообще. В этом месте указываются пропорции набора данных, которые используются для обучения модели (Training), проверки модели (Validation) и тестирования модели (Testing).

В следующем поле указывается начальное число для датчика псевдослучайных чисел. Смысл этого состоит в следующем: например, 70% исходных данных, компонуемых в обучающий набор данных, выбираются из исходного набора данных случайным образом. В результате этого оставшиеся две части по 15% (как в нашем случае) также представляют собой случайную последовательность баров.

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

Рис.6. Корреляция переменных

Рис.6. Корреляция переменных

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

Переменная
ZZ.35
 RSI_cad.14
 -0.0104122177
 JPY.dif2
 -0.0088412685
 EUR.dif3
 -0.0052379279
 CHF.dif3
 -0.0049692265
 GBP.dif3
 -0.0047409208
 GBP.dif1
  0.0044691430
 MA_cad.15.dif1
 -0.0039004722
 JPY.dif1
 -0.0023831247
 GBP.dif2
 -0.0015356091
 EUR.dif2
 -0.0013759749
 CHF.dif2
 -0.0012447101
 EUR.dif1
 0.0005863149
 MA_cad.10.dif1
 0.0023981433
 CHF.dif1
 0.0024543973
 MA_gbp.5.dif1
 0.0043757197
 MA_cad.5.dif1
 0.0075424397
 MA_gbp.10.dif1
 0.0094964069
 EURGBP.dif1
 0.0095990416
 CAD.dif1
 0.0110571043

Табл. 1.  Корреляция переменных

Мы видим, что довольно большой перечень переменных имеет корреляцию с ZZ.35 менее 0.01. Да и величина корреляции, менее 0.1, не позволяет делать вывод о каком-либо влиянии независимых переменных на целевую переменную.

На данном этапе отметим этот факт и по обстоятельствам будем его использовать после оценки моделей.

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

Каких-либо рекомендаций по величине корреляции не существует. Обычно используется магическое для статистики число – 5%. Но это в принципе неверно. Дело в том, что удаление предикторов, которые для модели являются шумом, приводит к уменьшению ошибки предсказания. А удаление предиктора, который не является шумом для модели, приводит к увеличению ошибки предсказания. Так что минимальный перечень предикторов, которые полезны для модели, устанавливается экспериментально.


3.3. Масштабирование

Некоторые модели, например, машины опорных векторов SVM, весьма чувствительны к разному масштабу предикторов, под которым имеется в виду следующее. Например, валютная пара EURUSD имеет изменчивость данных в пределах 0.5, валютная пара USDJPY имеет изменчивость несколько десятков единиц. Чтобы исключить разный масштаб предикторов, их на вкладке Transform преобразовывают в один масштаб, наиболее предпочтительно, когда колебания всех предикторов происходят в диапазоне [0-1].

Для выполнения масштабирования набираем Transform/Rescale/Scale [0-1]. После этого отмечаем все переменные и нажимаем, как всегда, «Выполнить».


3.4. Преобразование в категорический вид

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

Для выполнения преобразования значений индикатора RSI в категорическую форму набираем: Transform/Recode/KMeans, при этом количество уровней факторов устанавливаем равное 8. Отмечаем все индикаторы RSI и, как всегда, нажимаем «Выполнить».

Итак, отметим на вкладке Data переменную ZZ.35 как Ignore и можно переходить к построению моделей.


4. Общий алгоритм модели классификации

В Rattle доступны следующие модели:

  • модель древовидной классификации (Tree);
  • модель случайного леса (forest);
  • модель усиливающихся деревьев (ada);
  • модель машин опорных векторов (SVM);
  • обобщенные линейные модели (glm);
  • модель нейронных сетей (NNET).

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

Берется обучающий набор, который состоит из строк (в нашем случае 18030), содержащих значения предикторов (88 в нашем случае) и значение целевой переменной – «лонг» или «шорт» в нашем примере.

Любой из алгоритмов классификации решает следующую задачу: отделить комбинации значений предикторов, которым соответствует «лонг» от комбинации значений предикторов, которым соответствует «шорт». Это этап обучения модели.

Затем наступает этап проверки модели.

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

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

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

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

В статье рассмотрим только одну из моделей – модель леса случайных деревьев, сокращенно называемую «случайный лес».


5. Модель случайного леса (forest)

5.1. Краткий обзор

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

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

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

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

Читатель может самостоятельно проверить это утверждение с помощью Rattle, используя модель Tree, которая реализует описанный алгоритм построения дерева.

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

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

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

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

Алгоритмы случайных лесов часто создают от 100 до 500 деревьев. При компоновке окончательной модели решения, принятые каждым из деревьев, объединяются путем обработки деревьев как равных. Окончательное решение на ансамбле деревьев будет решением на большей части учредительных деревьев. Даже если 51 из этих 100 деревьев укажут на «лонг», то будет принято значение «лонг», хотя, возможно, с меньшей уверенностью.


5.2. Алгоритм

5.2.1. Формирование выборки из набора данных

Алгоритм формирования случайного дерева создает много деревьев решений, используя понятие, называемое бутстрэп агрегирование (bagging сокращение от bootstrap aggregation), для введения случайности в процесс формирования выборки. Бутстрэп агрегирование – это идея собрать случайную выборку наблюдений в стеллаж. В произвольном порядке составляется много стеллажей из выбранных наблюдений, полученных из исходных наблюдений в обучающем наборе данных.

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


5.2.2. Формирование набора предикторов

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


5.2.3. Случайность

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

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

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


5.2.4. Подсчет в ансамбле

В развертывании многих деревьев решений как одной модели, у каждого дерева есть равный вес в заключительном процессе принятия решений. Простое большинство диктует результат. Поэтому 51% разделений и 99% разделений дадут одинаковый класс, например, «лонгов».

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


5.3. Построение модели случайного леса

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

Разделю результат расчета на несколько частей и прокомментирую.

Рассмотрим результаты, приведенные на рис. 7.

Рис. 7. Верхняя часть результатов подгонки модели случайного леса

Рис.7. Верхняя часть результатов подгонки модели случайного леса

Отметим некоторые сведения на этом рисунке.

Целевая переменная – TREND.

В ходе построения модели было создано 500 деревьев. При расщеплении в каждом узле дерева использовалось 9 предикторов (переменных). Кроме этого для нас представляют интерес кнопки Errors (Ошибки) и OOB ROC.

Далее приведены сведения об ошибке предсказания, которые имеют следующий вид:

OOB estimate of error rate: 15.97%

Confusion matrix:


01class.error
0496011630.1899396
18585677 0.1312930

Табл. 2. Матрица сопряженности (ошибок) для обучающего набора

Перевод следующий: Величина ошибки оценки вне стеллажа: 15.97%.

Полученная ошибка предсказания вполне приличная. Важно уточнить то, как она получена, а именно: «вне стеллажа». Дело в том, что для построения модели использовался не весь обучающий набор данных, который, в свою очередь, составляет 70% исходного набора данных. Для построения модели использовались примерно 60% обучающего набора данных, а 40% не использовались. Эти 40% и называются «Out of bag» - вне стеллажа. Именно на этих данных получена ошибка предсказания, равная 15.97%.

Далее по тексту.

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

Сверху строка – это предсказанные «шорты» и «лонги». Слева сбоку – это фактические «шорты» и «лонги», которые получены из индикатора ZigZag для исторических данных.

Величина 4960 с координатами (0,0) – это количество «шортов», которые были правильно предсказаны. Следующая величина 1163 – это количество «шортов», которые были предсказаны как «лонги».

Величина 858 с координатами (1,0) – это количество «лонгов», которые были предсказаны как «шорты». Величина 5677 – это количество правильно предсказанных «лонгов».

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

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


01MeanDecreaseAccuracyMeanDecreaseGini
MA_eur.5.dif142.9741.8554.86 321.86
EUR.dif337.2146.3851.80177.34
RSI_eur.14 37.7040.1150.75254.61
EUR.dif2 24.6631.6438.24110.83
MA_eur.10.dif122.9425.3931.48193.08
CHF.dif3  22.9123.4230.1573.36
MA_chf.5.dif1  21.8123.2429.56135.34

Табл. 3. Важность переменных в модели случайного леса

Таблица содержит несколько оценок важности переменных. Под «важностью» понимается степень влияния конкретной переменной на целевую переменную. Чем больше величина оценки, тем «важнее» соответствующая переменная.

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

И последнее, что представляет интерес на вкладке Model – это кнопка Errors. Нажимаем и получаем рис.8.

Рис. 8. Зависимость ошибки моделирования от числа деревьев

Рис.8. Зависимость ошибки моделирования от числа деревьев

6. Результативность моделей

Оценка результативности моделей производится на вкладке Evaluate, на которой Rattle предоставляет доступ к набору опций для оценки результативности моделей.

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

При переходе из вкладки Model на вкладку Evaluate последняя из созданных моделей будет автоматически отмечена флажком. Это соответствует общему образцу поведения в Rattle: создаем и настраиваем модель, а затем исследуем ее результативность, перемещаясь на вкладку Evaluate.

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

Первые четыре опции для Data соответствуют разделению набора данных, указанного на вкладке Data. Опции – Training (обучение), Validation (проверка), Test (тестирование) и Full (весь набор). Понятие разделения набора данных на наборы обучения/проверки/тестирования было обсуждено ранее.

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

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

Мы используем набор данных Validation (Проверки) для проверки результативности модели при ее создании и настройке. Таким образом, после создания модели будет проверена результативность по этому набору данных проверки. Затем можно изменить некоторые опции настройки для создания модели. Мы сравниваем новую модель со старой, основывая ее результативность на наборе данных проверки. В этом смысле набор данных проверки используется во время процесса моделирования, чтобы создать заключительную модель. Следовательно, у нас все еще будет смещенная оценка заключительной результативности нашей модели, если мы положимся на набор данных проверки для этой меры.

Набор данных Test (Тестирования) - это заключительный набор данных, который вообще не использовался во время создания модели. Как только мы идентифицировали «лучшую» модель, основанную на наборах данных обучения и проверки, то можно оценить результативность модели на наборе данных тестирования. Это - оценка ожидаемой результативности на любых новых данных. Четвертая опция использует для оценки модели набор данных Full (Весь набор - объединение наборов данных обучения, проверки и тестирования). Это, как можно заметить, не более чем любопытство, а не стремление получить точный результат.

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

Матрица ошибок (сопряженности) используется при предсказании категориальной целевой переменной.

Матрица ошибок (Error Matrix) показывает фактические результаты против предсказанных результатов. Выдается две таблицы: первая показывает количественные результаты, вторая таблица показывает результаты в процентах.

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

На рис. 9 показана матрица ошибок для ранее рассчитанной модели случайного леса.

Рис. 9. Результат оценки модели случайного леса

Рис.9. Результат оценки модели случайного леса

Из рисунка видно, что средняя ошибка составляет 0.167, т.е 16.7%. На этапе обучения была получена ошибка предсказания равная 15.97%. Можно считать эти величины равными.

Проведем расчет для набора данных тестирования. Получаем следующий результат:

Error matrix for the Random Forest model on TC [test] (counts):


Predicted
Predicted
Actual  01
01016256
11931248

 Табл. 4. Матрица ошибок для модели случайного леса в абсолютных величинах (тестовый набор)


Error matrix for the Random Forest model on TC [test] (proportions):


Predicted
Predicted

Actual01Error
00.370.090.20
10.070.460.13

Табл. 5. Матрица ошибок для модели случайного леса в относительных величинах (тестовый набор)


Overall error: 0.1654994, Averaged class error: 0.1649244

Ошибка предсказания равна 16.4%.

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

Отдельно следует отметить, что результативность моделей, которую рассчитывает Rattle, в обязательном порядке следует проверить в тестере терминалов МetaТrader 4 или MetaTrader 5. Затем, как обычно, на демо-счете и реальном счете с небольшими лотами. Только после этого можно будет делать окончательные выводы о модели.



7. Улучшение модели

Выше, при исследовании корреляции псевдо целевой переменной ZZ.35 с предикторами, было выяснено, что значительное количество предикторов очень слабо коррелировано с целевой переменной.

Удалим те предикторы, которые имеют коэффициент корреляции менее 0.01. Для этого на вкладке Data пометим соответствующие предикторы как игнорируемые (Ignore)   и повторим расчет модели случайного леса на вкладке Model.

Получаем следующие результаты:

  • ошибка предсказания вне стеллажа = 15.77%;
  • ошибка предсказания на наборе данных проверки = 15.67%;
  • ошибка предсказания на наборе данных тестирования = 15.77%.

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

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

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


8. Использование модели в терминале MetaTrader 4

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

При торговле внутри дня без терминала МetaТrader 4 или его аналога не обойтись.

Для организации автоматической и полуавтоматической торговли с использованием Rattle потребуется:

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

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

Библиотека взаимодействия R и терминала МetaТrader 4 имеется в CodeBase: mt4R for new MQL4.

Код на R, который соответствует обученной модели, имеется в журнале (вкладка Log). Все действия, которые производились при создании модели, протоколируются в виде кода на R, который и следует использовать в реальной торговле.


Заключение

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

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


Прикрепленные файлы |
Article.zip (6598.05 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (112)
Vladimir Perervenko
Vladimir Perervenko | 28 янв 2015 в 16:13
Dr.Trader:
Интересная статья, спасибо. Про R в первый раз услышал, выглядит как очень полезная вещь. Давно хочу сделать нейронную сеть которая сможет сама торговать на основе исторических данных, попробую выгрузить историю из mt5 (ohlc, spread, volumes), передать её в rattle, и посмотреть что получится.

Вот как раз для этого rattle и не предназначен. Работать нужно прямо в R. Вот здесь вариант такого решения https://www.mql5.com/ru/articles/1103.

Успехов

Vladimir Perervenko
Vladimir Perervenko | 29 янв 2015 в 11:25

To: CyberCortex

Извини СанСаныч что встряю.

Не мог пройти мимо такого верхоглядства и агрессивного непрофессианализма.

Рассмотрим по порядку утверждения автора из его описания прикладной программы

Цитата: «Преимущества CyberCortex в сравнении с существующими аналогами:

  • Используемый алгоритм. Для многих трейдеров технологии из области искусственного интеллекта начинаются и заканчиваются на избитой теме классических нейронных сетей. Но алгоритм бустинга, реализованный в CyberCortex – это на порядок более мощный и современный инструмент(?), потому что: “

Возражение:

  1. Откуда это пренебрежительно величественное мнение о многих трейдерах?Вообще эта область называется «Машинное обучение», искусственный интеллект это несколько другое. Уверен, что многие трейдеры знакомы с большим количеством типов нейронных сетей о которых Вы даже не слышали ( глубокие сети, сверточные и другие современные ). Тема нейросетей избита для тех кто ограничился изучением MLP. Спешу Вас огорчить, тема нейросетей сейчас получила второе дыхание после разработки методов глубокого обучения и для знающих и умеющих это далеко не закрытая тема. Кроме этого нам известны много других алгоритмов классификации, которые реализованы в многочисленных пакетах языка R.

  2. Алгоритм бустинга в самых разнообразных модификациях известен довольно давно (1996) и никак не является более мощным чем нейросетевой. Кстати нужно было бы озвучить по какому конкретно алгоритму работает Ваша программа. На вскидку по пакетам R -

  • ADA”- адаптивный стохастический бустинг. одна из моих любимых, реализовано три модификации оригинального алгоритма : Gentle-, Logit-, and Real AdaBoost

  • «adabag” - в пакете применены мультиклассалгоритмы Adaboost.M1(Freund and Schapire's), AdaBoost-SAMME(Zhu et al., 2009) и Breiman's Bagging algorithm;

  • «boost” - содержит набор методов бустинга таких как - 'BagBoost', 'LogitBoost', 'AdaBoost' and 'L2Boost' дополненных предвыбором признаков(предикторов) с помощью Wilcoxon test statistic;

  • «pga” - содержит ансамбль алгоритмов объдиняющий AdaBoost и Random Forest эволюционным алгоритмом( в простонародии генным)

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

Как видите выбор довольно широк.

Для тех кто не в теме. «Бустинг»(усиление) — метод ресемплинга предложенный первоначально для решения задач в областях науки, где изначально количество примеров(результатов экспериментов) для использовании их в стат расчетах было мало, добыть новые невозможно или очень дорого. Суть метода заключается в извлечении из первоначального небольшого набора выборку меньшего размера сформированную случайным образом. Эту процедуру повторяют многократно и в результате получают достаточно большую суммарную выборку которую и используют в последующем в стат расчетах.

Во первых. Рынок форекс не является случаем «дефицита данных». Напротив — это как раз случай «изобилия данных».

Во вторых. Длительный опыт исследования и применения бустинга и кроссвалидации на практике и в университетах показал, что эти методы нежелательно применять в процессе обучения, т. е. при выборе модели по внутренней ошибке. Но очень полезно на стадии оценки обученной модели, т. е. получении внешней ошибки. Поэтому для нашего случая «изобилия данных» разделение на train/valid/test при обучении идеальное решение. Есть много других тонкостей, которые нужно учитывать в процессе выбора и предподготовки данных и от которых в большой степени зависит результат моделирования, но это отдельная большая тема.

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


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

Вопрос- каким таким волшебным образом отсеиваются неинформативные признаки? Определение(оценка) важности предикторов (importance) заложена в каждом алгоритме деревьев решения, но критериев по которым определяют важность довольно много и не все дают однозначные результаты. Вы как это решаете в программе? 

Цитата: «Алгоритм не требует предварительной нормировки данных, и вообще, каких-бы то ни было предварительных манипуляций. Все данные автоматически приводятся к единичной дисперсии и нулевому математическому ожиданию.”

Единственные алгоритм который действительно не требует никакого препроцессинга это RandomForеst. Все остальные требуют различную предобработку. Вы очевидно хотели сказать, что Ваша программа процесс стандартизации (х минус среднее деленное на стандартное отклонение) выполняет за пользователя? Я не уверен, что это хорошее решение, так как существует еще по крайней мере десяток различных способов препроцессинга и нужно в каждом индивидуальном случае определять какой из них лучший.

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

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

Цитата:»Алгоритм  практически не подвержен склонности к переобучению.”

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

Цитата:»Алгоритм  позволяет классифицировать данные на произвольное число классов”

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

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

Может я Вас удивлю, но все алгоритмы имеют эту особенность.

Итог. Непонятный алгоритм, который Вы предлагаете за деньги, можно реализовать прозрачно, просто и в различных вариантах на языке R и заметьте совершенно безвозмездно, т. е. бесплатно. Программа эта будет длиной 10-15 строк кода. Это первое. Второе, Неоспоримое преимущество языка R – он разрабатывается и поддерживается мировым научным сообществом (практически все университета мира) а сейчас и гигантами программного бизнеса. Майкрософт запустила облачный сервис «Azure” с Microsoft Azure Machine Learning Studio” которая позволяет в облаке произвести все стадии создания, обучения и оценки модели и в последствии получать предсказания отправляя данные в сервис к своей модели. Сервис основан полностью на языке R и имеет графический интерфейс позволяющий свести процесс к «рисованию» картинки (это я упрощаю конечно). Если раньше язык был де факто стандартом в исследовательских кругах, то сейчас он практически стал таковым в прикладной и промышленной области.

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

Щательней надо. Как говорил классик.

Успехов


CyberCortex
CyberCortex | 1 фев 2015 в 21:12
vlad1949:


Hello!

"Вообще эта область называется «Машинное обучение», искусственный интеллект это несколько другое."  - Машинное обучение - это подраздел искусственного интеллекта. Но я уверен, что вы просто забыли об этом. Бывает...

О новых типах нейронных сетей я слышал:) И, если вы заметили, в описании к моей программе сказано "классических нейронных сетей", а не всех сетей. Под классическими я подразумеваю MLP, его производные, сеть Хопфилда, вероятностная сеть и прочие. 

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

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

 "Для тех кто не в теме. «Бустинг»(усиление) — метод ресемплинга предложенный..." - я не знаю откуда вы это скопипастили, но, по-моему, то, что описывает это определение, это не бустинг, а бутстреп:) Бустинг - это усиление простых классификаторов. В бустинге не получают одну большую выборку N из малой m. В бустинге для каждого последующего простого классификатора  преимущественно отбираются примеры, неправильно классифицированные предыдущим. Количество примеров всегда равно первоначальному.  После этого особенно смешно читать ваше серьезное: "Для тех кто не в теме." xD

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

"Длительный опыт исследования и применения бустинга и кроссвалидации на практике и в университетах показал..." - да ладно? Boring...

"Из своего опыта длительных экспериментов с ADA могу сказать- иногда отличные результаты, иногда отвратительные = очень нестабилен. " - Ваш опыт для нас  - не аксиома, возможно, вы перепутали какие-нибудь кнопочки там или еще чего, подобно тому, как путались чуть выше. I don't know.

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

 "Я не уверен, что это хорошее решение" - вам не кажется, что вы слишком категоричны? Сдается мне, разработчику софта немного виднее, что нужно добавить, чтобы работало как задумано.

 "Неправда. Любой известный алгоритм бустинга имеет минимум два параметра которые нужно тюнинговать для получения лучшего результата." - какие у вас там в R нужны параметры? Я записываю...

 "Цитата:»Алгоритм  практически не подвержен склонности к переобучению.” Ложное утверждение..." - Мне так нравятся ваши высказывания:). Ну, во-первых, там сказано, что "практически". На русском языке это означает "почти". Но если в данных существует устойчивая закономерность, например, как при эксперименте с распознаванием автомобильных номеров, то да, алгоритм не переобучается. На тренировочной выборке ошибка уходит в ноль, а на тестовой выборке ошибка остается постоянной, около 1%. Вопросы?

 "Это не есть достижение этого алгоритмаСегодня практически все алгоритмы машинного обучения делают это." - вы еще скажите, что это недостаток. Это преимущество по-сравнению с бинарным классификатором. Или вы так не считаете?

 "Может я Вас удивлю, но все алгоритмы имеют эту особенность." - Читайте внимательно "если в данных содержатся закономерности, – они будут найдены." Акцент мной ставится на этом. Главная проблема в алгоритмах машинного обучения заключается в том на сколько полно будут найдены эти закономерности. В моей программе с этим все нормально. По вашей логике получается, что имея какой-нибудь MLP, людям не стоит разрабатывать другие алгоритмы, ведь многослойный персептрон  - это алгоритм машинного обучения, а вы говорите, что "все алгоритмы имеют эту особенность". 

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

 "Я не против того, чтобы Вы монетизировали свой труд воплощенный в программу. " - Простите, ведь я забыл спросить о вашем мнении на этот счет. Но раз вы не против, то я спокоен.

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

Спасибо. Я кончил. Как говорил классик.

P.S.: Я всего лишь отвечаю на агрессию. Не обижайтесь. Peace.

P.P.S.: И да, зря вы начали со мной спорить:) 

 

 

 

 

 

 

 

Vasily Belozerov
Vasily Belozerov | 4 дек 2016 в 10:43

Ребята, приветствую! Вашу энергию, да в правильное русло!

Поздравляю, у Вас стратегическая ошибка!

Цитирую первую строку Вашей статьи: "Изначально, целью построения торговой системы является предсказание поведения некоторого рыночного инструмента, например, валютной пары".

Дальше читать статью даже не стал. Лучше изучите ВСЕ методы прогнозирования!

Открою Вам секрет: целью построения торговой системы является "Создание модели (Вашего) поведения".

Не важно что будет делать рынок (лидер), важно что будете делать Вы: И, ИЛИ, НЕ.

Например: И - погоня за лидером (повторение действий лидера).

Dr.Trader
Dr.Trader | 13 дек 2016 в 13:50

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

Путём анализа ошибок установки получил такой список пакетов которые нужно установить в самой операционной системе до установки rattle в R:

в консоли - 
$ sudo apt-get install libxml2-dev unixodbc-dev libssl-dev libgtk2.0-dev 

И потом уже можно запускать установку в самом R -
> install.packages("rattle", dependencies=TRUE) 

А если всё равно будет не хватать ещё каких-то *.h файлов для установки rattle - нужный пакет можно найти так
$ sudo apt-get install apt-file
$ apt-file update
$ apt-file search /someheaderfile.h

 

Может это поможет кому-то ещё :) 

Рецепты MQL5 - обработка типичных событий графика Рецепты MQL5 - обработка типичных событий графика

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

Рецепты MQL5 - обработка события TradeTransaction Рецепты MQL5 - обработка события TradeTransaction

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

Подготовка торгового счета к миграции на виртуальный хостинг Подготовка торгового счета к миграции на виртуальный хостинг

Клиентский терминал MetaTrader идеально подходит для автоматизации торговых стратегий. Для разработчиков торговых роботов в нем есть всё ‒ мощный язык программирования MQL4/MQL5 на основе C++, удобная среда разработки MetaEditor, многопоточный тестер стратегий с поддержкой распределенных вычислений в MQL5 Cloud Network. В этой статье вы узнаете, как перенести свой клиентский терминал со всеми разработками в виртуальную среду.

Рецепты MQL5 - обработка пользовательских событий графика Рецепты MQL5 - обработка пользовательских событий графика

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