Open cjw123ztt opened 2 years ago
void ats_server::init(pub_ats_event_handler pub) { task = new publish_task(); task->handler = pub; publish_work_flow.register_workflow(task); publish_work_flow.set_sleep_timer(ats_config::get_instance()->get_gui_timer()); publish_work_flow.set_name("zmq_publish_thread"); kill_time = ats_config::get_instance()->get_shutdown_time(); m_enable_stop = ats_config::get_instance()->get_enable_auto_stop(); }
template
//1.serialize
uint8_t* buf_ptr = nullptr;
uint32_t sz = 0;
boost::shared_ptr<TMemoryBuffer> mem_buf(new TMemoryBuffer);
boost::shared_ptr<TCompactProtocol> bin_proto(new TCompactProtocol(mem_buf));
msg.write(bin_proto.get());
mem_buf->getBuffer(&buf_ptr, &sz);
//if (destination != "Log")
//{
boost::shared_ptr<TMemoryBuffer> jbuf(new TMemoryBuffer);
boost::shared_ptr<TDebugProtocol> jpro(new TDebugProtocol(jbuf));
msg.write(jpro.get());
/*boost::shared_ptr<string> str_buf(new string);
*str_buf = mem_buf->getBufferAsString();*/
//jpro->writeString()
std::ofstream in1;
std::string strname = destination + ".json";
if (bAppendLog == false)
{
in1.open(strname.c_str(), std::ios::out);
}
else
{
in1.open(strname.c_str(), std::ios::app);
}
in1 << "ser_num::" << ++ser_num << std::endl;
in1 << jbuf->getBufferAsString() << endl;
in1.close();
//}
Bytef* buffer = new Bytef[compressBound(sz) + 1024*10];//10k bytes
uLong len = sizeof(buffer);
len = compressBound(sz) + 1024 * 10;
memset(buffer, 0, len);
/*int ret = */
gzcompress(buf_ptr, sz, buffer, &len);
buf_ptr = buffer;
sz = len;
//3.send
zmq::message_t msgdestination(destination.size());
memcpy(msgdestination.data(), destination.data(), destination.size() + 1);
zmq::message_t msgbody(sz);
std::memcpy(msgbody.data(), buf_ptr, sz);
//4.send userid
m_socket_pub->send(msgdestination, ZMQ_SNDMORE);
m_socket_pub->send(msgbody);
delete[] buffer;
}
void ats_manager::initialize_logger()
{
std::string logFile = ats_config::get_instance()->get_log_file();
loggerv2::init(logFile);
//boost::shared_ptr
module | comments |
---|---|
feedbee | 只存成文件,不显示.feedsource.ini已支持,但存储方式很落后也比较慢 |
行情ui | 只显示 |
策略信号 | push_tick,lastprice |
策略仓位 | 总仓位=仓位可分已有仓位和途中pending仓位 |
合约总仓位 | |
账户总仓位 | |
op.ctptrade6313 | depend on thosttraderapi_se.lib,thosttraderapi_se.dll |
feed.ctpfeed6313 | thostmduserapi_se.lib,thostmduserapi_se.dll |
ats.define.h | 决定要编译哪些模块,但ats是hardcode依赖这些模块的lib,FEED_CTP_ES_TEST,CON_CTP_ES_TEST |
BOOST_INC,BOOST_LIB | 环境变量用于设置boost的路径.BOOST_SYSTEM_NO_DEPRECATED;BOOST_LIB_DIAGNOSTIC; |
WORKDIR2 | |
log格式 | 要统一,"时间戳,级别" |
log.key | code*,feed_code,atsname,orderid,线程id,线程名称 |
twapserver.log | C:\Users\lenovo\Desktop\ftp\20170621\codes\CppProjectsV2\terra\common\src\terra_logger |
algotradingclient.log | C:\Users\lenovo\Desktop\ftp\20170621\codes\Terra\Common\Logger,C:\Users\lenovo\Desktop\ftp\20170621\codes\Terra\Common\Log2\RTLoggerAppender |
loggerv2::error | twapserver产生的log虽然一份落在本地,一份传输给ui,内容是有少许差别的,error/warning级别才上传给ui |
性能 | comments |
---|---|
多线程 | 线程id,线程名称,线程主函数log |
定时器 | atsserver.publish_task,也是一线程 |
多核 | |
gpu | |
共享内存 | |
高精度时间戳 |
module | key | 数据结构 | 线程 | 读写操作 | 锁的粒度 | comments |
---|---|---|---|---|---|---|
统一feedsource | feedcode,feedsource | get_feed_item(code) | thread_feedsource_receive | 主要是写操作 | ||
atsinstrument策略多路选优行情 | atsname,feedcode | bind可用C++ Boost signal2信号/插槽替代 | thread_feedsource_receive | 主要是拷贝,也是写 | ||
ats策略引擎 | ats_thread | 读 | ||||
atsserver统一行情转发 | atsserver_thread | 读 |
把1:N==>N:1转换便于用列表显示
id | id1 | id2 | comments |
---|---|---|---|
orderid | twap_task_id | 策略ID | 一个twap task可能有多次下单的过程 |
close.twap_task_id | open.twap_task_id | 一个开仓twaptask需要多次平仓 | |
exec.id | orderId | 一个单好好几笔成交 |
下单 | 开平仓 | 先决条件 | comments |
---|---|---|---|
双击下单 | 开仓 | auto=false | 直接下单 |
双击下单 | 开仓 | auto=true | 生成twap任务再下单,已有任务则先撤单 |
策略下单 | 开仓 | auto=true,active=true | 生成twap任务再下单,已有任务则等待直到该任务结束 |
强制平仓 | 平仓,平今还是平昨 | NA,今仓还是昨仓 | tradeitem有仓位。上期所SHFE平今平昨的区别https://blog.csdn.net/wowotuo/article/details/43242663 |