{"id":19534976,"url":"https://github.com/newyaroslav/binary-cpp-api","last_synced_at":"2025-08-01T05:14:25.931Z","repository":{"id":162735294,"uuid":"158737811","full_name":"NewYaroslav/binary-cpp-api","owner":"NewYaroslav","description":"Binary C++ API client","archived":false,"fork":false,"pushed_at":"2025-04-02T17:04:22.000Z","size":41750,"stargazers_count":10,"open_issues_count":2,"forks_count":9,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-26T14:42:24.895Z","etag":null,"topics":["binary-options","forex-prediction","forex-trading","forexconnect-api","trading","trading-algorithms","trading-api","trading-bot","trading-strategies","trading-systems"],"latest_commit_sha":null,"homepage":"https://www.binary.com","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NewYaroslav.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-11-22T18:29:48.000Z","updated_at":"2025-04-02T17:04:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"95f91c23-02c7-455d-98e7-b7e957dcc2fb","html_url":"https://github.com/NewYaroslav/binary-cpp-api","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/NewYaroslav/binary-cpp-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fbinary-cpp-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fbinary-cpp-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fbinary-cpp-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fbinary-cpp-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NewYaroslav","download_url":"https://codeload.github.com/NewYaroslav/binary-cpp-api/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fbinary-cpp-api/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268171959,"owners_count":24207437,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-01T02:00:08.611Z","response_time":67,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["binary-options","forex-prediction","forex-trading","forexconnect-api","trading","trading-algorithms","trading-api","trading-bot","trading-strategies","trading-systems"],"created_at":"2024-11-11T02:16:44.135Z","updated_at":"2025-08-01T05:14:25.873Z","avatar_url":"https://github.com/NewYaroslav.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"![binary-cpp-api logo](doc/logo/binary-cpp-api_logo.png)\n\n***\n\n### Внимание!\n\nРекомендую перейти на библиотеку [optionx_cpp](https://github.com/NewYaroslav/optionx_cpp) после добавления в неё API Binary, так как проект `binary-cpp-api` развиваться дальше не будет.\n\n### Описание\n\nДанная *header-only* библиотека содержит класс для взаимодействия с Binary.com WebSocket API v3. [https://developers.binary.com/api/](https://developers.binary.com/api/). \n\nНа данный момент библиотека находится в разработке\n\n### Как пользоваться?\n\nЧтобы начать использовать BinaryAPI в своей программе, необходимо после подключения всех зависимостей в проект просто добавить заголовочный файл *BinaryAPI.hpp*. Также для использования дополнительных возможностей, упрощающих использование API, можно добавить в проект файлы с окончанием *Easy.hpp* \n\n* *BinaryAPI.hpp* содержит класс для взаимодействия с брокером Binary\n* *BinaryApiEasy.hpp* содержит функции для загрузки, записи, чтения файлов котировок.\n* *ZstdEasy.hpp* позволяет легко использовать библиотеку *zstd* для сжатия и декомпресии файлов котировок.\n* *CorrelationEasy.hpp* содержит функции для определения корреляции\n* *IndicatorsEasy.hpp* содержит индикаторы технического анализа\n* *HistoricalDataEasy.hpp* содержит класс для удобного использования исторических данных\n* *NormalizationEasy.hpp* содержит функции для нормализации данных\n* *BinaryOptionsEasy.hpp* содержит функции и классы для проведения тестов стратегий (имитация торговли)\n* *WavEasy.hpp* позволяет преобразовать котировки в звук\n* *FannEasy.hpp* местами облегчает использовать библиотеку FANN\n\n### Пример программы\n\nПрограмма, которая выводит на экран цены закрытия (последние три минутные свечи) с трех валютных пар (EURUSD, EURGBP, EURJPY), а также время сервера:\n```C++\n#include \"BinaryAPI.hpp\"\n\nint main() {\n        BinaryAPI iBinaryApi; // класс для взаимодействия с BinaryApi\n        \n        std::vector\u003cstd::string\u003e symbols; // массив валютных пар\n        symbols.push_back(\"frxEURUSD\");\n        symbols.push_back(\"frxEURGBP\");\n        symbols.push_back(\"frxEURJPY\");\n        // инициализируем список валютных пар \n        std::cout \u003c\u003c \"init_symbols \" \u003c\u003c std::endl;\n        iBinaryApi.init_symbols(symbols);\n        // инициализируем поток котировок, глубина начальной истории 60 минут\n        std::cout \u003c\u003c \"init_stream_quotations \" \u003c\u003c iBinaryApi.init_stream_quotations(60) \u003c\u003c std::endl;\n        // инициализируем поток процентов выплат\n        std::cout \u003c\u003c \"init_stream_proposal \" \u003c\u003c iBinaryApi.init_stream_proposal(10, 3, iBinaryApi.MINUTES, \"USD\") \u003c\u003c std::endl;\n        // последнее полученное с сервера время\n        unsigned long long servertime_last = 0;\n        // начинается основной цикл программы\n        std::cout \u003c\u003c \"...\" \u003c\u003c std::endl;\n        while(true) {\n                // для всех валютных пар\n                std::vector\u003cstd::vector\u003cdouble\u003e\u003e close_data; // цены закрытия\n                std::vector\u003cstd::vector\u003cunsigned long long\u003e\u003e time_data; // время открытия свечей\n                std::vector\u003cdouble\u003e buy_data; // проценты выплат (ставка вверх)\n                std::vector\u003cdouble\u003e sell_data; // проценты выплат (ставка вниз)\n                unsigned long long servertime = 0; // время сервера\n\n                if(iBinaryApi.get_servertime(servertime) != iBinaryApi.OK) {\n                        // если время сервера не удалось получить\n                        iBinaryApi.request_servertime(); // отправляем запрос на получение времени\n                        std::this_thread::sleep_for(std::chrono::milliseconds(100)); // задержка \n                        continue;\n                } else {\n                        // время было получено, проверим, прошла ли секунда\n                        if(servertime \u003e servertime_last) {\n                                // секунда прошла, сохраним последнее полученное от сервера время\n                                servertime_last = servertime;\n                        } else {\n                                std::this_thread::sleep_for(std::chrono::milliseconds(100));\n                                // секунда еще не прошла, вернемся\n                                continue;\n                        }\n                }\n                // проверим, удалось ли получить данные по котировкам и процентам выплат\n                if(iBinaryApi.get_stream_quotations(close_data, time_data) == iBinaryApi.OK \u0026\u0026\n                   iBinaryApi.get_stream_proposal(buy_data, sell_data) == iBinaryApi.OK) {\n                        // выводим последние значения котировок валютных пар\n                        for(size_t i = 0; i \u003c symbols.size(); ++i) {\n                                std::cout \u003c\u003c symbols[i] \u003c\u003c \" \" \u003c\u003c buy_data[i] \u003c\u003c \"/\" \u003c\u003c sell_data[i] \u003c\u003c std::endl;\n                                for(size_t j = time_data[i].size() - 3; j \u003c time_data[i].size(); ++j) {\n                                        std::cout \u003c\u003c close_data[i][j] \u003c\u003c \" \" \u003c\u003c time_data[i][j] \u003c\u003c std::endl;\n                                }\n                                std::cout \u003c\u003c \"size: \" \u003c\u003c time_data[i].size() \u003c\u003c std::endl;\n                        }\n                }\n                // время сервера в GMT\\UTC\n                std::cout \u003c\u003c servertime \u003c\u003c std::endl;\n                std::cout \u003c\u003c std::endl;\n                std::this_thread::yield();\n        }\n}\n```\n\n![example_1](doc/example_1.png)\n\n### Методы класса BinaryAPI\n\n* Объявление класса BinaryAPI\n\n```C++\n#include \"BinaryAPI.hpp\"\n\n//...\n\nBinaryAPI apiBinary; // откроем соединение с сервером без авторизации\n/* Вариант с авторизацией выглядит так:\n * std::string token = \"ваш токен\", app_id = \"id вашего номера приложения\"\n * BinaryAPI apiBinary(token, app_id);\n */\n\n```\n\n* Включить логирование ошибок\n\n```C++\n\napiBinary.set_use_log(true);\n\n```\n\nВсе сообщения с ошибками будут записываться в файл, имя которого задано макросом BINARY_API_LOG_FILE_NAME в файле *BinaryAPI.hpp*  \nПример сообщений из файла:\n\n```\n\n//------------------------------------------------------------------------------\nstart of error message (04.12.2018 18:30:02):\n{\"echo_req\":{\"end\":1544054400,\"granularity\":60,\"start\":1544080800,\"style\":\"candles\",\"ticks_history\":\"frxEURUSD\"},\"error\":{\"code\":\"InvalidStartEnd\",\"message\":\"Start time 1544080800 must be before end time 1544054400\"},\"msg_type\":\"ticks_history\"}\nend of error message\n//------------------------------------------------------------------------------\n\n//------------------------------------------------------------------------------\nstart of error message (04.12.2018 18:30:22):\nBinaryApi: Error, error message: Операция ввода/вывода была прервана из-за завершения потока команд или по запросу приложения.\nend of error message\n//------------------------------------------------------------------------------\n\n```\n\n* Инициализировать список валютных пар\n\nПеред тем, как активировать потоки процентов выплат или котировок, необходимо инициализировать список валютных пар\n\n```C++\n\nstd::vector\u003cstd::string\u003e symbols; // массив валютных пар\nsymbols.push_back(\"frxEURUSD\");\nsymbols.push_back(\"frxEURGBP\");\nsymbols.push_back(\"frxEURJPY\");\n// инициализируем список валютных пар \napiBinary.init_symbols(symbols);\n\n```\n\n* Поток процентов выплат\n\n```C++\n\nif(!apiBinary.is_proposal_stream()) { // если поток процентов выплат еще не был инициализирован\n\tconst double amount = 10.0; // размер ставки,по которой расчитывается процент выплат\n    const int duration = 3; // длительность опциона\n    const int duration_uint = BinaryAPI::MINUTES; // единица измерения длительности опциона, минуты\n    const std::string currency = \"USD\"; // валюта счета (при авторизации можно не указывать)\n\t// инициализируем поток процентов выплат\n\tint err_data = apiBinary.init_stream_proposal(amount, duration, duration_uint, currency);\n\tif(err_data != apiBinary.OK) { // если не удалось инициализировать поток выплат\n\t\t// что нибудь делаем, например попробуем еще раз\n\t} \n}\n\n// ...\n\n// Допустим у нас без ошибок удалось подключиться к потоку процентов выплат, теперь получим данные\n\n/* массив процентов выплат \n * номер элемента соответствует позиции в массиве валютных пар\n * Да это тот самый массив валютных пар, который мы указали в методе init_symbols\n * Например, если  frxEURUSD идет первым элементом, значит процент выплат за ставку BUY находится\n * тут buy_data[0];\n */\nstd::vector\u003cdouble\u003e buy_data; \nstd::vector\u003cdouble\u003e sell_data;\nif(apiBinary.get_stream_proposal(buy_data, sell_data) == apiBinary.OK) { // если мы без ошибок получили проценты выплат\n\t// Например, выводим последние значения процентов выплат\n\tfor(size_t i = 0; i \u003c symbols.size(); ++i) {\n\t\t\tstd::cout \u003c\u003c symbols[i] \u003c\u003c \" \" \u003c\u003c buy_data[i] \u003c\u003c \"/\" \u003c\u003c sell_data[i] \u003c\u003c std::endl;\n\t}\n}\n\n// Вдруг мы передумали получать проценты выплат, значит можно (или нужно) остановить поток\napiBinary.stop_stream_proposal();\n\n```\n\n* Поток котировок\n\n```C++\n\nconst int LAST_TIME = 60; // количество минут, которые мы предварительно загрузим в массивы с котировками\n// инициализируем поток котировок. Изначально в массивах уже будут \"исторические\" данные за последние 60 минут\napiBinary.init_stream_quotations(LAST_TIME);\n\n// Пьем чай, и вдруг\n\nstd::vector\u003cstd::vector\u003cdouble\u003e\u003e close_data; // цены закрытия\nstd::vector\u003cstd::vector\u003cunsigned long long\u003e\u003e time_data; // время открытия свечей\n// получаем котировки\nif(apiBinary.get_stream_quotations(close_data, time_data) == apiBinary.OK) {\n\t/* у нас получилось получить массивы котировок без ошибок, делаем с ними что хотим\n\t * номер элемента соответствует позиции в массиве валютных пар\n\t * в close_data[0] хранится массив котировок для валютной пары frxEURUSD (только в примере!)\n\t * соответственно, close_data[0].back() вам вернет последную цену закрытия (или просто текущий тик, если свеча еще не готова)\n\t * /\n}\n\n// Дальше мы разлили чай, пошли эти котировки...\n\napiBinary.stop_stream_quotations(); // останавливаем поток котировок\n\n/* не забываем, что и здесь у нас есть метод is_quotations_stream() \n * с помощью которого мы можем узнать, подписаны мы сейчас на котировки или нет\n */\n\n```\n\n* Поток баланса депозита\n\n```C++\n\n/* подпишемся на поток баланса депозита\n * каждый раз, когда депозит изменяет нам свое значение, сливает наши бабки\n * мы получим его размер на данный момент времени\n */\nif(apiBinary.init_stream_balance() != apiBinary.OK) {\n\t// тут мы окажемся, если произошла ошибочка\n}\n\ndouble balance; // тут будет наш баланс\nif(apiBinary.get_balance(balance) != apiBinary.OK) {\n\t/* тут мы окажемся, если произошла ошибочка, например мы не смогли \n\t * авторизироваться\n\t */\n}\n\n// а еще есть метод get_currency, при помощи которого мы можем узнать валюту счета\n\n// отпишемся от потока баланса\napiBinary.stop_stream_balance();\n\n```\n\n* Получить время сервера\n\n```C++\n\nunsigned long long server_time;\n// пытаемся получить время сервера\nif(apiBinary.get_servertime(server_time) != apiBinary.OK) { \n\t// тут мы окажемся, если у нас не удалося получить время сервера\n\t\n\t// попробуем что ли тогда отправить запрос на получение времени сервера\n\tapiBinary.request_servertime();\n}\n\n//...\n\n```\n\n* Открытие ордера BUY или SELL\n\n```C++\n\ndouble amount = 1000.0; // поставим 1000 USD, яж человек не жадный!\nint duration = 3; // опцион на при минуты!\n// откроем ордер BUY!\napiBinary.send_order(\"frxEURUSD\", amount, apiBinary.BUY, duration, apiBinary.MINUTES);\n\n// откроем ордер SELL! У нас же вилка!\napiBinary.send_order(\"frxEURUSD\", amount, apiBinary.SELL, duration, apiBinary.MINUTES);\n\n// дальше ждем, когда сольется депозит\n\n```\n\n* Загрузка исторических данных\n\n```C++\n\n// найдем timestamp даты, с которой мы хотим начать загружать историю в виде минутных баров/свечей\nunsigned long long t1 = xtime::get_unix_timestamp(5,11,2018,0,0,0);\nunsigned long long t2 = t1 + xtime::SEC_DAY * 30; // загрузим данные за 30 дней!\n\nstd::vector\u003cdouble\u003e candles_close;\nstd::vector\u003cunsigned long long\u003e candles_times;\n// загружаем данные без лимитов\nint err = apiBinary.get_candles_without_limits(\"frxEURUSD\", candles_close, candles_times, t1 + 30, t2);\n\n/* если err == 0, значит все хорошо\n * вектор candles_close содержит цены закрытия свечей\n * а вектор candles_times - время открытия свечей\n * ясно понятно?!\n */\n\nstd::vector\u003cdouble\u003e prices;\nstd::vector\u003cunsigned long long\u003e times;\n// аналогичный метод для тиков\napiBinary.get_ticks_without_limits(\"frxEURUSD\", prices, times, t1, t2)\n\n// ...\n\n```\n\n* Возможные состояния ошибок\n\n```C++\n\n// варианты ошибок API\nenum ErrorType {\n\tOK = 0, \t\t\t\t\t// процесс завершился удачно\n\tNO_AUTHORIZATION = -1, \t\t// нет авторизации\n\tNO_COMMAND = -2, \t\t\t// не было команды перед использованием метода\n\tUNKNOWN_ERROR = -3, \t\t// неизвестная ошибка\n\tNO_INIT = -4, \t\t\t\t// не было инициализации перед использованием метода\n\tNO_OPEN_CONNECTION = -5, \t// нет соединения с сервером\n\tINVALID_PARAMETER = -6, \t// какой-то параметр указали неверно\n\tDATA_NOT_AVAILABLE = -7, \t// нет данных, надо жэ...\n};\n\n```\n\n### Функции для работы с файлами\n\n* Загрузить данные за последние пару дней\n\n```C++\n\n#include \"BinaryApiEasy.hpp\"\n\n//...\n\nBinaryAPI iBinaryApi; // класс для взаимодействия с BinaryApi\n\nstd::string symbol = \"frxEURUSD\";\nunsigned long long timestamp = 12345678910; // день, с которого начнется загрузка\nstd::vector\u003cstd::vector\u003cdouble\u003e\u003e prices; // цены (за N дней)\nstd::vector\u003cstd::vector\u003cunsigned long long\u003e\u003e times; // временные метки (за N дней)\nint num_days = 5; // количество последних дней\nbool is_skip_day_off = true; // пропускать выходные дни\nint type = BinaryApiEasy::QUOTES_BARS;\n\n/* Данная функция загружает полные данные за день за последние N дней\n * Важно: При этом текущий день не учавствует в загрузке! Это значит,\n * например, что загружая данные 5 числа в 12 часов дня по GMT за последние 3 дня,\n * данная функция загрузит 4, 3, 2 дни месяца. Котировок из 5-го числа присутствовать в данных не будет!\n */\nint err = BinaryApiEasy::download_last_few_days(iBinaryApi, symbol, timestamp, prices, times, num_days, is_skip_day_off, type);\nif(err == BinaryApiEasy:OK) {\n\t// загрузка завершилась удачно\n}\n\n```\n\n* Получить имя файла из даты\n\n```C++\n\nunsigned long long timestamp = 12345678910;\n/* Выбрана последовательность ГОД МЕСЯЦ ДЕНЬ чтобы файлы были\n * в алфавитном порядке\n * file_name будет содержать имя файла без расширения!\n */\nstd::string file_name = BinaryApiEasy::get_file_name_from_date(timestamp);\n\n```\n\n* Записать бинарный файл котировок\n\n```C++\n\nstd::vector\u003cdouble\u003e prices;\nstd::vector\u003cunsigned long long\u003e times;\n// Заполним prices и times ...\n\nstd::string file_name = \"2015_6_6.hex\";\n// Записать бинарный файл котировок\nint err = BinaryApiEasy::write_binary_quotes_file(file_name, prices, times);\n\n```\n\n* Читать бинарный файл котировок\n\n```C++\n\nstd::vector\u003cdouble\u003e prices;\nstd::vector\u003cunsigned long long\u003e times;\n\nstd::string file_name = \"2015_6_6.hex\";\n// Читать бинарный файл котировок\nint err = BinaryApiEasy::read_binary_quotes_file(file_name, prices, times);\n\n```\n\n### Функции для работы с алгоритмом сжатия без потерь zstd\n\n* Создание словаря для алгоритма компресии и декомпресии\n\n```C++\n\n#include \"ZstdEasy.hpp\"\n\n//...\n\nstd::string path = \"..//..//train\"; // путь к папке с примерами обучения\nstd::string dictionary_file = \"quotes_ticks.zstd\"; // имя файла словаря\nsize_t dictionary_size = 100 * 1024; // размер словаря\n\n/* Количество сэмплов (фацлов) для обучения дожно быть примерно 1000 шт и более\n * Как правило, разумный словарь имеет размер ~ 100 КБ.\n * Рекомендуется предоставить несколько тысяч образцов, хотя это может сильно отличаться\n * Рекомендуется, чтобы общий размер всех выборок был примерно в x100 раз больше целевого размера словаря\n */\n\n// начинаем обучение\nint err = ZstdEasy::train_zstd(path, dictionary_file, 1024 * 1024);\nstd::cout \u003c\u003c \"stop train \" \u003c\u003c err \u003c\u003c std::endl;\n\n```\n\n* Компрессия или декомпрессия файлов\n\n```C++\n\nstd::string file_name = \"..//..//train//frxEURGBP//2015_12_14.hex\"; // имя файла, который надо сжать\nstd::string compress_file_name = \"compress_2015_12_14.hex\"; // имя сжатого файла\nstd::string dictionary_file = \"quotes_ticks.zstd\"; // имя файла словаря\n\n// сжимаем файл file_name, получаем файл compress_file_name\nZstdEasy::compress_file(file_name, compress_file_name, dictionary_file);\n\nstd::string decompress_file_name = \"decompress_2015_12_14.hex\"; // имя файла после декомпресии\n\n// декомпрессия файла compress_file_name, получаем на выходе файл decompress_file_name\nZstdEasy::decompress_file(compress_file_name, decompress_file_name, dictionary_file);\n\n```\n\n* Чтение или запись сжатых файлов\n\n```C++\nstd::vector\u003cdouble\u003e prices;\nstd::vector\u003cunsigned long long\u003e times;\n\n// заполним prices и times данными\n//...\n\nstd::string dictionary_file = \"quotes_ticks.zstd\"; // имя файла словаря\n\n// запишем данные в сжатый файл\nZstdEasy::write_binary_quotes_compressed_file(\"compress.zstd\", dictionary_file, prices, times);\n// прочитаем сжатый файл\nZstdEasy::read_binary_quotes_compress_file(\"compress.zstd\", dictionary_file, prices, times);\nstd::cout \u003c\u003c prices.back() \u003c\u003c \" \" \u003c\u003c times.back() \u003c\u003c std::endl;\n\n/* Еще есть read_compressed_file и write_compressed_file, которые позволяют записывать и читать любые данные\n */\n```\n\n* Скачать и сохранить все доступные данные по котировкам\n\n```\n\n/** \\brief Скачать и сохранить все доступыне данные по котировкам\n * \\param api Класс BinaryAPI\n * \\param symbol валютная пара\n * \\param path директория, куда сохраняются данные\n * \\param dictionary_file файл словаря для декомпресии\n * \\param timestamp временная метка, с которой начинается загрузка данных\n * \\param is_skip_day_off флаг пропуска выходных дней, true если надо пропускать выходные\n * \\param type тип загружаемых данных, QUOTES_BARS - минутные бары, QUOTES_TICKS - тики (как правило период 1 секунда)\n * \\param user_function - функтор (можно указать NULL, если не нужен)\n */\nint download_and_save_all_data_with_compression(\n   BinaryAPI \u0026api,\n   std::string symbol,\n   std::string path,\n   std::string dictionary_file,\n   unsigned long long timestamp,\n   bool is_skip_day_off = true,\n   int type = QUOTES_BARS,\n   void (*user_function)(std::string,\n\tstd::vector\u003cdouble\u003e \u0026,\n\tstd::vector\u003cunsigned long long\u003e \u0026,\n\tunsigned long long) = NULL);\n\t\t\t\n```\n\n\n### Готовые программы для ОС Windows\n\nВ архиве bin.7z содержится несколько программ.\n\nПрограмма *binary_recorder.exe* записывает проценты выплат для каждой секунды, а также загружает исторические данные тиков и минутных баров за цельный рабочий день.\n\nПрограмма *binary_proposal_recorder.exe*, которая записывает каждую секунду проценты выплат с валютных пар (WLDAUD...WLDUSD, AUDCAD, AUDCHF, AUDJPY, AUDNZD, AUDUSD, EURAUD, EURCAD, EURCHF, EURGBP, EURJPY, EURNZD, EURUSD, GBPAUD, GBPCAD, GBPCHF, GBPJPY)\nПроценты выплат записываются для сделок PUT и CALL с временем экспирации 3 минуты. Для расчета процента используется ставка 10 USD.\nДанные записываются в виде бинарных файлов. Каждый файл соответствует конкретной дате и название файла формируется из даты, когда он был записан (например *proposal_29_11_2018.hex*). Время для каждого сэмпла указано в виде 8 байт timestamp в конце, используется время сервера Binary (GMT).\nМаксимальное число сэмплов в файле соответствует количеству секунд одного дня. \n\nПрограмма *simply_upload_history.exe* загружает исторические данные котировок.\n\nНастройки программы хранятся в JSON файле *settings.json*. Пример содержимого файла:\n```java\n{\n\t\"disk\": \"D\", // диск, на котором находится программа\n\t\"path\": \"_repoz//binary_historical_data\", // папка (репозиторий git), где будут храниться данные\n\t\"amount\": 10.0, // ставка для расчета процентов выплат\n\t\"duration\": 3, // время экспирации опциона\n\t\"duration_uint\": 2, // единица измерения времени (2 - минуты)\n\t\"currency\": \"USD\", // валюта счета \n\t\"folder\": \"proposal_data\", // папка, где будут храниться данные процентов выплат\n\t\"git\": 1 // использовать git для загрузки данных в репозиторий\n}\n```\n\nНа данный момент данные по процентам выплат будут храниться в репозитории [https://github.com/NewYaroslav/binary_historical_data](https://github.com/NewYaroslav/binary_historical_data). \n\nПрограмма *martingale_does_not_work.exe* позволяет сравнить разные варианты мани менеджмента и прийти к выводу, что мартингейл не работает.\n\n![martingale_does_not_work_2](doc/martingale_does_not_work_2.png)\n\n\n### Зависимости\n\n*binary-cpp-api* зависит от следующих внешних библиотек / пакетов\n\n* *Simple-WebSocket-Server (необходимо для BinaryApi)* - [https://gitlab.com/eidheim/Simple-WebSocket-Server](https://gitlab.com/eidheim/Simple-WebSocket-Server)\n* *Boost.Asio* или автономный *Asio (необходимо для BinaryApi)* - [http://think-async.com/Asio](http://think-async.com/Asio)\n* *Библиотека OpenSSL (необходимо для BinaryApi)* - [http://slproweb.com/products/Win32OpenSSL.html](http://slproweb.com/products/Win32OpenSSL.html)\n* *Библиотека JSON (необходимо для BinaryApi)* - [https://github.com/nlohmann/json](https://github.com/nlohmann/json)\n* *Библиотека zstd (для работы с сжатыми файлами)* - [https://github.com/facebook/zstd](https://github.com/facebook/zstd)\n* *Библиотека xtime (необходимо для BinaryApi и для работы с файлами)* - [https://github.com/NewYaroslav/xtime_cpp.git](https://github.com/NewYaroslav/xtime_cpp.git)\n* *Библиотека banana-filesystem-cpp (для работы с файлами)* - [https://github.com/NewYaroslav/banana-filesystem-cpp](https://github.com/NewYaroslav/banana-filesystem-cpp)\n* *Библиотека imgui (для программы martingale_does_not_work)* - [https://github.com/ocornut/imgui](https://github.com/ocornut/imgui)\n* *Библиотека imgui-sfml (для программы martingale_does_not_work)* - [https://github.com/eliasdaler/imgui-sfml](https://github.com/eliasdaler/imgui-sfml)\n* *Библиотека SFML (для программы martingale_does_not_work)* - [https://www.sfml-dev.org/](https://www.sfml-dev.org/)\n* *gcc* или *mingw* с поддержкой C++11, например - [https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/7.3.0/threads-posix/seh/x86_64-7.3.0-release-posix-seh-rt_v5-rev0.7z/download](https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/7.3.0/threads-posix/seh/x86_64-7.3.0-release-posix-seh-rt_v5-rev0.7z/download)\n\nВсе необходимые библиотеки добавлены, как субмодули, в папку lib. \n\n### Полезные ссылки\n\nПросмотреть схемы JSON можно здесь - [https://github.com/binary-com/websockets/tree/gh-pages/config/v3](https://github.com/binary-com/websockets/tree/gh-pages/config/v3)\n\nСайт брокера - [https://www.binary.com/](https://www.binary.com/)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewyaroslav%2Fbinary-cpp-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnewyaroslav%2Fbinary-cpp-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewyaroslav%2Fbinary-cpp-api/lists"}