




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网际风数据接口开发指南和问题答疑目录前言第一章:通视(分析家)规范1、驱动的注册:示例代码2、驱动加载和消息处理:示例代码及数据处理注意事项3、驱动卸载:示例代码第二章:网际风对通视规范的扩充1、分笔数据的扩充:分笔定义及说明2、当天分时与分笔的API请求扩充:如何使用请求式API及注意事项3、期货市场的数据扩充:扩充数据的使用说明4、财务和除权数据获取:取得财务和除权数据的2种方法第三章:开发过程中常见问题的解答1、通视规范的行情数据定义,记录大小与时间字段:常犯的错误2、网际风的市场代码是如何定义的3、历史数据为何不从服务器通过API请求4、关于SQL写库程序5、网际风为何不自动补数据前言网际风是一款通视分析家规范兼容的行情数据接口,可以与任何支持外挂式驱动(通视规范)的分析软件挂接,如分析家系列、飞狐系列等。用户只要按照通视规范来开发即可获得所需要的行情数据,同时网际风针对通视规范没有定义的几个数据类型做了扩充,下面详述。第一章:通视(分析家)规范通视规范是1996年-2003年之间,由西安通视公司(生产硬件:通视信息接收卡)和深圳汇天齐(提供股票分析软件:分析家系列)公司共同制定的一个股票行情接收设备(硬件驱动)和分析软件之间传输股票数据的接口规范,这是一个企业规范,但是因为当时这个组合几乎垄断了国内的股票接收市场,所以其他的各种分析软件为了能用通视卡接收数据,不得不遵守这个规范,同样,其他的接收卡,为了能使用分析家和飞狐系列软件,也不得不遵守这个规范,所以这个规范就渐渐成为国内股票界唯一的行业规范,几乎所有的接收卡、分析软件、网络接口都遵从这个规范,但是这个规范是单向广播式的,没有约定任何请求式的协议,所以不同的网络接口,在数据的补充请求上,做了不同的扩充。国内的股票软件界并没有一个统一的国家规范,基本上属于群雄混战,在DOS年代,是钱龙的天下,分析家刚推出来时,股票代码规范都使用钱龙规范,如上证指数使用1A0001,深圳指数使用2A01,后来深圳代码扩充到6位,加上钱龙公司在Windows平台的分析软件上毫无建树,基本上被分析家一统天下,后来出现的飞狐软件极力模仿分析家的界面和功能,打了不少官司。所以渐渐地,通视分析家规范成了国内唯一的股票软件规范,这个规范是开放式的,公开协议文档和数据定义。同时,国内还存在一个交易所规范,这个可以算是国标,是采用DBF格式数据库(Foxpro2.5)存储的快照数据,券商的系统和电视台、信息台的很多系统都是基于DBF规范开发的,网际风既支持通视规范,同时也支持DBF规范,只要开通DBF权限即可,不过DBF的规范格式非常简单,只包含行情数据,其他的任何衍生数据(日线、分钟线、分时K线等)均没有涉及,因为DBF中并没有存储上述数据的位置,也没有约定衍生数据的规范。通视规范包含3个方面的内容:1、驱动的注册:数据接收驱动和分析软件的挂接,是通过注册表项来实现挂接的,硬件驱动程序在注册表的HKEY_LOCAL_MACHINESOFTWAREStockDrv 下的Driver键值中,写入驱动的详细路径,如 Driver=c:windowssystem32stock.dll ,说明数据接口驱动在系统的文件夹下面stock.dll,分析家和飞狐在启动或启动接收系统时,会去读取这个键值,根据他载入对应的DLL,实现数据驱动的加载,用户可以修改这个键值,即可让分析家去加载不同厂家的驱动程序,只要他们都符合通视规范要求即可。读取驱动键值的示例代码如下:(Delphi7) StockDrvPath=SOFTWAREStockDrv; StockDrvSubKey:string=Driver; successflag:=true; RegF:=TRegistry.Create; RegF.RootKey:=HKEY_LOCAL_MACHINE; try RegF.OpenKey(StockDrvPath,False); DLLPath:=RegF.ReadString(StockDrvSubKey); / 读出注册表分析家驱动键值 RegF.CloseKey; except successflag:=false; end; RegF.Free;2、驱动加载和消息处理:有了驱动DLL的路径信息,下面我们就可以加载他,并跟他进行注册和一些信息查询,使用LoadLibrary加载上述DLL,再使用GetProcAddress取得Stock_Init、Stock_Quit、GetStockDrvInfo等API的入口。使用远程方式调用上面取得的Stock_Init,并传入3个参数(消息处理句柄、消息号、工作模式),消息处理句柄和消息号是用户程序自定义的(句柄一般为用户处理窗体的句柄,消息号可以取WM_USER后的某个值),是应用层告诉网际风数据接口的关键数据,相当于注册函数,以后网际风给用户程序发送所有数据都是通过上述消息号来通知,如果网际风有数据要发送给用户程序,Stock.DLL就会向上述句柄发送上述消息号,这是基于Windows的消息机制,STOCK.DLL的数据空间是跟应用层同一个段的,所以指针地址所指的内容可以被用户程序正常读取。在消息参数中有数据标识和对应的数据地址,用户程序只需要在上述消息处理函数中,对传过来的地址指针取数据即可。简单说,用户程序只要调用一次Stock_Init,然后就坐等网际风给你发消息了,如果行情数据有变化,数据就会不请自来,你只对消息参数处理即可,用户主动请求的数据也是以消息模式传送过来。行情数据是服务端主动发过来的,到来的时机是不确定的,行情火爆时,可能每秒钟都会来几个包,行情清淡时,可能1-2秒来一个包,其他历史数据如补日线、分钟线等,在用户通过网际风控制台操作(或设定自动补数据并且满足补数据的条件时),才会收到,服务端一般不会主动发送历史数据给你,因为服务端不知道你是否缺少数据,缺少哪一方面的数据,这个问题在后面还有讨论。工作模式现在恒为4,现在的最新驱动程序均为5档,规范中早期的数据定义可以不用看,基本上现在的分析软件均使用最后的数据定义版本。消息处理为整个数据处理的核心:网际风发给你的所有数据都在此处理,所以要精心优化此函数代码,以实现高效处理,千万不可在此函数中做高耗时的动作,如数据库查询或将数据写入数据库等,因为这些操作都是秒级的,消息处理函数需要毫秒级的响应,如果在此函数中,进行秒级操作,会造成数据的不断延迟和堆积,如网际风一分钟产生的数据量,而你的处理函数需要3-5分钟才能处理完,随着数据的不断到来,会产生几分钟甚至几十分钟的延迟,因为网际风只有等待上一个数据包处理完毕返回后,才发送下一个数据包给你,所以如果要实现数据更新和存储,需要尽可能快地处理,也可以将数据尽快复制到本地的另一个缓冲区,通过另外的进程或定时器慢慢处理,而此消息函数要尽快返回,以便驱动可以响应下一个数据包。如果用户发现,数据在盘中延迟不断加大而且频繁中断,而使用分析家软件测试却没有延迟和中断,说明用户的消息处理函数太慢了,可以屏蔽掉处理代码试一下,如果屏蔽后速度恢复正常,需要优化处理函数和改变编程模式,将高耗时操作代码移出消息处理函数。下面是部分示例代码:(Delphi7) WM_StkDataOK=WM_USER+10; / 股票数据到达消息 RCV_WORK_SENDMSG=4; / 版本 2 建议使用的方式,对于六位代码的深圳市场必须使用这种模式 RI_PanKouSUPPORT=$100; / 支持盘口数据 RI_DATAExtSUPPORT1=$101; / 支持扩展数据传输 内嵌通视协议 RI_DATAExtSUPPORT2=$102; / 支持扩展数据传输 通视扩展协议 网际风扩充协议 private Private declarations procedure OnStkDataOk(var MyMsg:TMessage); message WM_StkDataOK; / 消息函数注册 public Public declarations end; StockInitType=function(hWnd:THandle; Msg:Word; nWorkMode:Integer):Integer; stdcall; StockQuitType=function(hWnd:THandle):Integer; stdcall; GetStockDrvInfoType=function(nInfo:integer; pBuf:pChar):DWORD; stdcall; SetupReceiverType=function(bShowWindow:boolean):integer; stdcall; GetStockMin=function(pszStockCode:pChar; nMarket:integer):integer; stdcall; / 取分时 GetStockPRP=function(pszStockCode:pChar; nMarket:integer):integer; stdcall; / 取分笔 GetStockPwr=function(pszStockCode:pChar; nMarket:integer; var pDataNum:integer; pData:pChar):integer; stdcall; / 取除权数据 GetStockFin=function(pszStockCode:pChar; nMarket:integer; pData:pChar):integer; stdcall; / 取财务数据 StockDriver:HWND; / 通视驱动句柄 StockInitProc,StockInitProcSC,StockQuitProc,GetStockDrvInfo,SetupReceiver:TFarProc; / 通视驱动接口地址 GetStockMinProc,GetStockPRPProc,GetStockPwrProc,GetStockFinProc:TFarProc; / 通视驱动接口地址 if successflag then begin StockDriver:=LoadLibrary(pChar(DLLPath); / 加载驱动 if StockDriverHINSTANCE_ERROR then successflag:=false; if successflag then begin StockInitProc:=GetProcAddress(StockDriver,Stock_Init); / 驱动初始化入口 if StockInitProc=nil then successflag:=false; StockQuitProc:=GetProcAddress(StockDriver,Stock_Quit); / 驱动退出入口 if StockQuitProc=nil then successflag:=false; GetStockDrvInfo:=GetProcAddress(StockDriver,GetStockDrvInfo); / 获得版本号 if GetStockDrvInfo=nil then successflag:=false; GetStockMinProc:=GetProcAddress(StockDriver,GetStockMin); / 网际风扩充API入口 GetStockPRPProc:=GetProcAddress(StockDriver,GetStockPRP); / 网际风扩充API入口 GetStockPwrProc:=GetProcAddress(StockDriver,GetStockPwr); / 网际风扩充API入口 GetStockFinProc:=GetProcAddress(StockDriver,GetStockFin); / 网际风扩充API入口 GetStockDrvInfoType(GetStockDrvInfo)(RI_PanKouSUPPORT,nil); / 告诉网际风驱动 我具有分笔处理能力 不调用此查询得不到网际风格式的分笔数据 / 网际风3.62以上版本 支持总笔数字段传输 如果不需要扩展行情可以注释下面一行 if (GetStockDrvInfoType(GetStockDrvInfo)(RI_DATAExtSUPPORT2,nil)=1) then WJF362Flag:=1;/ if (GetStockDrvInfoType(GetStockDrvInfo)(RI_DATAExtSUPPORT1,nil)=1) then WJF362Flag:=1; i1:=StockInitType(StockInitProc)(Form1.Handle,WM_StkDataOK,RCV_WORK_SENDMSG); / 向驱动注册消息号 if successflag and (i11) then successflag:=false else begin ReceiveFlag:=1; AddLog(启动接收系统 +IntToStr(i1); end; end; end; if not(successflag) then MessageDlg(无法找到股票接收驱动程序!,mtError,mbOK,0);消息处理函数部分示例代码: RCV_DATA=Record 文件形式的补充数据,日线,基本资料,分时等 m_wDataType:integer; 文件类型 m_nPacketNum:integer; 记录数 m_File:RCV_FILE_HEADEx; 文件接口 m_bDISK:boolean; 文件是否已存盘的文件 m_pData:pointer; 股评,消息, 文件名等 end; PRCV_DATA=RCV_DATA;procedure TForm1.OnStkDataOk(var MyMsg:TMessage); / 消息处理函数示例var pHeader:PRCV_DATA; pReport:PRCV_REPORT_STRUCTEx; OneStock:RCV_REPORT_STRUCTEx; size,MinNum,i:integer; nPacketNum,n:word; pDay:PRCV_HISTORY_STRUCTEx; pMin:PRCV_MINUTE_STRUCTEx; pPwr:PRCV_POWER_STRUCTEx; pFile:pChar; pMF:RCV_FILE_HEADEx; mypk:PMy_PankouType; FS:TFileStream; STKN:StockNumType; s,s1,s2:shortstring;begin with MyMsg do begin case wParam of / 检测消息类型 是行情数据 还是补充日线数据 或 分笔数据 RCV_REPORT : / 实时行情数据 begin pHeader:=PRCV_DATA(lParam); nPacketNum:=pHeader.m_nPacketNum; / 行情数量 pReport:=pHeader.m_pData; / 行情数据的地址 move(pReport,OneStock,sizeof(OneStock); / 显示首笔行情提示信息 setlength(s2,2); move(OneStock.m_wMarket,s21,2); if CheckBox1.Checked then Addlog(接收到行情 +s2+pReport.m_szLabel+ 等+IntToStr(nPacketNum)+笔动态行情); for n:=0 to nPacketNum-1 do begin size:=OneStock.m_cbSize; / 提取一笔行情数据 if (sizesizeof(OneStock) or (size=0) then size:=sizeof(OneStock); fillchar(OneStock,sizeof(OneStock),0); move(pReport,OneStock,size); UpdateOneStock(OneStock); / 处理一笔行情数据的更新 if OneStock.m_cbSize0 then / 根据行情数据的大小后移指针 以便自适应记录大小的变化 pReport:=PRCV_REPORT_STRUCTEx(PChar(pReport)+OneStock.m_cbSize) else pReport:=PRCV_REPORT_STRUCTEx(PChar(pReport)+sizeof(OneStock); end; end; RCV_FILEDATA : / 文件类型补充数据 begin pHeader:=PRCV_DATA(lParam);/ Addlog(DataType: +IntToHex(pHeader.m_wDataType,4); case pHeader.m_wDataType of FILE_MINUTE_EX: / 收到分时数据 begin pMin:=pHeader.m_pData; / 该地址指向分时数据缓冲区 nPacketNum:=pHeader.m_nPacketNum; / 行情数量 if pMin.m_time=EKE_HEAD_TAG then / 碰到标识帧了 提取里面的市场和编码信息 begin strcopy(STKN,PRCV_EKE_HEADEx(pMin).m_szLabel); s1:=trim(StrPas(STKN); setlength(s2,2); move(PRCV_EKE_HEADEx(pMin).m_wMarket,s21,2); Addlog(收到分时数据 +s2+s1+ +IntToStr(nPacketNum)+ 笔); / 补分时数据 s:=AppPath+MIN+s2+s1+.MIN; / 生成日线文件名 try FS:=TFileStream.Create(s,fmCreate); FS.Write(pMin,nPacketNum*sizeof(RCV_MINUTE_STRUCTEx); / 演示将收到的分时数据存入磁盘文件,实际开发应将分时数据更新内存数据为宜 FS.Free; finally; end; end; end; FILE_HISTORY_EX: begin Addlog(收到日线数据); pDay:=pHeader.m_pData; nPacketNum:=pHeader.m_nPacketNum; / 行情数量 if pDay.m_time=EKE_HEAD_TAG then / 该处理较简单 未考虑多个标识帧连续的情况 下面的另一个代码较完善 begin strcopy(STKN,PRCV_EKE_HEADEx(pDay).m_szLabel); s1:=trim(StrPas(STKN); setlength(s2,2); move(PRCV_EKE_HEADEx(pDay).m_wMarket,s21,2); s:=AppPath+MIN+s2+s1+.DAY; pDay:=PRCV_HISTORY_STRUCTEx(PChar(pDay)+sizeof(RCV_HISTORY_STRUCTEx); try FS:=TFileStream.Create(s,fmCreate); FS.Write(pDay,(nPacketNum-1)*sizeof(RCV_HISTORY_STRUCTEx); FS.Free; finally; end; end; pDay:=pHeader.m_pData; / 这段补日线数据代码供参考 为较复杂的实际应用层代码 目前处理天数还有上限 建议改进代码突破上限 DayNum:=0; i:=0; MaxDayRec:=0; while i0 then / 曾经补过数据则将上一个数据体存盘 begin MaxDaySize:=MaxDayRec*Sizeof(RCV_HISTORY_STRUCTEx); Seek(DayF,0); blockwrite(DayF,DayBuf,MaxDaySize); Closefile(DayF); end; strcopy(STKN,PRCV_EKE_HEADEx(pDay).m_szLabel); s1:=trim(StrPas(STKN); setlength(s2,2); move(PRCV_EKE_HEADEx(pDay).m_wMarket,s21,2); s:=DataPath+DAY+s2+s1+.DAY; / 生成日线文件名 assignfile(DayF,s); filemode:=fmOpenReadWrite; reset(DayF,1); if Ioresult0 then / 不存在生成一个新的空文件 begin rewrite(DayF,1); if Ioresult0 then exit; MaxDaySize:=0; / 记录数为0 end else / 否则读入已有记录以便跟新接收到的数据合并 begin blockread(DayF,DayBuf,Sizeof(DayBuf),MaxDaySize); if Ioresult0 then exit; end; MaxDayRec:=MaxDaySize div Sizeof(RCV_HISTORY_STRUCTEx); DayNum:=0; inc(i); pDay:=PRCV_HISTORY_STRUCTEx(PChar(pDay)+Sizeof(RCV_HISTORY_STRUCTEx); end else begin if (pDay.m_fAmount0) and (MaxDayRec=0) do begin CheckDateFlag:=MyCheckDate(DayBufj.m_time,pDay.m_time); / 检查2个C时间的日期是否相同 if CheckDateFlag=0 then break else dec(j); / 找到比他小的一天 end; if CheckDateFlag=0 then DayBufj:=pDay else / 找到日期相同的 则替换(或忽略 自己选择) 否则插入日线数据 begin if (j0 then / 最后一个包处理 begin MaxDaySize:=MaxDayRec*Sizeof(RCV_HISTORY_STRUCTEx); Seek(DayF,0); blockwrite(DayF,DayBuf,MaxDaySize); Closefile(DayF); end; end; FILE_BASE_EX: begin pFile:=pHeader.m_pData; pMF:=pHeader.m_File; Addlog(收到F10资料 +StrPas(pMF.m_szFileName)+ 大小+IntToStr(pMF.m_dwLen); / 补F10数据 if pMF.m_dwLen1 then exit; / 保存 F10 资料代码 供参考 s1:=trim(StrPas(pMF.m_szFileName); i:=Pos(.,s1); SetLength(s1,i-1); SetLength(s2,2); move(pMF.m_dwAttrib,s21,2); s:=AppPath+MIN+s2+s1+.TXT; try FS:=TFileStream.Create(s,fmCreate); try FS.Write(pFile,pMF.m_dwLen); finally FS.Free; end; except end; end; 6 : begin Addlog(收到除权数据); pPwr:=pHeader.m_pData; nPacketNum:=pHeader.m_nPacketNum; / 行情数量 if pPwr.m_time=EKE_HEAD_TAG then begin strcopy(STKN,PRCV_EKE_HEADEx(pPwr).m_szLabel); s1:=trim(StrPas(STKN); setlength(s2,2); move(PRCV_EKE_HEADEx(pPwr).m_wMarket,s21,2); s:=AppPath+MIN+s2+s1+.PWR; / 生成除权文件名 try FS:=TFileStream.Create(s,fmCreate); FS.Write(pPwr,nPacketNum*sizeof(RCV_POWER_STRUCTEx); FS.Free; finally; end; end; end; $51: begin Addlog(收到5分钟数据); pDay:=pHeader.m_pData; nPacketNum:=pHeader.m_nPacketNum; / 行情数量 if pDay.m_time=EKE_HEAD_TAG then begin strcopy(STKN,PRCV_EKE_HEADEx(pDay).m_szLabel); s1:=trim(StrPas(STKN); setlength(s2,2); move(PRCV_EKE_HEADEx(pDay).m_wMarket,s21,2); s:=AppPath+MIN+s2+s1+.MN5; pDay:=PRCV_HISTORY_STRUCTEx(PChar(pDay)+sizeof(RCV_HISTORY_STRUCTEx); try FS:=TFileStream.Create(s,fmCreate); FS.Write(pDay,(nPacketNum-1)*sizeof(RCV_HISTORY_STRUCTEx); / 头部标识帧没有写入文件/ FS.Write(pDay,(nPacketNum)*sizeof(RCV_HISTORY_STRUCTEx); FS.Free; finally; end; end; end; FILE_NEWS_EX: begin pFile:=pHeader.m_pData; pMF:=pHeader.m_File; Addlog(收到公告新闻数据 长度+IntToStr(pMF.m_dwLen); if not(pHeader.m_bDISK) then / 如果消息未存盘发送 保存公告新闻 begin s1:=IntToHex(pMF.m_dwSerialNo,8); s:=AppPath+MIN+s1+.TXT;/ s:=DataPath+NEWS+s1+.NEW; / 文件名可以取序号 或者 pMF.m_szFileName 做路径/ s:=DataPath+NEWS+pMF.m_szFileName+.TXT; / 文件名可以取序号 或者 pMF.m_szFileName 做路径 try FS:=TFileStream.Create(s,fmCreate); try FS.Write(pFile,pMF.m_dwLen); finally FS.Free; end; except end; end; end; FILE_SOFTWARE_EX: begin Addlog(收到 FILE_SOFTWARE_EX 数据); end; end; end; RCV_PANKOUDATA : / 收到网际风格式的分笔(盘口)数据 begin mypk:=PMy_PankouType(lParam); setlength(s2,2); move(mypk.m_wMarket,s21,2); Addlog(盘口笔数 +s2+mypk.m_szLabel+ +IntToStr(mypk.m_nCount)+ 笔数据); / 补分笔数据 s:=AppPath+MIN+s2+mypk.m_szLabel+.PRP; / 生成分笔文件名 try FS:=TFileStream.Create(s,fmCreate); FS.Write(mypk.m_Data,mypk.m_nCount*sizeof(RCV_PANKOU_STRUCTEx);/ FS.Write(mypk,(mypk.m_nCount-1)*sizeof(RCV_PANKOU_STRUCTEx)+sizeof(My_PankouType); FS.Free; finally; end; end; end; end;end;在消息处理函数中,我们看到,要尽快将数据取走,比如存成磁盘文件,之后可以慢慢用WINHEX分析磁盘文件格式,而不要在消息函数中频繁下断点来观察数据,因为消息函数中断后,会造成网际风无限等待,其他的应用软件也得不到数据了,甚至网络中断接收停止。网际风可以同时驱动多套(最多10套)应用软件,即允许10个STOCK.DLL加载来共同处理行情数据,如果某一个应用层数据处理不响应,则其他应用层也都会失去数据,所以尽可能不要在消息函数处理中下断点。从消息函数的处理,我们可以看出,真正的股票软件在处理各种数据时,是非常复杂的,需要根据实际需要设计一个数据模型来存储各类数据,如行情数据、分时数据、日线和分钟K线、除权和财务数据等,而且这些数据尽可能放在内存,这样可以实现极高速度的存取,才有可能实现毫秒级的轮询,所以一个股票系统的开发投入百万、千万也不足为奇。3、驱动卸载:在用户不需要网际风传送数据时,需要及时调用Stock_Quit,相当于告诉Stock.DLL我不需要数据了。再调用FreeLibrary卸载上述DLL。示例代码: if successflag then begin if StockQuitProcnil then StockQuitType(StockQuitProc)(Form1.Handle);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金融考试题试题及答案
- 2025年体育赛事赞助商信息保密合同范本
- 2025年智能仓储物流配送合同模板修订版
- 2025年度绿色节能型办公大楼能源管理服务承包合同
- 2025年全渠道营销SEO排名外包合作协议
- 2025年度社区便民特色早餐店经营管理委托合同
- 国际出版协议
- 六月调考数学试卷
- 船舶安全考试题库及答案
- 临海期中考高一数学试卷
- 多媒体教室使用的课件
- 2025年军队专业技能岗位文职人员招聘考试(工程机械驾驶员)历年参考题库含答案详解(5卷)
- 2025年下半年广西现代物流集团社会招聘校园招聘笔试参考题库附带答案详解(10套)
- 2025年粉笔辅警考试题库
- 水声传感器技术研究与应用
- 2025年小学教研室教学计划
- 2025年上海市建筑工程施工合同模板
- 手术室护理业务学习
- 贩卖人口罪与强迫劳动罪
- 新员工入职职业道德培训
- 宽带宣传活动方案
评论
0/150
提交评论