Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 97 сообщений
Cообщения с меткой

торговля на бирже - Самое интересное в блогах

Следующие 30  »
жизнелюбка

адекватные брокеры или как не прогореть на финансовом рынке

Вторник, 05 Июля 2016 г. 19:10 (ссылка)

Многие из нас ищут дополнительный заработок, который будет не только приносить денег, но и не отнимать много времени. Одни на это скажут, что глупо мечтать о несбыточном, другие махнут рукой. Но факт остается фактом, сегодня множество людей зарабатывают в сети. Конечно, чтобы начать любой вид деятельности в сети необходимо мужество и кроме этого много сил, но со временем затраченные силы приводят к успеху и отличному заработку. В основном силы и терпение необходимы для того, чтобы приобрести опыт и необходимые знания. К сожалению, опыт приходит через ошибки и обман, особенно если вы решили зарабатывать на финансовом рынке. Чтобы избавить вас от лишних переживаний сразу скажу, что надежным брокером является privatefx.com, прочесть о нем можно тут http://www.everythingis-ok.ru/kompaniya-privatefx-i-otzyvy-o-nej/, вы спросите почему именно этот брокер? А все просто, именно с ним вы всегда сможете без проблем связаться и решить различные вопросы, в том числе спорные.

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

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

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Перевод] Алгоритмы сжатия данных без потерь: что они говорят о рынках

Вторник, 10 Мая 2016 г. 17:19 (ссылка)





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



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



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



Эффективность рынка и гипотеза случайного блуждания



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



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



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



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



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



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



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



Алгоритмическая теория информации и случайность



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



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







Модель машины Тьюринга



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



Что происходит, когда мы закладываем в машину Тьюринга случайную последовательность S? Если нет логики в распределении данных, машине нечего симулировать. Единственный вариант получить на выходе случайную последовательность – print S. Но эта программа длиннее, чем случайная последовательность S. Поэтому ее сложность, по определению, выше. Вот что имеют в виду, когда говорят, что случайная последовательность несжимаема. Другой вопрос, чем мы можем подкрепить факт, что найденная нами программа самая короткая из возможных? Для того чтобы прийти к такому выводу нам следовало бы перебрать бесконечное число комбинаций.



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



Компрессия и случайность рынка: постановка проблемы



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



Вызов 1: конечная последовательность и бесконечность


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



Вызов 2: дрейф рынка


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



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



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







Модель 1 (Броуновское движение) — в среднем, все пути ведут в никуда, при нулевом отклонении. При бинаризации эта модель превращается в последовательность подбрасывания монеты







Модель 2 (Геометрическое Броуновское движение) — пути ведут вверх, а отклонение является ненулевым. При бинаризации в результаты будет вноситься искажение



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



Вызов 3: стохастическая волатильность и разрывы


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



Тест сжатия для рыночной случайности



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



Методология проверки


Методология основана на трех известных алгоритмах сжатия: {gzip, bzip2 и xz}.




  • Нужно загрузить рыночные индексы с Quandl.com.

  • Затем рассчитывать логарифмические возвраты индексов и обозначить их как r.

  • Подсчитать их среднее (компонент отклонения) –

https://habrahabr.ru/post/283252/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Служба_поддержкиТЦ

Узнай 5 мифов о бинарных опционах

Пятница, 01 Апреля 2016 г. 17:57 (ссылка)


Узнай 5 мифов о бинарных опционах



С вами ТЦ С нуля в миллионеры и Академия инвестирования Dem Winner


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


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


Миф № 1. Прибыль в размере 70% от инвестиции заработать невозможно
Читать далее
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Служба_поддержкиТЦ

Секретные технологи заработка $ 75 за одну ставку, и дохода от 5% в день за одну торговую сессию на бинарных опционах!

Пятница, 01 Апреля 2016 г. 17:27 (ссылка)


Приветствуем Вас!



 



На связи ТЦ С нуля в миллионеры и Академия Инвестирования “DeM WINNER”



 



Сегодня в 18-00 посетив наш интенсив => Вход на интенсив



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



а если и говорят, то только за большие деньги!



 



Через 30 минут успешный трейдер, практик Константин Беседин,



поделится с вами секретными технологиями заработка $ 75 за одну ставку,



и дохода от 5% в день за одну торговую сессию на бинарных опционах!



 



СЕГОДНЯ мы Вам НЕ будем предлагать никаких "волшебных таблеток" и ненужной теории. Besedin.jpg



Мы будем давать материал, накопленный годами практики,



по самому безопасному и прибыльному способу торговли –



бинарными опционами.



читать далее
Метки:   Комментарии (1)КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество
Sonya_kot

Дивергенция в бинарных опционах: что это и можно ли с ней работать

Пятница, 20 Февраля 2016 г. 02:54 (ссылка)

binarnyj-opcion (218x183, 36Kb)

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


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


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


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


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


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

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Эксперимент: Насколько иррациональна биржевая торговля на коротких интервалах (скальпинг)

Вторник, 16 Февраля 2016 г. 12:50 (ссылка)






Разработчик и трейдер Йоан Кристиан Лоттер, создатель бога Financial Hacker, написал интересный материал, в котором рассказал о своем эксперименте, призванном выяснить, имеет ли смысл торговля с использованием коротких и сверхкоротких интервалов для совершения сделок. Мы представляем вашему вниманию главные мысли этой заметки. Читать дальше →

https://habrahabr.ru/post/277337/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
LizaDm

Заработок в интернете путём торговли на бирже

Понедельник, 11 Января 2016 г. 11:17 (ссылка)


В этой речь пойдет о трейдинге. Что это такое?Трейдинг — это заработок на бирже. Я, для примера, буду рассматривать биржу Forex.


Что же такое биржа Forex( далее FX)?


Это заработок на изменении курса валюты по отношению к другой валюте. Конечно, предсказать в какую сторону будет меняться та или иная валюта порою очень трудно, но разработчики FX создали специально для новичков ряд программ, предсказывающих изменение какой-либо валюты(к примеру — Autochartist). Но всё же очень сильно полагаться на эти программы не стоит, так как не всегда прогнозы оказываются правильными. Но как же предсказывают изменение валюты профессионалы, спросите вы. Всё очень просто. Они проводят анализ изменения курса той или иной валюты за какой-либо отрезок времени(час, день, месяц) и тем самым делают вывод. Для новичка такой способ покажется очень сложным, ведь он требует много времени, терпения и усилий. Поэтому я и советую новичкам использовать программы-предсказатели(всё тот же Autochartist и ряд других).


5975799_17686894845_4a1fa6215e_c (700x467, 99Kb)


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


Биржа FX использует для вывода средств WebMoney(если вы с ней не знакомы, советую ознакомиться).


 

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Эволюция торговых терминалов: Мобильный-трейдинг в эпоху тач-интерфейсов

Среда, 16 Сентября 2015 г. 10:11 (ссылка)





Ранее в нашем блоге мы рассказывали об эволюции интерфейсов мобильных терминалов на примере приложений ITinvest — по сравнению с выпущенным в 2003 году приложением для телефонов с Windows Mobile 2003, интерфейс программ для iOS и Android в 2015 году стал значительно проще (меню и кнопки стали больше, число настроек сократилось).



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



Одним из вариантов подобного упрощения, помимо уменьшения количества элементов на экране, является адаптация приложения к работе в «эпоху touch». Именно по этому пути пошли разработчики торгового приложения Robinhood.



Свайп на биржу



Приложение Robinhood для iOS и Android использует для совершения финансовых операций с ценными тапы и свайпы — таким образом работа с приложением становится больше похоже на процесс проверки почты или просмотра ленты в соцсети.



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







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



Чем проще, тем лучше



«Мы думаем, что [торговля на бирже] не особенно увлекательное занятие для многих людей, — говорит сооснователь проекта Байжу Бхатт (Baiju Bhatt). — Если люди не думают о финансах, а им так или иначе приходится выстраивать финансовую траекторию своей жизни, то это значительная проблема».



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







В настоящий момент Robinhood работает в США, компания также объявила о планах по расширению бизнеса в Австралии, Канаде и Великобритании. Компания за два года привлекла $66 млн инвестиций, которые потратила в том числе на разработку приложения для Apple Watch.







По данным Wall Street Journal, средний возраст более чем 80% пользователей Robinhood не превышает 26 лет. Далеко не все из них постоянно торгуют на бирже — многие, по словам Тенева, просто изучают ситуацию на рынке.



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



Original source: habrahabr.ru (comments, light).

http://habrahabr.ru/post/266947/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] Возможности Matlab для разработки и тестирования механистических торговых систем

Четверг, 18 Июня 2015 г. 18:44 (ссылка)

Думаю, обосновывать необходимость тщательного тестирования и подбора параметров торговых стратегий нет необходимости… Лучше поясню, почему именно Matlab.



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



image

image



На мой взгляд, эта система тестирования обладает рядом существенных недостатков:

1) Нельзя использовать реальные тиковые данные, можно их только моделировать по хранящимся на сервере данным минутных, 5-минутных, 15-минутных и т.д. таймфреймов;

2) Для подбора оптимальных параметров стратегии достаточно скудный набор доступных оптимизационных процедур;

3) Чуть более разнообразный, но всё же недостаточный набор целевых показателей торговой стратегии, которые можно оптимизировать;

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



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



Всё это возможно при использовании Matlab в качестве платформы разработки и тестирования стратегий. От MetaTrader нам понадобятся исходные данные (в моём примере: ежесекундные текущие цены по 27-ми валютным парам). Потом MetaTrader всё-таки будет использоваться для работы с готовой торговой стратегией, реализованной, например, в виде DLL, но вся самая творческая часть создания системы произойдёт в более математической среде.



Данные собираются пользовательским индикатором, код которого на MQL4 выглядит так:



//+------------------------------------------------------------------+
//| pack_collector.mq4 |
//| Copyright 2014, JamaGava |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, JamaGava"
#property link ""
#property version "1.00"
#property strict

int filehandleData;
int filehandleHead;
int filehandleVolHead;
int filehandleVolData;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
EventSetTimer(1);
filehandleData = FileOpen("tickPack.csv",FILE_WRITE|FILE_CSV);
filehandleHead = FileOpen("tickPackHead.csv",FILE_WRITE|FILE_CSV);
filehandleVolHead = FileOpen("tickPackVolumeHead.csv",FILE_WRITE|FILE_CSV);
filehandleVolData = FileOpen("tickPackVolume.csv",FILE_WRITE|FILE_CSV);

FileWrite(filehandleHead,

"bid:AUD/USD", "ask:AUD/USD",
"bid:EUR/USD", "ask:EUR/USD",
"bid:GBP/USD", "ask:GBP/USD",
"bid:NZD/USD", "ask:NZD/USD",
"bid:USD/CAD", "ask:USD/CAD",
"bid:USD/CHF", "ask:USD/CHF",
"bid:USD/JPY", "ask:USD/JPY",
"bid:AUD/CAD", "ask:AUD/CAD",
"bid:AUD/CHF", "ask:AUD/CHF",
"bid:AUD/NZD", "ask:AUD/NZD",
"bid:CAD/CHF", "ask:CAD/CHF",
"bid:EUR/AUD", "ask:EUR/AUD",
"bid:EUR/CAD", "ask:EUR/CAD",
"bid:EUR/CHF", "ask:EUR/CHF",
"bid:EUR/GBP", "ask:EUR/GBP",
"bid:EUR/NZD", "ask:EUR/NZD",
"bid:GBP/AUD", "ask:GBP/AUD",
"bid:GBP/CAD", "ask:GBP/CAD",
"bid:GBP/CHF", "ask:GBP/CHF",
"bid:GBP/NZD", "ask:GBP/NZD",
"bid:NZD/CAD", "ask:NZD/CAD",
"bid:NZD/CHF", "ask:NZD/CHF",
"bid:AUD/JPY", "ask:AUD/JPY",
"bid:CAD/JPY", "ask:CAD/JPY",
"bid:CHF/JPY", "ask:CHF/JPY",
"bid:EUR/JPY", "ask:EUR/JPY",
"bid:GBP/JPY", "ask:GBP/JPY",
"bid:NZD/JPY", "ask:NZD/JPY"

);


FileWrite(filehandleVolHead,

"volume:AUD/USD",
"volume:EUR/USD",
"volume:GBP/USD",
"volume:NZD/USD",
"volume:USD/CAD",
"volume:USD/CHF",
"volume:USD/JPY",
"volume:AUD/CAD",
"volume:AUD/CHF",
"volume:AUD/NZD",
"volume:CAD/CHF",
"volume:EUR/AUD",
"volume:EUR/CAD",
"volume:EUR/CHF",
"volume:EUR/GBP",
"volume:EUR/NZD",
"volume:GBP/AUD",
"volume:GBP/CAD",
"volume:GBP/CHF",
"volume:GBP/NZD",
"volume:NZD/CAD",
"volume:NZD/CHF",
"volume:AUD/JPY",
"volume:CAD/JPY",
"volume:CHF/JPY",
"volume:EUR/JPY",
"volume:GBP/JPY",
"volume:NZD/JPY"

);
FileClose(filehandleHead);
FileClose(filehandleVolHead);
return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer();
FileClose(filehandleData);
}

