📄 tw.cpp
字号:
return 0;
}
int TryGetReport( BYTE * buffer, size_t len, PRCV_DATA pRCV_DATA )
{
if( len < sizeof(TW_ANS) )
return 0;
TW_ANS * pans = (TW_ANS*)buffer;
if( TW_MAGIC != pans->m_header.m_magic )
return 0;
if( 0x00 != pans->m_tag1 || 0x03 != pans->m_tag2 )
return 0;
CTWStockArray astocks;
BOOL bStockOK = GetSerialStock( pans->m_serial, astocks );
// get it, fill pRCV_DATA
size_t dataoffset = 43;
int datalen = len - dataoffset;
if( pRCV_DATA && bStockOK && astocks.GetSize() > 0 && datalen >= (int)sizeof(TW_ANS_REPORT) )
{
TW_ANS_REPORT * preport = (TW_ANS_REPORT*)(buffer+dataoffset);
memset( pRCV_DATA, 0, sizeof(RCV_DATA) );
pRCV_DATA->m_wDataType = RCV_REPORT; // no use
pRCV_DATA->m_nPacketNum = astocks.GetSize();
pRCV_DATA->m_bDISK = FALSE;
pRCV_DATA->m_pReport = new RCV_REPORT_STRUCTEx[astocks.GetSize()];
memset( pRCV_DATA->m_pReport, 0, sizeof(RCV_REPORT_STRUCTEx)*astocks.GetSize() );
CSPTime tLatest = CTSCache::GetInstance().GetLocalLatest( );
for( int i=0; i<astocks.GetSize() && i<datalen/(int)sizeof(TW_ANS_REPORT); i++ )
{
pRCV_DATA->m_pReport[i].m_cbSize = sizeof(RCV_REPORT_STRUCTEx);
pRCV_DATA->m_pReport[i].m_time = tLatest.GetTime();
pRCV_DATA->m_pReport[i].m_wMarket = (astocks[i].m_type & 0x20) ? SZ_MARKET_EX : SH_MARKET_EX;
strncpy(pRCV_DATA->m_pReport[i].m_szLabel, astocks[i].m_code,
min(sizeof(pRCV_DATA->m_pReport[i].m_szLabel),sizeof(astocks[i].m_code)));
// unknown pRCV_DATA->m_pReport[i].m_fLastClose = (float)(0.001*preport->m_open);
pRCV_DATA->m_pReport[i].m_fOpen = (float)(0.001*preport[i].m_open);
pRCV_DATA->m_pReport[i].m_fHigh = (float)(0.001*preport[i].m_high);
pRCV_DATA->m_pReport[i].m_fLow = (float)(0.001*preport[i].m_low);
pRCV_DATA->m_pReport[i].m_fNewPrice = (float)(0.001*preport[i].m_new);
pRCV_DATA->m_pReport[i].m_fVolume = (float)(0.01*preport[i].m_volume);
pRCV_DATA->m_pReport[i].m_fAmount = (float)(0.01*preport[i].m_amount);
pRCV_DATA->m_pReport[i].m_fBuyPrice[0]= (float)(0.001*preport[i].m_buy1);
pRCV_DATA->m_pReport[i].m_fBuyPrice[1]= (float)(0.001*preport[i].m_buy2);
pRCV_DATA->m_pReport[i].m_fBuyPrice[2]= (float)(0.001*preport[i].m_buy3);
pRCV_DATA->m_pReport[i].m_fBuyVolume[0]= (float)(0.01*preport[i].m_buy1vol);
pRCV_DATA->m_pReport[i].m_fBuyVolume[1]= (float)(0.01*preport[i].m_buy2vol);
pRCV_DATA->m_pReport[i].m_fBuyVolume[2]= (float)(0.01*preport[i].m_buy3vol);
pRCV_DATA->m_pReport[i].m_fSellPrice[0]= (float)(0.001*preport[i].m_sell1);
pRCV_DATA->m_pReport[i].m_fSellPrice[1]= (float)(0.001*preport[i].m_sell2);
pRCV_DATA->m_pReport[i].m_fSellPrice[2]= (float)(0.001*preport[i].m_sell3);
pRCV_DATA->m_pReport[i].m_fSellVolume[0]= (float)(0.01*preport[i].m_sell1vol);
pRCV_DATA->m_pReport[i].m_fSellVolume[1]= (float)(0.01*preport[i].m_sell2vol);
pRCV_DATA->m_pReport[i].m_fSellVolume[2]= (float)(0.01*preport[i].m_sell3vol);
}
return len;
}
return 0;
}
int TryGetMinute( BYTE * buffer, size_t len, PRCV_DATA pRCV_MINUTE, PRCV_DATA pRCV_REPORT )
{
if( len < sizeof(TW_ANS) )
return 0;
TW_ANS * pans = (TW_ANS*)buffer;
if( TW_MAGIC != pans->m_header.m_magic )
return 0;
if( 0x01 != pans->m_tag1 || 0x04 != pans->m_tag2 )
return 0;
TW_STOCK stock;
memset( &stock, 0, sizeof(stock) );
BOOL bStockOK = GetSerialStock( pans->m_serial, stock );
// get it, fill pRCV_DATA
size_t dataoffset = 43;
int datalen = len - dataoffset;
if( pRCV_MINUTE && pRCV_REPORT && bStockOK && datalen >= (int)(sizeof(TW_ANS_MINUTE)-240*sizeof(TW_MINUTE)) )
{
TW_ANS_MINUTE * pminute = (TW_ANS_MINUTE*)(buffer+dataoffset);
CSPTime tLatest = CTSCache::GetInstance().GetLocalLatest( );
int nCount = min(241,pminute->m_offset+1);
int count1 = 0, count2 = 0;
for( int k=0; k<nCount; k++ )
{
if( pminute->m_minutes[k].m_data1 <= pminute->m_high && pminute->m_minutes[k].m_data1 >= pminute->m_low )
count1 ++;
if( pminute->m_minutes[k].m_data2 <= pminute->m_high && pminute->m_minutes[k].m_data2 >= pminute->m_low )
count2 ++;
}
int mode = ( count1 > count2 ? 1 : 2 );
// minute
memset( pRCV_MINUTE, 0, sizeof(RCV_DATA) );
pRCV_MINUTE->m_wDataType = FILE_MINUTE_EX;
pRCV_MINUTE->m_nPacketNum = 1+nCount;
pRCV_MINUTE->m_bDISK = FALSE;
pRCV_MINUTE->m_pMinute = new RCV_MINUTE_STRUCTEx[1+nCount];
memset( pRCV_MINUTE->m_pMinute, 0, sizeof(RCV_MINUTE_STRUCTEx)*(1+nCount) );
pRCV_MINUTE->m_pMinute[0].m_head.m_dwHeadTag = EKE_HEAD_TAG;
pRCV_MINUTE->m_pMinute[0].m_head.m_wMarket = (stock.m_type & 0x20) ? SZ_MARKET_EX : SH_MARKET_EX;
strncpy(pRCV_MINUTE->m_pMinute[0].m_head.m_szLabel, stock.m_code,
min(sizeof(pRCV_MINUTE->m_pMinute[0].m_head.m_szLabel),sizeof(stock.m_code)));
for( int i=0; i<nCount; i++ )
{
pRCV_MINUTE->m_pMinute[i+1].m_time = CSPTime::GetTradeOffsetToTime(i,tLatest.GetTime());
if( 1 == mode )
{
pRCV_MINUTE->m_pMinute[i+1].m_fPrice = (float)(0.001 * pminute->m_minutes[i].m_data1);
pRCV_MINUTE->m_pMinute[i+1].m_fVolume = (float)(0.01 * pminute->m_minutes[i].m_data2);
}
else
{
pRCV_MINUTE->m_pMinute[i+1].m_fPrice = (float)(0.001 * pminute->m_minutes[i].m_data2);
pRCV_MINUTE->m_pMinute[i+1].m_fVolume = (float)(0.01 * pminute->m_minutes[i].m_data1);
}
pRCV_MINUTE->m_pMinute[i+1].m_fAmount = (float)(100. * pRCV_MINUTE->m_pMinute[i+1].m_fVolume * pRCV_MINUTE->m_pMinute[i+1].m_fPrice);
}
// report
memset( pRCV_REPORT, 0, sizeof(RCV_DATA) );
pRCV_REPORT->m_wDataType = RCV_REPORT; // no use
pRCV_REPORT->m_nPacketNum = 11;
pRCV_REPORT->m_bDISK = FALSE;
pRCV_REPORT->m_pReport = new RCV_REPORT_STRUCTEx[11];
memset( pRCV_REPORT->m_pReport, 0, sizeof(RCV_REPORT_STRUCTEx)*11 );
for( i=0;i <11; i++ )
{
pRCV_REPORT->m_pReport[i].m_cbSize = sizeof(RCV_REPORT_STRUCTEx);
pRCV_REPORT->m_pReport[i].m_time = CSPTime::GetTradeOffsetToTime(pminute->m_details[i].m_offset,tLatest.GetTime());
pRCV_REPORT->m_pReport[i].m_wMarket = (stock.m_type & 0x20) ? SZ_MARKET_EX : SH_MARKET_EX;
strncpy(pRCV_REPORT->m_pReport[i].m_szLabel, stock.m_code,
min(sizeof(pRCV_REPORT->m_pReport[i].m_szLabel),sizeof(stock.m_code)));
// unknown pRCV_REPORT->m_pReport[i].m_fLastClose = (float)(0.001*pminute->m_open);
pRCV_REPORT->m_pReport[i].m_fOpen = (float)(0.001*pminute->m_open);
pRCV_REPORT->m_pReport[i].m_fHigh = (float)(0.001*pminute->m_high);
pRCV_REPORT->m_pReport[i].m_fLow = (float)(0.001*pminute->m_low);
pRCV_REPORT->m_pReport[i].m_fNewPrice = (float)(0.001*pminute->m_details[i].m_price);
pRCV_REPORT->m_pReport[i].m_fVolume = (float)(0.01*pminute->m_details[i].m_volume);
pRCV_REPORT->m_pReport[i].m_fAmount = (float)(100.*pRCV_REPORT->m_pReport[i].m_fVolume*pRCV_REPORT->m_pReport[i].m_fNewPrice);
pRCV_REPORT->m_pReport[i].m_fBuyPrice[0]= (float)(0.001*pminute->m_details[i].m_buy);
if(10==i) pRCV_REPORT->m_pReport[i].m_fBuyPrice[1]= (float)(0.001*pminute->m_buy2);
if(10==i) pRCV_REPORT->m_pReport[i].m_fBuyPrice[2]= (float)(0.001*pminute->m_buy3);
if(10==i) pRCV_REPORT->m_pReport[i].m_fBuyVolume[0]= (float)(0.01*pminute->m_buy1vol);
if(10==i) pRCV_REPORT->m_pReport[i].m_fBuyVolume[1]= (float)(0.01*pminute->m_buy2vol);
if(10==i) pRCV_REPORT->m_pReport[i].m_fBuyVolume[2]= (float)(0.01*pminute->m_buy3vol);
pRCV_REPORT->m_pReport[i].m_fSellPrice[0]= (float)(0.001*pminute->m_details[i].m_sell);
if(10==i) pRCV_REPORT->m_pReport[i].m_fSellPrice[1]= (float)(0.001*pminute->m_sell2);
if(10==i) pRCV_REPORT->m_pReport[i].m_fSellPrice[2]= (float)(0.001*pminute->m_sell3);
if(10==i) pRCV_REPORT->m_pReport[i].m_fSellVolume[0]= (float)(0.01*pminute->m_sell1vol);
if(10==i) pRCV_REPORT->m_pReport[i].m_fSellVolume[1]= (float)(0.01*pminute->m_sell2vol);
if(10==i) pRCV_REPORT->m_pReport[i].m_fSellVolume[2]= (float)(0.01*pminute->m_sell3vol);
}
return len;
}
return 0;
}
int TryGetHistory( BYTE * buffer, size_t len, PRCV_DATA pRCV_DATA )
{
if( len < sizeof(TW_ANS) )
return 0;
TW_ANS * pans = (TW_ANS*)buffer;
if( TW_MAGIC != pans->m_header.m_magic )
return 0;
if( 0x09 != pans->m_tag2 )
return 0;
TW_STOCK stock;
memset( &stock, 0, sizeof(stock) );
int nCount = 0;
BOOL bStockOK = GetSerialStock( pans->m_serial, stock, &nCount );
if( 1 == nCount ) nCount = 2;
int ktype = ktypeDay;
if( 0x20 == pans->m_tag1 )
ktype = ktypeDay;
else if( 0x30 == (0xf0 & pans->m_tag1) )
ktype = ktypeMin5;
else if( 0x40 == (0xf0 & pans->m_tag1) )
ktype = ktypeMin15;
else if( 0x50 == (0xf0 & pans->m_tag1) )
ktype = ktypeMin30;
else if( 0x60 == (0xf0 & pans->m_tag1) )
ktype = ktypeMin60;
else if( 0x10 == (0xf0 & pans->m_tag1) )
ktype = ktypeDay;
else if( 0x80 == (0xf0 & pans->m_tag1) )
ktype = ktypeWeek;
else if( 0x90 == (0xf0 & pans->m_tag1) )
ktype = ktypeMonth;
// get it, fill pRCV_DATA
size_t dataoffset = 43;
int datalen = len - dataoffset;
if( pRCV_DATA && bStockOK && nCount > 0 && datalen >= nCount*(int)(sizeof(TW_ANS_HISTORY)+sizeof(DWORD)) )
{
int dataprefix = datalen - nCount*(int)(sizeof(TW_ANS_HISTORY)+sizeof(DWORD));
if( 2 == nCount && datalen >= nCount*(int)(sizeof(TW_ANS_HISTORY)+sizeof(DWORD))+36 )
{
dataprefix = datalen - nCount*(int)(sizeof(TW_ANS_HISTORY)+sizeof(DWORD)) - 36;
}
TW_ANS_HISTORY * phistory = (TW_ANS_HISTORY*)(buffer+dataoffset+dataprefix);
CSPTime tLatest = CTSCache::GetInstance().GetLocalLatest( );
// minute
memset( pRCV_DATA, 0, sizeof(RCV_DATA) );
pRCV_DATA->m_wDataType = FILE_HISTORY_EX;
pRCV_DATA->m_nPacketNum = 1 + nCount;
pRCV_DATA->m_bDISK = FALSE;
pRCV_DATA->m_pDay = new RCV_HISTORY_STRUCTEx[pRCV_DATA->m_nPacketNum+1];
memset( pRCV_DATA->m_pDay, 0, sizeof(RCV_HISTORY_STRUCTEx)*(pRCV_DATA->m_nPacketNum+1) );
pRCV_DATA->m_pDay[0].m_head.m_dwHeadTag = EKE_HEAD_TAG;
pRCV_DATA->m_pDay[0].m_head.m_wMarket = (stock.m_type & 0x20) ? SZ_MARKET_EX : SH_MARKET_EX;
strncpy(pRCV_DATA->m_pDay[0].m_head.m_szLabel, stock.m_code,
min(sizeof(pRCV_DATA->m_pDay[0].m_head.m_szLabel),sizeof(stock.m_code)));
for( int i=0; i<nCount; i++ )
{
CSPTime sptime;
if( sptime.FromStockTime( phistory[i].m_date, ktype, tLatest.GetYear() ) )
pRCV_DATA->m_pDay[i+1].m_time = sptime.GetTime();
else
return 0;
pRCV_DATA->m_pDay[i+1].m_fOpen = (float)(0.001 * phistory[i].m_open);
pRCV_DATA->m_pDay[i+1].m_fHigh = (float)(0.001 * phistory[i].m_high);
pRCV_DATA->m_pDay[i+1].m_fLow = (float)(0.001 * phistory[i].m_low);
pRCV_DATA->m_pDay[i+1].m_fClose = (float)(0.001 * phistory[i].m_close);
pRCV_DATA->m_pDay[i+1].m_fVolume = (float)(phistory[i].m_volume);
pRCV_DATA->m_pDay[i+1].m_fAmount = (float)(1000. * ((DWORD*)&(phistory[nCount]))[i] );
}
return len;
}
return 0;
}
int TryGetMultisort( BYTE * buffer, size_t len, PRCV_DATA pRCV_DATA )
{
if( len < sizeof(TW_ANS) )
return 0;
TW_ANS * pans = (TW_ANS*)buffer;
if( TW_MAGIC != pans->m_header.m_magic )
return 0;
if( 0x0a != pans->m_tag1 || 0x08 != pans->m_tag2 )
return 0;
// get it, fill pRCV_DATA
size_t dataoffset = 41;
int datalen = len - dataoffset;
if( pRCV_DATA && datalen >= (int)sizeof(TW_ANS_MULTISORT) )
{
TW_ANS_MULTISORT * pmultisort = (TW_ANS_MULTISORT*)(buffer+dataoffset);
if( 0x0006 == pmultisort->m_tag1 || datalen == sizeof(TW_ANS_MULTISORT) )
{
memset( pRCV_DATA, 0, sizeof(RCV_DATA) );
pRCV_DATA->m_wDataType = FILE_MULTISORT_EX; // no use
pRCV_DATA->m_nPacketNum = 1;
pRCV_DATA->m_bDISK = FALSE;
pRCV_DATA->m_pMultisort = new RCV_MULTISORT_STRUCTEx[1];
memset( pRCV_DATA->m_pMultisort, 0, sizeof(RCV_MULTISORT_STRUCTEx)*1 );
memcpy( pRCV_DATA->m_pMultisort, pmultisort, sizeof(TW_ANS_MULTISORT) );
return len;
}
}
return 0;
}
int TryGetDetail( BYTE * buffer, size_t len, PRCV_DATA pRCV_DATA )
{
if( len < sizeof(TW_ANS) )
return 0;
TW_ANS * pans = (TW_ANS*)buffer;
if( TW_MAGIC != pans->m_header.m_magic )
return 0;
if( 0x01 != pans->m_tag1 || 0x02 != pans->m_tag2 )
return 0;
TW_STOCK stock;
memset( &stock, 0, sizeof(stock) );
BOOL bStockOK = GetSerialStock( pans->m_serial, stock );
// get it, fill pRCV_DATA
size_t dataoffset = 43;
int datalen = len - dataoffset;
if( pRCV_DATA && bStockOK && datalen >= (int)sizeof(TW_ANS_DETAIL) )
{
TW_ANS_DETAIL * pdetail = (TW_ANS_DETAIL*)(buffer+dataoffset);
int packetsize = datalen/(int)sizeof(TW_ANS_DETAIL);
memset( pRCV_DATA, 0, sizeof(RCV_DATA) );
pRCV_DATA->m_wDataType = RCV_REPORT; // no use
pRCV_DATA->m_nPacketNum = packetsize;
pRCV_DATA->m_bDISK = FALSE;
pRCV_DATA->m_pReport = new RCV_REPORT_STRUCTEx[packetsize];
memset( pRCV_DATA->m_pReport, 0, sizeof(RCV_REPORT_STRUCTEx)*packetsize );
CSPTime tLatest = CTSCache::GetInstance().GetLocalLatest( );
for( int i=0;i <packetsize; i++ )
{
pRCV_DATA->m_pReport[i].m_cbSize = sizeof(RCV_REPORT_STRUCTEx);
pRCV_DATA->m_pReport[i].m_time = CSPTime::GetTradeOffsetToTime( pdetail[i].m_offset, tLatest.GetTime() );
pRCV_DATA->m_pReport[i].m_wMarket = (stock.m_type & 0x20) ? SZ_MARKET_EX : SH_MARKET_EX;
strncpy(pRCV_DATA->m_pReport[i].m_szLabel, stock.m_code,
min(sizeof(pRCV_DATA->m_pReport[i].m_szLabel),sizeof(stock.m_code)));
pRCV_DATA->m_pReport[i].m_fNewPrice = (float)(0.001*pdetail[i].m_price);
pRCV_DATA->m_pReport[i].m_fVolume = (float)(0.01*pdetail[i].m_volume);
pRCV_DATA->m_pReport[i].m_fAmount = (float)(100.*pRCV_DATA->m_pReport[i].m_fVolume*pRCV_DATA->m_pReport[i].m_fNewPrice);
pRCV_DATA->m_pReport[i].m_fBuyPrice[0]= (float)(0.001*pdetail[i].m_buy1);
pRCV_DATA->m_pReport[i].m_fSellPrice[0]= (float)(0.001*pdetail[i].m_sell1);
}
return len;
}
return 0;
}
int TryGetBase( BYTE * buffer, size_t len, PRCV_DATA pRCV_DATA )
{
if( len < sizeof(TW_ANS) )
return 0;
TW_ANS * pans = (TW_ANS*)buffer;
if( TW_MAGIC != pans->m_header.m_magic )
return 0;
if( 0x05 != pans->m_tag1 || 0x0b != pans->m_tag2 )
return 0;
TW_STOCK stock;
memset( &stock, 0, sizeof(stock) );
BOOL bStockOK = GetSerialStock( pans->m_serial, stock );
// get it, fill pRCV_DATA
size_t dataoffset = 45;
int datalen = len - dataoffset;
if( pRCV_DATA && bStockOK && datalen > 0 )
{
memset( pRCV_DATA, 0, sizeof(RCV_DATA) );
pRCV_DATA->m_wDataType = FILE_BASE_EX;
pRCV_DATA->m_nPacketNum = 1;
pRCV_DATA->m_bDISK = FALSE;
pRCV_DATA->m_File.m_dwLen = datalen;
strncpy( pRCV_DATA->m_File.m_szFileName, stock.m_code, min(sizeof(stock.m_code),sizeof(pRCV_DATA->m_File.m_szFileName)-1) );
if( strlen(pRCV_DATA->m_File.m_szFileName)+5 < sizeof(pRCV_DATA->m_File.m_szFileName) )
strcat(pRCV_DATA->m_File.m_szFileName, ".txt");
pRCV_DATA->m_pData = new BYTE[datalen+1];
memcpy( pRCV_DATA->m_pData, buffer + dataoffset, datalen );
((char*)pRCV_DATA->m_pData)[datalen] = 0;
return len;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -