My newbie system for reading threads

 

Введение

Перед началом изучения данной статьи, рекомендую ознакомиться с первой статьей из серии: "Разработка самоадаптирующегося алгоритма (Часть I): Поиск базовой закономерности". Это не обязательное условие, основная суть будет понятна, но так будет интереснее.

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

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

Анализ недостатков

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

  • Сигналы на открытие серии генерируются слишком редко. Повышение качества сигнала сильно снижает количество сигналов на вход и общую прибыль;
  • Для анализа берется фиксированное окно выборки. Пусть выборки и заданы диапазоном, но анализировать одну выборку не слишком эффективное решение. Рынок не синусоида и "хвосты" влияют на текущее качество сигнала. Границы выборки должны быть нечеткими и влиять на итоговое решение. Грубо говоря, в предыдущей версии бралось 100 свечей, и анализировался перевес падающих и растущих. Если перевес проходил порог, то генерировался сигнал на вход. Выборка должна быть не фиксированной, а динамической. Нужно проверять не только какая ситуация была в окне для анализа, но и что было за пределами окна для анализа;
  • Пороговый процент имеет фиксированное значение для каждой выборки, не зависимо от числа свечей в этой выборке. Такое решение не эффективно, по тому что вероятность появления 75% перевеса в выборке 30 свечей и в выборке 200 свечей, далеко не одинаковая, она снижается нелинейно с увеличением числа свечей в выборке;
  • Открытие позиций на каждой свече слишком затратно и приводит к повышению просадок. Часто открывается слишком много позиций, нужно уменьшить число открываемых позиций в серии. Так повысится эффективность использования капитала;
  • Закрытие позиций с фиксированным числом прибыли на лот снижает стабильность или доходность. Приходится искать компромисс между стабильностью и доходностью, на постоянно меняющемся рынке. Без корректировки этого параметра, робот в скором времени получит убыток просто по тому что пропустит оптимальную точку закрытия серии позиций;
  • Жесткое ограничение числа инструментов для одновременной торговли снижает общую прибыльность системы. Сигналы открытия серий на разных инструментах немного коррелируют между собой, соответственно получение убытка по одному инструменту может коррелировать с получением убытка по другому инструменту. Нужно разработать меры, позволяющие уменьшить корреляцию сигналов, чтобы можно было существенно увеличить число одновременно торгуемых инструментов, без значительного увеличения величины просадки.

Упрощенный алгоритм работы

Напомню, как упрощенно работала первая версия алгоритма. В новой версии смысл работы останется аналогичным, но каждый шаг будет переработан и улучшен.
  • сканируется окно из N свечей; 
  • проверяется каких свечей больше, падающих или растущих;
  • если перевес больше порогового, то сигнал на начало серии позиций; 
  • больше падающих свечей = сигнал Buy, больше растущих = Sell;
  • расcчитывается лот;
  • открывается новая позиция на каждой следующей свече, пока не сработает условие на закрытие серии; 
  • срабатывает условие закрытия серии;
  • закрываются все позиции;
  • поиск нового сигнала.

Модернизация

Робот был разработан в 2016 году, и создавался под MetaTrader 4, поэтому код прикреплю в конце для этого терминала.

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

  1. Динамический пороговый процент начала серии

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

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

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

CP,

где

  • С - число сочетаний
  • n - число свечей в выборке
  • k - число растущих свечей
  • P - вероятность наступления события
  • P2 - удвоенная вероятность события

Вероятность события P нужно умножать на 2 по тому что P посчитано для случая, когда больше свечей одного направления падающих или растущих. Нас интересует общая вероятность, не важно какого направления. Умножать вероятность на 2 не нужно только, если число падающих свечей = числу растущих.

Для примера посчитаем вероятность наступления события, когда из 30 свечей 24 свечи одного направления и 6 другого. Для этого я сделал таблицу, ка на рисунке 1 ниже.

probability table

Рисунок 1. Таблица вероятностей

24 свечи одного направления из 30, соответствует 80% перевеса. Вероятность появления такой комбинации 0.11%. Теперь сравню по таблице, какой процент перевеса должен быль для 100 свечей в выборке, чтобы ее вероятность появления была 0,11%. Для 100 свечей такой вероятности появления комбинаций не встречается. Есть вероятность появления 0.172% и 0.091%. Выберу более редкий вариант и он соответствует соотношению одного типа свечей к другому, как 66/34, или 66% свечей одного направления.

Ясно, что комбинации для 30 свечей с 75% перевесом падающих или растущих свечей будет встречаться также часто как комбинация из 100 свечей с 66% перевесом. Зависимость процента перевеса от числа свечей, нелинейная, поэтому для корректировки процента, с увеличением числа свечей, нужно применить нелинейную функцию. Я разработал такую функцию:

