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

Задача:

Используя предоставленные данные о нескольких брокерах (intrade.bar, binary.com, OlympTrade) разработать для каждого брокера модель процентов выплат и оформить ее в виде класса header-only C++ библиотеки.

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

Исходные данные:

Брокер IntradeBar

Самая проста модель процентов выплат у брокера intrade.bar, так как данный брокер имеет фиксированный процент выплат. Модель процентов выплат данного брокера базируется на следующей информации:

С 0:00 до 3:00 по МСК данный брокер не принимает ставки. При разработке модели данное время перевести в GMT (С 21:00 до 0:00)

Начиная с 17 часов по МСК до 23 часов брокер запрещает торговать в начале часа, середине, и 1 минуту после часа. Например, во время 16:59, 17:00 и 17:01 нельзя открыть ставку, пока не наступит 17:02. Иными словами, как только наступает 16:59:00 целых три минуты идет блокировка ставки. Блокировка снимается ровно в 17:02. Такая история дальше повторяется с каждым часом (18, 19, до 23). 

Начиная с 09-01-2019 было повышение процентов выплат. Эту настройку надо добавить в модель. При длине экспирации опциона 3 минуты размер выплаты был 80%, стал 82%. При длине экспирации от 4 минут до 500 минут размер выплаты был 77%, стал 79%. Также размер выплаты зависит от размера ставки. Если ставка меньше 5000 RUB или 80 USD, то выплата равна указанной ранее, если от 5000 RUB или 80 USD, то выплаты стала 85%(была 84%) вне зависимости от времени экспирации. 

В выходные дни торговля не ведется.

Класс может называться IntradeBar и находиться в пространстве имен payout_model. Для получения процентов выплат вызывается метод int get_payout(double &payout, const unsigned long long timestamp, const int duration, const int currency_pair_indx, const double amount), где в payout будет помещен процент выплат, переменная timestamp  содержит временную метку unix времени (GMT),  переменная duration содержит длительность опциона в секундах, переменная currency_pair_indx обозначает номер валютной пары из писка валютных пар брокера (список может быть упорядочен в алфавитном порядке или каком либо другом порядке),  переменная amount содержит размер ставки бинарного опциона. Для получения имени валютной пары от ее номера сделать метод std::string get_currecy_pair_name(), а также добавить метод для возвращения списка валютных пар std::vector get_currecy_pair_list()

Валюту счета USD или RUB указывать в конструкторе класса. 

Брокер OlympTrade

Для данного брокера была собрана статистика процентов выплат, которую можно скачать здесь: https://github.com/NewYaroslav/olymptrade_historical_data  Статистика упакована в бинарные файлы, подробности описаны в репозитории и есть код C++ для чтения.

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

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

  • Допустим имеется временная метка с временем 4 часа утра GMT на валютной паре AUDCAD.
  • Статистика говорит нам, что с 4 утра до 8 утра на данной валютной паре в 60% случаев бывает выплата 90%, в 30% случаев бывает выплата 80% и в 10% случаев бывает выплата 60%.
  • С помощью генератора случайных чисел выбираем один из вариантов, например мы попали на вероятность 30%, поэтому процент выплат будет составлять 80%.
  • В следующий раз мы запросим цену в 4 часа и 1 минуту. Из-за специфики брокера процент выплат обычно держится некоторое время, которое тоже может быть известно из статистики. Например, процент выплат, который был установлен в 4 часа, обычно держится на валютной паре около часа, а затем меняется. Так как ранее мы уже нашли процент выплат, равный 80%, то его не меняем и вернем 80%. И только лишь после 5 часа мы заново пересчитаем случайный выбор процента выплат.
Если, например, модель процентов выплат можно упростить или надо усложнить, если следует из статистики,  сначала предупредить об этом и показать почему это надо сделать.

Корреляцию, и некоторые другие полезные инструменты для С++ можно найти в этом репозитории: https://github.com/NewYaroslav/binary-cpp-api/blob/master/include

Некоторые особенности брокера:

  • С 0:00 до 3:00 по МСК данный брокер не принимает ставки. При разработке модели данное время перевести в GMT (С 21:00 до 0:00). Процент выплат приравнять к 0.
  • В выходные дни торговля не ведется для форекс валютных пар, для криптовалют торговля продолжается и в выходные дни.
  • Процент выплат не зависит от ставки и длины экспирации опциона
  • Процент выплат зависит от наличия ВИП аккаунта, если аккаунт не ВИП, то процент выплат ограничивается верхней планкой в 80%. Это можно прописать как условие в алгоритме.
  • Если ставка меньше минимальной или больше максимальной, процент выплат приравнять к 0.
Класс может называться OlympTrade и находиться в пространстве имен payout_model. Для получения процентов выплат вызывается метод int get_payout(double &payout, const unsigned long long timestamp, const int currency_pair_indx, const double amount), где в payout будет помещен процент выплат, переменная timestamp  содержит временную метку unix времени (GMT), переменная currency_pair_indx обозначает номер валютной пары из писка валютных пар брокера (список может быть упорядочен в алфавитном порядке или каком либо другом порядке),  переменная amount содержит размер ставки бинарного опциона. Для получения имени валютной пары от ее номера сделать метод std::string get_currecy_pair_name(), а также добавить метод для возвращения списка валютных пар std::vector get_currecy_pair_list().

Валюту счета USD или RUB указывать в конструкторе класса (у брокера отличается размер минимальной и максимальной ставки). 

Брокер Binary.com

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

Проверить корреляцию процента выплат для BUY и SELL с индикатором RSI с разными периодами, начиная от 3 заканчивая 180. Возможно, что процент выплат можно получить, умножив значение индикатора RSI на некий коэффициент. Это конечно не отменяет также зависимости от времени торговли и дня недели, возможно что просто данный коэффициент может зависеть от времени торговли, и тогда уже стоит рассматривать распределение этого коэффициента от секунды дня и дня недели.

Индикатор RSI можно найти тут: https://github.com/NewYaroslav/binary-cpp-api/blob/master/include/IndicatorsEasy.hpp

Исторические данные котировок можно взять здесь: https://github.com/NewYaroslav/binary_historical_data

Для чтения этих данных можно использовать класс:

MultipleCurrencyHistory

https://github.com/NewYaroslav/binary-cpp-api/blob/master/include/HistoricalDataEasy.hpp

Имеются только данные для экспирации опциона 3 минуты, поэтому рассматриваем только эту экспирацию. 

Класс может называться Binary и находиться в пространстве имен payout_model. Для установки цены сделать метод void set_price(const double price, const int currency_pair_indx). Этот метод будет обновлять состояния индикаторов внутри класса модели процентов выплат, т.е. его надо вызывать каждый раз, когда поменялась котировка валютной пары).  Для получения процентов выплат вызывается метод int get_payout(double &payout, const unsigned long long timestamp, const int currency_pair_indx, const double amount, const int type_option), где в payout будет помещен процент выплат, переменная timestamp  содержит временную метку unix времени (GMT), переменная currency_pair_indx обозначает номер валютной пары из писка валютных пар брокера (список может быть упорядочен в алфавитном порядке или каком либо другом порядке),  переменная amount содержит размер ставки бинарного опциона, а переменная type_option указывает направление опциона BUY или SELL (принять BUY = 1 а SELL = 1).  Для получения имени валютной пары от ее номера сделать метод std::string get_currecy_pair_name(), а также добавить метод для возвращения списка валютных пар std::vector get_currecy_pair_list().

Валюту счета указывать в конструкторе класса (у брокера отличается размер минимальной и максимальной ставки в зависимости от счета).  

Общие требования:

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

Метод должен возвращать процент выплат в виде дробного числа, т.е. например не 82%, а 0.82, использовать тип double

Для таких переменных, как размер ставки или значение цены использовать тип double

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

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

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

Требования к коду:

  • Код должен быть протестирован, для этого стоит написать тестовую программу
  • Код должен быть написан на С++ 11
  • Программа на С++ должна работать с компилятором mingw 7.3.0
Требования к оформлению кода:

  • Писать комментарии к коду на русском языке
  • Комментариями сопровождать все не понятные (сложные) места кода, а также сопровождать абсолютно все методы класса, функции, объекты класса.
  • Использовать в качестве отступа табуляцию длиной 4 символа
  • Делать комментарии к функциям, методам, объектам класса и пр. с использованием правил оформления для Doxygen. Статья про Doxygen: https://habr.com/ru/post/252101/ Т.е. например:         /** \brief Получить данные потока процентов выплат

             * Проценты выплат варьируются обычно от 0 до 1.0, где 1.0 соответствует 100% выплате брокера

             * Порядок следования валютных пар зависит от порядка, указанного в массие функции init_symbols

             * \param buy проценты выплат по сделкам BUY для всех валютных пар

             * \param sell проценты выплат по сделкам SELL для всех валютных пар

             * \return состояние ошибки (0 в случае успеха, иначе см. ErrorType)

             */

            inline int get_stream_proposal(std::vector &buy,

                                           std::vector &sell);

    
  • Использовать стиль CamelCase для имен классов, переменные и методы называть в стиле snake_case. Пример:

    https://github.com/NewYaroslav/binary-cpp-api/blob/master/include/BinaryApi.hpp

    https://github.com/NewYaroslav/olymptrade-cpp-api/blob/master/include/OlympTradeAPI.hpp

  • Реализовать код на С++ в виде header-only библиотеки, при этом для каждого брокера отдельный "репозиторий".
  • Попытаться реализовать весь С++ код header-only библиотеки для каждого брокера в одном файле, т.е. не выделять под второстепенные классы по новому файлу, если эти классы небольшого размера.
  • В остальном придерживаться правил оформления кода:
  • https://habr.com/ru/post/172091/

    http://cpp-cpp.blogspot.com/2014/09/c.html

Решить поставленную задачу до 16 августа 2019 года. 

Оплата частями, или при предоставлении хороших примеров работ 50% предоплата.
5 лет назад
ELEKTRO_YAR
Ярослав 
30 летРоссия
5 лет в сервисе
Был
3 года назад
  • Похожие заказы
  • Нужно написать программу для arduino, в которой осуществляется управление частотным преобразователем (даташит во вложениях) по протоколу rs485 и с помощью одноименного модуля. В программе нужно реализовать только функции подключения и управления некоторыми параметрами (старт, стоп, ...

    Прикладное ПО1 исполнитель
    Завершен
    5 лет назад
  • Есть макрос, который генерирует договоры. То есть в файле Excel есть поля (имя клиента, даты, суммы). После нажатия на кнопку формируется вордовский файл – договор. Макрос был сделан на Windows и не работает на Mac ...

    Прикладное ПОнет заявок
    Закрыт
    5 лет назад
  • $1000

    Есть проект на базе МК STM32F107, измерительной части ADE7953 и с графическим дисплеем. Необходимо вдохнуть жизнь в несколько собранных экземпляров, обеспечить хранение и корректное отображение кВт*ч и кВар*час, измеряемых ADE, на ЖКИ. В идеале - откалибровать самостоятельно, ...

    Закрыт
    5 лет назад
  • Коллеги добрый день. Ищу инженеров ЦТО, у которых магазины с кассами Фронтол. Обязательно в городе Москва! Необходима их дополнительная настройка, под нашу программу лояльности. Все подробности в личном общении.

    Прикладное ПОнет заявок
    Закрыт
    5 лет назад
  • $230

    По датам: у меня ещё не всё оборудование настроено, чтобы я мог дать доступы. Предлагаю установить с 12 августа по 12 сентября. Я так понимаю, нужно будет 3 компа: 1) линукс в локалке, подключенный к и-нету ...

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

    Закрыт
    5 лет назад
  • Разработка пользовательских интерфейсов (в том числе мобильных) с использованием стека ReactJS. Работа с проектами, которые уже живут в production и где растет количество пользователей, трафик, базы данных и нагрузка на инфраструктуру.  С чем работать:  [list][*]ReactJS / Redux ...

    Закрыт
    5 лет назад
  • Добрый день! Нужен программист для создания бота который будет в автоматическом режиме проставлять ставки по прогнозам в букмекерской конторе bet365. Бот должен распознавать прогнозы с сайта https://www.betonsuccess.ru/ далее производить поиск события в линии БК и покупать их. Проект ...

    Закрыт
    5 лет назад
  • Создание алгоритма на языке c# с использованием библиотек программы строительного проектирования AutodeskRevit (Revit API) Пример: пользователь создаёт линию от А до Б инструментом"Линия". Надстройка должна повторить данное действие n-ное количество раз. Для выполнения пишется техническое задание исходя ...

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

    Закрыт
    5 лет назад