📄 cl_hq.c
字号:
#include <windows.h>#include <windowsx.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <io.h>#include <sys\stat.h>#include <share.h>#include <fcntl.h>#include <time.h>#include "main.h"#include "hq.h"#include "sv_hq.h"#include "dbf_data.h"#include "data.h"#include "cl_hq.h"#include "cl_data.h" DBF_DATA HqkData[2], GpkData[2], SzZskData, SzMmpkData;ZX_DATA ZxData;extern void DelSpaces(LPSTR);extern BOOL clGetInitString(LPSTR, LPSTR, LPSTR);extern void clPutInitString(LPSTR, LPSTR, LPSTR);extern int GetInitInt(LPSTR, LPSTR);extern int UDPBlockingHook(void);extern BOOL run_cancelled;extern BOOL gfIsNewsSrcDel;extern int date_num,tim;extern char *HqItems[];LPDBF_DATA lpDbfDatas[]={&HqkData[0], &HqkData[1], &GpkData[0],/* &GpkData[1],*/ &SzZskData, &SzMmpkData,NULL};LPDBF_DATA lpDbfFile[2][5] ={ {&HqkData[0],&GpkData[0],&SzZskData,&SzMmpkData,NULL}, {&HqkData[1],NULL, NULL, NULL, NULL} };long oldDpCjss2[2][20];int gnHqRefreshTime =5;int Skip = -1,Idel; int clHqInit(void){ int i, jys; char tmp[256], temp[256]; OFSTRUCT os; memset(&oldDpCjss2, 0, sizeof(oldDpCjss2)); memset(&zs_times, 0, sizeof(zs_times)); if(GetInitString("HQ", "RUN", tmp)) { if(tmp[0]=='N') { HqIsRun=FALSE; return 0; } } for(i =0; i<2; i++) { memset(&HqData[i], 0, sizeof(HqData[i])); memset(&MmpData[i], 0, sizeof(MmpData[i])); memset(&HqTime[i], 0, sizeof(HqTime[i])); memset(&GraphData[i], 0, sizeof(GraphData[i])); memset(&DpData[i], 0, sizeof(DpData[i])); hfHq[i] =HFILE_ERROR; hfMmp[i] =HFILE_ERROR; hfMaxMin[i] =HFILE_ERROR; } hfDp =HFILE_ERROR; //初始化广告和新闻 memset(&ZxData, 0, sizeof(ZxData)); if(!GetInitString("ZX", "FILE0", ZxDataFile)) { ErrMsg(ghWndMain, "get zx init failed!"); PutInitString("ZX", "FILE0", ""); return -1; } strupr(ZxDataFile); hfZx =OpenFile(ZxDataFile, &os, OF_SHARE_DENY_NONE|OF_READ); if(hfZx ==HFILE_ERROR) { ErrMsg(ghWndMain, "open zx file failed"); return -1; } szNewsPath[0] =0; if(!GetInitString("NEWS", "DIR", szNewsPath)) { ErrMsg(ghWndMain, "get news init failed!"); PutInitString("NEWS", "DIR", ""); } szNewsSrc[0] =0; if(!GetInitString("NEWS", "SRC", szNewsSrc)) { ErrMsg(ghWndMain, "get news init failed!"); PutInitString("NEWS", "SRC", ""); } if(GetInitString("NEWS", "DELSRC", tmp)) { if(tmp[0]=='Y') gfIsNewsSrcDel =TRUE; else gfIsNewsSrcDel =FALSE; } else gfIsNewsSrcDel =FALSE; i=0; while(HqItems[i]) { memset(lpDbfDatas[i], 0, sizeof(DBF_DATA)); lpDbfDatas[i]->hf =-1; i++; } memset(tmp,0,sizeof(tmp)); if(clGetInitString("GLOBAL", "IDEL", tmp)) { Idel= atoi(tmp); } else { clPutInitString("GLOBAL", "IDEL", "0"); Idel=10; } //设置开闭市时间 for(jys =0; jys <2; jys++) { for(i =0; i<4; i++) { if(!GetInitString("TIME", HqTimeItems[i+4*jys], tmp)) { strcpy(tmp, HqTimeDefs[i+4*jys]); PutInitString("TIME", HqTimeItems[i+4*jys], tmp); } else { if(strlen(tmp) > 12 || strlen(tmp) <3) { ErrMsg(ghWndMain, "time set error!"); return -1; } } *lpHqTimes[i+4*jys] =atoi(strtok(tmp, ":"))*60; *lpHqTimes[i+4*jys] +=atoi(strtok(NULL, ":")); } } //初始化DBF文件 i =0; while(HqItems[i]) { if(!clGetInitString("DBF", HqItems[i], tmp)) { wsprintf(temp, "can not find %s:\n %s", (LPSTR)HqItems[i], (LPSTR)tmp); ErrMsg(ghWndMain, temp); clPutInitString("DBF", HqItems[i], NULL); return -1; } if(access(tmp,_S_IREAD) <0) { wsprintf(temp, "can not read %s:\n %s", (LPSTR)HqItems[i], (LPSTR)tmp); ErrMsg(ghWndMain, temp); return -1; } lpDbfDatas[i]->hf=OpenDbfBase(tmp,OF_READ); if (lpDbfDatas[i]->hf==-1) { wsprintf(temp, "can not open %s:\n %s", (LPSTR)HqItems[i], (LPSTR)tmp); ErrMsg(ghWndMain, temp); return -1; } strcpy(lpDbfDatas[i]->file,tmp); if (InitBase(lpDbfDatas[i]->hf,&lpDbfDatas[i]->dbfStruct, &lpDbfDatas[i]->fldStruct,&lpDbfDatas[i]->fldCount) !=SUCCEED) { wsprintf(temp, "can not init %s:\n %s", (LPSTR)HqItems[i], (LPSTR)tmp); ErrMsg(ghWndMain, temp); return -1; } i++; } //初始化分时数据结构 if(!clGetInitString("HQ", "DATAPATH", szDataPath)) { ErrMsg(ghWndMain, "not set datapath in [graph]"); PutInitString("HQ", "DATAPATH", NULL); return -1; } i =strlen(szDataPath); if(szDataPath[i] =='\\') szDataPath[i] =0; wsprintf(HqDataPath, "%s\\HQDATA", szDataPath); wsprintf(GraphData[0].szGraPath, "%s\\SZDATA", szDataPath); wsprintf(GraphData[1].szGraPath, "%s\\SHDATA", szDataPath); //初始化行情数据文件 i =0; while(HqDataFileName[i]) { wsprintf(tmp, "%s\\%s.dat", HqDataPath, HqDataFileName[i]); if(access(tmp,_S_IREAD) <0) { *HqDataFile[i] =OpenFile(tmp,&os, OF_SHARE_DENY_NONE|OF_CREATE|OF_READWRITE); if(*HqDataFile[i] ==-1) { wsprintf(temp, "can not create hq_data_file %s:", tmp); ErrMsg(ghWndMain, temp); return -1; } } else *HqDataFile[i] =OpenFile(tmp, &os, OF_SHARE_DENY_NONE|OF_READWRITE); if (*HqDataFile[i] ==HFILE_ERROR) { wsprintf(temp, "can not open hq_data_file %s:", tmp); ErrMsg(ghWndMain, temp); return -1; } i++; } //gnHqRefreshTime =GetInitInt("HQ", "REF_TIME"); //if(gnHqRefreshTime <5 || gnHqRefreshTime >60) gnHqRefreshTime =5; for(jys =0; jys <2; jys++) { CloseDbfFile(jys); } return 0;}void clHqExit(void){ static BOOL fExit =FALSE; int jys, i; if(fExit ==TRUE) return; fExit =TRUE; for(jys =0; jys <2; jys++) { if(HqData[jys].lpPreData !=NULL) GlobalFreePtr(HqData[jys].lpPreData); if(HqData[jys].lpRefData !=NULL) GlobalFreePtr(HqData[jys].lpRefData); if(HqData[jys].lpbChanged !=NULL) GlobalFreePtr(HqData[jys].lpbChanged); if(MmpData[jys].lpMmp) GlobalFreePtr(MmpData[jys].lpMmp); if(GraphData[jys].lpGraData) GlobalFreePtr(GraphData[jys].lpGraData); if(GraphData[jys].lpGraHead) GlobalFreePtr(GraphData[jys].lpGraHead); if(LzwData202[jys].recCount) GlobalFreePtr(LzwData202[jys].recCount); if(hfHq[jys] !=HFILE_ERROR) _lclose(hfHq[jys]); if(hfMmp[jys] !=HFILE_ERROR) _lclose(hfMmp[jys]); if(hfMaxMin[jys] !=HFILE_ERROR) _lclose(hfMaxMin[jys]); } if(hfDp !=HFILE_ERROR) _lclose(hfDp); i =0; while(HqItems[i]) { if(lpDbfDatas[i]->hf!=-1) { CloseDbf(lpDbfDatas[i]->hf); } if(lpDbfDatas[i]->fldStruct) GlobalFreePtr(lpDbfDatas[i]->fldStruct); i++; } if(ZxData.lpText) free(ZxData.lpText);}BOOL OpenDbfFile(int jys){ int i =0; while(lpDbfFile[jys][i]!=NULL) { if(lpDbfFile[jys][i]->hf==-1) lpDbfFile[jys][i]->hf =OpenDbfBase(lpDbfFile[jys][i]->file,OF_READ); if(lpDbfFile[jys][i]->hf == -1) return FALSE; i++; } return TRUE;}void CloseDbfFile(int jys){ int i=0; while(lpDbfFile[jys][i]!=NULL) { if(lpDbfFile[jys][i]->hf!=-1) { CloseDbf(lpDbfFile[jys][i]->hf); lpDbfFile[jys][i]->hf =-1; } i++; } }//zqdm,zrsp,jrkp,zgjg,zdjg,zgjm,zdjm,zjjg,zd,cjss,lc,npzl,wb,cjjeint HqFldLens[HQ_FLDS_COUNT]={ MAX_ZQDM_SIZE, sizeof(float),sizeof(float), sizeof(float), sizeof(float), sizeof(float), sizeof(float), sizeof(float), sizeof(float),sizeof(int), sizeof(int), sizeof(int), sizeof(float), sizeof(int)};int HqFldTypes[HQ_FLDS_COUNT]={ FLD_TYPE_STRING, FLD_TYPE_FLOAT, FLD_TYPE_FLOAT, FLD_TYPE_FLOAT, FLD_TYPE_FLOAT, FLD_TYPE_FLOAT, FLD_TYPE_FLOAT, FLD_TYPE_FLOAT, FLD_TYPE_FLOAT, FLD_TYPE_LONG, FLD_TYPE_LONG, FLD_TYPE_LONG, FLD_TYPE_FLOAT, FLD_TYPE_LONG};int HqFldPoss[2][HQ_FLDS_COUNT] ={ //0zqdm,1zrsp,2jrkp,3zgjg,4zdjg,5zgjm,6zdjm,7zjjg,8zd,9cjss,0lc,11npzl, //12wb,13cjje //{0, 2, 3, 5, 6, 8, 9, 7, -1, 4, -1,-1, -1, 15}, {0, 1, 2, 4, 5, 7, 8, 6, -1, 3, -1,-1, -1, 14}, {0, 2, 3, 5, 6, 8, 9, 7, -1, 10, -1, -1, -1, 4},};BOOL IsTodayHq(int jys){ struct _stat buff; char tmp[10]; _strdate(tmp); _fstat(HqkData[jys].hf,&buff); return TRUE;}#define _hread hRead#define PER_READ_LEN 1024Llong hRead(HFILE hf,char * buff,long len){ long rlen=0; UINT ret,plen ; if(len<=PER_READ_LEN) { ret =_lread(hf,buff,(UINT)(len)); rlen =(long)(ret); } else { rlen =0; do { if(len -rlen>= PER_READ_LEN) { plen =(UINT)(PER_READ_LEN); } else { plen =(UINT)(len -rlen); } ret =_lread(hf,buff,plen); if(ret!=HFILE_ERROR) { buff+=ret; rlen +=ret; } else { return -1; } }while(rlen<len&&ret!=HFILE_ERROR); } return rlen; }////////////////////////////////////////////////////////////////////功能 :初始化内存行情数据对象、内存买卖盘对象、内存分时数据头部信息 , // 同时,填充相应的内存行情数据的股票名称字段, 三个内存对象与填充// 操作以内存行情数据的记录号为主索引 ,所以当行情数据的记录数有变化// 时,一定要更新其余的内存对象,并重作名称填充。该例程同时初始化大盘// 内存对象和排行榜内存对象//参数 :// jys---交易所编码//返回码 :// TRUE---成功// FALSE--失败//修改日期 :1997/10/15//修改建议 :可将内存行情数据放入BTREE,BTREE内包含其余的两内存数据对象,以股票// 代码作索引int ReadHqFirst(int jys){ int i, j ; short reclen, headlen; long recCount,bytes; char *buffer; char *lpTmp; LPSTR lpFld; char tmp[100]; static BOOL fFirst[2] ={TRUE, TRUE}; if(HqkData[jys].hf <0) { ErrMsg(ghWndMain, "ReadHqFirst 不能打开行情库句柄!"); return FALSE; } if(jys ==0) MsgLocal("读取深圳行情"); else MsgLocal("读取上海行情"); reclen=*(short *)HqkData[jys].dbfStruct.rlen; headlen=*(short *)HqkData[jys].dbfStruct.hlen; //计算行情库有效记录 //recCount =GetDbfRecCount(HqkData[jys].hf,headlen,reclen); recCount =GetValidRecNum(jys); if(jys ==1) { recCount --; } if(recCount <=0) { ErrMsg(ghWndMain, "ReadHqFirst 行情库记录数为零!"); return FALSE; } // 分配内存,同时将分时数据结构等清零及初始化 if(clHqAllocMem(jys, (int)recCount) <0) { ErrMsg(ghWndMain, "ReadHqFirst:HqAllocMem错!"); return FALSE; } HqData[jys].recCount =(short)recCount; //读交易所行情文件 buffer =(char *)GlobalAllocPtr(GHND, recCount*reclen+1); if (buffer==NULL) { ErrMsg(ghWndMain, "ReadHqFirst:alloc buffer 错!"); return FALSE; } _llseek(HqkData[jys].hf,(long)headlen,SEEK_SET); if(jys ==1) _llseek(HqkData[jys].hf, reclen, SEEK_CUR); bytes =hRead(HqkData[jys].hf, buffer, recCount*reclen); if(bytes == -1) { ErrMsg(ghWndMain,"ReadHqFirst:hRead bytes =-1错"); GlobalFreePtr(buffer); return FALSE; } if(bytes !=recCount*reclen) { ErrMsg(ghWndMain, "ReadHqFirst:bytes !=recCount*reclen"); GlobalFreePtr(buffer); return FALSE; } //初始化行情数据结构 lpTmp =buffer; for (i=0;i<recCount;i++) { for(j =0; j<HQ_FLDS_COUNT; j++) { lpFld =GetHqFldPos(jys, i, j); if(HqFldPoss[jys][j] >=0) { FldToString(lpTmp, (FieldStruct *)&HqkData[jys].fldStruct[HqFldPoss[jys][j]], tmp); switch(HqFldTypes[j]) { case FLD_TYPE_STRING: strcpy(lpFld, tmp); break; case FLD_TYPE_FLOAT: *(float *)lpFld =(float)atof(tmp); break; case FLD_TYPE_LONG: *(int *)lpFld =atol(tmp); break; } } } if(IsGuoZhai(jys, i)) HqData[jys].lpRefData[i].cjss /=10; //单位:手 else HqData[jys].lpRefData[i].cjss /=100; //单位:手 HqData[jys].lpRefData[i].cjje /=1000; //单位:万 HqData[jys].lpRefData[i].lc =0; if(HqData[jys].lpPreData[i].zrsp ==0 ||HqData[jys].lpRefData[i].zjcj ==0) HqData[jys].lpRefData[i].zdf =0; else HqData[jys].lpRefData[i].zdf = (HqData[jys].lpRefData[i].zjcj - HqData[jys].lpPreData[i].zrsp) /HqData[jys].lpPreData[i].zrsp*100; if(clIsZsRec(jys, i)) { if(jys ==1) { GetShZsFirst(lpTmp, DpData[jys].zsCount); DpData[jys].zsCount++; } } if(jys ==1) { FldToString(lpTmp,(FieldStruct *)&HqkData[jys].fldStruct[1], HqData[jys].lpPreData[i].zqmc); GetShMmp(TRUE, i, lpTmp); } lpTmp +=reclen; } GlobalFreePtr(buffer); CheckGraHead(jys); if(jys ==0) { if(!GetSzZqmc(jys)) { ErrMsg(ghWndMain,"ReadHqFirst:GetSzZqmc(jys)错"); return FALSE; } if(!ReadSzZsFirst()) { ErrMsg(ghWndMain,"ReadHqFirst:ReadSzZsFirst()错"); return FALSE; } if(!ReadSzMmp(TRUE)) { ErrMsg(ghWndMain,"ReadHqFirst:ReadSzZsFirst()错"); return FALSE; } } i =GetMaxMin10(jys); GetDpData(jys, TRUE); MsgLocal("OK."); fFirst[jys] =FALSE; return TRUE;}//////////////////////////////////////////////////////////功能 :根据股票代码、记录号获取股票名称,该功能只支持深股//参数 :// jys---交易所编号// rec---记录标号(0-->记录数-1)// gpdm--股票代码// gpmc--股票名称//返回码 :// 0 --成功// -1 --失败//修改日期 :1997/10/15int GetZqmc(int jys,int rec,char *gpdm,char *gpmc){ int i; short reclen, headlen, fldnum; int rec_count; char *buffer; char tmp[40]; if(GpkData[jys].hf ==-1) return -1; if(jys==1) return -1; reclen=*(short *)GpkData[jys].dbfStruct.rlen; headlen=*(short *)GpkData[jys].dbfStruct.hlen; rec_count =(int)GetDbfRecCount(GpkData[jys].hf,headlen,reclen);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -