-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpy_wrapper.cpp
118 lines (98 loc) · 4.42 KB
/
py_wrapper.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include "py_wrapper.h"
#include <boost/python/class.hpp>
BOOST_PYTHON_MODULE(StrategyFramework)
{
python::enum_<BncOrder::Side>("Side")
.value("BUY", BncOrder::BUY)
.value("SELL", BncOrder::SELL)
;
python::enum_<BncOrder::Type>("Type")
.value("LIMIT", BncOrder::LIMIT)
.value("MARKET", BncOrder::MARKET)
.value("STOP_LOSS", BncOrder::STOP_LOSS)
.value("STOP_LOSS_LIMIT", BncOrder::STOP_LOSS_LIMIT)
.value("TAKE_PROFIT", BncOrder::TAKE_PROFIT)
.value("TAKE_PROFIT_LIMIT", BncOrder::TAKE_PROFIT_LIMIT)
.value("LIMIT_MAKER", BncOrder::LIMIT_MAKER)
;
python::enum_<BncOrder::TimeInForce>("TimeInForce")
.value("FOK", BncOrder::FOK)
.value("GTC", BncOrder::GTC)
.value("IOC", BncOrder::IOC)
;
python::class_<bnc_order_t>("Order")
.def_readwrite("symbol", &bnc_order_t::symbol)
.def_readwrite("newClientOrderId", &bnc_order_t::newClientOrderId)
.def_readwrite("type", &bnc_order_t::type)
.def_readwrite("side", &bnc_order_t::side)
.def_readwrite("quantity", &bnc_order_t::quantity)
.def_readwrite("timeInForce", &bnc_order_t::timeInForce)
.def_readwrite("quoteOrderQty", &bnc_order_t::quoteOrderQty)
.def_readwrite("price", &bnc_order_t::price)
.def_readwrite("stopPrice", &bnc_order_t::stopPrice)
.def_readwrite("icebergQty", &bnc_order_t::icebergQty)
;
python::enum_<OrderAction>("OrderAction")
.value("Execute", OrderAction::OA_Execute)
.value("View", OrderAction::OA_View)
.value("Correction", OrderAction::OA_Correction)
;
python::enum_<TlgKeyboard::Side>("Orientation")
.value("Vertical", TlgKeyboard::Vertical)
.value("Horizontal", TlgKeyboard::Horizontal)
;
//PyEval_InitThreads();
python::class_<StrategyServer>("StrategyServer")
;
python::class_<PyStrategyInstance, boost::noncopyable>("StrategyInstance", python::init<StrategyServer&>())
.def("exec_order", &StrategyInstance::execOrder)
.def("delete_order", &StrategyInstance::deleteOrder)
.def("delete_all_orders", &StrategyInstance::deleteAllOrders)
.def("send_message", &StrategyInstance::sendMessage, (python::arg("msg"), python::arg("alw") = false))
.def("to_log", &StrategyInstance::toLog)
.def("request_value", &StrategyInstance::requestValue)
.def("request_command", &StrategyInstance::requestCommand, (python::arg("msg"), python::arg("keys"), python::arg("orientation") = TlgKeyboard::Vertical))
.def("get_price", &StrategyInstance::getPrice)
.def("add_stream", &StrategyInstance::addStream)
.def("del_stream", &StrategyInstance::addStream)
.def("send_to_web", &StrategyInstance::toFront)
.def("to_journal", &StrategyInstance::toJournal)
.def("to_alert_channel", &StrategyInstance::toAlertChannel)
.def("create_timer", &StrategyInstance::createTimer, (python::arg("name"), python::arg("function")))
.def("start_timer", &StrategyInstance::startTimer, (python::arg("interval"), python::arg("recurring") = false))
.def("stop_timer", &StrategyInstance::stopTimer)
.def("del_timer", &StrategyInstance::delTimer)
;
}
python::object import(const std::string& module, const std::string& path, python::object& globals)
{
python::dict locals;
locals["module_name"] = module;
locals["path"] = path;
python::exec("import imp\n"
"new_module = imp.load_module(module_name, open(path), path, ('py', 'U', imp.PY_SOURCE))\n",
globals,
locals);
return locals["new_module"];
}
bool init_strategy_interface(ss_callbacks_t& callbacks, const char* sprategy_path, python::object& strategy)
{
try
{
StrategyServer strategy_server;
strategy_server.set_callbacks(callbacks);
PyImport_AppendInittab("StrategyFramework", &PyInit_StrategyFramework);
Py_Initialize();
python::object main = python::import("__main__");
python::object globals = main.attr("__dict__");
python::object module = import("strategy", sprategy_path, globals);
python::object Strategy = module.attr("Strategy");
strategy = Strategy(strategy_server);
return true;
}
catch(const python::error_already_set&)
{
PyErr_Print();
return false;
}
}