Скачать MetaTrader 5

Курс Монетки и основанный на нем Индикатор Трендовости

26 января 2011, 17:00
Гребенев Вячеслав
50
6 242


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


Курс монетки – определение, иллюстрация, свойства

Для начала смоделируем результат броска монетки с помощью генератора случайных чисел. Итак, обозначим орла как +1, а решку -1. Результат i-ого броска монетки x(i)=p(1/2), где p(1/2) есть функция принимающая значения +1 с вероятностью 1/2 и -1 с той же вероятностью 1/2. Тогда курс монетки будет просто сумма  x(i).  Стартуем для простоты с нуля.

Курс монетки. По оси ординат – значения курса, по оси абсцисс – количество бросков монетки.

Рис.1 Курс монетки: по оси ординат – значения курса, по оси абсцисс – количество бросков монетки.

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

  1. Теоремы арксинуса. Чем дольше мы бросаем монетку, тем реже курс монетки переходит через ноль.
  2. Курс монетки 90 процентов времени находится с одной стороны от нуля. Собственно, эти две теоремы бесполезны при реальной торговле. Да и нам они нужны только для того, чтобы подчеркнуть отличия реальных курсов валютных пар от курса монетки.
  3. Курс монетки - фрактал, то есть курс подобен сам себе при изменении масштаба. Фрактал – слово красивое, да и картинки фракталов тоже красивы. Полезно то, что статистические параметры курса сохраняются при изменении масштаба.
  4. Теорема о пьяном матросе. Курс монетки – это след пьяного матроса, который, слив депозит, удаляется от кабака  со средней скоростью пропорциональной корню квадратному из числа шагов (или бросков монетки). Эта очень полезная теорема позволяет оценить случайность или не случайность событий. Если мы каким-то чудом выиграли в орлянку 65 раз из 100, то это нам просто повезло, или с чудом надо поделиться частью выигрыша за его полезность?

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

Несколько замечаний  о торговле 

  1. На курсе монетки невозможно угадать, куда двинется курс в следующий момент.
  2. Курс монетки может как угодно далеко отойти от нуля, как в плюс так и  в минус за достаточно большое количество бросков.
  3. Никакая торговая система не может в среднем ни выиграть, ни проиграть на курсе монетки. Тут стоит уточнить, что пока рынок игрушечный, денежные средства торговой системы могут уходить в минус (становиться отрицательными).  Торгуем конечное число бросков. На последнем броске все сделки закрываются. Ключевое словечко «в среднем» можно заменить фразой «при усреднении по набору из всех возможных курсов».
    Если же денежные средства торговой системы ограничены и не могут уходить в минус, то справедливо будет следующее высказывание: Любая торговая система, активно торгуя на курсе монетки, будет в среднем терять денежные средства, пока их полностью не потеряет.
  4. Если позволить посредникам брать маленький спред с каждой сделки, то денежные средства будут убывать со скоростью  пропорциональной количеству сделок. Оптимальная стратегия при торговле с посредниками - не играть вообще. Если же поторговать очень хочется, то поставить всё на одну сделку. В этом случае вероятность выигрыша максимальна, но всё равно меньше 0.5.
  5. На курсе монетки будут работать большинство индикаторов и торговых советников.  Многие из них будут советовать продавать или покупать. Но их советы абсолютно бессмысленны. Правильный торговый советник на курсе монетки с учётом посредников должен выдать одну рекомендацию – «Не входить в рынок». 
  6. Значения Z счёта для любой торговой стратегии на курсе монетки будут нормально распределены вокруг нуля. Конкретное значение Z-счёта на какой то реализации курса монетки никак не характеризует торговую стратегию. На курсе монетки все кошки серы, в смысле, все торговые стратегии одинаковы. Торговые стратегии различаются способом угадывания будущих изменений курса, а курс монетки предугадать невозможно.
  7. На курсе монетки можно наблюдать тренды, циклы, фигуры разворота, каналы и прочую атрибутику технического анализа. Это всё мнимые фигуры и торговать они никак не помогут. Уж такова психология трейдера – видеть миражи в пустыне, где нет ни капли информации.
  8. Если двое с ограниченным количеством монеток у каждого будут играть в орлянку, то выигрывать в среднем  будет тот, у кого монеток больше, так как игра автоматически прекращается, если у одного кончились деньги. Если в орлянку играют трейдер и рынок, то шансы трейдера на выигрыш в среднем пропорциональны отношению капитала трейдера к объёму рынка. Скажем проще – у трейдера нет шансов. Даже если нет посредников.
  9. На курсе монетки можно провести чемпионат. Каждому участнику даются условные денежные средства. Спонсоры обещают реальные деньги тем, кто наберёт больше всех условных денег. Математическое ожидание прибыли становится существенно положительным. Возникает задача о реализации стратегии мартингейла оптимизированной под условия чемпионата. Наиболее агрессивные сольют депозит задолго до конца, осторожные наберут мало средств. Среди середняков курс монетки разыграет лотерею. Интересно, что стратегия должна быть оптимизирована не только под количество бросков монетки и начальный депозит, но и под количество и агрессивность других участников. Но оставим это уже для другой статьи. Прелесть курса монетки заключается в том, что он позволяет решать такие задачи оптимизации точно, как численно при моделировании, так и аналитически. А решённую задачу уже с пониманием можно переносить в реальную жизнь.

