cjw123ztt / stocktupoui

realtime subscribe the stock tupo info
0 stars 2 forks source link

twap内存映射*行情信息,以便减少内存使用 #194

Open cjw123ztt opened 2 years ago

cjw123ztt commented 2 years ago
  1. 传输方式通过配置url来实现,是tcp还是内存映射
  2. 目前的方法是传输所有的合约信息,不管合约有没有变化,频率是ats_config::get_instance()->get_gui_timer()
  3. 每次传输都会调用serializeAndSend,重新申请和释放内存,消耗很大导致bad allocation
  4. 有一个序列化与反序列化的过程
  5. 如果用共享内存就没有这个过程了 解决方法
  6. append_log 决定是否输出.json文件
  7. logger的level如何设定
  8. 能不能共享一个内存,前提是要求同步操作,加个锁
cjw123ztt commented 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(); }

cjw123ztt commented 2 years ago

template void serializeAndSend(const T& msg, std::string destination = "ALL") { try {

                //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;
            }
cjw123ztt commented 2 years ago

void ats_manager::initialize_logger() { std::string logFile = ats_config::get_instance()->get_log_file(); loggerv2::init(logFile); //boost::shared_ptr sink(new terra::common::memory_log_sink(boost::make_shared())); //log_sink = sink; //logging::core::get()->add_sink(sink); return ; }

cjw123ztt commented 2 years ago

image

cjw123ztt commented 2 years ago
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
  1. RTLoggerAppender->CommonLogger
  2. Log->Logger->LogManager
cjw123ztt commented 2 years ago
性能 comments
多线程 线程id,线程名称,线程主函数log
定时器 atsserver.publish_task,也是一线程
多核
gpu
共享内存
高精度时间戳
cjw123ztt commented 2 years ago
  1. 手工下单需要2s才结束 image
  2. 全流程的手动下单

image

  1. twap.log vs ui.log image
cjw123ztt commented 2 years ago
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
cjw123ztt commented 2 years ago

把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 一个单好好几笔成交
cjw123ztt commented 2 years ago
下单 开平仓 先决条件 comments
双击下单 开仓 auto=false 直接下单
双击下单 开仓 auto=true 生成twap任务再下单,已有任务则先撤单
策略下单 开仓 auto=true,active=true 生成twap任务再下单,已有任务则等待直到该任务结束
强制平仓 平仓,平今还是平昨 NA,今仓还是昨仓 tradeitem有仓位。上期所SHFE平今平昨的区别https://blog.csdn.net/wowotuo/article/details/43242663