Nonliner proc

Где

  • Nb - число свечей в выборке.
  • Koef_NonLiner_proc - коэффициент из настроек, нужен, чтобы корректировать пороговый процент

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

Chart function

Рисунок 2.

На рисунке 2 фиолетовым цветом показан график уменьшения процента перевеса, при увеличении числа свечей в выборке и фиксированной вероятности появления такой комбинации. Красным цветом показан график разработанной функции уменьшения процента перевеса, от числа свечей в выборке. Видно, что обе функции нелинейные, но разработанная функция затухает медленнее. Это сделано специально, по тому что чем больше свечей в выборке, тем больше в серии может открыться позиций при возврате к 50% в. Больше позиций, значит больше нагрузка на депозит и больше просадки. 

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

2. Повышение качества сигналов

Чтобы повысить качество сигнала, выборка не должна состоять из жестко фиксированного числа свечей. Мы видим перевес растущих свечей 65% на 30 свечах, но много это или мало? Если на 100 свечах тоже есть какой - то перевес растущих свечей то этот факт должен делать сигнал сильнее, если же там нет перевеса или наоборот, есть перевес падающих свечей, то сигнал нужно ослабить. Я разработал 2 механизма усиления или ослабления сигнала.

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

Если первая выборка с самым маленьким числом свечей, то ее весовой коэффициент W1, для второй выборки, весовой коэффициент W2 и так далее до Wn

weighted average

  • W1 - весовой коэффициент первой выборки
  • W2 - весовой коэффициент второй выборки
  • Wn - весовой коэффициент n выборки
  • Nb1 - число свечей первой выборки
  • Nbn - число свечей n выборки
  • Pw - средневзвешенный процент перевеса свечей.
  • P1 - процент падающих/растущих свечей первой выборки
  • Pn - процент падающих/растущих свечей n выборки

Если первая выборка с самым маленьким числом свечей, то весовые коэффициенты нужно перевернуть

inverted weights
Для получения сигнала на начало серии, средневзвешенный процент нужно сравнивать с отдельным значением, указанным в настройке "Porog_Weighted_proc".

б) Использование множественной выборки это второй вариант повышения качества сигнала. Из диапазона нужно набрать несколько выборок, у которых перевес одного типа свечей больше порогового. Тут будем считать, что чем на большем числе выборок процент перевеса больше порогового, тем выше качество сигнала. В качестве порогового процента тут будет использоваться нелинейный процент. То есть для каждой выборки со своим числом свечей, должен использоваться свой пороговый процент перевеса.
В настройке "Kol_vibor" буду задавать минимальное число выборок, на которых перевес должен быть больше порогового. Тип свечей, для которых будет определяться процент перевеса, будут зависеть от того, какой тип свечей преобладает в первой выборке. Тут за первую выборку берется та, на которой найден перевес выше порогового. Я сделал, чтобы диапазон можно было перебирать от меньшего к большему и наоборот, чтобы сравнить, как будет лучше работать.
Такая методика помогает учитывать сигнал в более широком окне и не привязываться к фиксированному окну анализа. Например диапазон окна анализа задается от 30 до 300 свечей с шагом 2, и для формирования сигнала, нужно набрать не менее 5 выборок из этого диапазона с перевесом больше порогового. Перевес может сформироваться га 30, 52, 100, 101, 200 свечах. Так можно эффективнее оценить, что происходило в широком диапазоне числа свечей и не привязываться к фиксированному числу свечей.

Price Chart

Рисунок 3.

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

Ранее я писал, что число свечей (а соответственно и число позиций в серии) (вставить ссылку на предыдущую статью), на котором теоретически будет компенсирован возникший перевес, рассчитывается исходя из числа свечей, на котором он возник. Благодаря такому подходу делаются первые шаги к появлению самоадаптации. Алгоритм еще далек от самоадаптирующегося, но использование текущих характеристик рынка, для небольшой корректировки параметров работы, уже приближает его к цели.
Идеальный алгоритм не должен содержать настраиваемых параметров, каждый параметр должен абсолютно точно быть рассчитан на основе текущих характеристик рынка. Мы должны точно знать, какие параметры работы должны быть установлены в каждый момент времени, чтобы алгоритм оставался прибыльным.
3. Уменьшение числа открываемых позиций в серии

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

Были разработаны 2 меры, уменьшающие число позиций в серии.

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

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

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

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

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

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

open positions befor

open positions after

Рисунок 4

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


Прибыль Максимальный убыток Число позиций Profit factor
Открытие на каждой свече +71.99$ -463.96$ 92 1.56
Открытие с контролем процента перевеса +42.26$ -263.86$ 48 1.68

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

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

