📄 cframe.h
字号:
#include <stdlib.h>
#include <string.h>
#include <ace/ACE.h>
#include <ace/CDR_Base.h>
#include <ace/OS.h>
#pragma once
/**
* @name 主帧号定义
* @{
* 主帧号
* 帧号分配说明:
* 背景资料(盘前数据)类帧0x0080—0x008f;
* 行情报价类帧0x0090—0x00af
* 指标类帧0x00b0—0x00cf
* 控制类帧0x00d0—0x00ef
* 资讯类帧0x00f0—0x00ff
*/
#define FRM_MARKET_DATA 0x0092 // 4. 盘中快照
/**
* @name Tag定义
* @{
*/
#define TAG_INTERNAL_CODE 0x00 // 内码 Dword 4
// #define TAG_TRADE_INDEX_B 0x01 // 成交序号 byte 1
#define TAG_TRADE_INDEX_DW 0x02 // 成交序号 dword 4
#define TAG_TRADE_TIME 0x03 // 交易时间 LongTime 4
#define TAG_TIME_STAMP 0x04 // 时间戳 Timestamp 8 数据产生时间
#define TAG_NEW_PRICE_W 0x05 // 最新价 word 2
#define TAG_NEW_PRICE_D 0x06 // 最新价 Dword 4
#define TAG_NEW_BID_VOL_W 0x07 // 最新成交数量 word 2
#define TAG_NEW_BID_VOL_D 0x08 // 最新成交数量 Dword 4
#define TAG_NEW_BID_VOL_L 0x09 // 最新成交数量 8字节 8
#define TAG_NEW_BID_PRICE_W 0x0a // 最新成交金额 word 2
#define TAG_NEW_BID_PRICE_D 0x0b // 最新成交金额 Dword 4
#define TAG_NEW_BID_PRICE_L 0x0c // 最新成交金额 8字节 8
#define TAG_PRE_CLOSE_PRICE_W 0x0d // 昨收盘价 word 2
#define TAG_PRE_CLOSE_PRICE_D 0x0e // 昨收盘价 Dword 4
#define TAG_OPEN_PRICE_W 0x0f // 开盘价 word 2
#define TAG_OPEN_PRICE_D 0x10 // 开盘价 Dword 4
#define TAG_HIGH_PRICE_W 0x11 // 最高价 word 2
#define TAG_HIGH_PRICE_D 0x12 // 最高价 Dword 4
#define TAG_LOW_PRICE_W 0x13 // 最低价 word 2
#define TAG_LOW_PRICE_D 0x14 // 最低价 Dword 4
#define TAG_COMMISSIONED_PRICE 0x15 // 最好委托价格标识 byte 1
#define TAG_BUY_PRICE_VOL_NUMBER 0x16 // 申买价量个数
#define TAG_BUY_PRICE_W 0x17
#define TAG_BUY_PRICE_D 0x18 //申买价
#define TAG_BUY_VOL_D 0x19
#define TAG_BUY_VOL_L 0x1a //申买量
#define TAG_SALL_PRICE_VOL_NUMBER 0x1c // 申卖价量个数
#define TAG_SALL_PRICE_W 0x1d
#define TAG_SALL_PRICE_D 0x1e //申卖价
#define TAG_SALL_VOL_D 0x1f
#define TAG_SALL_VOL_L 0x20 //申卖量
#define TAG_TRADE_TOTAL_NUMBER 0x24 //成交总量
/** @}*/// Tag定义
// 帧最大大小
#define FRAME_SIZE_MAX 8192
#define FRAME_CNT_MAX 6144
#define FRAME_DATA_START_POSI 6
// 帧头/帧尾标记
#define STX 2
#define ETX 3
struct XTimeStamp
{
union
{
struct
{
unsigned ms : 10;
unsigned sec : 6;
unsigned min : 6;
unsigned hour : 5;
unsigned day : 5;
unsigned mon : 4;
unsigned year : 15;
unsigned pad : 13;
};
char ph[8];
};
XTimeStamp(int year , int month, int day , int hour ,
int min , int sec , int ms=0, int pad=0)
{
this->year = year;
this->mon = month;
this->day = day;
this->hour = hour;
this->min = min;
this->sec = sec;
this->ms = ms;
this->pad = pad;
}
XTimeStamp()
{
this->year = 0;
this->mon = 0;
this->day = 0;
this->hour = 0;
this->min = 0;
this->sec = 0;
this->ms = 0;
this->pad = 0;
}
XTimeStamp& operator=(const XTimeStamp &Item)
{
this->year = Item.year;
this->mon = Item.mon;
this->day = Item.day;
this->hour = Item.hour;
this->min = Item.min;
this->sec = Item.sec;
this->ms = Item.ms;
this->pad = Item.pad;
return *this;
}
};
typedef struct stQuickDataStrc
{
ACE_CDR::ULong dwInternal; //内码
XTimeStamp tTimeStamp;//时间戳
long dwClosePrice; //昨收盘价
long dwOpenPrice; //开盘价
long dwHighPrice; //最高价
long dwlowPrice; //最低价
long dwNewPrice; //最新价
ACE_CDR::ULong dwTradeTime; //交易时间
unsigned char bFlag1; //最好委托价格标识
unsigned char bBidPriceLevel; //申买价量个数
long dwBidPx[5]; //申买价
long long llBidSize[5]; //申买量
unsigned char bSallBidPriceCount; //申卖价量个数
long dwOfferPx[5]; //申卖价
long long llOfferSize[5]; //申卖量
long llTradeTotal; //成交总量
} QuickDataStrc;
//包的总数、当前包号
class CFrame
{
public:
CFrame ()
{
memset (pchDataCache, 0, sizeof (ACE_CDR::Char) * FRAME_SIZE_MAX);
pshFrameLen =
(ACE_CDR::UShort *) (pchDataCache + sizeof (ACE_CDR::UShort) * 2);
m_frameLen = 0;
//
//TODO: 在此处添加构造函数代码
//
}
~CFrame ()
{
}
public:
int AddHead (ACE_CDR::UShort wFrameId, ACE_CDR::UShort wSign);
int AddData (ACE_CDR::UShort wDataId, ACE_CDR::UShort dDataId,
ACE_CDR::UShort wDataLen, ACE_CDR::Char * pchDataValue);
ACE_CDR::Char * GetDataBuf (void);
ACE_CDR::UShort GetDataLen (void);
void AddCrcCheckSum ();
void TranslateData ();
private:
ACE_CDR::Char pchDataCache[FRAME_SIZE_MAX]; //帧的数据字段和校验字段缓冲
ACE_CDR::Char m_frameBuffer[FRAME_SIZE_MAX]; //帧数据缓冲
ACE_CDR::UShort * pshFrameLen; //指向帧数据长度的指针
ACE_CDR::UShort m_frameLen; //可变帧的帧长度
};
//typedef int (*Fuc_SendFrmData)(const void *pchDataFuf, ACE_CDR::UShort ushDataLen);
class CCreateFrame
{
public:
CCreateFrame (int cnt_max = FRAME_CNT_MAX)
{
pFrmData = NULL;
//SendFrmData = parSendFrmData;
//
//TODO: 在此处添加构造函数代码
//
}
~CCreateFrame ()
{
if (pFrmData != NULL)
{
delete pFrmData;
pFrmData = NULL;
}
}
public:
//void SetFrmCutLen(ACE_CDR::UShort pshLen); //设置分割内容帧的长度
template < typename SendFunc > void SendFrm (); //发送新建的帧
bool CreateNewsFrm (QuickDataStrc * pNwTrans); //创建新闻帧
private:
void PackNewsTitleFrm (CFrame * pFrm, QuickDataStrc * pNwTrans);
public:
CFrame *pFrmData; //帧数组
};
/*
*组播帧数据
*/
template < typename SendFunc > void
CCreateFrame::SendFrm ()
{
ACE_CDR::Char * pchDataBuf = NULL;
ACE_CDR::UShort ushLen;
if (pFrmData == NULL)
{
return;
}
//获得帧数据和长度
pchDataBuf = pFrmData[n].GetDataBuf ();
ushLen = pFrmData[n].GetDataLen ();
//发送组播数据pchDataBuf, 长度ushLen
SendFunc ()((void *) pchDataBuf, ushLen);
//清除原有的帧
delete[]pFrmData;
pFrmData = NULL;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -