SlideShare a Scribd company logo
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;
}
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Пример 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;
}
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Пример 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 (20)

PDF
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
Atsushi Tadokoro
 
PPT
JavaScript
Aleksandr Motsjonov
 
DOCX
Image Fundamental
Lusiana Diyan
 
PPTX
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
Ho Kim
 
PPTX
JavaScript Assíncrono
Natã Barbosa
 
PPTX
Александра Калинина "Trojan War: SinonJS"
Fwdays
 
PDF
The core of javascript
springuper
 
PDF
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
devCAT Studio, NEXON
 
PDF
Menguak Misteri Module Bundler
Riza Fahmi
 
PDF
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Loïc Knuchel
 
PDF
数式を構文解析した話
y1r96 Ueno
 
PDF
JUG.ua 20170225 - Java bytecode instrumentation
Anton Arhipov
 
PDF
Hyrje openmp
L Dr
 
PDF
Writeup ctf online idsecconf 2017
idsecconf
 
PPTX
Java лаб13
Enkhee99
 
PPTX
Java осень 2012 лекция 6
Technopark
 
PDF
D2D Pizza JS Игорь Ковган "Koa поможет"
Dev2Dev
 
PDF
Java Thread Cronometro
jubacalo
 
PDF
المحاضره 6 & 7 c#
nermeenelhamy1
 
KEY
珠三角技术沙龙新语言场 C++11
翀 周
 
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
Atsushi Tadokoro
 
Image Fundamental
Lusiana Diyan
 
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
Ho Kim
 
JavaScript Assíncrono
Natã Barbosa
 
Александра Калинина "Trojan War: SinonJS"
Fwdays
 
The core of javascript
springuper
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
devCAT Studio, NEXON
 
Menguak Misteri Module Bundler
Riza Fahmi
 
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Loïc Knuchel
 
数式を構文解析した話
y1r96 Ueno
 
JUG.ua 20170225 - Java bytecode instrumentation
Anton Arhipov
 
Hyrje openmp
L Dr
 
Writeup ctf online idsecconf 2017
idsecconf
 
Java лаб13
Enkhee99
 
Java осень 2012 лекция 6
Technopark
 
D2D Pizza JS Игорь Ковган "Koa поможет"
Dev2Dev
 
Java Thread Cronometro
jubacalo
 
المحاضره 6 & 7 c#
nermeenelhamy1
 
珠三角技术沙龙新语言场 C++11
翀 周
 

Viewers also liked (20)

PPTX
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Platonov Sergey
 
PPT
Евгений Крутько, Многопоточные вычисления, современный подход.
Platonov Sergey
 
PPTX
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Sergey Platonov
 
PPTX
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Sergey Platonov
 
PPTX
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
PPTX
Григорий Демченко, Универсальный адаптер
Sergey Platonov
 
PDF
Parallel STL
Evgeny Krutko
 
PDF
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Sergey Platonov
 
PDF
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
PDF
Fuzzing: The New Unit Testing
Dmitry Vyukov
 
PDF
Антон Бикинеев, Reflection in C++Next
Sergey Platonov
 
PDF
Clang tidy
Yury Yafimachau
 
PDF
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Yauheni Akhotnikau
 
PPTX
Фитнес для вашего кода: как держать его в форме
Ilia Shishkov
 
PPTX
C++ Core Guidelines
Sergey Zubkov
 
PPTX
Quality assurance of large c++ projects
corehard_by
 
PPTX
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Mikhail Matrosov
 
PDF
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Sergey Platonov
 
PDF
Догнать и перегнать boost::lexical_cast
Roman Orlov
 
PDF
Конверсия управляемых языков в неуправляемые
Platonov Sergey
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Platonov Sergey
 
Евгений Крутько, Многопоточные вычисления, современный подход.
Platonov Sergey
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Sergey Platonov
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Sergey Platonov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Григорий Демченко, Универсальный адаптер
Sergey Platonov
 
Parallel STL
Evgeny Krutko
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Sergey Platonov
 
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
Fuzzing: The New Unit Testing
Dmitry Vyukov
 
Антон Бикинеев, Reflection in C++Next
Sergey Platonov
 
Clang tidy
Yury Yafimachau
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Yauheni Akhotnikau
 
Фитнес для вашего кода: как держать его в форме
Ilia Shishkov
 
C++ Core Guidelines
Sergey Zubkov
 
Quality assurance of large c++ projects
corehard_by
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Mikhail Matrosov
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Sergey Platonov
 
Догнать и перегнать boost::lexical_cast
Roman Orlov
 
Конверсия управляемых языков в неуправляемые
Platonov Sergey
 
Ad

More from Platonov Sergey (20)

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

Тененёв Анатолий, 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; }
  • 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; }
  • 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