[Из песочницы] Пошаговая инструкция к созданию торгового робота на Python
Тема онлайн торгов (будь то форекс, акции, полезные ископаемые) обычно вызывает интерес. Но вместе с тем многие люди думают: «я в этом не разбираюсь, мне спец. терминология неизвестна. Да и непонятно, как начать». Вот над этим мы и поработаем! К концу статьи у вас будет достаточно знаний и примеров, чтобы начать играть на финансовых рынках.Покроем следующие моменты:
Суть биржевой игры; Брокеры; API для торговли/Пример робота; Деплоймент онлайн; Заключительные мысли. Суть биржевой игрыЕсть много теорий и объяснений. Но мы подойдем к вопросу с точки зрения софтверщика и понятия об уровнях абстракции. Очень просто (но вместе с тем правдиво) суть игры в следующем: есть график некоей (псевдо?) случайной величины (цены). Известна её история за довольно большой период. Стоит задача предсказания движения (вверх или вниз). Всё. Реально. То, что делают трейдеры — предсказывают, пойдет цена вверх или вниз и делают на это ставки (оpen trades): покупают (buy/long) какое-то количество «продукта» (instrument) в надежде на поход вверх, или продают (sell/short) в надежде, что пойдет вниз.После какого-то времени (если цена изменилась значительно) open trades закрывают и получают в результате прибыть (угадали с движением) или убыток (не угадали).Сделку можно закрыть руками, а можно автоматичеки (order): можно заранее задекларировать — если цена достигнет такого-то уровня, то закрыть trade.
Доступ к рынку для совершения сделок предоставляет брокер. И за это он взимают плату за каждую сделку.
Подкованные теорией, мы можем опять вернуться в область, далекую от финансов и сказать: хей! да мы же просто ищем сигнал в шуме! Сейчас по быстрому разложим в ряд Фурье, определим частоты и озолотимся!
Всё верно, так всё и есть. Игра началась.
Брокеры Есть много брокеров, которые специализируются на частных лицах. Они отличают набором инструментов доступных для торгов, ценами на услуги, надежностью, возможность создания роботов.Я не буду давать сравнительный анализ. Сразу дам лучшего — Oanda. Почему Oanda:
Репутация; Возможность открыть сделку в 1 доллар и нет требований к размеру trade (некоторые брокеры обязывают делать его кратным большим величинам); Низкая цена за сделки (узкий spread); Огромное количество инструментов: валюты, драг металлы и нефть, индексы; Возможность торговать через API; Ввод вывод денег возможен через PayPal. Для того, чтобы торговать, надо создать учетную запись на Oanda. Для начала — тренировочную (fxtrade practice). В меню «Manage API Access» нужно указать, что на вашем счету возможна торговля через API. После этого вам сгенерят секретный токен для использования в RESTful вызовах.
API для торговли developer.oanda.com/docs/ — RESTfulПримеры: developer.oanda.com/docs/v1/code-samples/
Я буду использовать Python 2.7 и библиотеку requests.
Для того, чтобы торговать, нам нужно:
Получать информацию о цене. Робот должен знать, что происходит def connect_to_stream (): try: s = requests.Session () url = «https://stream-fxpractice.oanda.com/v1/prices» headers = {'Authorization' : 'Bearer ' + «YOUR TOKEN», #'X-Accept-Datetime-Format' : 'unix' } params = {'instruments' : «EUR_USD, AUD_JPY», 'accountId' : «YOUR ACC ID»} req = requests.Request ('GET', url, headers = headers, params = params) pre = req.prepare () resp = s.send (pre, stream = True, verify = False, timeout=20) return resp except Exception as e: s.close () print «Caught exception when connecting to stream\n» + str (e) Эта функция позволит соединиться к потоку цен на EUR/USD и AUD/JPY.
Теперь мы можем их считывать:
try: #infinite loop on receiving events about price. on each tick Strategy function is called for line in response.iter_lines (1): if line: msg = json.loads (line) if msg.has_key («instrument») or msg.has_key («tick»): strategy (msg['tick']['instrument'], msg['tick']['time'], msg['tick']['ask']) except Exception as e: print «something gone bad » +str (e) return
Теперь нам нужен мозг. Принятие решений Как видно, в функцию стратегии передается информация о названии инструмента, цена и время.Мы можем решать в функции strategy:, а что нам делать с этой новой инфой? Проигнорировать? Или, может, открыть новую сделку?
Вот здесь пригодится, что вы — программист. Изобретайте! Есть числовой ряд — ищете закономерности, анализируйте, да всё, что угодно.
Допустим, робот подумал и сказал: точно цена пойдет вверх! Чувствую своей shiny metal ass!
Тогда нам нужна возможность заключить сделку def order (instr, take_profit, stop_loss): try: url = «https://» + «api-fxpractice.oanda.com» + »/v1/accounts/»+«YOUR ACC»+»/orders» headers = {'Authorization' : 'Bearer ' + «YOUR TOKEN», #'X-Accept-Datetime-Format' : 'unix' «Content-Type» : «application/x-www-form-urlencoded» } params = urllib.urlencode ({ «instrument» : instr, # инструмент, по которому открывает сделку «units» : 10, # сколько единиц покупаем «type» : 'market', # прям сейчас исполнить! «side» : «buy», # считаем, что цена пойдет вверх («sell» если думаем что вниз) «takeProfit» : take_profit # насколько цена должна пройти вверх, чтобы наша жадность удовлетворилась, и мы закрыли бы сделку. и считали профит «stopLoss» : stop_loss # насколько цена может опуститься, прежде чем наш страх скажет «ты чё?! дальше только хуже будет. закрывай немедля. фиг с ними с потерями» }) req =requests.post (url, data=params, headers=headers) for line in req.iter_lines (1): print «order responce:», line except Exception as e: print «Caught exception when connecting to orders\n» + str (e)
Вот, в общем-то, и всё. Мы научились получать информацию о цене и, исходя из этого, открывать сделки с фиксированными целями.
Деплоймент онлайн Открыл для себя наличие vps по бросовым ценам. Например, ftpit.com. Взял тот, что за 2 доллара в месяц.Этот хостиг без проблем держит на себе 3-х моих роботов, которые день и ночь пытаются одолеть толстосумов с Wall Street. Плюс к этому есть свой SMTP server и небольшой сайт.Заключительные мысли Торговля на финансовых рынках может стать замечательным хобби, которое не только дает возможность программировать, но и приобщиться к огромной онлайн игре, в которой каждый день много новостей, мнений, событий, страха, жадности и надежды! Если у вас есть вопросы — отвечу с радостью и в меру сил.