4. Модернизация закрытия позиций в прибыли

В первой версии алгоритма (добавить ссылку на место), было введено понятие прибыль на лот. Это значение устанавливалось в валюте депозита для размера лота равного единице. Далее считалось число лотов по открытым позициям серии и значение из настроек умножалось на текущий суммарный лот по открытым позициям серии. Например в настройках установлено закрыть серию позиций, когда прибыль станет больше 15$ на лот. Сейчас открыто 11 позиций по 0.01 лоту, значит общая позиция 0.01*11=0.11. Далее прибыль на лот, умножается на полученное число лотов 15$*0.11=1.65$. Если общая прибыль по открытым позициям достигнет 1.65$, серию позиций нужно завершить.

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

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

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

Я отказался от контроля прибыли в валюте депозита, по тому, что цена пункта не постоянна для валютных пар типа USD/XXX и меняется от текущего значения цены. Прибыль будет контролироваться в пунктах. Для этого нужно взять текущее значение индикатора ATR (в пунктах) и умножить на значение из настроек "Koef_multi_ATR". Получилось число пунктов для закрытии в прибыль. Далее для каждой позиции считается сколько прошло пунктов от цены открытия до текущего значения и находится среднее значение для всех позиций. Полученное среднее значение сравнивается с числом пунктов для закрытия в прибыль. Если среднее число пунктов больше или равно числу пунктов для закрытия, то серия завершается, если нет, то на следующей свече процедура повторяется. 

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

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

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

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

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

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

Чтобы корреляция между сигналами открытия серий на разных инструментах была как можно меньше, нужно разбить валютные пары на отдельные валюты, и считать что открываются позиции по отдельным валютам. Если открыта позиция Sell по EURUSD, то данная позиция делится на позицию Sell по EUR и Buy по USD. Перед началом каждой новой серии, нужно проверять, есть позиции по валютам входящим в пару или нет. Если есть позиция Sell по EUR, то нужно запретить начало любой серии, где будет требоваться продать EUR. Но не нужно запрещать сигналы, в которых нужно купить EUR. 


Рисунок 5

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

Currencies 2

Рисунок 6.

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

6. Коррекция лота от текущей волатильности

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

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

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

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

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

Тесты

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

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

GBPUSD 2000 tester chart

GBPUSD 2000 Tester report

Рисунок 7. GBPUSD 2000.01.01 - 2020.12.08 статичный лот

На рисунке 7 показан тест GBPUSD для таймфрейма H1, за период почти 21 год с 2000.01.01 по 2020.12.08. Оптимизацию я делал в 2017 году, когда использовал этого робота для реальной торговли и сейчас не проводил дополнительной оптимизации, просто взял настройки того времени. Тут используется множественная выборка из диапазона. Диапазон анализа 68-200 свечей и используется 15 выборок.

Если первая версия алгоритма проходила тест только с 2001 года, то вторя версия уже спокойно проходит тест с 2000 года. По сравнению с первой версией алгоритма (вставить ссылку на картинку), в 3 раза увеличилось число позиций, и в 1.9 раза увеличилась прибыль. Профит фактор уменьшился с 7.5 до 2.74, но все еще остается на достойном уровне. Сигналы на начало серии генерируются чаще, а средне число позиций в серии уменьшилось. Наверное можно подобрать настройки и лучше, но я взял те, что использовал для торговли.

Ранее была разработана функция коррекции лота от текущего значения ATR. На рисунке 8 проведен тот-же тест, что и для рисунка 7, но с динамическим лотом, зависящим от волатильности. Так ка для 3000$ использовался лот 0.01, то для корректной работы алгоритма коррекции размера лота, я увеличил депозит до 30 000$ и соответственно поднял лот до 0.1.

GBPUSD 2000 tester chart dyn lot

GBPUSD 2000 Tester report dyn lot

Рисунок 8. GBPUSD 2000.01.01 - 2020.12.08 динамический лот, зависящий от ATR 

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

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


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

 

Yes there are a lot of information.

I want to say what i am doing in this case.

I am openning this link https://www.mql5.com/en/forum every time (refreshing for example) to see new posts and to open link "New posts".

Besides this link https://www.mql5.com/go?link=https://www.forex-tsd.src/search is helping a lot to find something.

 

Hi niewdigital,

Thanks! Not only that, but there's also a thread search.

Even more, if there are some threads that contain copies of PDF eBooks, you can use Acrobat Pro to read the eBooks to you. If you don't have Acrobat Pro there are a number of free utilities that will also do the job.

Once you get used to the digitized voices, it's not bad at all.

moneyline

 

And there is some chat somewhere which we used one month ago.

Reason: