用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

178 lines
7.8 KiB

10 months ago
#include <atomic>
#include <Services/dataservice.h>
#include <Common/datastruct.h>
#include <Common/config.h>
#include <Common/util.h>
#include <Common/logger.h>
#include <Common/msgq.h>
//#include <Common/Data/datatype.h>
#include <Data/datamanager.h>
#include <Data/tickwriter.h>
#include <Data/tickreader.h>
//#include <Strategy/strategyFactory.h>
using namespace std;
namespace StarQuant
{
extern std::atomic<bool> gShutdown;
atomic<uint64_t> MICRO_SERVICE_NUMBER(0);
void DataBoardService() {
try {
// std::unique_ptr<CMsgq> msgq_sub_;
// msgq_sub_ = std::make_unique<CMsgqNanomsg>(MSGQ_PROTOCOL::SUB, CConfig::instance().SERVERPUB_URL, false);
// while (!gShutdown) {
// string msg = msgq_sub_->recmsg(0);
// if (!msg.empty()) {
// vector<string> vs = stringsplit(msg, SERIALIZATION_SEPARATOR);
// //cout<<"Databoad rec msg size:"<<vs.size()<<endl;
// if ((MSG_TYPE)(atoi(vs[0].c_str())) == MSG_TYPE::MSG_TYPE_Trade) // Always Tick; actual contents are determined by MSG_TYPE
// {
// Tick k;
// k.fullsymbol_ = vs[1];
// k.time_ = vs[2]; //atoi(vs[1].c_str());
// k.price_ = atof(vs[3].c_str());
// k.size_ = atoi(vs[4].c_str());
// k.depth_ = 1;
// if (DataManager::instance()._latestmarkets.find(k.fullsymbol_) != DataManager::instance()._latestmarkets.end()) {
// //cout<<"Databoard latest price:"<<k.price_<<" Datatype:"<<k.msgtype_<<endl;
// DataManager::instance().SetTickValue(k);
// // PRINT_TO_FILE("ERROR:[%s,%d][%s]%s.\n", __FILE__, __LINE__, __FUNCTION__, buf);
// }
// //cout<<"Databoard latest price:"<<k.fullsymbol_.length()<<DataManager::instance()._latestmarkets[k.fullsymbol_].price_<<endl;
// }
// else if ((MSG_TYPE)(atoi(vs[0].c_str())) == MSG_TYPE::MSG_TYPE_TICK_L1) // Always Tick; actual contents are determined by MSG_TYPE
// {
// Tick_L1 k;
// k.fullsymbol_ = vs[1];
// k.time_ = vs[2];
// k.price_ = atof(vs[3].c_str());
// k.size_ = atoi(vs[4].c_str());
// k.depth_ = 1;
// k.bidprice_L1_ = atoi(vs[5].c_str());
// k.bidsize_L1_ = atoi(vs[6].c_str());
// k.askprice_L1_ = atoi(vs[7].c_str());
// k.asksize_L1_ = atoi(vs[8].c_str());
// k.open_interest = atoi(vs[9].c_str());
// k.open_ = atoi(vs[10].c_str());
// k.high_ = atoi(vs[11].c_str());
// k.low_ = atoi(vs[12].c_str());
// k.pre_close_ = atoi(vs[13].c_str());
// k.upper_limit_price_ = atoi(vs[14].c_str());
// k.lower_limit_price_ = atoi(vs[15].c_str());
// if (DataManager::instance()._latestmarkets.find(k.fullsymbol_) != DataManager::instance()._latestmarkets.end()) {
// DataManager::instance().SetTickValue(k);
// // PRINT_TO_FILE("ERROR:[%s,%d][%s]%s.\n", __FILE__, __LINE__, __FUNCTION__, buf);
// }
// }
// else if ((MSG_TYPE)(atoi(vs[0].c_str())) == MSG_TYPE::MSG_TYPE_TICK_L5) // Always Tick; actual contents are determined by MSG_TYPE
// {
// Tick_L5 k;
// k.fullsymbol_ = vs[1];
// k.time_ = vs[2];
// k.price_ = atof(vs[3].c_str());
// k.size_ = atoi(vs[4].c_str());
// k.depth_ = 5;
// k.bidprice_L1_ = atoi(vs[5].c_str());
// k.bidsize_L1_ = atoi(vs[6].c_str());
// k.askprice_L1_ = atoi(vs[7].c_str());
// k.asksize_L1_ = atoi(vs[8].c_str());
// k.bidprice_L2_ = atoi(vs[9].c_str());
// k.bidsize_L2_ = atoi(vs[10].c_str());
// k.askprice_L2_ = atoi(vs[11].c_str());
// k.asksize_L2_ = atoi(vs[12].c_str());
// k.bidprice_L3_ = atoi(vs[13].c_str());
// k.bidsize_L3_ = atoi(vs[14].c_str());
// k.askprice_L3_ = atoi(vs[15].c_str());
// k.asksize_L3_ = atoi(vs[16].c_str());
// k.bidprice_L4_ = atoi(vs[17].c_str());
// k.bidsize_L4_ = atoi(vs[18].c_str());
// k.askprice_L4_ = atoi(vs[19].c_str());
// k.asksize_L4_ = atoi(vs[20].c_str());
// k.bidprice_L5_ = atoi(vs[21].c_str());
// k.bidsize_L5_ = atoi(vs[22].c_str());
// k.askprice_L5_ = atoi(vs[23].c_str());
// k.asksize_L5_ = atoi(vs[24].c_str());
// k.open_interest = atoi(vs[25].c_str());
// k.open_ = atoi(vs[26].c_str());
// k.high_ = atoi(vs[27].c_str());
// k.low_ = atoi(vs[28].c_str());
// k.pre_close_ = atoi(vs[29].c_str());
// k.upper_limit_price_ = atoi(vs[30].c_str());
// k.lower_limit_price_ = atoi(vs[31].c_str());
// if (DataManager::instance()._latestmarkets.find(k.fullsymbol_) != DataManager::instance()._latestmarkets.end()) {
// DataManager::instance().SetTickValue(k);
// // PRINT_TO_FILE("ERROR:[%s,%d][%s]%s.\n", __FILE__, __LINE__, __FUNCTION__, buf);
// }
// }
// }
// //TODO: adding trig event,sigal other thread to continue
// }
}
catch (exception& e) {
PRINT_TO_FILE_AND_CONSOLE("ERROR:[%s,%d][%s]%s.\n", __FILE__, __LINE__, __FUNCTION__, e.what());
}
catch (...) {
}
PRINT_TO_FILE("INFO:[%s,%d][%s]disconnect from market data feed.\n", __FILE__, __LINE__, __FUNCTION__);
}
void BarAggregatorServcie() {
// TODO: separate from DataBoardService
}
void TickRecordingService() {
std::unique_ptr<CMsgq> msgq_sub_;
msgq_sub_ = std::make_unique<CMsgqNanomsg>(MSGQ_PROTOCOL::SUB, CConfig::instance().SERVERPUB_URL, false);
string ymdstr = ymd();
string fname = CConfig::instance().dataDir() + "/marketdata-" + ymdstr + ".txt";
FILE* fp = fopen(fname.c_str(), "a+");
TickWriter fwriter;
fwriter.fp = fp;
char *buf = nullptr;
if (fp) {
while (!gShutdown) {
string msg = msgq_sub_->recmsg(0);
if (!msg.empty())
fwriter.put(msg);
//fwriter.insertdb(msg);
}
}
//PRINT_TO_FILE("INFO:[%s,%d][%s]recording service stopped: %s\n", __FILE__, __LINE__, __FUNCTION__);
}
void TickReplayService(const std::string& filetoreplay,int32_t tickinterval)
{
std::unique_ptr<CMsgq> msgq_pub_;
msgq_pub_ = std::make_unique<CMsgqNanomsg>(MSGQ_PROTOCOL::PUB, CConfig::instance().SERVERPUB_URL);
uint64_t curt = 0;
uint64_t logt = 0;
//vector<TimeAndMsg> lines = readreplayfile(filetoreplay);
vector<string> lines = readreplayfile(filetoreplay);
int32_t i = 0, sz = lines.size();
while (!gShutdown && i++ < sz) {
// logt = lines[i].t;
// curt = getMicroTime();
// static uint64_t diff = curt - logt; //89041208806
// while (!gShutdown && (diff + logt > curt)) {
// curt = getMicroTime();
// }
// string& msg = lines[i].msg;
string& msg =lines[i];
//cout<< "REPLAY data:"<<msg<<endl;
msgq_pub_->sendmsg(msg);
msleep(tickinterval);
}
msleep(2000);
PRINT_TO_FILE("INFO:[%s,%d][%s]replay service stopped: %s\n", __FILE__, __LINE__, __FUNCTION__);
}
}