用于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.

207 lines
8.7 KiB

10 months ago
/*****************************************************************************
* Copyright [2019]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*****************************************************************************/
#ifndef CPPSRC_STARQUANT_DATA_TICKWRITER_H_
#define CPPSRC_STARQUANT_DATA_TICKWRITER_H_
#include <Common/config.h>
#include <Common/util.h>
#include <Common/datastruct.h>
#include <APIs/Ctp/ThostFtdcUserApiDataType.h>
#include <APIs/Ctp/ThostFtdcUserApiStruct.h>
#include <APIs/Tap/TapQuoteAPIDataType.h>
#include <APIs/Tap/TapAPICommDef.h>
// #include <bson.h>
// #include <bson/bcon.h>
#include <bson/bson.h>
#include <mongoc.h>
#include <time.h>
#include <condition_variable>
#include <mutex>
#include <vector>
#include <string>
using std::mutex;
//////////////////////////////////////////////////////////////////////////
// tick recorder
//////////////////////////////////////////////////////////////////////////
namespace StarQuant {
struct TickWriter {
int32_t bufSize;
FILE* fp = nullptr;
int32_t count = 0; // length of string in the buffer
char* head = nullptr; // = raiibuf.get();
// mongodb writer
// mongoc_client_t *client;
// mongoc_database_t *database;
// mongoc_collection_t *collection;
// bson_t *command, reply, *insert;
bson_error_t error;
mongoc_client_pool_t *pool;
mongoc_uri_t *uri;
TickWriter() {
bufSize = 1024;
head = new char[bufSize];
mongoc_init();
uri = mongoc_uri_new("mongodb://localhost:27017");
pool = mongoc_client_pool_new(uri);
// client = mongoc_client_new ("mongodb://localhost:27017");
// database = mongoc_client_get_database (client, "findata");
}
~TickWriter() {
if (fp) {
fwrite(head, sizeof(char), count, fp);
fflush(fp);
fclose(fp);
}
delete[] head;
// mongoc_collection_destroy (collection);
// mongoc_database_destroy (database);
// mongoc_client_destroy (client);
mongoc_client_pool_destroy(pool);
mongoc_uri_destroy(uri);
mongoc_cleanup();
}
void put(const string& _str) {
if (!_str.empty()) {
char tmp[512] = {};
// sprintf(tmp, "%lu@%s\n", getMicroTime(), _str.c_str());
sprintf(tmp, "%s @%s\n", ymdhmsf().c_str(), _str.c_str());
uint32_t strsize = strlen(tmp); // + 1;
uint32_t required_buffer_len = count + strsize;
if (required_buffer_len > bufSize) {
size_t r = fwrite(head, sizeof(char), count, fp);
// printf("write files\n");
if (r == count) {
memcpy(head, tmp, strsize * sizeof(char));
count = strsize;
fflush(fp);
return;
} else {
// error
// http://www.cplusplus.com/reference/cstdio/fwrite/
}
}
memcpy(head + count, tmp, strsize * sizeof(char));
count = required_buffer_len;
}
}
void insertdb(const string& _str) {
if (!_str.empty()) {
vector<string> vs = stringsplit(_str, SERIALIZATION_SEPARATOR);
if ((MSG_TYPE)(atoi(vs[0].c_str())) == MSG_TYPE::MSG_TYPE_TICK_L1) {
vector<string> fullsym = stringsplit(vs[1], ' ');
string collectionname = fullsym[2];
mongoc_client_t *client = mongoc_client_pool_pop(pool);
mongoc_collection_t *collection = mongoc_client_get_collection (client, "findata", collectionname.c_str());
bson_t *doc = bson_new();
BSON_APPEND_UTF8(doc, "contractno", fullsym[3].c_str());
BSON_APPEND_DATE_TIME(doc, "datetime", string2unixtimems(vs[2]) + 8*3600000);
BSON_APPEND_DOUBLE(doc, "price", atof(vs[3].c_str()));
BSON_APPEND_INT32(doc, "size", atoi(vs[4].c_str()));
BSON_APPEND_DOUBLE(doc, "bidprice1", atof(vs[5].c_str()));
BSON_APPEND_INT32(doc, "bidsize1", atoi(vs[6].c_str()));
BSON_APPEND_DOUBLE(doc, "askprice1", atof(vs[7].c_str()));
BSON_APPEND_INT32(doc, "asksize1", atoi(vs[8].c_str()));
BSON_APPEND_INT32(doc, "openinterest", atoi(vs[9].c_str()));
BSON_APPEND_INT32(doc, "dominant", 0);
// BSON_APPEND_DOUBLE(doc, "upperLimit", atof(vs[14].c_str()));
// BSON_APPEND_DOUBLE(doc, "lowerLimit", atof(vs[15].c_str()));
// 将bson文档插入到集合
if (!mongoc_collection_insert(collection, MONGOC_INSERT_NONE, doc, NULL, &error)) {
fprintf(stderr, "Count failed: %s\n", error.message);
}
bson_destroy(doc);
mongoc_collection_destroy(collection);
mongoc_client_pool_push(pool, client);
} else if ((MSG_TYPE)(atoi(vs[0].c_str())) == MSG_TYPE::MSG_TYPE_TICK_L5) {
// 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());
}
}
}
void insertdb(const Tick& k){
vector<string> fullsym = stringsplit(k.fullSymbol_, ' ');
string collectionname = fullsym[2];
mongoc_client_t *client = mongoc_client_pool_pop(pool);
mongoc_collection_t *collection = mongoc_client_get_collection (client, "findata", collectionname.c_str());
bson_t *doc = bson_new();
BSON_APPEND_UTF8(doc, "contractno", fullsym[3].c_str());
BSON_APPEND_DATE_TIME(doc, "datetime", string2unixtimems(k.time_) + 8*3600000);
BSON_APPEND_DOUBLE(doc, "price", k.price_);
BSON_APPEND_INT32(doc, "size", k.size_);
BSON_APPEND_DOUBLE(doc, "bidprice1", k.bidPrice_[0]);
BSON_APPEND_INT32(doc, "bidsize1", k.bidSize_[0]);
BSON_APPEND_DOUBLE(doc, "askprice1", k.askPrice_[0]);
BSON_APPEND_INT32(doc, "asksize1", k.askSize_[0]);
BSON_APPEND_INT32(doc, "openinterest", k.openInterest_);
BSON_APPEND_INT32(doc, "dominant", 0);
// BSON_APPEND_DOUBLE(doc, "upperLimit", k.upper_limit_price_);
// BSON_APPEND_DOUBLE(doc, "lowerLimit", k.lower_limit_price_);
if (!mongoc_collection_insert(collection, MONGOC_INSERT_NONE, doc, NULL, &error)) {
cout << "insert mongodb failed, errormsg = " << error.message;
}
bson_destroy(doc);
mongoc_collection_destroy(collection);
mongoc_client_pool_push(pool, client);
}
};
} // namespace StarQuant
#endif // CPPSRC_STARQUANT_DATA_TICKWRITER_H_