📄 sv_hq.c
字号:
return TRUE;}//////////////////////////////////////////////////////////功能 :根据股票代码、记录号获取股票名称,该功能只支持深股//参数 :// jys---交易所编号// rec---记录标号(0-->记录数-1)// gpdm--股票代码// gpmc--股票名称//返回码 :// 0 --成功// -1 --失败//修改日期 :1997/10/15int GetZqmc(int jys,int rec,char *gpdm,char *gpmc){ int i, reclen, headlen, fldnum, rec_count; char *buffer; char tmp[40]; if(GpkData[jys].hf ==-1) return -1; if(jys==1) return -1; reclen=*(int *)GpkData[jys].dbfStruct.rlen; headlen=*(int *)GpkData[jys].dbfStruct.hlen; rec_count =(int)GetDbfRecCount(GpkData[jys].hf,headlen,reclen); if(rec_count <=0) return -1; fldnum =GpkData[jys].fldCount; //reclen=*(int *)GpkData[jys].dbfStruct.rlen; //headlen=*(int *)GpkData[jys].dbfStruct.hlen; buffer =(char *)malloc(reclen+1); if (buffer==NULL) { ErrMsg(ghWndMain, "GetZqmc:alloc buffer failed!"); return -1; } //用记录数定位 if(rec<rec_count) { _llseek(GpkData[jys].hf,(long)(headlen+reclen*rec),SEEK_SET); if(_lread(GpkData[jys].hf,buffer,reclen) ==(UINT)reclen) { FldToString(buffer,(FieldStruct *)&GpkData[jys].fldStruct[0], tmp); if(!strcmp(tmp, gpdm)) { FldToString(buffer,(FieldStruct *)&GpkData[jys].fldStruct[1],gpmc); free(buffer); return 0; } } } //线性搜索 _llseek(GpkData[jys].hf,(long)headlen,SEEK_SET); for (i=0;i<rec_count;i++) { if(_lread(GpkData[jys].hf,buffer,reclen) !=(UINT)reclen) break; FldToString(buffer,(FieldStruct *)&GpkData[jys].fldStruct[0], tmp); if(!strcmp(tmp, gpdm)) { FldToString(buffer,(FieldStruct *)&GpkData[jys].fldStruct[1],gpmc); free(buffer); return 0; } } free(buffer); return -1;}///////////////////////////////////////////////////功能 :刷新行情数据//参数 :// jys---交易所编码//返回码 :// 0---成功// -1--失败//修改日期 :1997/10/15int HqRefresh(int jys){ int i, j, reclen, headlen, zs_num[2] ={0, 0}; char huge *buffer; char huge *lpTmp; LPSTR lpFld; char tmp[50]; long l,bytes; HQ_REF_DATA LastHq; char LastZqdm[MAX_ZQDM_SIZE]; int recCount; if(HqkData[jys].hf ==-1) { ErrMsg(ghWndMain, "HqRefresh:不能打开行情库文件句柄"); return FALSE; } if(jys ==0) MsgLocal("刷新深圳行情"); else MsgLocal("刷新上海行情"); reclen=*(int *)HqkData[jys].dbfStruct.rlen; headlen=*(int *)HqkData[jys].dbfStruct.hlen; recCount =(int)GetDbfRecCount(HqkData[jys].hf,headlen,reclen); //检查行情库记录数有无增减,如有效记录数发生变化,则应从新调整内存 , //recCount =GetValidRecNum(jys); if(recCount ==0) { ErrMsg(ghWndMain,"HqRefresh:GetDbfRecCount =0"); return FALSE; } //上海行情库少采集一条记录 if(jys ==1) recCount --; if(recCount <=0) { ErrMsg(ghWndMain,"HqRefresh:调整recCount <=0"); return FALSE; } if(recCount!=HqData[jys].recCount) { MsgLocal("HqRefresh:记录数不匹配,重新初始化"); return FALSE; } if(HqData[jys].recCount <=0) { ErrMsg(ghWndMain, "HqRefresh:行情库记录数错"); return FALSE; } l =HqData[jys].recCount; if ((buffer=(char huge*)GlobalAllocPtr(GHND, l*reclen+1))==NULL) { ErrMsg(ghWndMain, "HqRefresh:行情采集分配缓冲区错!"); 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, l*reclen); if(bytes == -1) { ErrMsg(ghWndMain,"HqRefresh:bytes == -1"); GlobalFreePtr(buffer); return FALSE; } if(bytes!=l*reclen) { ErrMsg(ghWndMain, "HqRefresh:bytes!=l*reclen"); GlobalFreePtr(buffer); return FALSE; } else { lpTmp =buffer; for (i=0;i<HqData[jys].recCount;i++) { while(UDPBlockingHook()); if(run_cancelled) break; //拷贝行情老数据,作增量判断 memcpy(&LastHq,&HqData[jys].lpRefData[i], sizeof(HQ_REF_DATA)); //拷贝股票代码,以下用于股票数量加减判断 strcpy(LastZqdm,HqData[jys].lpPreData[i].zqdm); 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: *(long *)lpFld =atol(tmp); break; } } } //判断股票代码有无改变,如改变,则应获取正确的行情老数据 //如股票代码有改变,则相应的名称也应改变 if(strcmp(HqData[jys].lpPreData[i].zqdm,LastZqdm)!=0) { //重读股票名称 if(jys==0) { if(GetZqmc(jys,i,HqData[jys].lpPreData[i].zqdm, HqData[jys].lpPreData[i].zqmc)!=0) { strcpy(HqData[jys].lpPreData[i].zqmc, HqData[jys].lpPreData[i].zqdm); } } if(jys==1) { FldToString(lpTmp,(FieldStruct *)&HqkData[jys].fldStruct[1], HqData[jys].lpPreData[i].zqmc); } //放弃该次采集,处理下一条 lpTmp +=reclen; continue; } if(IsGuoZhai(jys, i)) HqData[jys].lpRefData[i].cjss /=10; //单位:手 else HqData[jys].lpRefData[i].cjss /=100; //单位:手 HqData[jys].lpRefData[i].cjje /=1000; //单位:万 if(jys ==1) { //FldToString(lpTmp,(FieldStruct *)&HqkData[jys].fldStruct[1], // HqData[jys].lpPreData[i].zqmc); if(IsZsRec(jys, i)) { RefreshShZs(lpTmp, zs_num[1]); zs_num[1] ++; } else GetShMmp(FALSE, i, lpTmp); } HqData[jys].lpRefData[i].lc = HqData[jys].lpRefData[i].cjss -LastHq.cjss; //没有成交 ,处理下一条 if(HqData[jys].lpRefData[i].lc <=0) { lpTmp +=reclen; continue; } //有成交,计算涨跌 if(HqData[jys].lpPreData[i].zrsp ==0 ||HqData[jys].lpRefData[i].zjjg ==0) HqData[jys].lpRefData[i].zdf =0; else HqData[jys].lpRefData[i].zdf = (HqData[jys].lpRefData[i].zjjg - HqData[jys].lpPreData[i].zrsp) /HqData[jys].lpPreData[i].zrsp*100; //如果是指数,则不处理 if(!IsZsRec(jys, i)) { GetGraData(jys, i, &LastHq); if(HqData[jys].lpRefData[i].lc >0) WriteGraData(jys, i); } lpTmp +=reclen; } } GlobalFreePtr(buffer); MsgLocal("OK."); if(jys ==0) { ReadSzMmp(FALSE); RefreshSzZs(); //if((int)*(long *)SzZskData.dbfStruct.recnum!=HqData[jys].recCount) //GetSzZqmc(jys); } GetMaxMin10(jys); GetDpData(jys, FALSE); //if(Skip!=-1) //{ // SendDp(jys); // SendHq(jys); //} return TRUE;}int ReadSzZsFirst(void){ int i, reclen, headlen; char *buffer; char tmp[100]; if(SzZskData.hf <0) { ErrMsg(ghWndMain, "ReadSzZsFirst:SzZskData.hf <0!"); return FALSE; } DpData[0].recCount =(int)*(long *)SzZskData.dbfStruct.recnum; if(DpData[0].recCount >15) DpData[0].recCount =15; reclen=*(int *)SzZskData.dbfStruct.rlen; headlen=*(int *)SzZskData.dbfStruct.hlen; if(DpData[0].recCount <=0) { ErrMsg(ghWndMain, "ReadSzZsFirst:DpData[0].recCount <=0!"); return FALSE; } buffer =(char *)malloc(reclen*DpData[0].recCount+1); if (buffer==NULL) { ErrMsg(ghWndMain, "ReadSzZsFirst:alloc buffer failed!"); return FALSE; } memset(buffer, 0, reclen*DpData[0].recCount+1); _llseek(SzZskData.hf,(long)headlen,SEEK_SET); _lread(SzZskData.hf,buffer, reclen*DpData[0].recCount); for (i=0;i<DpData[0].recCount;i++) { FldToString(buffer+i*reclen, (FieldStruct *)&SzZskData.fldStruct[2],tmp); DpData[0].sp[i] =(float)atof(tmp); FldToString(buffer+i*reclen, (FieldStruct *)&SzZskData.fldStruct[6], tmp); DpData[0].zs[i] =(float)atof(tmp); DpData[0].zd[i] =DpData[0].zs[i] -DpData[0].sp[i]; } free(buffer); return TRUE;}int GetShZsFirst(LPSTR lpbuf, int zsnum){ char tmp[100]; if(zsnum >15) return 0; FldToString(lpbuf,(FieldStruct *)&HqkData[1].fldStruct[7], tmp); DpData[1].zs[zsnum] =(float)atof(tmp); FldToString(lpbuf,(FieldStruct *)&HqkData[1].fldStruct[2], tmp); DpData[1].sp[zsnum] =(float)atof(tmp); //FldToString(lpbuf,(FieldStruct *)&HqkData[1].fldStruct[3], // tmp); //if((float)atof(tmp)!=0.00) // DpData[1].zd[zsnum] =(float)atof(tmp)-DpData[1].sp[zsnum]; //else DpData[1].zd[zsnum] =DpData[1].zs[zsnum]-DpData[1].sp[zsnum]; return 0;}int GetShMmp(BOOL fFirst, int rec_num, LPSTR buffer){ int i; char tmp[100]; double f1, f2; MMP LastMmp; long tmpl; float tmpf; memcpy(&LastMmp, &MmpData[1].lpMmp[rec_num], sizeof(MMP)); MmpData[1].lpMmp[rec_num].jwBuy[0] =HqData[1].lpRefData[rec_num].zgjm; MmpData[1].lpMmp[rec_num].jwSell[0] =HqData[1].lpRefData[rec_num].zdjm; f1 =f2 =0; for(i =0; i<3; i++) { FldToString(buffer,(FieldStruct *)&HqkData[1].fldStruct[12+i*2], tmp); MmpData[1].lpMmp[rec_num].slBuy[i] =atol(tmp)/100; if(i !=2) { FldToString(buffer,(FieldStruct *)&HqkData[1].fldStruct[12+i*2+1], tmp); MmpData[1].lpMmp[rec_num].jwBuy[i+1] =(float)atof(tmp); } f2+=MmpData[1].lpMmp[rec_num].slBuy[i]; } for(i =0; i<3; i++) { FldToString(buffer,(FieldStruct *)&HqkData[1].fldStruct[17+i*2], tmp); MmpData[1].lpMmp[rec_num].slSell[i] =atol(tmp)/100; if(i !=2) { FldToString(buffer,(FieldStruct *)&HqkData[1].fldStruct[17+i*2+1], tmp); MmpData[1].lpMmp[rec_num].jwSell[i+1] =(float)atof(tmp); } f1+=MmpData[1].lpMmp[rec_num].slSell[i]; } tmpl=MmpData[1].lpMmp[rec_num].slSell[0]; tmpf=MmpData[1].lpMmp[rec_num].jwSell[0]; MmpData[1].lpMmp[rec_num].slSell[0]= MmpData[1].lpMmp[rec_num].slSell[2]; MmpData[1].lpMmp[rec_num].jwSell[0]= MmpData[1].lpMmp[rec_num].jwSell[2]; MmpData[1].lpMmp[rec_num].slSell[2]=tmpl; MmpData[1].lpMmp[rec_num].jwSell[2]=tmpf; if(f1+f2 ==0) HqData[1].lpRefData[rec_num].wb =0; else HqData[1].lpRefData[rec_num].wb =(float)((f2-f1)/(f2+f1)); if(memcmp(&LastMmp, &MmpData[1].lpMmp[rec_num], sizeof(MMP))) MmpData[1].lpChanged[rec_num] =TRUE; else MmpData[1].lpChanged[rec_num] =FALSE; return 0;}int ReadSzMmp(BOOL fFirst){ int i, j, reclen, headlen; char huge*buffer; char huge *lpTmp; char tmp[100]; double f1, f2; int rec_count; MMP LastMmp; long bytes; if(SzMmpkData.hf <0) { ErrMsg(ghWndMain, "ReadSzMmp:SzMmpkData.hf <0!"); return FALSE; } MsgLocal("read Sz_Mmp..."); rec_count =HqData[0].recCount*6; reclen=*(int *)SzMmpkData.dbfStruct.rlen; headlen=*(int *)SzMmpkData.dbfStruct.hlen; //加入以下代码处理买卖盘库尚未传完的情况 i=(int)GetDbfRecCount(SzMmpkData.hf,headlen,reclen); if(rec_count>i) rec_count =i; //reclen=*(int *)SzMmpkData.dbfStruct.rlen; //headlen=*(int *)SzMmpkData.dbfStruct.hlen; buffer =(char *)GlobalAllocPtr(GHND, (long)rec_count*reclen+1); if (buffer==NULL) { ErrMsg(ghWndMain, "ReadSzMmp:alloc buffer failed!"); return FALSE; } //memset(buffer, 0, reclen*MmpData[0].recCount+1); _llseek(SzMmpkData.hf,(long)headlen,SEEK_SET); bytes =hRead(SzMmpkData.hf, buffer, (long)rec_count*reclen); if(bytes ==-1) { MsgLocal("HqRefresh:重新初化szmmpk"); GlobalFreePtr(buffer); return FALSE; } if(bytes !=(long)rec_count*reclen) { ErrMsg(ghWndMain, "error read sz_mmpk"); } else { lpTmp =buffer; for(i =0; i<rec_count/6; i++) { while(UDPBlockingHook()); if(run_cancelled) break; if(IsZsRec(0, i)) continue; memcpy(&LastMmp, &MmpData[0].lpMmp[i], sizeof(MMP)); f1 =f2 =0; //应加入股票代码检查 for(j =0; j<3; j++) { //if(_lread(SzMmpkData.hf,buffer, reclen) !=(UINT)reclen) break; //if(fFirst && j==0) // FldToString(lpTmp, // (FieldStruct *)&SzMmpkData.fldStruct[0], // MmpData[0].lpMmp[i].zqdm); FldToString(lpTmp,(FieldStruct *)&SzMmpkData.fldStruct[2], tmp); MmpData[0].lpMmp[i].jwSell[j] =(float)atof(tmp); FldToString(lpTmp,(FieldStruct *)&SzMmpkData.fldStruct[4], tmp); MmpData[0].lpMmp[i].slSell[j] =atol(tmp)/100; f1+=(double)MmpData[0].lpMmp[i].slSell[j]; lpTmp +=reclen; } if(j !=3) break; for(j =0; j<3; j++) { //if(_lread(SzMmpkData.hf,buffer, reclen) !=(UINT)reclen) break;; FldToString(lpTmp,(FieldStruct *)&SzMmpkData.fldStruct[2], tmp); MmpData[0].lpMmp[i].jwBuy[j] =(float)atof(tmp); FldToString(lpTmp,(FieldStruct *)&SzMmpkData.fldStruct[3], tmp); MmpData[0].lpMmp[i].slBuy[j] =atol(tmp)/100; f2+=(double)MmpData[0].lpMmp[i].slBuy[j]; lpTmp +=reclen; } if(j !=3) break; if(f1+f2 !=0) HqData[0].lpRefData[i].wb =(float)((f2-f1)/(f1+f2)); else HqData[0].lpRefData[i].wb =0; if(memcmp(&LastMmp, &MmpData[0].lpMmp[i], sizeof(MMP))) MmpData[0].lpChanged[i] =TRUE; else MmpData[0].lpChanged[i] =FALSE; //rec_num++; } } //没有初始化的买卖盘数据 if(rec_count/6<HqData[0].recCount) { memset(&MmpData[0].lpMmp[rec_count/6],0, sizeof(MMP)*(HqData[0].recCount -rec_count/6)); } GlobalFreePtr(buffer); MsgLocal("OK."); return TRUE;}int RefreshSzZs(void){ int i, reclen, headlen; char *buffer; char tmp[100]; static int times =0; if(SzZskData.hf <0) return 0; reclen=*(int *)SzZskData.dbfStruct.rlen; headlen=*(int *)SzZskData.dbfStruct.hlen; buffer =(char *)malloc(reclen*DpData[0].recCount+1); if (buffer==NULL) { ErrMsg(ghWndMain, "RefreshSzZs:alloc buffer failed!"); return -1; } memset(buffer, 0, reclen*DpData[0].recCount+1); _llseek(SzZskData.hf,(long)headlen,SEEK_SET); _lread(SzZskData.hf,buffer, reclen*DpData[0].recCount); for (i=0;i<DpData[0].recCount;i++) { FldToString(buffer+i*reclen, (FieldStruct *)&SzZskData.fldStruct[6], tmp); DpData[0].zs[i] =(float)atof(tmp); DpData[0].zd[i] =DpData[0].zs[i]-DpData[0].sp[i]; } free(buffer); return 0;}int RefreshShZs(LPSTR lpbuf, int zsnum){ char tmp[100]; if(zsnum >15) return 0; FldToString((char huge*)lpbuf,(FieldStruct *)&HqkData[1].fldStruct[7], tmp); DpData[1].zs[zsnum] =(float)atof(tmp); FldToString((char huge*)lpbuf,(FieldStruct *)&HqkData[1].fldStruct[2], tmp); DpData[1].sp[zsnum] =(float)atof(tmp); DpData[1].zd[zsnum] =DpData[1].zs[zsnum]-DpData[1].sp[zsnum]; return 0;}int GetSzZqmc(int jys){ int i, j, reclen, headlen, fldnum, rec_count; char *buffer; char tmp[40]; if(GpkData[jys].hf ==-1) { ErrMsg(ghWndMain, "GetSzZqmc:GpkData[jys].hf ==-1!"); return FALSE; } //rec_count =(int)*(long *)SzZskData.dbfStruct.recnum; rec_count =(int)*(long *)GpkData[jys].dbfStruct.recnum; if(rec_count <HqData[jys].recCount) rec_count =HqData[jys].recCount; fldnum =GpkData[jys].fldCount; reclen=*(int *)GpkData[jys].dbfStruct.rlen; headlen=*(int *)GpkData[jys].dbfStruct.hlen; if(rec_count <=0) { ErrMsg(ghWndMain, "GetSzZqmc:rec_count <=0!"); return FALSE; } buffer =(char *)malloc(reclen+1); if (buffer==NULL) { ErrMsg(ghWndMain, "GetSzZqmc:alloc buffer failed!"); return FALSE; } _llseek(GpkData[jys].hf,(long)headlen,SEEK_SET); for (i=0;i<rec_count;i++) { if(_lread(GpkData[jys].hf,buffer,reclen) !=(UINT)reclen) break; // get zqdm FldToString(buffer,(FieldStruct *)&GpkData[jys].fldStruct[0], tmp); for(j =0; j<HqData[jys].recCount; j++) if(!strcmp(tmp, HqData[jys].lpPreData[j].zqdm)) break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -