Как написать бот для торговли на бирже

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

Бум криптовалют

О, помните эти времена, когда из каждого утюга кричали про криптовалюты! «Биткоин снова обновил максимумы! Он стоит уже $1000, $2000, $3000!»

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

Где-то в начале этого безумного ралли финансовыми инструментами заинтересовался и я.

Первые шаги

Дело было в 2017 году. Тогда один Биткоин стоил $800, а я учился в магистратуре МФТИ.

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

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

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

Как торговать в плюс?

На этот вопрос вам с радостью ответит куча «экспертов» в интернете. Есть статьи, книги и даже обучающие видео. Люди утверждают, что существуют простые правила, следуя которым можно прогнозировать изменение цены и получать прибыль.

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

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

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

Нужен рисёрч

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

Есть стратегии разных типов. Большинство из них сводятся к одному — посмотрел на график, увидел Сигнал к росту — закупился. Увидел сигнал к падению — продал (или зашортил). Получается, купил подешевле, продал подороже – получил прибыль.

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

Другой пример вожделенных Сигналов — фигуры, которые образует график цены за какое-то время.

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

Начинаем работу

Я объединился с тремя однокурсниками-единомышленниками, и мы начали разработку торгового робота.

4 Физтеха: физик, программист, математик и дата саентист. Каждый из нас. Успех неизбежен!

Чтобы не слить все деньги сразу, мы скачали >100Гб исторических данных о ценах разных криптовалют и построили систему тестирования алгоритмов.

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

Проверяем известные стратегии

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

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

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

Оказывается, это соотношение всегда примерно 1:1. Если мы рассмотрим например 5000 молотов, то в ~2500 случаев цена после него пошла вверх, а в ~2500 – вниз. Если бы мы торговали по этой стратегии, то вышли бы примерно в ноль. Только заплатили комиссию 2 * 5000 раз. Понятно, что заработал здесь только брокер.

Волк с Уолл-стрит

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

Целый мир

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

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

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

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

Применяем профессиональные алгоритмы

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

Например, иногда можно купить за 1 биткоин 10 монет эфира, за 10 монет эфира купить 100 лайткоинов, а за 100 лайткоинов купить 1.1 биткоина. Если комиссия составила меньше 0.1 биткоина, вы заработали.

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

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

Баланс робота на основе внутрибиржевого арбитража

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

Пора переходить на следующий уровень.

Применяем машинное обучение

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

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

График цены с размеченными моментами покупки и продажи

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

Так меняется биржевой стакан во времени

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

1500% годовых

Однажды утром, проверяя результаты работы разных алгоритмов, я увидел, что один из них за 2 дня сделал +11% к портфелю.

Так менялся баланс аккаунта, с которого торговал наш робот, первые 60 часов

Вы только представьте эмоции, возникающие при виде такой доходности. 11% за 60 часов — это больше 1500% годовых без учета сложного процента!

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

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

Тачка трейдера Academeg

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

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

Баланс аккаунта, с которого торговал наш робот, 500 часов (20 дней)

Это была случайность.

Осознание

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

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

Tradingview.com

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

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

Деньги, время и силы лучше вложить в проекты, которые принесут пользу.

Я, например, основал Travers – Сервис для поиска инструкторов по сноуборду и горным лыжам.

Выводы

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

Я даже защитил магистерскую диссертацию на эту тему. А при подготовке общался с управляющим директором BCS Global Markets, Сергеем Глущенко. Тогда он руководил департаментом алгоритмической торговли.

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

Закончить я хотел бы цитатой известного инвестора.

По графику цены можно предсказывать только прошлое

Джейсон Стэйтем

Спасибо, что дочитали! Надеюсь, было не слишком много иронии. Если вам понравился стиль, загляните в мой профиль – там есть ещё классные статьи.

Я не рекламирую телеграмм канал – у меня его нет. Но буду рад, если подпишитесь на меня здесь. Аудитория VC мне нравится и думаю, что за этой штукой будущее. Фейсбуки и прочие Твитеры будут умирать..

А цифра в профиле тешит моё самолюбие)

Успехов вам и классных проектов!

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

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

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

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

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

С чего начать ?

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

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

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

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

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

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

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

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

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

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

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

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

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

Главный недостаток такого подхода проистекает из его достоинств – вы не знаете, как работает данный торговый робот и на каких принципах он построен. И если даже продавец предоставил вам подробное описание заложенной в нем торговой системы, вы никогда не будете в ней уверены до конца.

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

Я бы в трейдеры пошел, пусть меня научат

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

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

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

Первые шаги по созданию торгового робота

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

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

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

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

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

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

Выбор языка программирования

При выборе языка программирования нужно принять во внимание несколько важных факторов:

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

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

Всё украдено до вас

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

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

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

Поэтому вы можете смело брать доступные в исходном виде коды торговых роботов и пытаться найти правильное их использование на тех или иных инструментах и таймфреймах. Как говорится — «Вы не любите кошек? Вы просто не умеете их готовить!» В это трудно поверить, но вероятность того, что вы придумаете что-то принципиально новое, очень мала. Тут главное всё правильно сделать самому из доступных ингредиентов и не думать, что кто-то сверхумный пользуется какими-то секретными разработками из лабораторий NASA. В этом и заключается секрет Грааля.

Редкая птица долетит до середины Днепра…

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

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

Отклоняясь немного от темы, приведем в пример легендарную группу «Черепахи», которая успешно торговала на множестве рынков в конце 20-го века. Прочитав «Путь черепах», понимаешь, что главное в профессии трейдера именно железная внутренняя дисциплина, а не какая-то суперсекретная система. Взять хотя бы торговые системы А. Герчика — он дает их бесплатно, их можно скачать с торрентов бесплатно. Увы, большинство не сможет торговать по прибыльной стратегии, даже если получит её даром. И потому многие начинают подозревать, что их обманывают… )

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

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

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

Каждый трейдер желает… не торговать самостоятельно

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

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

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

А пока предлагаем проверить ваши торговые идеи в MetaTrader 5.

На каких языках программирования пишут торговых роботов – вопрос не праздный и не имеющий однозначного ответа.

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

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

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

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

Содержание

  1. В чем преимущества и недостатки самостоятельной разработки робота для торгов
  2. Какие шаги включает в себя процесс разработки торгового робо-советника
  3. Финансовый анализ, заложенные алгоритмы, торговый движок
  4. Как выбрать язык для программирования торговых роботов
  5. Отладка и тестирование торгового робота на виртуальном счете
  6. Знание каких языков программирования необходимы для создания торгового робота – разработка бота от А до Я
  7. MetaQuotes Language 5
  8. С#
  9. Java
  10. Python
  11. Инструменты, которые понадобятся при разработки робота для трейдинга
  12. Wealth-Lab
  13. MetaStock
  14. Omega Research
  15. TSLab
  16. StockSharp
  17. LiveTrade
  18. SmartX
  19. Основные этапы разработки бота для торговой площадки
  20. Этап 1: идея и детальные описания будущей системы
  21. Этап 2: предварительное тестирование
  22. Этап 3: анализ роботизированной системы
  23. Этап 4: ядро
  24. Этап 5: разработка торговой стратегии
  25. Этап 6: тестирование
  26. Этап 7: анализирование результатов
  27. Возможно ли разработать торгового робота для биржевой работы без навыков программирования?
  28. Способ 1: Написание торгового робота, используя инструменты внутреннего языка вашего программного обеспечения
  29. Способ 2: использование табличного процессора Excel
  30. Способ 3: использование аналитических платформ
  31. Способ 4: применение в процессе разработки трейдингового робота языков программирования

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

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

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

  • возможно стратегия, заложенная вами в бота, окажется прибыльной;
  • не каждый трейдеры имеет возможность оплатить услугу, так как стоимость создания скрипта может начинаться от 5$ и заканчиваться тысячами;
  • редко, когда система устраивает покупателя после первого раза, чаще код отправляется на доработку, чтобы исправить недочёты;
  • вы не сможете разобраться, что написал специалист, если не знаете языка программирования, что в итоге обесценит товар.

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

Однако и тут можно столкнуться со следующими неприятностями:

  • у вас не будет возможности подключить к системе любые выбранные индикаторы;
  • подобные роботы не предполагают работу с аналитическими данными и прямыми потоками котировок через API.

Какие шаги включает в себя процесс разработки торгового робо-советника

Финансовый анализ, заложенные алгоритмы, торговый движок

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

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

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

Создание алгоритмов для трейдинга, логика торговых роботов:

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

Чтобы создать максимально подробный первичный образ робота, ответьте себе на следующие вопросы:

  1. Нужно знать по какой стоимости приобретать тот или иной актив. Если мы выложили, а заявка по-прежнему висит, цена ушла. Берем по расценкам рынка?
  2. Что делать, если заявка отыграла себя только на половину? Остаток продаём по рыночной стоимости? Через какой промежуток времени?
  3. Отключаем робота раньше, чем завершиться торги? Насколько раньше? Будет ли он основан на спокойной волатильном боковике или, наоборот, на всплеске?
  4. В какие дни робот будет осуществлять торговлю? На протяжении всей недели или в активно волатильные дни – в понедельник и пятницу?
  5. Какие останавливающие приказы будут запрограммированы в робо-советнике?

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

Как выбрать язык для программирования торговых роботов

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

Если у вас уже есть определенные знания в сфере программирования и вы владеете, например, С#, то скорее всего вы будете писать стационарное приложение, в котором будет применено API торгового терминала вашего брокера, допустим это будет программный продукт QUIK.

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

Интересно! Если вы не сталкивались с программированием, но хотите обрести эти навыки и разработать собственного бота, обратите внимание на языки QPILE и QLUA, которые встроены в рабочий комплекс QUIK.

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

Третьим шагом будет проверка нашей работы, когда робот сформирован и написан.

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

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

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

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

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

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

Знание каких языков программирования необходимы для создания торгового робота – разработка бота от А до Я

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

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

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

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

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

  • торговый двигатель – доступная и простая система, отвечающая за выполнение легких задач, создается на языках C, C++;
  • торговый робот для управления настройками – данная система отвечает за управление алгоритмами и редактирует интерфейс пользователя, включает в себя механизмы представления результатов торговли; пишется программа на языках C++, С#, Java и подобные;
  • сервис для тестирования рабочей платформы на основе исторических данных и подбора параметров для торговли – модуль отвечает за тестирование новых алгоритмов, осуществляющееся на основе исторических данных, а также заново настраивает текущие алгоритмы; для написания используются только скриптовые языки программирования.

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

Востребованные языки программирования исходя из анализа рынка (безотносительно к разработке трейдинговых роботов)

Так какой же язык программирования для написания торгового робота выбрать: Java, Python, C# или C++?

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

Наибольшим спросом пользуются следующие языки: MetaQuotes Language 5, C#, Java, Python и C++. Последние два являются наиболее простыми для изучения.

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

Amibroker

MetaQuotes Language 5

Данный язык программирования похож на C++, на нем пишутся и разрабатываются программы для сервиса Meta Trader 5, используемой для торговли на биржах Forex, Futures и других.

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

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

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

Главными функциями программы являются:

  1. Консультант – автоматическая торговая система, которая привязывается к определенному графику.
  2. Графическое отображение рассчитанных зависимостей – это индикатор, разработанный клиентом в качестве дополнения к уже встроенных в систему датчикам.
  3. Скрипт – сценарий, где прописан ход действий, созданный для единоразового автоматического выполнения.
  4. Библиотека – совокупность общедоступных функций, где хранятся и распространяются часто используемые модули клиентских программ. Автоматически библиотеки никакие функции не выполняют.
  5. Включаемый файл – первоначальный текст часто используемых модулей пользовательских программ.

С#

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

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

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

Таким образом, разобравшись в С#, вы сможете работать на любой платформе, так как язык не имеет привязки к какой-то одной. На нем можно как тестировать торговые алгоритмы, так и заниматься написаниемкодов, скриптов и торговых инвестиционных брокеров.

Java

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

Java является объектно-ориентированным языком программирования, на котором работают многие высокоуровневые функции, важные для создания роботов.

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

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

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

Обратите внимание! Язык программирования Java можно эксплуатировать отдельно от программируемого сервиса.

Python

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

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

Инструменты, которые понадобятся при разработки робота для трейдинга

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

Wealth-Lab

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

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

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

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

Как выбрать язык программирования для создания торгового робота – программирование для трейдера:

MetaStock

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

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

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

Omega Research

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

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

TSLab

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

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

StockSharp

Программный инструмент StockSharp является бесплатным в базовой версии, но имеет расширенную версию Pro, в которой наиболее широкий и привлекательный функционал. Основным языком программирования является C#.

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

LiveTrade

Данный продукт является плодом работы петербуржской русской компании Cofite. Через встроенный в сервис терминал можно запускать роботов, а в продукте Robotlab от той же компании разрабатывать их.

Здесь также можно записывать торговые стратегии в виде блок-схемы, если не владеть навыком программирования, а затем реализовать их в терминале.

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

SmartX

Торговая площадка SmartX являет собой не привычный терминал, а полноценный программный продукт, включающий в себя векторный язык программирования TradeScript, созданный специально для разработки роботизированных инвестиционных брокеров в США американской компанией Modulus Financial Engineering

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

.

Главными преимуществами программного продукта являются:

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

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

Основные этапы разработки бота для торговой площадки

Этап 1: идея и детальные описания будущей системы

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

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

В чем заключается идея вашей торговой стратегии?

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

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

Этап 2: предварительное тестирование

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

Обратите внимание! Чтобы разобраться с основным функционалом робота-консультанта нужно выделить несколько дней свободного времени.

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

Этап 3: анализ роботизированной системы

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

Условно они делятся на две категории:

  • торговые;
  • дизайнерские.

Торговые риски – все те моменты, которые будут упущены в процессе разработки торгового алгоритма.

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

Этап 4: ядро

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

Этап 5: разработка торговой стратегии

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

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

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

Этап 6: тестирование

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

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

Если где-то имеются погрешности, вернитесь на 3 или 4 этап разработки и отредактируйте элементы в них.

Этап 7: анализирование результатов

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

Важно! Необходимо постоянно обновлять информацию и не пренебрегать записями в данном журнале.

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

Возможно ли разработать торгового робота для биржевой работы без навыков программирования?

ТОП-4 доступных и простых способа написания автоматизированного брокера без знания языков программирования

Не всегда есть время и возможность разбираться и изучать программные языки, но всё-таки есть огромное желание создать свою систему. И это реально!

Способ 1: Написание торгового робота, используя инструменты внутреннего языка вашего программного обеспечения

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

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

Робот для Quik на LUA

Способ 2: использование табличного процессора Excel

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

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

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

Способ 3: использование аналитических платформ

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

Способ 4: применение в процессе разработки трейдингового робота языков программирования

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

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

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

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

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

Тем, кто попал сюда впервые, и не знает о чем идет речь, советую прочитать предыдущие статьи цикла – вы сможете найти перечень внизу этой статьи.

Итак, что это за бот и как он будет работать

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

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

Если сделка на покупку не реализуется в течении какого-то времени (у меня это три минуты) бот отменяет ордер и создает новый, с новым курсом.

Если сделка на покупку прошла, то бот создает ордер на продажу, и держит этот ордер до тех пор, пока он не будет целиком исполнен.

Бот берет среднюю цену по рынку за некоторый период (из-за ограничений exmo, за последние 100 сделок, на других биржах я действовал по другому), и создает ордера на покупку с указанной наценкой – т.е. ниже текущей цены рынка, после чего создает ордера на покупку – опять же с указанной наценкой – получается выше цены рынка. В сумму продаж/покупок закладывается комиссия биржи и, таким образом, нивелируется. Совершая сделки, бот отдает бирже требуемый ею кусок, но прибыль для владельца бота остается неизменной.

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

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

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

Сколько зарабатывает:

В рамках подготовки этой статьи (и отладки алгоритма), я играл на сумму 1 доллар 49 центов – и вот какие он сделки совершал (читать снизу вверх):

Сколько приносит бот на бирже

Если проанализировать доход/расход, то бот принес 3.5 цента за день – при том, что я играл на полтора доллара – это 2.4% со вклада в день.

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

Недостатки бота:

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

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

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


Реклама



Алгоритм работы:

Для наглядности составлена блок-схема алгоритма работы – полностью транслировать её в текст я смысла не вижу, поясню основные принципы.

Бот играет на сумму которую вы указали – в данном случае для примера выбрана сумма 10 долларов США. На эту сумму бот старается купить биткойнов по курсу, чуть ниже текущего курса рынка. Если в течении некоторого времени (три минуты в примере) купить не получается, этот ордер на покупку отменяется, и создается новый, чуть ниже текущей цены уже на этот момент времени.

Если же ордер на покупку исполняется, то бот создает отложенный ордер на продажу этой валюты – он старается продать купленную валюту, и получить за это условные 10 долларов + желаемую наценку.

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

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

Вот блок-схема работы:

алгоритм работы торгового робота


Реклама



Как начать пользоваться:

1. Регистрируйтесь на бирже (если еще этого не сделали):

2. Перейдите в Account-settings-API, нажмите “Generate and save”, и получите ключ и подпись: 

получить API ключи для робота

3. Установите интерпретатор Python 3.4 и выше (описано в этой статье)

4. Создайте файл с названием exmo.py и скопируйте туда код, указанный ниже

5. В коде, в строках 11 и 13, укажите ключи API, полученные в шаге 2

6. В строке  24 укажите сумму, на которую будет играть бот — CAN_SPEND = 1.45 – сейчас указано 1.45 доллара.

7. На балансе не должно быть currency_1 — например, если играете на паре BTC_USD, то BTC заранее переведите в доллары или в другую валюту, а то продаст в минус.

8. Сохраните и запускайте (F5) – бот начнет работать.

Вы можете его запустить, даже если на бирже сейчас нет денег – бот вас предупредит, и просто ничего не купит. Но, конечно, для успешной работы нужно, что бы деньги были :) На 11.04.2017 минимальная сумма на балансе должна составлять примерно 1.5 доллара – это примерно равно минимальной сумме сделки на бирже, 0.001 Btc.


Реклама



Сам код бота:

import urllib, urllib.request, http.client
import time
import json
import sys
# эти модули нужны для генерации подписи API
import hmac, hashlib

# ключи API, которые предоставила exmo
API_KEY = ''
# обратите внимание, что добавлена 'b' перед строкой
API_SECRET = b''

# Тонкая настройка
CURRENCY_1 = 'BTC' 
CURRENCY_2 = 'USD'

CURRENT_PAIR = CURRENCY_1 + '_' + CURRENCY_2




ORDER_LIFE_TIME = 3 # через сколько минут отменять неисполненный ордер на покупку CURRENCY_1
STOCK_FEE = 0.002 # Комиссия, которую берет биржа (0.002 = 0.2%)
AVG_PRICE_PERIOD = 15 # За какой период брать среднюю цену (мин)
CAN_SPEND = 10 # Сколько тратить CURRENCY_2 каждый раз при покупке CURRENCY_1
PROFIT_MARKUP = 0.001 # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
DEBUG = True # True - выводить отладочную информацию, False - писать как можно меньше

STOCK_TIME_OFFSET = 0 # Если расходится время биржи с текущим 


# Запросить с биржи лимиты и использовать данные в работе
PAIR_LIMITS = {}
with urllib.request.urlopen("https://api.exmo.com/v1.1/pair_settings") as url:
    pairs_settings = json.loads(url.read().decode())
    if CURRENT_PAIR in pairs_settings:
        PAIR_LIMITS = pairs_settings[CURRENT_PAIR]
    else:
        print("Не удалось найти настройки пары", CURRENT_PAIR, "в ответе от биржи", pairs_settings)
        sys.exit(1)

CURRENCY_1_MIN_QUANTITY = float(PAIR_LIMITS["min_quantity"]) # минимальная сумма ставки - берется из https://api.exmo.com/v1/pair_settings/
PRICE_PRECISION = int(PAIR_LIMITS["price_precision"])

# базовые настройки
API_URL = 'api.exmo.com'
API_VERSION = 'v1'

# Свой класс исключений
class ScriptError(Exception):
    pass
class ScriptQuitCondition(Exception):
    pass




# все обращения к API проходят через эту функцию
def call_api(api_method, http_method="POST", **kwargs):
    # Составляем словарь {ключ:значение} для отправки на биржу
    # пока что в нём {'nonce':123172368123}
    payload = {'nonce': int(round(time.time()*1000))}

    # Если в ф-цию переданы параметры в формате ключ:значение
    if kwargs:
        # добавляем каждый параметр в словарь payload
        # Получится {'nonce':123172368123, 'param1':'val1', 'param2':'val2'}
        payload.update(kwargs)

    # Переводим словарь payload в строку, в формат для отправки через GET/POST и т.п.
    payload =  urllib.parse.urlencode(payload)

    # Из строки payload получаем "подпись", хешируем с помощью секретного ключа API
    # sing - получаемый ключ, который будет отправлен на биржу для проверки
    H = hmac.new(key=API_SECRET, digestmod=hashlib.sha512)
    H.update(payload.encode('utf-8'))
    sign = H.hexdigest()
    
    # Формируем заголовки request для отправки запроса на биржу. 
    # Передается публичный ключ API и подпись, полученная с помощью hmac
    headers = {"Content-type": "application/x-www-form-urlencoded",
           "Key":API_KEY,
           "Sign":sign}

    # Создаем подключение к бирже, если в течении 60 сек не удалось подключиться, обрыв соединения
    conn = http.client.HTTPSConnection(API_URL, timeout=60)
    # После установления связи, запрашиваем переданный адрес
    # В заголовке запроса уходят headers, в теле - payload
    conn.request(http_method, "/"+API_VERSION + "/" + api_method, payload, headers)
    # Получаем ответ с биржи и читаем его в переменную response
    response = conn.getresponse().read()
    # Закрываем подключение
    conn.close()

    try:
        # Полученный ответ переводим в строку UTF, и пытаемся преобразовать из текста в объект Python
        obj = json.loads(response.decode('utf-8'))

        # Смотрим, есть ли в полученном объекте ключ "error"
        if 'error' in obj and obj['error']:
            # Если есть, выдать ошибку, код дальше выполняться не будет
            raise ScriptError(obj['error'])
        # Вернуть полученный объект как результат работы ф-ции
        return obj
    except ValueError:
        # Если не удалось перевести полученный ответ (вернулся не JSON)
        raise ScriptError('Ошибка анализа возвращаемых данных, получена строка', response)

# Реализация алгоритма
def main_flow():
    
    try:
        # Получаем список активных ордеров
        try:
            opened_orders = call_api('user_open_orders')[CURRENCY_1 + '_' + CURRENCY_2]
        except KeyError:
            if DEBUG:
                print('Открытых ордеров нет')
            opened_orders = []
            
        sell_orders = []
        # Есть ли неисполненные ордера на продажу CURRENCY_1?
        for order in opened_orders:
            if order['type'] == 'sell':
                # Есть неисполненные ордера на продажу CURRENCY_1, выход
                raise ScriptQuitCondition('Выход, ждем пока не исполнятся/закроются все ордера на продажу (один ордер может быть разбит биржей на несколько и исполняться частями)')
            else:
                # Запоминаем ордера на покупку CURRENCY_1
                sell_orders.append(order)
                
        # Проверяем, есть ли открытые ордера на покупку CURRENCY_1
        if sell_orders: # открытые ордера есть
            for order in sell_orders:
                # Проверяем, есть ли частично исполненные
                if DEBUG:
                    print('Проверяем, что происходит с отложенным ордером', order['order_id'])
                try:
                    order_history = call_api('order_trades', order_id=order['order_id'])
                    # по ордеру уже есть частичное выполнение, выход
                    raise ScriptQuitCondition('Выход, продолжаем надеяться докупить валюту по тому курсу, по которому уже купили часть')
                except ScriptError as e:
                    if 'Error 50304' in str(e):
                        if DEBUG:
                            print('Частично исполненных ордеров нет')
                    
                        time_passed = time.time() + STOCK_TIME_OFFSET*60*60 - int(order['created'])

                        if time_passed > ORDER_LIFE_TIME * 60:
                            # Ордер уже давно висит, никому не нужен, отменяем
                            call_api('order_cancel', order_id=order['order_id'])
                            raise ScriptQuitCondition('Отменяем ордер -за ' + str(ORDER_LIFE_TIME) + ' минут не удалось купить '+ str(CURRENCY_1))
                        else:
                            raise ScriptQuitCondition('Выход, продолжаем надеяться купить валюту по указанному ранее курсу, со времени создания ордера прошло %s секунд' % str(time_passed))
                    else:
                        raise ScriptQuitCondition(str(e))

        else: # Открытых ордеров нет
            balances = call_api('user_info')['balances']
            if float(balances[CURRENCY_1]) >= CURRENCY_1_MIN_QUANTITY: # Есть ли в наличии CURRENCY_1, которую можно продать?
                """
                    Высчитываем курс для продажи.
                    Нам надо продать всю валюту, которую купили, на сумму, за которую купили + немного навара и минус комиссия биржи
                    При этом важный момент, что валюты у нас меньше, чем купили - бирже ушла комиссия
                    0.00134345 1.5045
                """
                wanna_get = CAN_SPEND + CAN_SPEND * (STOCK_FEE+PROFIT_MARKUP)  # сколько хотим получить за наше кол-во
                print('sell', balances[CURRENCY_1], wanna_get, (wanna_get/float(balances[CURRENCY_1])))
                new_order = call_api(
                    'order_create',
                    pair=CURRENT_PAIR,
                    quantity = balances[CURRENCY_1],
                    price= "{price:0.{prec}f}".format(prec=PRICE_PRECISION, price=wanna_get/float(balances[CURRENCY_1])),
                    type='sell'
                )
                print(new_order)
                if DEBUG:
                    print('Создан ордер на продажу', CURRENCY_1, new_order['order_id'])
            else:
                # CURRENCY_1 нет, надо докупить
                # Достаточно ли денег на балансе в валюте CURRENCY_2 (Баланс >= CAN_SPEND)
                if float(balances[CURRENCY_2]) >= CAN_SPEND:
                    # Узнать среднюю цену за AVG_PRICE_PERIOD, по которой продают CURRENCY_1
                    """
                     Exmo не предоставляет такого метода в API, но предоставляет другие, к которым можно попробовать привязаться.
                     У них есть метод required_total, который позволяет подсчитать курс, но,
                         во-первых, похоже он берет текущую рыночную цену (а мне нужна в динамике), а
                         во-вторых алгоритм расчета скрыт и может измениться в любой момент.
                     Сейчас я вижу два пути - либо смотреть текущие открытые ордера, либо последние совершенные сделки.
                     Оба варианта мне не слишком нравятся, но завершенные сделки покажут реальные цены по которым продавали/покупали,
                     а открытые ордера покажут цены, по которым только собираются продать/купить - т.е. завышенные и заниженные.
                     Так что берем информацию из завершенных сделок.
                    """
                    deals = call_api('trades', pair=CURRENT_PAIR)
                    prices = []
                    for deal in deals[CURRENT_PAIR]:
                        time_passed = time.time() + STOCK_TIME_OFFSET*60*60 - int(deal['date'])
                        if time_passed < AVG_PRICE_PERIOD*60:
                            prices.append(float(deal['price']))
                    try:        
                        avg_price = sum(prices)/len(prices)
                        """
                            Посчитать, сколько валюты CURRENCY_1 можно купить.
                            На сумму CAN_SPEND за минусом STOCK_FEE, и с учетом PROFIT_MARKUP
                            ( = ниже средней цены рынка, с учетом комиссии и желаемого профита)
                        """
                        # купить больше, потому что биржа потом заберет кусок
                        my_need_price = avg_price - avg_price * (STOCK_FEE+PROFIT_MARKUP) 
                        my_amount = CAN_SPEND/my_need_price
                        
                        print('buy', my_amount, my_need_price)
                        
                        # Допускается ли покупка такого кол-ва валюты (т.е. не нарушается минимальная сумма сделки)
                        if my_amount >= CURRENCY_1_MIN_QUANTITY:
                            new_order = call_api(
                                'order_create',
                                pair=CURRENT_PAIR,
                                quantity = my_amount,
                                price="{price:0.{prec}f}".format(prec=PRICE_PRECISION, price=my_need_price),
                                type='buy'
                            )
                            print(new_order)
                            if DEBUG:
                                print('Создан ордер на покупку', new_order['order_id'])
                            
                        else: # мы можем купить слишком мало на нашу сумму
                            raise ScriptQuitCondition('Выход, сумма для торгов (CAN_SPEND) меньше минимально разрешенной биржей')
                    except ZeroDivisionError:
                        print('Не удается вычислить среднюю цену', prices)
                else:
                    raise ScriptQuitCondition('Выход, не хватает денег')
        
    except ScriptError as e:
        print(e)
    except ScriptQuitCondition as e:
        if DEBUG:
            print(e)
        pass
    except Exception as e:
        print("!!!!",e)


try:
    balances = call_api('user_info')['balances']
    alt_balance = float(balances[CURRENCY_1])

    poss_profit = (CAN_SPEND*(1+STOCK_FEE) + CAN_SPEND * PROFIT_MARKUP) / (1 - STOCK_FEE) 

    if float(balances[CURRENCY_1]) > 0:
        decision = input("""
            У вас на балансе есть {amount:0.8f} {curr1}
            Вы действительно хотите, что бы бот продал все это по курсу {rate:0.8f}, выручив {wanna_get:0.8f} {curr2}?
            Введите Д/Y или Н/N
        """.format(
            amount=alt_balance,
            curr1=CURRENCY_1,
            curr2=CURRENCY_2,
            wanna_get=poss_profit,
            rate=poss_profit/alt_balance
        ))
        if decision in ('N','n','Н','н'):
            print("Тогда избавьтесь от {curr} (как вариант создайте ордер с ними по другой паре) и перезапустите бота".format(curr=CURRENCY_1))
            sys.exit(0)
except Exception as e:
    print(str(e))

while(True):
    main_flow()
    time.sleep(1)

Примечания по коду:

Строки 16 и 17  обозначают валютную пару. В данном примере это BTC_USD, но вы можете поменять на любую другую.

Строка 19  — CURRENCY_1_MIN_QUANTITY = 0.001. Это минимальная ставка, которая допускается на бирже. Для разных валют она разная, и, вообще, стоило бы получать её автоматически через API запрос. Но это усложнит код, поэтому я указал её как константу. Тем не менее, если вы планируете торговать другой валютой, вам следует поменять это значение, иначе торговля может затрудниться.

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

Строка 22 — STOCK_FEE = 0.002. Комиссия биржи за совершенную сделку. Непохоже, что бы она когда-то менялась, но, тем не менее, вы, при необходимости, сможете поменять её здесь если понадобится.

Строка 23 — AVG_PRICE_PERIOD = 90. Бот, в идеале, смотрит сделки за последние 90 минут, что бы узнать среднюю цену, в данной реализации он получает список совершенных сделок, и берет те из них, кто моложе 90 минут. Другой вопрос, что биржа не возвращает больше 100 записей, так что в данном случае число 90 сильно завышено.

Строка 24 — CAN_SPEND = 1.45. Важный параметр – сумма денег, которую вы доверяете боту для игры. В данном случае – 1 доллар 45 центов. Это удобно в том случае, когда бот играет на одну валютную пару, а вы – на другую, ну и еще гарантирует, что бот не проиграет всё, что нажито. В общем, чем больше эта сумма, тем больше денег он может заработать.

Строка 25  — PROFIT_MARKUP = 0.001. Это сумма наценки, которую вы хотите получить. В данном случае – это 0.1% от ставки. Чем больше это число, тем больше вы заработаете, но и курс будет раздуваться больше – т.е. вам придется дольше ждать исполнения сделки. Допускается дальнейшее дробление – например, число 0.00111 подходит. Если указать ноль, то бот будет работать вхолостую, обогащая биржу. Вы при этом, терять и зарабатывать не будете.

В строке 26 указано DEBUG = True. С этим параметром будет очень «разговорчивым», он будет комментировать каждое свое действие. Когда вам это надоест, советую вместо True написать False – тогда бот будет писать только по делу.

Так же не помешало бы в код добавить обработку некоторых исключительных ситуаций, перевести на ООП и так далее – но я не вижу смысла усложнять учебный код. Тот, кто заинтересуется, сможет сделать всё это и сам. Ну, или не делать, а просто пользоваться ботом как он есть :)


Реклама



Заключение

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

Желаю вам стабильных, хороших заработков!

Можно ли с помощью ИИ автоматизировать набор правил, по которым действуют на бирже профессиональные трейдеры? Команда VK Cloud Solutions перевела статью о том, как это удалось реализовать и что вышло из такой затеи.

Как появилась идея автоматизации

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

Он ответил, что занимается трейдингом. «Если какая-то ценная бумага растет на протяжении часа и я уже заработал более 1%, я ее продаю, — объяснил он. — Это одно из моих персональных правил». Не обращая внимания на псевдонаучный аспект этих правил, я понял, что он имел в виду под детоксом. Чтобы соблюдать такие правила, нужно постоянно заглядывать в смартфон.

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

Но для начала: время — деньги, и я не хочу никого разводить на деньги. Вот что мы сделаем:

  1. Возьмем детализированные данные о ценах на акции в реальном времени, в идеале с интервалом в одну минуту. Чем их больше, тем лучше. Используем для этого Yahoo! Finance, подробнее объясню ниже.

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

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

  4. Вот, собственно, и все — система готова. Осталось только где-то деплоить и отслеживать ее работу. Я решил, что система будет отправлять сообщение в телеграм-чат при выполнении какого-либо действия.

Что нам понадобится?

  • Python 3.6 с несколькими библиотеками;

  • учетная запись в облаке с правами администратора для хранения и деплоймента;

  • Node.js, чтобы установить Serverless Framework для деплоймента;

  • аккаунт в телеграме для мониторинга.

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

Сбор данных

Собрать данные — дело непростое. Еще несколько лет назад были доступны официальный Yahoo! Finance API и его альтернатива Google Finance. К сожалению, оба сервиса закрылись несколько лет назад. Но остались альтернативы. Я сформулировал следующие требования:

  • Бесплатно. Для рабочей системы я бы, конечно, поменял это требование на «недорого», но для игрушечной системы данные мне нужны бесплатно.

  • Высокая скорость. Желательно вообще без ограничений, но производительности свыше 500 запросов в минуту более чем достаточно.

  • Данные в реальном времени. Некоторые API выдают данные с небольшой задержкой, скажем, в 15 минут. Мне нужны цены на акции, максимально приближенные к текущим.

  • Простота использования. Это проверка идеи, так что мне нужно самое простое решение.

С учетом своих требований я решил присмотреться к yfinance — неофициальной альтернативе старого доброго Yahoo Finance API. Для рабочей системы я бы выбрал Alpha Vantage API, опираясь на замечательный список Патрика Коллинза. Но пока давайте не усложнять. 

Ран Арусси разработал библиотеку yfinance для доступа к данным Yahoo! Finance, когда официальный API перестал работать. Приведу цитату с GitHub:

«С тех пор как Yahoo! Finance закрыли свой API исторических данных, многие программы, которые использовали этот интерфейс, прекратили работу. yfinance призвана решить проблему — это надежное решение на Python для загрузки исторических данных по рынку из Yahoo! Finance».

Мило, мне подходит. Как это работает? Для начала библиотеку нужно установить:

$ pip install yfinance --user

А потом можно получить доступ к данным через объект Ticker:

import yfinance as yf

google = yf.Ticker(“GOOG”)

Это достаточно быстрый метод (в среднем исполняется чуть дольше 0,005 секунды), который возвращает МАССУ информации об акциях. Например, google.info содержит 123 поля, в том числе:

52WeekChange: 0.3531152
SandP52WeekChange: 0.17859101
address1: 1600 Amphitheatre Parkway
algorithm: None
annualHoldingsTurnover: None
annualReportExpenseRatio: None
ask: 1815
askSize: 1100
…
twoHundredDayAverage: 1553.0764
volume: 1320946
volume24Hr: None
volumeAllCurrencies: None
website: http://www.abc.xyz
yield: None
ytdReturn: None
zip: 94043

 Еще больше данных можно получить с помощью методов dividends, splits, balance_sheet, earnings и других. Большинство из них возвращают данные в виде объекта pandas DataFrame, так что придется немного повозиться, чтобы получить все, что нам нужно. 

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

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

df = google.history(period='1d', interval="1m")print(df.head())

DataFrame — динамика цен на акции Google

DataFrame — динамика цен на акции Google

Видно, как они индексируются по дате и времени. При этом у каждой записи семь характеристик: четыре значения цены на акцию за эту минуту (открытие, максимальная, минимальная, закрытие) а также объем, дивиденды и сплит акций. Я буду использовать только характеристику «минимальная». Соберем необходимые данные:

df = google.history(period='1d', interval="1m")
df = df[['Low']]
df.head()

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

df['date'] = pd.to_datetime(df.index).time
df.set_index('date', inplace=True)
df.head()

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

Добавляем ИИ

Не пытайтесь повторять это в домашних условиях. Я подобрал ОЧЕНЬ простую модель ARIMA для прогнозирования следующей цены на акцию, поэтому относитесь к ней как к учебной. Чтобы использовать эти наработки для настоящего трейдинга, советую поискать модель получше и помощнее. Но не теряйте бдительности: если бы это было просто, такие модели были бы у всех.

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

X = df.index.values
y = df['Low'].values
# The split point is the 10% of the dataframe length
offset = int(0.10*len(df))
X_train = X[:-offset]
y_train = y[:-offset]
X_test  = X[-offset:]
y_test  = y[-offset:]

Построим график:

plt.plot(range(0,len(y_train)),y_train, label='Train')
plt.plot(range(len(y_train),len(y)),y_test,label='Test')
plt.legend()
plt.show()

Теперь добавим в модель данные для обучения и получим прогноз. Обратите внимание, что здесь гиперпараметры модели фиксированы, а в реальной жизни для получения оптимальных параметров нужно использовать кросс-валидацию. К вашим услугам замечательное руководство о том, как подбирать гиперпараметры ARIMA по сетке на Python. Я использую конфигурацию 5, 0, 1 и получаю прогноз на момент, который наступает сразу после данных для обучения.

from statsmodels.tsa.arima.model import ARIMAmodel = ARIMA(y_train, order=(5,0,1)).fit()
forecast = model.forecast(steps=1)[0]

Давайте посмотрим, хорошо ли сработала наша учебная модель:

print(f'Real data for time 0: {y_train[len(y_train)-1]}')
print(f'Real data for time 1: {y_test[0]}')
print(f'Pred data for time 1: {forecast}')
—
Real data for time 0: 1776.3199462890625
Real data for time 1: 1776.4000244140625
Pred data for time 1: 1776,392609828666

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

Подключение к брокеру

Как вы, наверное, догадались, многое зависит от выбранного брокера. Я расскажу о подключении к RobinHood и Alpaca. Почему я выбрал именно их?

  • Есть публичный API.

  • Они не берут комиссию за трейдинговые операции.

В зависимости от типа учетной записи действуют те или иные ограничения. Например, у RobinHood можно совершать всего три трейдинговые операции в пять дней, если остаток на счете менее 25 000 долларов. У Alpaca ограничения не такие жесткие, но все же установлен лимит в 200 запросов в минуту на один ключ API.

RobinHood

Есть несколько библиотек, поддерживающих RobinHood API, но ни одна из них не является официальной. Библиотека Sanko была самой большой, с 1,5 тысяч звезд на GitHub, но ее закрыли. Библиотека LichAmnesia приняла эстафету, но пока что набрала только 99 звезд. Я собираюсь использовать robin_stocks, у которой на момент написания статьи чуть более 670 звезд. Давайте ее установим:

$ pip install robin_stocks

Для большинства действий нужен логин, так что для начала войдем в систему. RobinHood требует многофакторную аутентификацию, так что необходимо ее настроить. Войдите в свою учетную запись, включите двухфакторную аутентификацию и выберите «other» в ответе на вопрос «Какое приложение вы собираетесь использовать?». Вы получите буквенно-цифровой код, который мы применим:

import pyotp
import robin_stocks as robinhood
RH_USER_EMAIL = <<<YOUR EMAIL GOES HERE>>>
RH_PASSWORD = <<<YOUR PASSWORD GOES HERE>>>
RH_MFA_CODE = <<<THE ALPHANUMERIC CODE GOES HERE>>>
timed_otp = pyotp.TOTP(RH_MFA_CODE).now()
login = rh.login(RH_USER_EMAIL, RH_PASSWORD, mfa_code=totp)

Купить или продать — дело нехитрое:

# Buying 5 shares of Google
rh.order_buy_market('GOOG', 5)
# Selling 5 shares of Google
rh.order_sell_market('GOOG', 5)

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

Alpaca

Для Alpaca мы используем библиотеку alpaca-trade-api, у которой на GitHub более 700 звезд. Устанавливаем:

$ pip install alpaca-trade-api

Войдите в учетную запись и получите API key ID и секретный ключ, они нужны для входа в систему:

import alpaca_trade_api as alpaca
ALPACA_KEY_ID = <<<YOUR KEY ID GOES HERE>>>
ALPACA_SECRET_KEY = <<<YOUR SECRET KEY GOES HERE>>>
# Change to https://api.alpaca.markets for live
BASE_URL = 'https://paper-api.alpaca.markets'
api = alpaca.REST(
    ALPACA_KEY_ID, ALPACA_SECRET_KEY, base_url=BASE_URL)

Отправлять поручения здесь несколько сложнее, чем в RobinHood:

# Buying 5 shares of Google
api.submit_order(
    symbol='GOOG', 
    qty='5',
    side='buy',
    type='market',
    time_in_force='day'
)
# Selling 5 shares of Google
api.submit_order(
    symbol='GOOG', 
    qty='5',
    side='sell',
    type='market',
    time_in_force='day'
)

Готово! Напомню, что оставлять свои учетные данные в виде Plain Text — чрезвычайно плохая идея. Но не переживайте, на следующем этапе мы перейдем к переменным среды, это намного безопаснее. Теперь давайте развернем модель в облаке и настроим мониторинг.

Деплоймент и мониторинг

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

Но пока обойдемся и этим — запланируем ежедневный запуск Lambda и обучение модели на данных за текущий день. Для мониторинга настроим бот в Telegram, который отправляет сообщение с действием и его результатом. AWS Lambda можно пользоваться бесплатно, если не превышать заданные лимиты; но если вы хотите отправлять очень много сообщений, помните о квотах.

Для начала создадим бота. Я опирался на официальную инструкцию из телеграма:

  • Найдите в телеграме пользователя @BotFather.

  • Используйте команду newbot, выберите название и имя пользователя для бота.

  • Получите и сохраните в надежном месте токен, он вам скоро понадобится.

Следующий этап — деплоймент. Есть несколько способов деплоймента в Lambda. Я собираюсь использовать фреймворк serverless, так что давайте его установим и создадим шаблон.

$ npm install serverless --global
$ serverless create --template aws-python3 --path ai_trading_system

Мы создали папку scheduled_tg_bot с тремя файлами: .gitignore, serverless.yml, и handler.py. Serverless.yml определяет деплоймент: что, когда и как будет запущено. А файл handler.py содержит запускаемый код.

import telegram
import sys
import os
CHAT_ID = XXXXXXXX
TOKEN = os.environ['TELEGRAM_TOKEN']

# The global variables should follow the structure: 
#       VARIABLE = os.environ['VARIABLE']
# for instance: 
#       RH_USER_EMAIL = os.environ['RH_USER_EMAIL]
def do_everything():
    # The previous code to get the data, train the model
    # and send the order to the broker goes here.
    return 'The action performed'
def send_message(event, context):
    bot = telegram.Bot(token=TOKEN)
    action_performed = do_everything()    bot.sendMessage(chat_id=CHAT_ID, text=action_performed)

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

Теперь давайте определим, как запускать код. Откройте serverless.yml и напишите:

org: your-organization-name
app: your-app-name
service: ai_trading_system
frameworkVersion: “>=1.2.0 <2.0.0”
provider:
  name: aws
  runtime: python3.6
  environment:
    TELEGRAM_TOKEN: ${env:TELEGRAM_TOKEN}
    # If using RobinHood    
    RH_USER_EMAIL: ${env:RH_USER_EMAIL}
    RH_PASSWORD: ${env:RH_PASSWORD}
    RH_MFA_CODE: ${env:RH_MFA_CODE}
    # If using Alpaca
    ALPACA_KEY_ID: ${env:ALPACA_KEY_ID}
    ALPACA_SECRET_KEY: ${env:ALPACA_SECRET_KEY}
functions:
  cron:
    handler: handler.send_message
    events:
      # Invoke Lambda function at 21:00 UTC every day
      - schedule: cron(00 21 * * ? *)

Этот код сообщает AWS, какая среда выполнения нам нужна, и берет токен телеграма из нашего собственного окружения, чтобы нам не пришлось его развертывать. После этого мы определяем Сron для ежедневного запуска функции в 21:00.

Единственное, что осталось сделать перед деплойментом, это получить учетные данные AWS и установить их как переменные среды вместе с токеном и остальными переменными как переменные среды. Получить учетные данные достаточно просто.

Из консоли AWS:

  • перейдите в My Security Credentials — Users — Add user;

  • выберите имя пользователя и Programmatic access;

  • на следующей странице выберите Attach existing policies directly — AdministratorAccess;

  • скопируйте и сохраните Access Key ID и Secret Access Key;

Вот и все. Теперь давайте экспортируем учетные данные AWS и токен телеграма. Откройте терминал и напишите:

$ export AWS_ACCESS_KEY_ID=[your key goes here]
$ export AWS_SECRET_ACCESS_KEY=[your key goes here]
$ export TELEGRAM_TOKEN=[your token goes here]# 
If using RobinHood
$ export RH_USER_EMAIL=[your mail goes here]
$ export RH_PASSWORD=[your password goes here]
$ export RH_MFA_CODE=[your mfa code goes here]
    
# If using Alpaca
$ export ALPACA_KEY_ID=[your key goes here]
$ export ALPACA_SECRET_KEY=[your key goes here]

Установите необходимые пакеты локально и выполните деплоймент в AWS:

$ pip3 install -r requirements.txt -t . --system
$ serverless deploy

Готово! Бот будет торговать за нас каждый день в 21:00 и отправлять нам сообщения о совершенном действии. Для апробации концепции неплохо. Пожалуй, можно порадовать приятеля: теперь он может расслабиться и заниматься трейдингом, не заглядывая в смартфон сто раз в день :)

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

Команда VK Cloud Solutions развивает собственные ML-решения. Будем признательны, если вы их протестируете и дадите обратную связь. Для тестирования пользователям при регистрации начисляем 3000 бонусных рублей.

Читать по теме:

  • Как дата-сайентистам эффективно сотрудничать с дата-инженерами

  • Четыре хитрости в работе с пайплайнами данных, о которых знают не все

  • Настоящее и будущее дата-инжиниринга

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

progr

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

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

1. Разработку форекс робота начинаем с идеи

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

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

Написать форекс советника

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

2. 4 важных вопроса перед разработкой

Но перед этим попытайтесь ответить себе на следующие вопросы:

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

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

[info_block align=»right» linkText=»Форекс советники» linkUrl=»https://fortrader.org/forex-ea-testing/» imageUrl=»http://files.fortrader.org/uploads/2016/08/robot.jpg»]Исследование торговых роботов с возможностью скачать советника.[/info_block]

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

3. Конструктор советников – не проходим мимо!

У новичков на валютном рынке часто возникает множество вопросов, ответы на которые бывают не совсем очевидны, либо являются лишь вопросом неопытности оного. Будучи начинающим трейдером, достаточно прочитать одну книгу Билла Вильямса, чтобы на всю жизнь подменить понятие торгового хаоса торговым порядком. Затем такие люди удивляются, почему вот здесь да не купить, а вот здесь да не продать, и заказывают у программистов советник по пересечению двух скользящих средних. А ведь на начальных этапах обучения это вполне можно отдать на откуп готовым инструментам разработки. Одной из таких как раз является MQL5 Wizard – мастер по созданию советников для MetaTrader 5.

Для реализации простых вещей Мастер идеален. Вам не нужно обладать никакими магическими способностями – навыки программирования здесь не требуются. Несколько простых шагов, и советник готов. Уже готовый советник можно протестировать в том же терминале MetaTrader. Держите комбайн по производству простецких Граалей.

4. MQL5 Wizard. Сделать советник за 5 минут

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

Мастер советников MetaTrader

Дальше нужно указать название советника и основные входные параметры.

Мастер советников MetaTrader

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

Параметры сигналов советника

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

Варианты торговых сигналов советника

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

параметры модуля сигналов

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

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

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

5. Хочу программировать непростого советника? Написание технического задания

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

Написание ТЗ для робота

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

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

6. Напишите мне советник по индикатору

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

[info_block align=»right» linkText=»Вникайте в процесс!»]»Старайтесь вникать в процесс работы и всего, что непосредственно касается реализации идеи вашего советника»[/info_block]

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

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

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

7. Выбор исполнителя

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

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

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

Реализация торгового советника

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

[info_block align=»right» linkText=»Все в ваших руках»]»В ваших интересах контролировать процесс создания советника вашей мечты. Просите проводить промежуточные этапы работ, участвуйте в бета-тесте и не брезгуйте узнавать технические подробности.»[/info_block]

Один из типичных примеров – недопонимание форматов файлов и их значения. Вроде: «У меня тут есть .dll библиотека (.exe файл или .ex4 программа), не могли бы вы быстренько поправить то и то, а я вам за это копеечку закину? Нет? А почему? Василий мне сделал советника за 5 баксов, а вы плохой разработчик значит!».

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

8. Сдача советника – включайтесь в работу!

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

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

Принять участие в разработке своего робота

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

Если задача небольшая, исполнитель вполне может пойти на уступки, и исправить работу в соответствии с новым ТЗ. Если работа проделана масштабная – что-либо менять уже поздно. Частая проблема – тотальная отрешенность в процессе разработки, например, отказ от участия в бета-тестировании: «Зачем вы мне скинули советника с ошибками, я что за вас тестировать еще должен?» или: «Откуда я знаю, как этот ваш тестер запускать, я программист что-ли?».

[info_block align=»right» linkText=»Безопасный Мартингейл» linkUrl=»https://fortrader.org/learn/forex-trader/bezopasnyj-martingejl-kak-otdelnymi-elementami-martingejla-uvelichit-pribylnost-strategii.html» imageUrl=»http://files.fortrader.org/uploads/2016/07/coins-730×487.jpg»]Как отдельными элементами Мартингейла увеличить прибыльность стратегии?[/info_block]

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

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

Заключение

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

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

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

Вам также будет интересно

  • Как из запаздывающего индикатора сделать работающий Грааль?
  • ECN или MTF – выбираем агрегатор ликвидности
  • Сетка ордеров на форекс: 2 варианта популярной стратегии

Понравилась статья? Поделить с друзьями:
  • Как написать боссу что заболел
  • Как написать босс на английском
  • Как написать бордовый или бардовый цвет правильно
  • Как написать бон аппетит на французском
  • Как написать бомж английскими буквами