SlideShare a Scribd company logo
1 of 20
Download to read offline
Boost.Asio в алгоритмической торговле
Тененёв Анатолий
Содержание
● Торговля на финансовых ранках
● Boost.Asio
● Алгоритмическая торговля
https://github.com/bytefury/trading_robot_2
https://github.com/bytefury/asio_examples
Торговля на ФР
Параметры заявки
●
Buy/Sell
●
Цена
●
Объём
Операции и события
● add_order – добавить заявку
● cancel_order – отменить заявку
● move_order – переместить заявку
● on_change_order – изменение статуса заявки
● on_tick – новая сделка по инструменту
● on_stocks – стакан котировок инструмента
Boost.Asio
Библиотека для разработки асинхронных
приложений.
Плюсы:
● Библиотека для С++
● Простая и удобная
● Поддержка корутин
● io_service ios;
● ios.post([]() { ... });
● ios.run(); ios.run_one();
● ios.poll(); ios.poll_one();
● ios.reset();
● io_service::work work(ios);
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace std;
namespace asio = boost::asio;
namespace pt = boost::posix_time;
namespace bs = boost::system;
int main() {
asio::io_service ios; // (1)
asio::deadline_timer timer(ios, pt::seconds(3)); // (2)
timer.async_wait([](bs::error_code){ cout << "Hello World!n"; }); // (3)
ios.run(); // (4)
return 0;
}
Пример 1
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace std;
namespace asio = boost::asio;
namespace pt = boost::posix_time;
namespace bs = boost::system;
int main() {
asio::io_service ios; // (1)
asio::spawn(ios, [&ios](asio::yield_context yield) { // (2)
asio::deadline_timer timer(ios, pt::seconds(3)); // (3)
timer.async_wait(yield); // (4)
cout << "Hello World!n";
});
ios.run(); // (5)
return 0;
}
Пример 2
Пример 3
int main() {
asio::io_service ios;
async_wait(ios, 1, [](bs::error_code, pt::ptime time) { // (1)
cout << "Hello World 1: " << time << "n";
});
asio::spawn(ios, [&ios](asio::yield_context yield) {
pt::ptime time = async_wait(ios, 3, yield); // (2)
cout << "Hello World 2: " << time << "n";
});
ios.run();
return 0;
}
Продолжение
template<typename Token>
typename boost::asio::async_result
<typename boost::asio::handler_type<Token,
void(bs::error_code, pt::ptime)>::type
>::type // в С++14 заменяем на auto
async_wait(asio::io_service& ios, int seconds, Token&& token) // (3)
{
using handler_type = typename asio::handler_type
<Token, void(bs::error_code, pt::ptime)>::type; // (4)
handler_type handler(std::forward<Token>(token)); // (5)
asio::async_result<handler_type> result(handler); // (6)
ios.post([&ios, handler, seconds]() mutable { // (7)
asio::spawn(ios, [&ios, handler, seconds](asio::yield_context yield) mutable { // (8)
asio::deadline_timer timer(ios, pt::seconds(seconds));
timer.async_wait(yield);
handler(bs::error_code(), pt::second_clock::local_time()); // (9)
});
});
return result.get(); // (10)
}
Пример 4
class ScopeGuard { // (1)
public:
ScopeGuard() {}
~ScopeGuard() { cout << "Good bye, Scope!n"; }
};
Продолжение
int main() {
unique_ptr<asio::io_service> ios1{new asio::io_service}; // (2)
unique_ptr<asio::io_service> ios2{new asio::io_service}; // (3)
asio::spawn(*ios1, [&ios1](asio::yield_context yield) {
ScopeGuard sg; // (4)
asio::deadline_timer timer(*ios1, pt::seconds(999999)); // (5)
timer.async_wait(yield);
cout << "Will it be printed?n"; // (6)
});
asio::spawn(*ios2, [&ios1, &ios2](asio::yield_context yield) {
asio::deadline_timer timer(*ios2, pt::seconds(3)); // (7)
timer.async_wait(yield);
ios1.reset(); // (8)
cout << "Coroutine finishn"; // (9)
});
while (true) { // (10)
if (!ios1 || !ios2) break; // (11)
ios1->poll(); // (12)
ios2->poll(); // (13)
}
cout << "Exitn"; // (14)
return 0;
}
Пример 5
int main() {
unique_ptr<asio::io_service> ios1{new asio::io_service};
unique_ptr<asio::io_service> ios2{new asio::io_service};
asio::spawn(*ios1, [&ios1](asio::yield_context yield) {
ScopeGuard sg;
async_wait(*ios1, 999999, yield); // (1)
cout << "Will it be printed?n";
});
asio::spawn(*ios2, [&ios1, &ios2](asio::yield_context yield) {
async_wait(*ios2, 3, yield); // (2)
ios1.reset();
cout << "Coroutine finishn";
});
while (true) {
if (!ios1 || !ios2) break;
ios1->poll();
ios2->poll();
}
cout << "Exitn";
return 0;
}
Пример 6
int main() {
unique_ptr<asio::io_service> ios1{new asio::io_service};
unique_ptr<asio::io_service> ios2{new asio::io_service};
asio::spawn(*ios1, [&ios1](asio::yield_context yield) {
ScopeGuard sg;
CustomTimer timer(*ios1, pt::seconds(999999)); // (1)
timer.async_wait(yield);
cout << "Will it be printed?n";
});
asio::spawn(*ios2, [&ios1, &ios2](asio::yield_context yield) {
CustomTimer timer(*ios2, pt::seconds(3)); // (2)
timer.async_wait(yield);
ios1.reset();
cout << "Coroutine finishn";
});
while (true) {
if (!ios1 || !ios2) break;
ios1->poll();
ios2->poll();
}
cout << "Exitn";
return 0;
}
class CustomTimer : public asio::basic_io_object<TimerService> { // (3)
public:
CustomTimer(asio::io_service& ios, const pt::time_duration& td) :
basic_io_object(ios) // (4)
{
auto& impl = get_implementation(); // (5)
impl.datetime = pt::second_clock::universal_time() + td; // (6)
}
template<typename Token>
auto async_wait(Token&& token) { // (7)
using handler_type = typename asio::handler_type
<Token, void(bs::error_code)>::type;
handler_type handler(std::forward<Token>(token));
asio::async_result<handler_type> result(handler);
get_service().async_wait(get_implementation(), std::move(handler)); // (8)
return result.get();
}
};
Продолжение
class TimerService : public asio::io_service::service { // (9)
public:
struct implementation_type { // (10)
pt::ptime datetime;
};
typedef implementation_type impl_type;
TimerService(asio::io_service& ios) : service(ios) {} // (11)
~TimerService() {}
static asio::io_service::id id; // (12)
void construct(impl_type&) {} // (13)
void destroy(impl_type&) {} // (14)
template<typename Handler>
void async_wait(impl_type& impl, Handler&& handler) { // (15)
unique_ptr<asio::deadline_timer> timer{new asio::deadline_timer(get_io_service(),
impl.datetime)}; // (16)
timer->async_wait([this, &impl, _handler=std::move(handler)](bs::error_code) mutable { // (17)
get_io_service().post([this, &impl, _handler]() mutable { // (18)
_handler(bs::error_code()); // (19)
m_timers.erase(&impl); // (20)
});
});
m_timers[&impl] = std::move(timer); // (21)
}
private:
unordered_map<void*, unique_ptr<asio::deadline_timer>> m_timers; // (22)
void shutdown_service() {} // (23)
};
asio::io_service::id TimerService::id;
Boost.Asio в алготорговле
class IMarket
{
public:
virtual ~IMarket() {}
virtual void add_order(const Order& order) = 0;
virtual void del_order(int64_t order_id) = 0;
virtual void move_order(int64_t order_id, int64_t new_order_id, double price, int volume) = 0;
virtual void req_securities() = 0;
virtual void ordlog_handler(const OrdLogHandler& handler) = 0;
virtual void order_handler(const OrderHandler& handler) = 0;
virtual void order_error_handler(const OrderErrorHandler& handler) = 0;
virtual void tick_handler(const TickHandler& handler) = 0;
virtual void stock_handler(const StockHandler& handler) = 0;
virtual void security_handler(const SecurityHandler& handler) = 0;
virtual std::vector<Quote> stocks(int64_t isin_id) = 0;
virtual pt::ptime datetime() = 0;
};
Бэктестер
while(true) {
backtester.process();
ios.poll;
}
Торговля
ios.run();
Вопросы?
Christopher Kohlhoff - Library Foundations for Asynchronous
Operations, Revision 2

More Related Content

What's hot

openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習BopenFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
Atsushi Tadokoro
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
devCAT Studio, NEXON
 
数式を構文解析した話
数式を構文解析した話数式を構文解析した話
数式を構文解析した話
y1r96 Ueno
 
Hyrje openmp
Hyrje openmpHyrje openmp
Hyrje openmp
L Dr
 
Java лаб13
Java лаб13Java лаб13
Java лаб13
Enkhee99
 
Java осень 2012 лекция 6
Java осень 2012 лекция 6Java осень 2012 лекция 6
Java осень 2012 лекция 6
Technopark
 
Java Thread Cronometro
Java Thread CronometroJava Thread Cronometro
Java Thread Cronometro
jubacalo
 
珠三角技术沙龙新语言场 C++11
珠三角技术沙龙新语言场 C++11珠三角技术沙龙新语言场 C++11
珠三角技术沙龙新语言场 C++11
翀 周
 

What's hot (20)

openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習BopenFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
 
JavaScript
JavaScriptJavaScript
JavaScript
 
Image Fundamental
Image FundamentalImage Fundamental
Image Fundamental
 
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tipsOpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
 
JavaScript Assíncrono
JavaScript AssíncronoJavaScript Assíncrono
JavaScript Assíncrono
 
Александра Калинина "Trojan War: SinonJS"
Александра Калинина "Trojan War: SinonJS"Александра Калинина "Trojan War: SinonJS"
Александра Калинина "Trojan War: SinonJS"
 
The core of javascript
The core of javascriptThe core of javascript
The core of javascript
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
 
Menguak Misteri Module Bundler
Menguak Misteri Module BundlerMenguak Misteri Module Bundler
Menguak Misteri Module Bundler
 
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
 
数式を構文解析した話
数式を構文解析した話数式を構文解析した話
数式を構文解析した話
 
JUG.ua 20170225 - Java bytecode instrumentation
JUG.ua 20170225 - Java bytecode instrumentationJUG.ua 20170225 - Java bytecode instrumentation
JUG.ua 20170225 - Java bytecode instrumentation
 
Hyrje openmp
Hyrje openmpHyrje openmp
Hyrje openmp
 
Writeup ctf online idsecconf 2017
Writeup ctf online idsecconf 2017Writeup ctf online idsecconf 2017
Writeup ctf online idsecconf 2017
 
Java лаб13
Java лаб13Java лаб13
Java лаб13
 
Java осень 2012 лекция 6
Java осень 2012 лекция 6Java осень 2012 лекция 6
Java осень 2012 лекция 6
 
D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"
 
Java Thread Cronometro
Java Thread CronometroJava Thread Cronometro
Java Thread Cronometro
 
المحاضره 6 & 7 c#
المحاضره  6   & 7 c#المحاضره  6   & 7 c#
المحاضره 6 & 7 c#
 
珠三角技术沙龙新语言场 C++11
珠三角技术沙龙新语言场 C++11珠三角技术沙龙新语言场 C++11
珠三角技术沙龙新语言场 C++11
 

Viewers also liked

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 

Viewers also liked (20)

Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
 
Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit Testing
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
Clang tidy
Clang tidyClang tidy
Clang tidy
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projects
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексией
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Конверсия управляемых языков в неуправляемые
Конверсия управляемых языков в неуправляемыеКонверсия управляемых языков в неуправляемые
Конверсия управляемых языков в неуправляемые
 

More from Platonov Sergey

HPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийHPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычислений
Platonov Sergey
 

More from Platonov Sergey (20)

Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIДмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 
QML\Qt Quick на практике
QML\Qt Quick на практикеQML\Qt Quick на практике
QML\Qt Quick на практике
 
Визуализация автомобильных маршрутов
Визуализация автомобильных маршрутовВизуализация автомобильных маршрутов
Визуализация автомобильных маршрутов
 
Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++
 
C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
 
HPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийHPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычислений
 
Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08
 
Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
 
One definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьOne definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим жить
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
 
Concepts lite
Concepts liteConcepts lite
Concepts lite
 
Денис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система QtДенис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система Qt
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
 
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
 
High quality library from scratch
High quality library from scratchHigh quality library from scratch
High quality library from scratch
 

Тененёв Анатолий, Boost.Asio в алгоритмической торговле

  • 1. Boost.Asio в алгоритмической торговле Тененёв Анатолий
  • 2. Содержание ● Торговля на финансовых ранках ● Boost.Asio ● Алгоритмическая торговля https://github.com/bytefury/trading_robot_2 https://github.com/bytefury/asio_examples
  • 3. Торговля на ФР Параметры заявки ● Buy/Sell ● Цена ● Объём
  • 4. Операции и события ● add_order – добавить заявку ● cancel_order – отменить заявку ● move_order – переместить заявку ● on_change_order – изменение статуса заявки ● on_tick – новая сделка по инструменту ● on_stocks – стакан котировок инструмента
  • 5. Boost.Asio Библиотека для разработки асинхронных приложений. Плюсы: ● Библиотека для С++ ● Простая и удобная ● Поддержка корутин
  • 6. ● io_service ios; ● ios.post([]() { ... }); ● ios.run(); ios.run_one(); ● ios.poll(); ios.poll_one(); ● ios.reset(); ● io_service::work work(ios);
  • 7. #include <iostream> #include <boost/asio.hpp> #include <boost/date_time/posix_time/posix_time.hpp> using namespace std; namespace asio = boost::asio; namespace pt = boost::posix_time; namespace bs = boost::system; int main() { asio::io_service ios; // (1) asio::deadline_timer timer(ios, pt::seconds(3)); // (2) timer.async_wait([](bs::error_code){ cout << "Hello World!n"; }); // (3) ios.run(); // (4) return 0; } Пример 1
  • 8. #include <iostream> #include <boost/asio.hpp> #include <boost/asio/spawn.hpp> #include <boost/date_time/posix_time/posix_time.hpp> using namespace std; namespace asio = boost::asio; namespace pt = boost::posix_time; namespace bs = boost::system; int main() { asio::io_service ios; // (1) asio::spawn(ios, [&ios](asio::yield_context yield) { // (2) asio::deadline_timer timer(ios, pt::seconds(3)); // (3) timer.async_wait(yield); // (4) cout << "Hello World!n"; }); ios.run(); // (5) return 0; } Пример 2
  • 9. Пример 3 int main() { asio::io_service ios; async_wait(ios, 1, [](bs::error_code, pt::ptime time) { // (1) cout << "Hello World 1: " << time << "n"; }); asio::spawn(ios, [&ios](asio::yield_context yield) { pt::ptime time = async_wait(ios, 3, yield); // (2) cout << "Hello World 2: " << time << "n"; }); ios.run(); return 0; }
  • 10. Продолжение template<typename Token> typename boost::asio::async_result <typename boost::asio::handler_type<Token, void(bs::error_code, pt::ptime)>::type >::type // в С++14 заменяем на auto async_wait(asio::io_service& ios, int seconds, Token&& token) // (3) { using handler_type = typename asio::handler_type <Token, void(bs::error_code, pt::ptime)>::type; // (4) handler_type handler(std::forward<Token>(token)); // (5) asio::async_result<handler_type> result(handler); // (6) ios.post([&ios, handler, seconds]() mutable { // (7) asio::spawn(ios, [&ios, handler, seconds](asio::yield_context yield) mutable { // (8) asio::deadline_timer timer(ios, pt::seconds(seconds)); timer.async_wait(yield); handler(bs::error_code(), pt::second_clock::local_time()); // (9) }); }); return result.get(); // (10) }
  • 11. Пример 4 class ScopeGuard { // (1) public: ScopeGuard() {} ~ScopeGuard() { cout << "Good bye, Scope!n"; } };
  • 12. Продолжение int main() { unique_ptr<asio::io_service> ios1{new asio::io_service}; // (2) unique_ptr<asio::io_service> ios2{new asio::io_service}; // (3) asio::spawn(*ios1, [&ios1](asio::yield_context yield) { ScopeGuard sg; // (4) asio::deadline_timer timer(*ios1, pt::seconds(999999)); // (5) timer.async_wait(yield); cout << "Will it be printed?n"; // (6) }); asio::spawn(*ios2, [&ios1, &ios2](asio::yield_context yield) { asio::deadline_timer timer(*ios2, pt::seconds(3)); // (7) timer.async_wait(yield); ios1.reset(); // (8) cout << "Coroutine finishn"; // (9) }); while (true) { // (10) if (!ios1 || !ios2) break; // (11) ios1->poll(); // (12) ios2->poll(); // (13) } cout << "Exitn"; // (14) return 0; }
  • 13.
  • 14. Пример 5 int main() { unique_ptr<asio::io_service> ios1{new asio::io_service}; unique_ptr<asio::io_service> ios2{new asio::io_service}; asio::spawn(*ios1, [&ios1](asio::yield_context yield) { ScopeGuard sg; async_wait(*ios1, 999999, yield); // (1) cout << "Will it be printed?n"; }); asio::spawn(*ios2, [&ios1, &ios2](asio::yield_context yield) { async_wait(*ios2, 3, yield); // (2) ios1.reset(); cout << "Coroutine finishn"; }); while (true) { if (!ios1 || !ios2) break; ios1->poll(); ios2->poll(); } cout << "Exitn"; return 0; }
  • 15.
  • 16. Пример 6 int main() { unique_ptr<asio::io_service> ios1{new asio::io_service}; unique_ptr<asio::io_service> ios2{new asio::io_service}; asio::spawn(*ios1, [&ios1](asio::yield_context yield) { ScopeGuard sg; CustomTimer timer(*ios1, pt::seconds(999999)); // (1) timer.async_wait(yield); cout << "Will it be printed?n"; }); asio::spawn(*ios2, [&ios1, &ios2](asio::yield_context yield) { CustomTimer timer(*ios2, pt::seconds(3)); // (2) timer.async_wait(yield); ios1.reset(); cout << "Coroutine finishn"; }); while (true) { if (!ios1 || !ios2) break; ios1->poll(); ios2->poll(); } cout << "Exitn"; return 0; }
  • 17. class CustomTimer : public asio::basic_io_object<TimerService> { // (3) public: CustomTimer(asio::io_service& ios, const pt::time_duration& td) : basic_io_object(ios) // (4) { auto& impl = get_implementation(); // (5) impl.datetime = pt::second_clock::universal_time() + td; // (6) } template<typename Token> auto async_wait(Token&& token) { // (7) using handler_type = typename asio::handler_type <Token, void(bs::error_code)>::type; handler_type handler(std::forward<Token>(token)); asio::async_result<handler_type> result(handler); get_service().async_wait(get_implementation(), std::move(handler)); // (8) return result.get(); } }; Продолжение
  • 18. class TimerService : public asio::io_service::service { // (9) public: struct implementation_type { // (10) pt::ptime datetime; }; typedef implementation_type impl_type; TimerService(asio::io_service& ios) : service(ios) {} // (11) ~TimerService() {} static asio::io_service::id id; // (12) void construct(impl_type&) {} // (13) void destroy(impl_type&) {} // (14) template<typename Handler> void async_wait(impl_type& impl, Handler&& handler) { // (15) unique_ptr<asio::deadline_timer> timer{new asio::deadline_timer(get_io_service(), impl.datetime)}; // (16) timer->async_wait([this, &impl, _handler=std::move(handler)](bs::error_code) mutable { // (17) get_io_service().post([this, &impl, _handler]() mutable { // (18) _handler(bs::error_code()); // (19) m_timers.erase(&impl); // (20) }); }); m_timers[&impl] = std::move(timer); // (21) } private: unordered_map<void*, unique_ptr<asio::deadline_timer>> m_timers; // (22) void shutdown_service() {} // (23) }; asio::io_service::id TimerService::id;
  • 19. Boost.Asio в алготорговле class IMarket { public: virtual ~IMarket() {} virtual void add_order(const Order& order) = 0; virtual void del_order(int64_t order_id) = 0; virtual void move_order(int64_t order_id, int64_t new_order_id, double price, int volume) = 0; virtual void req_securities() = 0; virtual void ordlog_handler(const OrdLogHandler& handler) = 0; virtual void order_handler(const OrderHandler& handler) = 0; virtual void order_error_handler(const OrderErrorHandler& handler) = 0; virtual void tick_handler(const TickHandler& handler) = 0; virtual void stock_handler(const StockHandler& handler) = 0; virtual void security_handler(const SecurityHandler& handler) = 0; virtual std::vector<Quote> stocks(int64_t isin_id) = 0; virtual pt::ptime datetime() = 0; }; Бэктестер while(true) { backtester.process(); ios.poll; } Торговля ios.run();
  • 20. Вопросы? Christopher Kohlhoff - Library Foundations for Asynchronous Operations, Revision 2