Как написать торгового робота: инструменты для начинающих / блог компании iti capital / хабр

Плюс на минус

Основные преимущества биржевых роботов:

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

2) Никакого эмоционального перегруза и психологического давления во время торговли. Ведь постоянная торговля – это для трейдера колоссальный стресс. Вы просто наслаждаетесь жизнью и торговля вам только в радость.

3) Робот всегда четко выполняет алгоритм и не отступает от него. В отличие от вас с вашими сомнениями, домыслами и надеждами по поводу тренда.

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

Но у любой, даже золотой медали, есть и обратная сторона. Каким бы идеальным робот не был, все же у него есть свои «минусы»:

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

2) При использовании робота трейдера вынуждены заплатить платить абонентскую плату. Это помимо комиссии за брокерское обслуживание.

ABI

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

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

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

Как работать на платформе Visual Strategy Builder

Сервис Visual Strategy Builder расположен по адресу: https://tools.forextester.com/

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

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

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

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

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

  • Уровни (Ценность);
  • Конкретная цена;
  • Диапазон (цены открытия, закрытия, максимумы и минимумы свечей);
  • Открытие по дням недели, месяца (опция время);
  • По конкретному объему или его абстрактному критерию;
  • Таймфрейм.

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

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

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

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

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

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

Остальные опции понятны, следует только внимательно отнестись к пунктам: 25 – это для четырехзначной системы котировок. При пяти знаках умножайте значения пунктов на 10.

Для нижней линии Боллинджера потребуется создать второе правило, опцию можно выбрать слева вверху, повторив все вышеописанные операции со следующими изменениями:

  • В настройках индикатора выбираем нижнюю линию;
  • Кроссовер – снизу вверх;
  • Тип ордера, открываемого по рынку – «Покупка».

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

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

Определите драйверы роста

Возьмите три листа бумаги и назовите их «Цель», «Стратегия», «Навыки».

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

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

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

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

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

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

Представьте Python-программиста после стажировки в веб-студии.

Цель. Через пять лет вырасти до старшего разработчика, получать от 150 тысяч рублей в месяц и трудиться в современной российской IT-компании.

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

Навыки. Освоить фреймворк Django, системы Docker и Kubernetes, базы данных Postgres и MongoDB, сервис Redis, Git и инструменты мониторинга Sentry или Prometheus. Стать уверенным Linux-пользователем. Выучить английский язык и гибкие методологии Scrum, Kanban, Agile. Как плюс — научиться управлять проектами, чтобы в будущем возглавить команду разработчиков.

Теперь проверим, подходят ли навыки под карьерную цель и стратегию:

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

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

  Scrum, Kanban или Agile применяют многие IT-команды. Разработчик готов часто менять компании и может познакомиться с гибкими методиками на практике. Значит, этот навык можно специально не прокачивать.

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

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

Тестируем

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

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

Основание пирамиды — модульные (юнит-) тесты. Их много, они простые и быстрые, но они тестируют небольшие кусочки кода, как правило, алгоритмы.

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

На верхнем уровне находятся системные (E2E, end-to-end) тесты, которые тестируют готовую к эксплуатации систему так, как это делал бы конечный пользователь: нажимают на кнопки в интерфейсе, проверяют результаты на экране и т. п. Часто такие тесты бывают ручными. На этом этапе проверяются конечные сценарии, которыми пользуются клиенты приложения. E2E тесты сложно поддерживать, потому что бизнес-логика часто меняется, и тесты тоже приходится переписывать.

Отдельно стоит выделить ещё два вида тестов:

Тестирование производительности, в которое входят стресс-тестирование, нагрузочное и другие виды тестирования.

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

Терминология

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

Криптовалютная биржа

Ордер

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

О р дер может быть описан следующими параметрами: пара, стоймость, объем, тип операции. Например:

Из данной таблицы видно, что вы можете купить 0.5 ETH за 1 BTC.

Пара читается справа налево при совершении операции. Например:

  • — продаю ETH за BTC,
  • — покупаю ETH за BCH.

Биржевой стакан

Если вы откроете страницу торгов на бирже Poloniex, то увидите ордера на продажу — SELL ORDERS и ордера на покупку — BUY ORDERS, которые выставляют трейдеры. Данные таблицы называются биржевым стаканом и отображают информацию о том сколько и за какую цену хотят купить / продать валюту.

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

Арбитражная ситуация

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

Например на бирже Poloniex есть три пары валют: BTC, BCH, ETH. И представим, что в биржевом стакане были созданы следующие ордера:

Данная таблица демонстрирует арбитражную ситуацию внутри биржы. Если вы выполните ордера, выставленные трейдерами (совершите с ними сделку) :

  • 1 BTC => 10 ETH
  • 10 ETH => 8 BCH
  • 8 BCH => 1.6 BTC

то останетесь в прибыли на 0.6 BTC, так как изначально имели 1 BTC.

На Poloniex доступна документация API. В рамках нашей задачи нас интересует раздел Public API Methods, метод returnOrderBook .

  • asks — ордера на продажу;
  • bids — ордера на покупку;

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

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

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

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

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

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

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

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

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

Как написать торгового робота. Инструменты и методы для MetaTrader

Что бы приблизиться в Вашей цели потребуется две вещи: информация и время.

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

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

Вам нужно будет время, поскольку информация сама в голову не залезет. Ее нужно туда положить. Примерно 2-3 недели по 1-2 часа и Вы будете писать торговых роботов своими рукам для терминала MetaTrader. В видеокурсе содержится полная информация обо всех аспектах программирования от А до Я.

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

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

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 загружает их самостоятельно;
  • построение торговой стратегии на основе тиковых изменений.

Запуск торгового робота

Если результат нас устраивает, тогда остаётся только запустить стратегию в работу.

Для этого необходимо нажать кнопку «Enable», после чего появится окно, в котором необходимо указать объём открываемой позиции и, по желанию, можно указать значение Take Profit и Stop Loss в USD. Если эти графы оставить пустыми, тогда позиции будут закрываться по условиям, описанным в торговой стратегии.

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

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

Для удаления стратегии достаточно нажать на крестик в конце строки.

В платформе R StocksTrader, в отличие от терминала MetaTrader 4 и MetaTrader 5, нет надобности постоянно держать включенным компьютер, чтобы робот имел возможность торговать. Услуги VPS сервера здесь так же не требуются. Достаточно запустить Торгового робота на платформе, после чего он автоматически запускается на сервере и начинает работать.

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

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

Шаг 1: Первоначальная подготовка

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

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

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

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

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

UX-исследование — это быстрое полезное действие, которое можно сделать еще на ранних этапах разработки, тем самым избежав ошибок, которые бы вышли в продакшен.

— Денис Элиановский, дизайн-директор JTC

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

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

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

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

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

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

Тестирование торговой стратегии

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

Если мы все сделали правильно, появятся результаты тестирования.

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

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

Но это еще не все, текущий результат можно улучшить, добавив еще несколько стандартных условий. Возвращаемся в раздел редактирования стратегии (нажимаем Editor) и в значении «Max open deals» ставим цифру 2.

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

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

Чтобы избежать подобной ситуации, но все же иметь возможность открыть позицию в том же направлении по лучшей цене, можно задействовать функцию «Enter every 0 ticks above last entry». Данная функция позволяет открывать новую позицию через определенное количество пунктов ниже/выше предыдущего ордера. Для этого, вместо значения ноль, прописываем нужное нам количество пунктов.

Дополнительно в значении «Multiplicator» прописываем цифру 2, то есть указываем роботу, что необходимо открывать вторую позицию с объёмом в два раза больше, чем в первой позиции.

Multiplicator умножает объём предыдущего открытого ордера на значение, которое в нем указано. Нажимаем «Backtest» и получаем новый результат.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Центр Начало
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: