Closed linonetwo closed 5 months ago
是配置用法问题(但不确定是哪里配错了),因为 C++ 写的 parser 也收不到信息。但是 ParserCTP 用同样的接口在发消息就能收到。
ParserRandom 生成随机测试行情的代码
void ParserRandom::subscribe(const CodeSet &vecSymbols)
{
m_running = true;
std::thread(&ParserRandom::generateRandomData, this, vecSymbols).detach();
}
void ParserRandom::unsubscribe(const CodeSet &vecSymbols)
{
m_running = false;
}
void ParserRandom::generateRandomData(const CodeSet &vecSymbols)
{
std::default_random_engine generator(static_cast<long unsigned int>(time(0)));
std::uniform_real_distribution<double> priceDist(100.0, 200.0); // Example price range
std::uniform_int_distribution<int> volumeDist(100, 1000); // Example volume range
while (m_running)
{
for (const std::string &symbol : vecSymbols)
{
WTSTickData *tick = WTSTickData::create("IC2401");
WTSTickStruct "e = tick->getTickStruct();
// strcpy(quote.exchg, pCommInfo->getExchg());
strcpy(quote.exchg, "CFFEX");
m_uTradingDate = TimeUtils::getCurDate();
// Randomly generate the fields similar to OnRtnDepthMarketData
quote.price = priceDist(generator);
quote.open = priceDist(generator);
quote.high = priceDist(generator);
quote.low = priceDist(generator);
quote.total_volume = volumeDist(generator);
quote.trading_date = m_uTradingDate;
// ... fill other fields similarly
// Print tick data for debugging
// std::cout << "Symbol: " << symbol << ", Price: " << quote.price << ", Volume: " << quote.total_volume << std::endl;
if (m_sink)
m_sink->handleQuote(tick, 1);
tick->release();
}
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
可能是 session 等地方配错了。
mdparsers.yaml
parsers: # 行情通道配置
- active: true
broker: '8888'
code: '' # 要录制的合约代码,如果为空默认contracts.json中的全部,不为空则只录制指定的合约,注意这里须与contracts中的代码一致!如'CFFEX.IF2408, CFFEX.IF2403'
front: tcp://121.37.90.193:20004 #openctp
id: parser
user: 1234
pass: 123456
module: ParserRandom
dtcfg.yaml
basefiles: # 基础文件
commodity: ../common/commodities.json
contract: ../common/contracts.json
holiday: ../common/holidays.json
session: ../common/sessions.json
utf-8: true
broadcaster: # UDP广播器配置项,如果要在局域网转发行情,可以使用该模块
active: true
bport: 3997 # UDP查询端口,主要是用于查询最新的快照
broadcast: # 广播配置
- host: 255.255.255.255 # 广播地址,255.255.255.255会向整个局域网广播,但是受限于路由器
port: 9001 # 广播端口,接收端口要和广播端口一致
type: 2 # 数据类型,固定为2
shmcaster: # 共享内存转发,适合本机转发
active: true
path: ./exchange.membin # memmap文件路径
parsers: mdparsers.yaml
statemonitor: statemonitor.yaml
writer: # 数据落地配置
module: WtDataStorage #数据存储模块
async: true #同步落地还是异步落地,期货推荐同步,股票推荐异步
groupsize: 20 #日志分组大小,主要用于控制日志输出,当订阅合约较多时,推荐1000以上,当订阅的合约数较少时,推荐100以内
path: ../storage_AD #数据存储的路径
savelog: true #是否保存tick到csv
disabletick: false #不保存tick数据,默认false
disablemin1: false #不保存min1数据,默认false
disablemin5: false #不保存min5数据,默认false
disableday: false #不保存day数据,默认false
disablehis: false #收盘作业不转储历史数据,默认false
commodities.json
{
"CFFEX": {
"IC": {
"covermode": 0,
"pricemode": 0,
"category": 1,
"precision": 1,
"pricetick": 0.2,
"volscale": 200,
"name": "中证",
"exchg": "CFFEX",
"session": "SD0930",
"holiday": "CHINA"
},
sessions.json
{
"SD0930":{
"name":"股票白盘0930",
"offset": 0,
"auction":{
"from": 929,
"to": 930
},
"sections":[
{
"from": 930,
"to": 1130
},
{
"from": 1300,
"to": 1500
}
]
},
"FD0915":{
"name":"期货白盘0915",
"offset": 0,
"auction":{
"from": 929,
"to": 930
},
"sections":[
{
"from": 930,
"to": 1130
},
{
"from": 1300,
"to": 1515
}
]
},
运行后没有接收到行情。(我在 c++ 部分加过 log,c++ 那边是一直在循环输出行情的)
而同时如果使用 ParserCTP 就能正常收到 tick
已协助一村解决。通过parserUDP转发时候可用testudp查看是否正确转发行情,目测已转发出。需要在run中改主kline合约代码。检查订阅的合约是否有行情。
,
感谢,我昨天写了个自动产 parser 的 CI,今天让他自己改改合约名多试试…
推荐检查流程: 1、检查是否正确配置自定义品种的合约信息 2、使用testUDP检查是否正确转发 3、检查策略是否正确订阅tick数据
This is the code in
demos/test_extmodules
that is modified:And this tdparser.yaml config. I understand
tdparsers.yaml
is about loading parser that provided by .so file? So the parser in the python code don't need to be registered using this yaml file. (I did so, and getSame name of parsers: myParser
error)I get this log
I also made an empty strategy for log. It should log if receive simulated data
But I didn't receive any simulated data from my parser.