//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
FileWrite(filehandleData,
MarketInfo("AUDUSD", MODE_BID), MarketInfo("AUDUSD", MODE_ASK),
MarketInfo("EURUSD", MODE_BID), MarketInfo("EURUSD", MODE_ASK),
MarketInfo("GBPUSD", MODE_BID), MarketInfo("GBPUSD", MODE_ASK),
MarketInfo("NZDUSD", MODE_BID), MarketInfo("NZDUSD", MODE_ASK),
MarketInfo("USDCAD", MODE_BID), MarketInfo("USDCAD", MODE_ASK),
MarketInfo("USDCHF", MODE_BID), MarketInfo("USDCHF", MODE_ASK),
MarketInfo("USDJPY", MODE_BID), MarketInfo("USDJPY", MODE_ASK),
MarketInfo("AUDCAD", MODE_BID), MarketInfo("AUDCAD", MODE_ASK),
MarketInfo("AUDCHF", MODE_BID), MarketInfo("AUDCHF", MODE_ASK),
MarketInfo("AUDNZD", MODE_BID), MarketInfo("AUDNZD", MODE_ASK),
MarketInfo("CADCHF", MODE_BID), MarketInfo("CADCHF", MODE_ASK),
MarketInfo("EURAUD", MODE_BID), MarketInfo("EURAUD", MODE_ASK),
MarketInfo("EURCAD", MODE_BID), MarketInfo("EURCAD", MODE_ASK),
MarketInfo("EURCHF", MODE_BID), MarketInfo("EURCHF", MODE_ASK),
MarketInfo("EURGBP", MODE_BID), MarketInfo("EURGBP", MODE_ASK),
MarketInfo("EURNZD", MODE_BID), MarketInfo("EURNZD", MODE_ASK),
MarketInfo("GBPAUD", MODE_BID), MarketInfo("GBPAUD", MODE_ASK),
MarketInfo("GBPCAD", MODE_BID), MarketInfo("GBPCAD", MODE_ASK),
MarketInfo("GBPCHF", MODE_BID), MarketInfo("GBPCHF", MODE_ASK),
MarketInfo("GBPNZD", MODE_BID), MarketInfo("GBPNZD", MODE_ASK),
MarketInfo("NZDCAD", MODE_BID), MarketInfo("NZDCAD", MODE_ASK),
MarketInfo("NZDCHF", MODE_BID), MarketInfo("NZDCHF", MODE_ASK),
MarketInfo("AUDJPY", MODE_BID), MarketInfo("AUDJPY", MODE_ASK),
MarketInfo("CADJPY", MODE_BID), MarketInfo("CADJPY", MODE_ASK),
MarketInfo("CHFJPY", MODE_BID), MarketInfo("CHFJPY", MODE_ASK),
MarketInfo("EURJPY", MODE_BID), MarketInfo("EURJPY", MODE_ASK),
MarketInfo("GBPJPY", MODE_BID), MarketInfo("GBPJPY", MODE_ASK),
MarketInfo("NZDJPY", MODE_BID), MarketInfo("NZDJPY", MODE_ASK)
);

FileWrite(filehandleVolData,
iVolume("AUDUSD", PERIOD_H1,0),
iVolume("EURUSD", PERIOD_H1,0),
iVolume("GBPUSD", PERIOD_H1,0),
iVolume("NZDUSD", PERIOD_H1,0),
iVolume("USDCAD", PERIOD_H1,0),
iVolume("USDCHF", PERIOD_H1,0),
iVolume("USDJPY", PERIOD_H1,0),
iVolume("AUDCAD", PERIOD_H1,0),
iVolume("AUDCHF", PERIOD_H1,0),
iVolume("AUDNZD", PERIOD_H1,0),
iVolume("CADCHF", PERIOD_H1,0),
iVolume("EURAUD", PERIOD_H1,0),
iVolume("EURCAD", PERIOD_H1,0),
iVolume("EURCHF", PERIOD_H1,0),
iVolume("EURGBP", PERIOD_H1,0),
iVolume("EURNZD", PERIOD_H1,0),
iVolume("GBPAUD", PERIOD_H1,0),
iVolume("GBPCAD", PERIOD_H1,0),
iVolume("GBPCHF", PERIOD_H1,0),
iVolume("GBPNZD", PERIOD_H1,0),
iVolume("NZDCAD", PERIOD_H1,0),
iVolume("NZDCHF", PERIOD_H1,0),
iVolume("AUDJPY", PERIOD_H1,0),
iVolume("CADJPY", PERIOD_H1,0),
iVolume("CHFJPY", PERIOD_H1,0),
iVolume("EURJPY", PERIOD_H1,0),
iVolume("GBPJPY", PERIOD_H1,0),
iVolume("NZDJPY", PERIOD_H1,0)
);


}
//+------------------------------------------------------------------+


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



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



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



Скрипт loadPrices.m:



global PRICES;
N = 16;

PRICES = cell( N, 1 );

fNames = {
'C:\matlabR2008a_win\work\frx\DATA\1\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\2\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\3\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\4\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\5\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\6\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\7\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\8\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\9\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\10\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\11\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\12\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\13\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\14\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\15\tickPack.csv';
'C:\matlabR2008a_win\work\frx\DATA\16\tickPack.csv';
};


for i = 1:N
PRICES{ i } = load( fNames{ i } );
display( i );
end



В итоге все блоки данных сохранены в глобальной переменной PRICES, представляющей собой 16 ячеек.



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



Скрипт testStrat.m:



function [R] = testStrat( P )

global DrawDown;
global Recovery;
global Equity;
global DealsNumber;
global MeanDeal;
global DealsSigma;
global Sharp;
global ProfitFactor;
global ProfitDealsNumber;
global ProfitDealsRate;
global ProfitMean;
global LossDealsNumber;
global LossDealsRate;
global LossMean;

global returnParamIndex;

global stratName;


initRates( 0 );


feval( stratName, P );


switch( returnParamIndex )
case 1
R = DrawDown;

case 2
R = -Recovery;

case 3
R = -Equity;

case 4
R = -DealsNumber;

case 5
R = -MeanDeal;

case 6
R = DealsSigma;

case 7
R = -Sharp;

case 8
R = -ProfitFactor;

case 9
R = -ProfitDealsNumber;

case 10
R = -ProfitDealsRate;

case 11
R = -ProfitMean;

case 12
R = LossDealsNumber;

case 13
R = LossDealsRate;

case 14
R = LossMean;

case 0
R = struct( ...
'DrawDown', DrawDown, ...
'Recovery', Recovery, ...
'Equity', Equity, ...
'DealsNumber', DealsNumber, ...
'MeanDeal', MeanDeal, ...
'DealsSigma', DealsSigma, ...
'Sharp', Sharp, ...
'ProfitFactor', ProfitFactor, ...
'ProfitDealsNumber', ProfitDealsNumber, ...
'ProfitDealsRate', ProfitDealsRate, ...
'ProfitMean', ProfitMean, ...
'LossDealsNumber', LossDealsNumber, ...
'LossDealsRate', LossDealsRate, ...
'LossMean', LossMean ...
);

end



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



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



Собственно, характеристики системы:

DrawDown — максимальная просадка (максимальная разность между предшествующим максимумом и текущим значением);

Recovery — фактор восстановления (отношение итогового выигрыша к максимальной просадке);

Equity — итоговый выигрыш;

DealsNumber — количество сделок;

MeanDeal — средний доход по сделке;

DealsSigma — стандартное отклонение доходов по каждой сделке от среднего значения;

Sharp — коэффициент Шарпа (отношение среднего дохода по сделке к стандартному отклонению доходов по сделкам от среднего значения);

ProfitFactor — профит фактор (отношение суммарной прибыли к суммарному убытку);

ProfitDealsNumber — число выигрышных сделок;

ProfitDealsRate — доля выигрышных сделок;

ProfitMean — средний выигрыш (за успешную сделку);

LossDealsNumber — число убыточных сделок;

LossDealsRate — доля убыточных сделок;

LossMean — средний проигрыш (за убыточную сделку).



Инициализируются эти показатели функцией initRates.m



function [z] = initRates( mode )

global DrawDown;
global Recovery;
global Equity;
global DealsNumber;
global MeanDeal;
global DealsSigma;
global Sharp;
global ProfitFactor;
global ProfitDealsNumber;
global ProfitDealsRate;
global ProfitMean;
global LossDealsNumber;
global LossDealsRate;
global LossMean;

global maxEquity;
global dealSqr;
global totalProfit;
global totalLoss;

z = mode;

maxEquity = 0;
dealSqr = 0;
totalProfit = 0;
totalLoss = 0;


if mode == 0

DrawDown = 0;
Recovery = 0;
Equity = 0;
DealsNumber = 0;
MeanDeal = 0;
DealsSigma = 0;
Sharp = 0;
ProfitFactor = 0;
ProfitDealsNumber = 0;
ProfitDealsRate = 0;
ProfitMean = 0;
LossDealsNumber = 0;
LossDealsRate = 0;
LossMean = 0;

else

DrawDown = 1000;
Recovery = -1000;
Equity = -1000;
DealsNumber = 0;
MeanDeal = -1000;
DealsSigma = 1000;
Sharp = -1000;
ProfitFactor = 0;
ProfitDealsNumber = 0;
ProfitDealsRate = 0;
ProfitMean = 0;
LossDealsNumber = 100000;
LossDealsRate = 1000;
LossMean = 1000;

end



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



maxEquity, dealSqr, totalProfit, totalLoss,



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



В ходе выполнения стратегии, при каждом закрытии сделки, будем обновлять характеристики работы стратегии. Для этого используем функцию updateStratRates.m:



function [z] = updateStratRates( dealResult )

z = sign( dealResult );

global DrawDown;
global Recovery;
global Equity;
global DealsNumber;
global MeanDeal;
global DealsSigma;
global Sharp;
global ProfitFactor;
global ProfitDealsNumber;
global ProfitDealsRate;
global ProfitMean;
global LossDealsNumber;
global LossDealsRate;
global LossMean;


global maxEquity;
global dealSqr;
global totalProfit;
global totalLoss;



Equity = Equity + dealResult;

if Equity > maxEquity
maxEquity = Equity;
end

down = maxEquity - Equity;
if down > DrawDown
DrawDown = down;
end

Recovery = Equity / DrawDown;


DealsNumber = DealsNumber + 1;
MeanDeal = Equity / DealsNumber;
dealSqr = dealSqr + dealResult^2;
DealsSigma = sqrt( (dealSqr / DealsNumber) - MeanDeal^2 );
Sharp = MeanDeal / DealsSigma;

if dealResult > 0
ProfitDealsNumber = ProfitDealsNumber + 1;
totalProfit = totalProfit + dealResult;
ProfitMean = totalProfit / ProfitDealsNumber;
else
LossDealsNumber = LossDealsNumber + 1;
totalLoss = totalLoss + dealResult;
LossMean = totalLoss / LossDealsNumber;
end

ProfitFactor = -totalProfit / totalLoss;
ProfitDealsRate = ProfitDealsNumber / DealsNumber;
LossDealsRate = 1 - ProfitDealsRate;



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



Исходные данные можно получить, например так:



global pairIndex;        % номер/номера интересующей валютной пары/пар
global DATA; % блоки данных
global dataBlocksNumber; % количество блоков данных (в нашем примере 16)


Теперь подробнее о торговой системе, twoEMA, на примере которой которой покажу, как это всё работает.

Идея системы состоит в использовании двух экспоненциальных скользящих средних. Вход в рынок осуществляется при соблюдении следующих условий:



Покупка/продажа осуществляется, если выполняются все условия:

1) Быстрая скользящая средняя выше/ниже медленной не менее чем на определённое количество 4-х значных пунктов;

2) Цена открытия таймфрейма выше/ниже быстрой скользящей средней;

3) Нет текущих открытых сделок.



Закрытие при выполнении любого из условий:

1) Достижение установленного значения прибыли по текущей сделке;

2) Достижение установленного значения убытка по текущей сделке (tralling stop-loss по мере роста дохода по сделке он подтягивается к текущей цене, вплоть до достижения безубыточных значений);

3) Появление условий 1 и 2 на открытие сделки в противоположную сторону.



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



Кроме того, предусмотрим два режима работы стратегии: отладочный и демонстрационный.

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



Таким образом, каждая сделка может быть представлена стандартным «баром» вместо традиционного линейного графика Equity. Прибыль считается в 4-х значных пунктах.



twoEMA.m:



function [Z] = twoEma( P )

%{
+---------------------------------------------------------------+
! !
! Parameters: !
! timeframe = P(1) !
! E1 - slow EMA with alpha = P(2) !
! E2 - fast EMA with alpha = P(3) !
! !
! Open: !
! long deal: (openPrice >= E2 > E1) & abs(E1 - E2) >= P(4) !
! short deal: (openPrice <= E2 < E1) & abs(E1 - E2) >= P(4) !
! !
! Close: !
! by trailing Stop-loss or by Take profit !
! !
+---------------------------------------------------------------+
%}

global pairIndex;

global DATA;
global dataBlocksNumber;

global WithPlot; % демонстрационный или отладочный режим
global EQ; % бары Equity
global eqCounter; % число баров


% проверка значений входных параметров на допустимость
if or( P( 1 ) < 0, ...
or( P( 4 ) * 0.0001 <= 0, ...
or( P( 5 ) * 0.0001 <= 0, ...
or( P( 6 ) * 0.0001 <= 0, ...
or( ...
or( P( 2 ) * 0.0001 <= 0, P( 2 ) * 0.0001 >= 1 ), ...
or( P( 3 ) * 0.0001 <= P( 2 ) * 0.0001, P( 3 ) * 0.0001 >= 1 ) ...
) ...
) ...
) ...
) ...
)

initRates( 1 ); % если значения входных параметров недопустимы, то характеристики стратегии
% инициализируем заведомо плохими значениями

Z = 1;
return;

end


initRates( 0 ); % инициализация значений параметров стратегии


% инициализация значений бара текущей сделки
currEQopen = 0;
currEQmin = 0;
currEQmax = 0;
currEQclose = 0;

TF = round( P( 1 ) ); % длина таймфрейма

for currBlock = 1:dataBlocksNumber


currData = DATA{ currBlock };
dataSize = size( currData );
dataLen = dataSize( 1 );
tfNumb = ceil( dataLen / TF );

% подготовка массивов bid и ask для текущего блока данных
bidPrices = currData( :, 2 * ( pairIndex - 1) + 1 );
askPrices = currData( :, 2 * pairIndex );

% инициализация рабочих переменных
dealDir = 0;
openDealPrice = 0;
stopLoss = 0;
takeProfit = 0;
currDeal = 0;
signal = 0;



E1 = bidPrices( 1 );
E2 = bidPrices( 1 );

currTime = 1;

for t = 2:tfNumb % по всем таймфреймам...

currTime = currTime + TF;

% определяем длину таймфрейма (последний таймфрейм может быть
% короче остальных)
barLen = TF;
if t == tfNumb
barLen = dataLen - TF * ( tfNumb - 1 );
end

for tick = 2:(barLen - 1) % по всем тикам внутри таймфрейма...


if dealDir == 1 % если открыта сделка покупки

% обновляем текущее состояние сделки
currDeal = bidPrices( currTime + tick ) - openDealPrice;

currEQmin = min( currDeal, currEQmin );
currEQmax = max( currDeal, currEQmax );
currEQclose = currDeal;

% обновляем текущее стоп-лосс
stopLoss = max( stopLoss, bidPrices( currTime + tick ) - P( 5 ) * 0.0001 );

% проверка на закрытие по стоп-лоссу или тейк-профиту
if or( bidPrices( currTime + tick ) <= stopLoss, ...
bidPrices( currTime + tick ) >= takeProfit ...
)

dealDir = 0;

% обновление характеристик стратегии
updateStratRates( currDeal );

% если демонстрационный режим, то закрытие бара
% текущей сделки
if WithPlot
[EQ, eqCounter] = updateSeries( EQ, eqCounter, [currEQopen, currEQmax, currEQmin, currEQclose] );
end

end

end

if dealDir == -1 % если открыта сделка продажи

currDeal = openDealPrice - askPrices( currTime + tick );

currEQmin = min( currDeal, currEQmin );
currEQmax = max( currDeal, currEQmin );
currEQclose = currDeal;

% обновляем текущее стоп-лосс
stopLoss = min( stopLoss, askPrices( currTime + tick ) + P( 5 ) * 0.0001 );

% проверка на закрытие по стоп-лоссу или тейк-профиту
if or( askPrices( currTime + tick ) >= stopLoss, ...
askPrices( currTime + tick ) <= takeProfit ...
)

dealDir = 0;

% обновление характеристик стратегии
updateStratRates( currDeal );

% если демонстрационный режим, то закрытие бара
% текущей сделки
if WithPlot
[EQ, eqCounter] = updateSeries( EQ, eqCounter, [currEQopen, currEQmax, currEQmin, currEQclose] );
end

end

end

end

% при открытии нового таймфрейма обновляем скользящие средние
E1 = E1 + P( 2 ) * 0.0001 * ( bidPrices( currTime ) - E1 );
E2 = E2 + P( 3 ) * 0.0001 * ( bidPrices( currTime ) - E2 );

% проверка текущего сигнала на открытие сделки
signal = 0;
if and( and( bidPrices( currTime ) >= E2, E2 > E1 ), abs( E1 - E2 ) >= P( 4 ) * 0.0001 )
signal = 1;
end
if and( and( bidPrices( currTime ) <= E2, E2 < E1 ), abs( E1 - E2 ) >= P( 4 ) * 0.0001 )
signal = -1;
end

% закрытие, если открыта сделка и есть сигнал на открытие
% противоположной
if or( ...
and( dealDir == 1, signal == -1 ), ...
and( dealDir == -1, signal == 1 ) ...
)

dealDir = 0;

% обновление характеристик стратегии
updateStratRates( currDeal );

% если демонстрационный режим, то закрытие бара
% текущей сделки
if WithPlot
[EQ, eqCounter] = updateSeries( EQ, eqCounter, [currEQopen, currEQmax, currEQmin, currEQclose] );
end

end

% открытие сделки на покупку
if and( dealDir == 0, signal == 1 )

dealDir = 1;
openDealPrice = askPrices( currTime ); % цена открытия

% стоп-лосс и тэйк-профит
stopLoss = bidPrices( currTime + tick ) - P( 5 ) * 0.0001;
takeProfit = bidPrices( currTime + tick ) + P( 6 ) * 0.0001;