Отличия реального курса от курса монетки

Высказывания 1-8 достаточно пессимистичны. Они предрекают безусловный слив депозита любому трейдеру на рынке монетки. Но курсы реальных валютных пар отличаются от курса монетки. Эти отличия – ключ к построению прибыльной (в среднем!) торговой стратегии. Перечислим основные отличия реального курса (некой валютной пары) от курса монетки.

  1. Реальный курс ограничен фундаментальными экономическими факторами и находится в границах некого фундаментального горизонтального канала. На этом факте, например, можно построить стратегию торговли «на волатильности» на больших таймфреймах.
  2. Изменения реального курса иногда можно предсказать, например, основываясь на новостях.
  3. Существуют  отличия в статистических распределениях параметров реального курса и курса монетки. Эта очень общая фраза является ключом к подавляющему большинству торговых стратегий. Реальный курс или курс монетки рассматриваются как ряд чисел. Ставится задача найти статистические закономерности в ряду и на их основе предсказать дальнейший курс.   

Ряд изменений курса монетки представляет собой ряд из случайно набранных +1 и -1. Как же искать в этом ряду статистические закономерности? Этот вопрос совпадает с задачей проверки ряда на случайность. Разработано очень много тестов проверки рядов на случайность. Если какой либо тест покажет «неслучайность» ряда, то на его базе можно строить торговую стратегию.


Понятие трендовости

Самый простой тест такой. Количество +1 и -1 в ряду должно быть примерно равно. По теореме о пьяном матросе количество +1 может отличаться от количества -1 в основном не более чем на корень квадратный из числа членов ряда.  Для реального курса этот тест на случайность выполняется просто в силу ограниченности реального курса фундаментальным каналом. Тут нам торговой стратегии не построить.

Куда интересней другой тест. Посчитаем количество цепочек «+1, +1», «+1, -1»,  «-1, +1»  и  «-1, -1». В случайном ряду их количество должно быть примерно равно (опять же с точностью до теоремы о пьяном матросе). Если количество цепочек ++ (переобозначим «+1, +1» ) вдруг заметно превышает количество цепочек +- («+1, -1»), то строим стратегию: После каждого + ставим на +. И по статистике мы должны выигрывать чаще, чем в половине случаев. 

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

Можно рассмотреть не только двучленные цепочки  ( ++, +-, -+, -- ),  но и трёхчленные  (+++, ++-, +-+, …) и более длинные цепочки. Можно посчитать количество трендовых (+++, ---, ++++) и антитрендовых (-+-, +-+, +-+-) цепочек или присвоить каждой цепочке коэффициент трендовости и посчитать сумму с коэффициентами. В конечном итоге такая деятельность приведёт нас к расчёту Z счёта. Но Z счёт здесь рассчитывается не в ряду выигрышей-проигрышей стратегии, как привыкли трейдеры, а в ряду изменений курса. Отрицательный Z счёт будет означать трендовый курс, а положительный  Z счёт говорит об антитрендовости курса.

Рассмотрение длинных цепочек и расчет Z счёта требуют достаточно длинного ряда (от 30 членов). Наша цель построение индикатора трендовости, и рассмотрение длинных рядов приведёт к сильному запаздыванию индикатора. Рассмотрение двучленных цепочек можно начинать уже с 8-членного ряда. Поэтому для построения индикатора пока остановимся на двучленных цепочках. Для серьёзного исследования курса (скажем, для построения симулятора курса) надо будет пользоваться Z счётом.


Курс монетки с трендом, иллюстрация

Проиллюстрируем понятие трендовость на курсе монетки «для наглядности». Одно из определений тренда такое: Тренд - это память курса о предыдущих изменениях. Курс монетки не помнит своей истории. Ну что ж, добавим ему памяти – пусть теперь результатом i-ого броска монетки будет x(i)=p(1/2+а*х(i-1)), где а – параметр трендовости – принимает значения от -1/2 до +1/2. Функция р(…) генерирует +1 с вероятностью 1/2+а*х(i-1) и -1 с вероятностью  1/2-а*х(i-1). Если а<0, то курс антитрендовый. Если а>0, то курс трендовый. Если а=0, то курс бестрендовый.

Курсы, сгенерированные на одной последовательности случайных чисел, представлены на картинке.

Курсы монетки с трендом

Рис.2 Сгенерированные курсы монетки: красный трендовый (а=0.2), синий бестрендовый (а=0) и жёлтый антитрендовый (а=-0.2).

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

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

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

На антитрендовом курсе можно торговать «на волатильности». Антитрендовый курс стремится сломать любой наклонный тренд и перейти в горизонтальный канал. Можно ставить Take Profit в любом месте горизонтального канала, независимо от текущего тренда, а Stop Loss за границами канала. Как бы цена ни гуляла по каналу рано или поздно она заденет Take Profit.

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


Предложение по симулятору курса

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

Где:

  • Amp - амплитуда,
  • P(...) - функция вероятности,
  • Trend - трендовость, функция предыдущих изменений курса,
  • Cycle - цикличность, функция времени,
  • Limit - функция от значений самого курса,
  • Expect - ожидания, функция будущих изменений.

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

Симуляция реального курса курсом монетки имеет гораздо более глубокое значение, чем просто иллюстрация слабости человеческого восприятия. Симуляция курса позволяет протестировать любого советника на ПОЛНОМ наборе возможных курсов (ну или хотя бы на разумной выборке из полного набора). Что, в свою очередь, позволит построить функцию распределения вероятности средств данного советника. Эта функция распределения однозначно характеризует советника по прибыльности, агрессивности и другим параметрам.

Определение Полноты набора:

  1. Набор курсов Исторически Полный - если для любого исторически случившегося отрезка реального курса в наборе есть очень похожий на него курс. При увеличении числа курсов в наборе похожесть становится абсолютной (расстояние (норма) в пространстве курсов (функций) между реальным и ближайшим симулированным курсом стремится к нулю)
  2. Стратегии Незнайки – стратегии, сделки в которых совершаются как угодно, но без знания исторических и текущих значений курса. Результаты предыдущих сделок также неизвестны. Известны только время от старта или номер броска монетки. Незнайка, как и положено такому персонажу, никогда не платит спреды, комиссии и налоги. Незнайка также может иметь отрицательные средства.
    Набор курсов Математически Полный – если функция распределения вероятности средств любой стратегии Незнайки на наборе стремится к нормальному распределению.
  3. Набор Полный – если он математически и исторически полный.


Состояние дел на сегодняшний момент таково, что даже сам создатель торгового советника в MetaTrader 5 не знает истинных характеристик своего детища. Тестирование на исторических данных конечно лучше, чем ничего. Но исторических данных мало и они уже устарели. Кроме того, исторические данные могут входить в конструкцию советника в виде оптимизации – как же на них тестировать?  А так всеми любимая кривая средств (Equity) советника на исторических данных есть просто сечение функции распределения вероятности средств на исторически случившейся реализации курса. И являться достаточно полной характеристикой советника никак не может.

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

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

Функция распределения вероятности средств советника - это технический паспорт советника и гарантия производителя. Закон «О защите прав потребителей» на территории РФ для советников никто не отменял. Тут, правда, сначала надо будет построить систему сертификации симуляторов курса.


Индикатор трендовости

На идее трендовости курса построим самый простой индикатор трендовости. В отличие от курса монетки реальный курс дан в виде баров. Упростим реальный курс до курса монетки. Каждый бар заменим одним средним значением (high+low)/2 (смотри вопрос в конце статьи). В  ряду изменений курса выбросим амплитуды изменений и оставим только знаки. Получим ряд плюсов-минусов типа такого ++-+---+-+--…. Посчитаем количество трендовых цепочек  «++» и  «- -» и антитрендовых цепочек «+-» и «-+» за последние N баров.  В качестве индикатора берём величину «++» + «--» - «-+» - «+-». Для удобства нарисуем на индикаторе линии оценки силы трендовости: + и – корень квадратный из N. Код индикатора на MQL5 приведён в конце статьи (TrendingHL.mq5).

Индикатор трендовости на EURUSD

Рис.3 Индикатор трендовости на EURUSD, месячный таймфрейм. Курс почти всегда трендовый (выше нуля), а половину времени и сильно трендовый (выше верхней зелёной линии). Количество баров по которым считается трендовость N=30.

Поиграв с индикатором трендовости на курсе EURUSD, отметим следующее:

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

  2. Реальный курс далеко не всегда трендовый.

  3. Индикатор трендовости запаздывает, как и все другие индикаторы.

  4. Индикатор трендовости позволяет оценить размер неслучайной прибыли, которая  может быть получена трендовой торговой стратегией на данном графике. Среднее значение индикатора на рисунке примерно 7. Среднее изменение курса за один бар 0.01 доллара (на глаз). 0.01*7=0.07. Итого, с одного вложенного доллара можно иметь каждый месяц примерно 7 центов прибыли.  Оценка грубая, но порядок величины дает. Мы здесь забыли о посредниках, маржинальной торговле, моментах входа-выхода на рынок.

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

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

  6. Лучше всего трендовость видно на больших таймфреймах.

  7. Антитрендовость встречается редко.

  8. Не смотря на то, что реальный курс – фрактал, говорить о сохранении трендовости при смене масштаба (таймфрейма) если и можно, то с большой натяжкой.

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


    где:

    • Trend - трендовость,
    • AverChangePerBar - среднее абсолютное изменение курса за бар,
    • TimeInBar - длительность бара по времени (таймфрейм).


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

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

Поясним последний абзац подробнее. Есть два вида предсказаний курса - 1 и 2:  

  1. Мы знаем, что на случайном курсе (курсе монетки) зарабатывать нельзя. Мы исследуем реальный курс и видим, что на реальном курсе есть неслучайность, и она живёт на нём уже много лет. Ну, раз много лет неслучайность есть, то наверное и завтра будет. Вот и всё предсказание. Один из видов неслучайности – трендовость. Неслучайность курса порождена нарастанием общей массы капитала. Нарастание капитала составляет несколько процентов в год – ну где-то такой процент с капитала мы и будем иметь от спекуляций на этой неслучайности.
  2. Мы знаем не только историю курса, но и движения на соседних рынках. Сумма капитала по всем рынкам есть величина примерно постоянная. Мы исследуем движения капитала между рынками, находим закономерности, и на их основе предсказываем курс. Прибыль здесь будет пропорциональна неслучайному перетоку капитала между рынками. Но реализовать такие предсказания на MetaTrader 5 пока можно только в пределах валютного рынка. 

Те 7 процентов трендовой доходности (читай «трендовой неслучайности»), что мы намерили индикатором, есть сумма двух выше рассмотренных неслучайностей и ещё каких-то неслучайностей, которые я не знаю.

Рынки здесь рассматриваются как незамкнутые (открытые) системы с притоком и оттоком. Нарастание = приток - отток. Если приток больше оттока, то рынок (курс на рынке) трендовый. Если приток равен оттоку, то рынок бестрендовый. Если приток меньше оттока, то рынок антитрендовый.

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

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


Выводы

Написана ещё одна статья по форексу. Этих статей на рынке текстов в Интернете несколько сотен со средней ценой доллар за штуку. А бесплатных статей просто немерено. Что же нового в этой статье?

  1. Дано название «Курс монетки». Сама конструкция стара как мир,  но названия хорошего не было. Прошу всех пользоваться.
  2. Для удобства трейдеров приведены свойства курса монетки и создан индикатор, который позволяет отличить реальный трендовый курс от курса монетки.
  3. С помощью индикатора дана оценка прибыли, которую может получить трендовая торговая стратегия.
  4. Предложено добавить к торговой платформе MetaTrader 5 симулятор курсов. Предложена формула-идея для симулятора.  


Вопрос

Вопрос: Почему для индикатора взяты среднее (High + Low)/2? Ведь по этой цене нельзя торговать. И брать среднее опасно – усредненный (сглаженный) курс монетки будет иметь трендовость. Причём, чем больше усреднение (сглаживание), тем больше трендовость.

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


Влияние усреднения на индикатор трендовости. EURUSD, месячный таймфрейм. Нижний индикатор рассчитан по средним (High + Low)/2 (trendinghl.mq5). Средний индикатор рассчитан по цене Open (trendingopen.mq5). Верхний индикатор рассчитан по цене Close (trendingclose.mq5). Видно, что все индикаторы в среднем выше нуля и курс по любому индикатору трендовый. Но среднее значение индикатора, по Open и Close уже не 7, как для(High + Low)/2, а примерно 2. Для той точности, с которой даются оценки в статье, различие не существенное. Должен признать, что усреднение искусственно увеличило трендовость курса.

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

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

Как оценено в статье, неслучайности на курсе хватает на 10 процентов с капитала в год (с точностью до порядка). Такую величину на курсе глазами не увидеть и руками не ухватить.  Необходим механический советник. И битва в советнике пойдёт за единицы процентов с капитала в год, а в скором будущем и за десятые-сотые доли процента. Для того и необходим симулятор, чтобы отлавливать и оптимизировать доли процента прибыли. 

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

//+------------------------------------------------------------------+
//|                                                     Trending.mq5 |
//|                                      Copyright 2010, Grebenev V. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, Grebenev V."
#property description "Trending Indicator"
#property version   "1.00"
#property indicator_separate_window
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   3
#property indicator_type1   DRAW_LINE
#property indicator_type2   DRAW_SECTION
#property indicator_type3   DRAW_SECTION
#property indicator_color1  LightSeaGreen
#property indicator_color2  DarkGreen
#property indicator_color3  DarkGreen
#property indicator_label1  "Trending"

//--- input parameters N – количество баров, по которым считается трендовость
input int      N=30;

double ExtTRbuffer[];  // массив для индикатора
double ExtTRbufferP[]; // массив для верхней оценки трендовости
double ExtTRbufferM[];  // массив для нижней оценки трендовости
double average[150000]; // массив для средних значений курса


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator digits
//   IndicatorSetInteger(INDICATOR_DIGITS,0);
//--- indicator short name
   IndicatorSetString(INDICATOR_SHORTNAME,"Trending");
//---- index buffer
   SetIndexBuffer(0,ExtTRbuffer);
   SetIndexBuffer(1,ExtTRbufferP);
   SetIndexBuffer(2,ExtTRbufferM);
//--- set index draw begin
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,1);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,1);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,1);
//---- Array Initialization
   ArrayInitialize(ExtTRbuffer,0);
   ArrayInitialize(ExtTRbufferP,0);
   ArrayInitialize(ExtTRbufferM,0);
   ArrayInitialize(average,0);
   return(0);
  }


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   double pp=0,pm=0,mp=0,mm=0; // pp - количество цепочек «++», pm  - количество цепочек «+-», mp – «-+», mm – «- -»

// Заполняем массив средних значений курса average значениями (high+low) /2
   for(int i=prev_calculated;i<rates_total;i++) average[i]=(high[i]+low[i])/2;

   for(int i=prev_calculated;i<rates_total;i++)
     {
      pp=0; pm=0; mp=0; mm=0;

      for(int j=0;j<N;j++)
        {
         if(i-j-2>=0) // проверяем, чтобы индекс массива не вышел за границу 0
           {
            if((average[i-j-1]-average[i-j-2])>0 && (average[i-j]-average[i-j-1])>0) pp++;
            if((average[i-j-1]-average[i-j-2])>0 && (average[i-j]-average[i-j-1])<0) pm++;
            if((average[i-j-1]-average[i-j-2])<0 && (average[i-j]-average[i-j-1])>0) mp++;
            if((average[i-j-1]-average[i-j-2])<0 && (average[i-j]-average[i-j-1])<0) mm++;
            // цепочки содержащие «0» просто выбросили
           }
        }
      // заполняем массивы индикатора
      ExtTRbuffer[i]=pp+mm-pm-mp;
      ExtTRbufferP[i]=sqrt(N);
      ExtTRbufferM[i]=-sqrt(N);
     }
   return(rates_total);
  }

Прикрепленные файлы |
trendingclose.mq5 (3.85 KB)
trendinghl.mq5 (3.81 KB)
trendingopen.mq5 (3.85 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (50)
Леонид
Леонид | 18 июн 2011 в 13:17

Сохранить

 

JohnyPipa
JohnyPipa | 13 апр 2012 в 15:21

Автору огромное спасибо. Жду Ваших новых статей.

Rashid Umarov
Rashid Umarov | 13 апр 2012 в 15:30

Предлагаю автору написать статью на тему Разборчивой невесты. На одном форуме много лет назад на основе этой задачи делались попытки построить торговую систему.
Гребенев Вячеслав
Гребенев Вячеслав | 9 июл 2012 в 09:51
Rosh:

Предлагаю автору написать статью на тему Разборчивой невесты. На одном форуме много лет назад на основе этой задачи делались попытки построить торговую систему.
Не понял идею системы. У невесты все женихи заведомо разные. У торговой системы все будущие сделки одинаковые.
Ivan Vagin
Ivan Vagin | 31 июл 2013 в 14:31

Задача о разборчивой невесте, или проблема остановки выбора может быть сформулирована следующим образом:[1]

Невеста ищет себе жениха (существует единственное вакантное место).

Есть известное число претендентов — n.

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

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


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

 

Если предложение принято, процесс останавливается.


Цель — выбрать лучшего претендента.

 

Этой задаче было уделено много внимания во многом потому, что оптимальная стратегия имеет интересную особенность: если число кандидатов достаточно велико (порядка сотни), оптимальная стратегия будет заключаться в том, чтобы отклонить всех первых n/e (где e=2{,}718\,281\ldots — основание натурального логарифма) претендентов и затем выбрать первого, кто будет лучше всех предыдущих[2]. При увеличении n вероятность выбора наилучшего претендента стремится к 1/e, то есть примерно к 37 %.


Невеста, это советник

Женихи - валютные пары

Оценка по критериям ТС на предмет максимального соответствия заданным параметрам.

В этом раскладе - можно существенно подвинуть устойчивый торговый постулат о количестве параметров системы в сторону увеличения, поскольку

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

При огромном количестве фильтров, - сигналов все таки не будет вообще....

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

..... с выбором индикаторов в качестве критериев - отдельная тема... 

При оценке первых n/e нужно буферить результат оценки

Стоп перебор как только попадается кандидат с оценкой выше чем любой из первых n/e

 

Первоисточник уверяет о более чем 50% вероятности выбора идеального жениха при переборе 37% претендентов

http://www.mccme.ru/mmmf-lectures/books/books/book.25.pdf 

 Таким образом, в этом случае шансы принцессы на удачный выбор

(при оптимальной стратегии) больше 50%.

Торговые события в MetaTrader 5 Торговые события в MetaTrader 5

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

Новый индикатор технического анализа Moving Mini-Max и его реализация в MQL5 Новый индикатор технического анализа Moving Mini-Max и его реализация в MQL5

В статье рассматривается новый индикатор технического анализа Moving Mini-Max, разработанный З.К. Силагадзе в 2008 году. Индикатор основан на модели туннельного эффекта, предложенного Г. Гамовым в теории альфа-распада. Описывается реализация индикатора на MQL5 и возможности его использования в торговле.

Реализация индикаторов в виде классов на примере Zigzag и ATR Реализация индикаторов в виде классов на примере Zigzag и ATR

Споры о том, какой способ расчета индикаторов является оптимальным, идут постоянно. Где лучше вычислять значения индикатора - в самом индикаторе или встроить всю логику в код самого эксперта, который его использует? В статье рассматривается один из вариантов переноса кода пользовательского индикатора iCustom непосредственно в код эксперта или скрипта с оптимизацией расчетов и моделированием значения prev_calculated.

Универсальная регрессионная модель для прогнозирования рыночной цены Универсальная регрессионная модель для прогнозирования рыночной цены

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