% инициализация значений бара Equity
currEQopen = askPrices( currTime + tick ) - bidPrices( currTime + tick );
currEQmin = askPrices( currTime + tick ) - bidPrices( currTime + tick );
currEQmax = askPrices( currTime + tick ) - bidPrices( currTime + tick );
currEQclose = askPrices( currTime + tick ) - bidPrices( currTime + tick );

end

% открытие сделки на продажу
if and( dealDir == 0, signal == -1 )

dealDir = -1;
openDealPrice = bidPrices( currTime ); % цена открытия

% стоп-лосс и тэйк-профит
stopLoss = askPrices( currTime + tick ) + P( 5 ) * 0.0001;
takeProfit = askPrices( currTime + tick ) - P( 6 ) * 0.0001;

% инициализация значений бара Equity
currEQopen = askPrices( currTime + tick ) - bidPrices( currTime + tick );
currEQmin = askPrices( currTime + tick ) - bidPrices( currTime + tick );
currEQmax = askPrices( currTime + tick ) - bidPrices( currTime + tick );
currEQclose = askPrices( currTime + tick ) - bidPrices( currTime + tick );

end

end

% закрываем все открытые сделки
if dealDir ~= 0

% обновление характеристик стратегии
updateStratRates( currDeal );

% если демонстрационный режим, то закрытие бара
% текущей сделки
if WithPlot
[EQ, eqCounter] = updateSeries( EQ, eqCounter, [currEQopen, currEQmax, currEQmin, currEQclose] );
end

end

end


Z = 0;



В приведённом выше листинге используется вспомогательная функция updateSeries, это своего рода «push_back».



Функция updateSeries.m:



function [S, I] = updateSeries(s, i, v)

if i == 0

S = v;
I = 1;

else

I = i + 1;
S = [s; v];


end



Ну и наконец, как всё это вместе можно использовать:



Скрипт mainScript.m:



% loadPrices;            % загрузка данных

global stratName;
global returnParamIndex;

global pairIndex;
global DATA;
global PRICES;
global dataBlocksNumber;

global WithPlot;
global EQ;
global eqCounter;


stratName = 'twoEma'; % тестируем twoEMA

pairIndex = 2; % вторая валютная пара (EUR/USD)

DATA = PRICES;

dataBlocksNumber = 16;

WithPlot = false; % режим отладки

P = [900, 100, 310, 25, 100, 40]; % стартовые значения

returnParamIndex = 7; % оптимизируем коэффициент Шарпа

P = fminsearch( 'testStrat', P );
display(P);


WithPlot = true; % режим демонстрации
EQ = 0;
eqCounter = 0;
returnParamIndex = 0;
R = testStrat( P );

display(R);

for i = 2:eqCounter % приводим бары по сделкам к накопительному виду

EQ( i, 1 ) = EQ( i, 1 ) + EQ( i - 1, 4 );
EQ( i, 2 ) = EQ( i, 2 ) + EQ( i - 1, 4 );
EQ( i, 3 ) = EQ( i, 3 ) + EQ( i - 1, 4 );
EQ( i, 4 ) = EQ( i, 4 ) + EQ( i - 1, 4 );

end

candle(EQ(:, 2), EQ(:, 3), EQ(:, 4), EQ(:, 1)); title('Equity');


В результате equity торговой системы будет выглядеть так:



image



А характеристики так:



DrawDown: 0.0105

Recovery: 12.6103

Equity: 0.1320

DealsNumber: 47

MeanDeal: 0.0028

DealsSigma: 0.0056

Sharp: 0.5034

ProfitFactor: 3.3393

ProfitDealsNumber: 34

ProfitDealsRate: 0.7234

ProfitMean: 0.0055

LossDealsNumber: 13

LossDealsRate: 0.2766

LossMean: -0.0043



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



Но ведь у нас не было цели создать супер систему. А возможности использования Matlab продемонстрированы.

Original source: habrahabr.ru (comments, light).

http://habrahabr.ru/post/260635/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
bo4kov

Система торговых роботов

Пятница, 05 Июня 2015 г. 12:38 (ссылка)
vsevideokursi.ru/videokurs/...ih-robotov

Узнать о торговых роботах и понять, как с помощью них зарабатывать серьёзные суммы «на автомате», вы сможете из бесплатного видеокурса «Система торговых роботов».
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
bo4kov

Прибыльная торговля фьючерсами 2.0

Суббота, 04 Апреля 2015 г. 14:52 (ссылка)
vsevideokursi.ru/videokurs/...ersami_2_0


Как стабильно зарабатывать на бирже до 5 000$ в день торгуя фьючерсами? Этот тренинг является новой и улучшенной версией тренинга Евгения Стрижа по торговле фьючерсами.

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<торговля на бирже - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda