分享

分析家各种数据格式

 禁忌石 2006-08-23

FinData.FxjData.CS:

using System;
using System.Collections;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Windows.Forms;
using Microsoft.Win32;
using System.Runtime.InteropServices;


namespace FinData
{
[ProgId("FinData.FxjData"),ComVisible(true)]
public class FxjData
{
public enum DataTypes { dm,hq,hqmb,hq0,hq5,cq,cw0,fp,gb,gd,cw,jjjz,jjzh,bk,pj,hqfq};
private string[,] tableNames = new string[,] {
#region 表名
{"dm","代码",""},
{"hq","行情",""},
{"hqmb","分笔成交",""},
{"hq0","动态行情",""},
{"hq5","五分钟行情",""},
{"cq","除权数据",""},
{"cw0","最新财务数据",""},
{"fp","分红送配",""},
{"gb","股本结构",""},
{"gd","十大股东",""},
{"cw","财务数据",""},
{"jjjz","基金净值",""},
{"jjzh","基金投资组合",""},
{"bk","板块",""},
{"pj","评级",""},
{"hqfq","复权行情",""}

};//行顺序与Datatype一致,列分别为表名、表中文名、对应文件名(GetTables函数中赋值)
#endregion
public FxjData()
{
try
{
//从注册表中读取分析家数据目录,如c:\fxj\data
RegistryKey keyFxj;
RegistryKey keySoftware = Registry.LocalMachine.OpenSubKey("Software");
keyFxj = keySoftware.OpenSubKey("FXJ");
if (keyFxj == null)
{
keyFxj = keySoftware.OpenSubKey("Huitianqi");
if (keyFxj == null)
{
fxjPath = "";
fxjDataPath = "";
msg = "没有找到分析家安装信息!";
return;
}
}
RegistryKey keySuperstk = keyFxj.OpenSubKey("SUPERSTK");
if (keySuperstk != null)
{
fxjPath = (string)keySuperstk.GetValue("InstPath");
if (fxjPath != "")
{
fxjPath = fxjPath.ToUpper();
if (fxjPath != "" && fxjPath.EndsWith(@"\") == false)
fxjPath = fxjPath + @"\";
fxjDataPath = fxjPath+ @"DATA\";
fxjDataPath = fxjDataPath.ToUpper();
RegistryKey keyMarket = keySuperstk.OpenSubKey("Market");
if (keyMarket != null)
{
string[] marketSubKeyNames = keyMarket.GetSubKeyNames();
if (marketSubKeyNames.Length > 0)
{
RegistryKey[] marketSubKey = new RegistryKey[marketSubKeyNames.Length];
fxjMarket = new string[marketSubKeyNames.Length, 3];
for (int i = 0; i < marketSubKeyNames.Length; i++)
{
marketSubKey[i] = keyMarket.OpenSubKey(marketSubKeyNames[i]);
if (marketSubKey[i] != null)
{
fxjMarket[i, 0] = marketSubKeyNames[i];
fxjMarket[i, 1] = (string)marketSubKey[i].GetValue("name");
fxjMarket[i, 2] = (string)marketSubKey[i].GetValue("shortname");
}
}
for (int i = 0; i < marketSubKeyNames.Length; i++)
{
int lastI=marketSubKeyNames.Length-1;
if (fxjMarket[i, 0].ToUpper() == "SH")
{
string[] temp = new string[3];
temp[0] = fxjMarket[0, 0];
temp[1] = fxjMarket[0, 1];
temp[2] = fxjMarket[0, 2];
fxjMarket[0, 0] = fxjMarket[i, 0];
fxjMarket[0, 1] = fxjMarket[i, 1];
fxjMarket[0, 2] = fxjMarket[i, 2];
fxjMarket[i, 0] = temp[0];
fxjMarket[i, 1] = temp[1];
fxjMarket[i, 2] = temp[2];
}
if (fxjMarket[i, 0].ToUpper() == "SZ")
{
string[] temp = new string[3];
temp[0] = fxjMarket[1, 0];
temp[1] = fxjMarket[1, 1];
temp[2] = fxjMarket[1, 2];
fxjMarket[1, 0] = fxjMarket[i, 0];
fxjMarket[1, 1] = fxjMarket[i, 1];
fxjMarket[1, 2] = fxjMarket[i, 2];
fxjMarket[i, 0] = temp[0];
fxjMarket[i, 1] = temp[1];
fxjMarket[i, 2] = temp[2];
}
if (fxjMarket[i, 0].ToUpper() == "$$")
{
string[] temp = new string[3];
temp[0] = fxjMarket[lastI, 0];
temp[1] = fxjMarket[lastI, 1];
temp[2] = fxjMarket[lastI, 2];
fxjMarket[lastI, 0] = fxjMarket[i, 0];
fxjMarket[lastI, 1] = fxjMarket[i, 1];
fxjMarket[lastI, 2] = fxjMarket[i, 2];
fxjMarket[i, 0] = temp[0];
fxjMarket[i, 1] = temp[1];
fxjMarket[i, 2] = temp[2];
}
}
}
}
return;
}
}
}
catch (Exception ex)
{
msg = ex.Message;
}
}
struct fileStruct
{
public string fileName;//文件名
public int startAddress,blockSize,recordSize;//起始地址,每块长度,记录长度
public bool codeIsLong, isIndexDataStruct; //codeIsLong索引中的代码包含有市场代码SH、SZ等;isIndexDataStruct象Day.Dat那样的结构即由索引+数据组成;
public string[,] fields;//字段
public fileStruct(DataTypes fileType)
{
fileName = "";
startAddress = 0;
blockSize = 0;
recordSize = 0;
codeIsLong = false;
isIndexDataStruct = true;
string fieldString = ""; //字段名,字段标签,类型,长度字段,存储顺序,偏移量
switch (fileType)
{

#region 代码表stkinfo51.dat
case DataTypes.dm:
fileName = "STKINFO51.DAT";
startAddress = 0x845898;
blockSize = 0;
recordSize = 248;
codeIsLong = false;
isIndexDataStruct = false;
fieldString =
"dm,代码,code,10,0,0,;" +
"jc,简称,string,32,1,10,;" +
"py,拼音,string,10,2,42,";
break;
#endregion
#region 分红送配stkinfo51.dat
case DataTypes.cq:
fileName = "STKINFO51.DAT";
startAddress = 0x14;
blockSize = 2116;
recordSize = 20;
codeIsLong = false;
isIndexDataStruct = false;
fieldString =
"dm,代码,code,10,0,0,;" +
"rq,日期,date,4,0,0,;" +
"sgbl,送股比例,single,4,1,4,;" +
"pgbl,配股比例,single,4,2,8,;" +
"pgjg,配股价格,single,4,3,12,;" +
"fh,分红,single,4,4,16,";
break;
#endregion
#region 财务数据(简单)stkinfo51.dat
case DataTypes.cw0:
fileName = "STKINFO51.DAT";
startAddress = 0x794;
blockSize = 2116;
recordSize = 196;
codeIsLong = false;
isIndexDataStruct = false;
fieldString =
"dm,代码,code,10,0,0,;" +
"rq,更新日期,date,4,38,192,;" +
"zgb,总股本,single,4,0,0,;" +
"gjg,国家股,single,4,1,4,;"+
"fqrg,发起人法人股,single,4,2,8,;"+
"frg,法人股,single,4,3,12,;"+
"b,B股,single,4,4,16,;"+
"h,H股,single,4,5,20,;"+
"a,流通A股,single,4,6,24,;"+
"zgg,职工股,single,4,7,28,;"+
"a2zpg,A2转配股,single,4,8,32,;"+
"bszzc,总资产,single,4,9,36,;"+
"bsldzc,流动资产,single,4,10,40,;"+
"bsgdzc,固定资产,single,4,11,44,;"+
"bswxzc,无形资产,single,4,12,48,;"+
"bscqtz,长期投资,single,4,13,52,;"+
"bsldfz,流动负债,single,4,14,56,;"+
"bscqfz,长期负债,single,4,15,60,;"+
"bszbgj,资本公积金,single,4,16,64,;"+
"mggjj,每股公积金,single,4,17,68,;"+
"bsgdqy,股东权益,single,4,18,72,;"+
"iszysl,主营收入,single,4,19,76,;"+
"iszylr,主营利润,single,4,20,80,;"+
"isqtlr,其他利润,single,4,21,84,;"+
"isyylr,营业利润,single,4,22,88,;"+
"istzsy,投资收益,single,4,23,92,;"+
"isbtsr,补贴收入,single,4,24,96,;"+
"isyywsz,营业外收支,single,4,25,100,;"+
"issytz,上年损益调整,single,4,26,104,;"+
"islrze,利润总额,single,4,27,108,;"+
"isshlr,税后利润,single,4,28,112,;"+
"isjlr,净利润,single,4,29,116,;"+
"iswfplr,未分配利润,single,4,30,120,;"+
"mgwfplr,每股未分配利润,single,4,31,124,;"+
"mgsy,每股收益,single,4,32,128,;"+
"mgjzc,每股净资产,single,4,33,132,;"+
"tzmgjzc,调整每股净资产,single,4,34,136,;"+
"gdqybl,股东权益比率,single,4,35,140,;"+
"jzcsyl,净资产收益率,single,4,36,144,";
//"unknown,(未知),string,44,37,148,;"

break;
#endregion
#region 最新行情stkinfo51.dat
case DataTypes.hq0:
fileName = "STKINFO51.DAT";
startAddress = 0x845898;
blockSize = 0;
recordSize = 248;
codeIsLong = false;
isIndexDataStruct = false;
fieldString =
"dm,代码,code,10,0,0,;" +
"jc,简称,string,32,1,10,;" +
"py,拼音,string,10,2,42,;" +
"rq,更新时间,datetime,4,5,60,;" +
"wrjl,五日均量,single,4,6,64,;" +
"zs,昨收,single,4,7,68,;" +
"jk,今开,single,4,8,72,;" +
"zg,最高,single,4,9,76,;" +
"zd,最低,single,4,10,80,;" +
"zx,最新,single,4,11,84,;" +
"zss,总手数,single,4,12,88,;" +
"je,金额,single,4,13,92,;" +
"xss,现手数,single,4,14,96,;" +
"sbcj,上笔成交价,single,4,29,156,;" +
"dbcj,当笔成交价,single,4,30,160,;" +
"np,内盘,single,4,27,148,;" +
"wp,外盘,single,4,28,152,;" +
"mr1jg,买一价,single,4,15,100,;" +
"mr1sl,买一量,single,4,18,112,;" +
"mr2jg,买二价,single,4,16,104,;" +
"mr2sl,买二量,single,4,19,116,;" +
"mr3jg,买三价,single,4,17,108,;" +
"mr3sl,买三量,single,4,20,120,;" +
"mr4jg,买四价,single,4,32,168,;" +
"mr4sl,买四量,single,4,34,176,;" +
"mr5jg,买五价,single,4,33,172,;" +
"mr5sl,买五量,single,4,35,180,;" +
"mc1jg,卖一价,single,4,21,124,;" +
"mc1sl,卖一量,single,4,24,136,;" +
"mc2jg,卖二价,single,4,22,128,;" +
"mc2sl,卖二量,single,4,25,140,;" +
"mc3jg,卖三价,single,4,23,132,;" +
"mc3sl,卖三量,single,4,26,144,;" +
"mc4jg,卖四价,single,4,36,184,;" +
"mc4sl,卖四量,single,4,38,192,;" +
"mc5jg,卖五价,single,4,37,188,;" +
"mc5sl,卖五量,single,4,39,196,";
//"jd,精度,int,4,3,52,;" +
//"scbz,删除标志,int,4,4,56,";
//"unknown,(未知),int,4,31,164,;" +
//",(未知),,48,40,200,;"
break;
#endregion
#region 分笔成交数据文件report.dat(结构同day.dat,但其中一些数据不是直接保存)
case DataTypes.hqmb:
fileName = "REPORT.DAT";
startAddress = 0x41000;
blockSize = 4068;
recordSize = 36;
codeIsLong = false;
isIndexDataStruct = false;//不完全等同于day.dat结构,因此单独处理
fieldString =
"dm,代码,code,10,0,0,;" +
"rq,日期,datetime,4,0,0,;" +
"zjcj,最近成交价,single,4,1,4,;" +
"zss,总手数,single,4,2,8,calc;" +
"je,金额,single,4,3,12,;" +
"xss,现手数,single,4,2,8,;" +
"mm,内外盘,string,2,16,35,;" +
"mr1jg,买一价,single,1,10,28,;" +
"mr1sl,买一量,single,2,4,16,;" +
"mr2jg,买二价,single,1,11,29,;" +
"mr2sl,买二量,single,2,5,18,;" +
"mr3jg,买三价,single,1,12,30,;" +
"mr3sl,买三量,single,2,6,20,;" +
"mc1jg,卖一价,single,1,13,31,;" +
"mc1sl,卖一量,single,2,7,22,;" +
"mc2jg,卖二价,single,1,14,32,;" +
"mc2sl,卖二量,single,2,8,24,;" +
"mc3jg,卖三价,single,1,15,33,;" +
"mc3sl,卖三量,single,2,9,26,";
//以类数据类型不是存储类型,程序中不直接用实际数据类型:买/卖X量为short,买/卖X价为byte
//现手数通过当总手数计算而得,应该放在总手数后面
break;
#endregion
#region 日线数据文件day.dat
case DataTypes.hq:
fileName = "DAY.DAT";
startAddress = 0x41000;
blockSize = 8192;
recordSize = 32;
codeIsLong = false;
fieldString =
"dm,代码,code,10,0,0,;" +
"rq,日期,date,4,1,0,;" +
"kp,开盘,single,4,2,4,B;" +
"zg,最高,single,4,3,8,B;" +
"zd,最低,single,4,4,12,B;" +
"sp,收盘,single,4,5,16,B;" +
"sl,成交数量,single,4,6,20,A;"+
"je,成交金额,single,4,7,24,";
break;
#endregion
#region 5分钟数据文件min.dat
case DataTypes.hq5:
fileName = "MIN.DAT";
startAddress = 0x41000;
blockSize = 8192;
recordSize = 32;
codeIsLong = false;
fieldString =
"dm,代码,code,10,0,0,;" +
"rq,日期,datetime,4,1,0,;" +
"kp,开盘,single,4,2,4,B;" +
"zg,最高,single,4,3,8,B;" +
"zd,最低,single,4,4,12,B;" +
"sp,收盘,single,4,5,16,B;" +
"sl,成交数量,single,4,6,20,A;"+
"je,成交金额,single,4,7,24,";
break;
#endregion
#region 分红送配数据文件exprof.fdt
case DataTypes.fp:
fileName = "EXPROF.FDT";
startAddress = 0x41000;
blockSize = 3776;
recordSize = 236;
codeIsLong = true;
fieldString =
"dm,代码,code,12,0,0,;"+
"cqrq,除权日期,date,4,23,176,;" +
"sgbl,送股比例,double,8,1,12,;" +
"sgdjr,送股股权登记日,date,4,2,20,;"+
"sgcqr,送股除权日,date,4,3,24,;"+
"sgssr,红股上市日,date,4,4,28,;"+
"zzbl,转增比例,double,8,5,32,;"+
"zzdjr,转增股权登记日,date,4,6,40,;"+
"zzcqr,转增除权日,date,4,7,44,;"+
"zzssr,转增上市日,date,4,8,48,;"+
"fhbl,分红比例,double,8,9,52,;"+
"fhdjr,分红股权登记日,date,4,10,60,;" +
"fhcxr,分红除息日,date,4,11,64,;" +
"fhpxr,分红派息日,date,4,12,68,;" +
"pgbl,配股比例,double,8,13,72,;"+
"pgdjr,配股股权登记日,date,4,14,80,;"+
"pgcqr,配股除权基准日,date,4,15,84,;"+
"pgjkqsr,配股缴款起始日,date,4,16,88,;"+
"pgjkzzr,配股缴款终止日,date,4,17,92,;"+
"pgssr,配股可流通上市日,date,4,18,96,;"+
"pgjg,配股价格,single,4,19,100,;"+
"frgpgbl,公众股受让法人股配股比例,double,8,20,104,;"+
"frgmgzrf,认购法人股配股每股转让费,single,4,21,112,;"+
"pgzcxs,配股主承销商,string,60,22,116,;"+
"bgrq,报告日期,date,4,24,180,;"+
"dshrq,董事会日期,date,4,25,184,;"+
"gdhrq,股东会日期,date,4,26,188,;"+
"fhggrq,分红公告日期,date,4,27,192,;"+
"zgbjs,总股本基数,double,8,28,196,;"+
"sgsl,送股数量,double,8,29,204,;"+
"zzsl,转增数量,double,8,30,212,;"+
"sjpgs,实际配股总数,double,8,31,220,;"+
"cqhzgb,除权后总股本,double,8,32,228";

break;
#endregion
#region 股本结构Capital.fdt
case DataTypes.gb:
fileName = "CAPITAL.FDT";
startAddress = 0x41000;
blockSize = 3488;
recordSize = 218;
codeIsLong = true;
fieldString =
"dm,代码,code,12,0,0;" +
"rq,日期,date,4,17,214;"+
"zgb,总股本,double,8,1,12;" +
"gjg,国家股,double,8,2,20;" +
"fqrg,发起人股,double,8,3,28;" +
"frg,法人股,double,8,4,36;" +
"ybfrps,一般法人配售,double,8,5,44;" +
"zgg,内部职工股,double,8,6,52;" +
"a,流通A股,double,8,7,60;" +
"zltzag,战略投资A股,double,8,8,68;" +
"zpg,转配股,double,8,9,76;" +
"jjps,基金配售,double,8,10,84;" +
"h,H股,double,8,11,92;" +
"b,B股,double,8,12,100;" +
"yxg,优先股,double,8,13,108;" +
"ggcg,高级管理人员持股,double,8,14,116;" +
"gbbdyy,股本变动原因,string,56,15,124;" +
"gbbdyylb,股本变动原因类别,string,34,16,180";

break;
#endregion
#region 财务数据Finance.fdt
case DataTypes.cw:
fileName = "FINANCE.FDT";
startAddress = 0x41000;
blockSize = 14848;
recordSize = 464;
codeIsLong = true;
fieldString =
"dm,代码,code,12,0,0,;"+
"rq,日期,date,4,,460,;"+
"bsdqtzje,短期投资净额,double,8,1,12,;"+
"bsyszkje,应收帐款净额,double,8,2,20,;"+
"bschje,存货净额,double,8,3,28,;"+
"bsldzc,流动资产,double,8,4,36,;"+
"bscqtzje,长期投资净额,double,8,5,44,;"+
"bsgdzc,固定资产,double,8,6,52,;"+
"bswxzc,无形及其他资产,double,8,7,60,;"+
"bszzc,总资产,double,8,8,68,;"+
"bsdqjk,短期借款,double,8,9,76,;"+
"bsyfzk,应付帐款,double,8,10,84,;"+
"bsldfz,流动负债,double,8,11,92,;"+
"bscqfz,长期负债,double,8,12,100,;"+
"bsfz,负债合计,double,8,13,108,;"+
"bsgb,股本,double,8,14,116,;"+
"bsssgdqy,少数股东权益,double,8,15,124,;"+
"bsgdqy,股东权益,double,8,16,132,;"+
"bszbgj,资本公积,double,8,17,140,;"+
"bsyygj,盈余公积,double,8,18,148,;"+
"iszysr,主营业务收入净额,double,8,1,156,;"+
"iszycb,主营业务成本,double,8,2,164,;"+
"iszylr,主营业务利润,double,8,3,172,;"+
"isqtlr,其它业务利润,double,8,4,180,;"+
"isyyfy,营业费用,double,8,5,188,;"+
"isglfy,管理费用,double,8,6,196,;"+
"iscwfy,财务费用,double,8,7,204,;"+
"istzsy,投资收益,double,8,8,212,;"+
"islrze,利润总额,double,8,9,220,;"+
"issds,所得税,double,8,10,228,;"+
"isjlr,净利润,double,8,11,236,;"+
"iskchjlr,扣除经常性损益后的净利润,double,8,12,244,;"+
"iswfplr,未分配利润,double,8,13,252,;"+
"cfjyhdxjlr,经营活动现金流入,double,8,1,260,;"+
"cfjyhdxjlc,经营活动现金流出,double,8,2,268,;"+
"cfjyhdxjje,经营活动现金净额,double,8,3,276,;"+
"cftzxjlr,投资现金流入,double,8,4,284,;"+
"cftzxjlc,投资现金流出,double,8,5,292,;"+
"cftzxjje,投资现金净额,double,8,6,300,;"+
"cfczxjlr,筹措现金流入,double,8,7,308,;"+
"cfczxjlc,筹措现金流出,double,8,8,316,;"+
"cfczxjje,筹措现金净额,double,8,9,324,;"+
"cfxjjze,现金及现金等价物净增额,double,8,10,332,;"+
"cfxsspxj,销售商品收到的现金,double,8,11,340,;"+
"mgsy,每股收益,single,4,1,348,;"+
"mgjzc,每股净资产,single,4,2,352,;"+
"tzmgjzc,调整后每股净资产,single,4,3,356,;"+
"mgzbgjj,每股资本公积金,single,4,4,360,;"+
"mgwfplr,每股未分配利润,single,4,5,364,;"+
"mgjyxjllje,每股经营活动产生的现金流量净额,single,4,6,368,;"+
"mgxjzjje,每股现金及现金等价物增加净额,single,4,7,372,;"+
"mll,毛利率,single,4,8,376,;"+
"zyywlrl,主营业务利润率,single,4,9,380,;"+
"jll,净利率,single,4,10,384,;"+
"zzcbcl,总资产报酬率,single,4,11,388,;"+
"jzcsyl,净资产收益率,single,4,12,392,;"+
"xsxjzb,销售商品收到的现金占主营收入比例,single,4,13,396,;"+
"yszczzl,应收帐款周转率,single,4,14,400,;"+
"chzzl,存货周转率,single,4,15,404,;"+
"gdzczzl,固定资产周转率,single,4,16,408,;"+
"zyywzzl,主营业务增长率,single,4,17,412,;"+
"jlrzzl,净利润增长率,single,4,18,416,;"+
"zzczzl,总资产增长率,single,4,19,420,;"+
"jzczzl,净资产增长率,single,4,20,424,;"+
"ldbl,流动比率,single,4,21,428,;"+
"sdbl,速动比率,single,4,22,432,;"+
"zcfzbl,资产负债比率,single,4,23,436,;"+
"fzbl,负债比率,single,4,24,440,;"+
"gdqybl,股东权益比率,single,4,25,444,;"+
"gdzcbl,固定资产比率,single,4,26,448,;"+
"kchmgjlr,扣除经常性损益后每股净利润,single,4,27,452,";

break;
#endregion
#region 十大股东stkhold.fdt
case DataTypes.gd:
fileName = "STKHOLD.FDT";
startAddress = 0x41000;
blockSize = 17568;
recordSize = 2196;
codeIsLong = true;
fieldString =
"dm,代码,code,12,0,0,;"+
"rq,日期,date,4,66,2192,;" +
"gd1mc,股东1名称,string,160,1,12,;"+
"gd1cgsl,股东1持股数量,double,8,2,172,;"+
"gd1cgbl,股东1持股比例,single,4,3,180,;"+
"gd1bz,股东1备注,string,20,4,184,;"+
"gd1fr,股东1法人,string,8,5,204,;"+
"gd1jyfw,股东1经营范围,string,16,6,212,;"+
"gd2mc,股东2名称,string,160,7,228,;"+
"gd2cgsl,股东2持股数量,double,8,8,388,;"+
"gd2cgbl,股东2持股比例,single,4,9,396,;"+
"gd2bz,股东2备注,string,20,10,400,;"+
"gd2fr,股东2法人,string,8,11,420,;"+
"gd2jyfw,股东2经营范围,string,16,12,428,;"+
"gd3mc,股东3名称,string,160,13,444,;"+
"gd3cgsl,股东3持股数量,double,8,14,604,;"+
"gd3cgbl,股东3持股比例,single,4,15,612,;"+
"gd3bz,股东3备注,string,20,16,616,;"+
"gd3fr,股东3法人,string,8,17,636,;"+
"gd3jyfw,股东3经营范围,string,16,18,644,;"+
"gd4mc,股东4名称,string,160,19,660,;"+
"gd4cgsl,股东4持股数量,double,8,20,820,;"+
"gd4cgbl,股东4持股比例,single,4,21,828,;"+
"gd4bz,股东4备注,string,20,22,832,;"+
"gd4fr,股东4法人,string,8,23,852,;"+
"gd4jyfw,股东4经营范围,string,16,24,860,;"+
"gd5mc,股东5名称,string,160,25,876,;"+
"gd5cgsl,股东5持股数量,double,8,26,1036,;"+
"gd5cgbl,股东5持股比例,single,4,27,1044,;"+
"gd5bz,股东5备注,string,20,28,1048,;"+
"gd5fr,股东5法人,string,8,29,1068,;"+
"gd5jyfw,股东5经营范围,string,16,30,1076,;"+
"gd6mc,股东6名称,string,160,31,1092,;"+
"gd6cgsl,股东6持股数量,double,8,32,1252,;"+
"gd6cgbl,股东6持股比例,single,4,33,1260,;"+
"gd6bz,股东6备注,string,20,34,1264,;"+
"gd6fr,股东6法人,string,8,35,1284,;"+
"gd6jyfw,股东6经营范围,string,16,36,1292,;"+
"gd7mc,股东7名称,string,160,37,1308,;"+
"gd7cgsl,股东7持股数量,double,8,38,1468,;"+
"gd7cgbl,股东7持股比例,single,4,39,1476,;"+
"gd7bz,股东7备注,string,20,40,1480,;"+
"gd7fr,股东7法人,string,8,41,1500,;"+
"gd7jyfw,股东7经营范围,string,16,42,1508,;"+
"gd8mc,股东8名称,string,160,43,1524,;"+
"gd8cgsl,股东8持股数量,double,8,44,1684,;"+
"gd8cgbl,股东8持股比例,single,4,45,1692,;"+
"gd8bz,股东8备注,string,20,46,1696,;"+
"gd8fr,股东8法人,string,8,47,1716,;"+
"gd8jyfw,股东8经营范围,string,16,48,1724,;"+
"gd9mc,股东9名称,string,160,49,1740,;"+
"gd9cgsl,股东9持股数量,double,8,50,1900,;"+
"gd9cgbl,股东9持股比例,single,4,51,1908,;"+
"gd9bz,股东9备注,string,20,52,1912,;"+
"gd9fr,股东9法人,string,8,53,1932,;"+
"gd9jyfw,股东9经营范围,string,16,54,1940,;"+
"gd10mc,股东10名称,string,160,55,1956,;"+
"gd10cgsl,股东10持股数量,double,8,56,2116,;"+
"gd10cgbl,股东10持股比例,single,4,57,2124,;"+
"gd10bz,股东10备注,string,20,58,2128,;"+
"gd10fr,股东10法人,string,8,59,2148,;"+
"gd10jyfw,股东10经营范围,string,16,60,2156,;"+
"gdzs,股东总数,int,4,61,2172,;"+
"gjgfrggds,国家股法人股股东数,int,4,62,2176,;"+
"aggds,流通股A股股东数,int,4,63,2180,;"+
"bggds,流通股B股股东数,int,4,64,2184,";

break;
#endregion
#region 基金周报fundweek.fdt
case DataTypes.jjjz:
fileName = "FUNDWEEK.FDT";
startAddress = 0x41000;
blockSize = 12032;
recordSize = 188;
codeIsLong = true;
fieldString =
"dm,代码,code,12,0,0,;"+
"rq,日期,date,4,13,184,;"+
"dwjz,基金单位净值,single,4,6,152,;" +
"jjze,基金净值总额,double,8,5,144,;" +
"gm,基金规模,double,8,4,136,;" +
"dwcz,基金单位初值,single,4,7,156,;"+
"tzhjz,基金调整后净值,single,4,8,160,;"+
"tzhcz,基金调整后初值,single,4,9,164,;"+
"zzl,基金增长率(%),double,8,10,168,;"+
"ljjz,基金累计净值,single,4,11,176,;"+
"slrq,基金设立日期,date,4,1,12,;"+
"glr,基金管理人,string,60,2,16,;"+
"tgr,基金托管人,string,60,3,76,"
;//12为保留字段

break;
#endregion
#region 基金投资组合funddiv.fdt
case DataTypes.jjzh:
fileName = "FUNDDIV.FDT";
startAddress = 0x41000;
blockSize = 8320;
recordSize = 260;
codeIsLong = true;
fieldString =
"dm,代码,code,12,0,0,;" +
"bgrq,报告日期,date,4,31,252,;" +
"zzrq,截止日期,date,4,32,256,;" +
"dm1,证券1代码,string,12,1,12,;" +
"sz1,证券1市值,double,8,2,24,;" +
"bl1,证券1占净值比例(%),single,4,3,32,;" +
"dm2,证券2代码,string,12,4,36,;" +
"sz2,证券2市值,double,8,5,48,;" +
"bl2,证券2占净值比例(%),single,4,6,56,;" +
"dm3,证券3代码,string,12,7,60,;" +
"sz3,证券3市值,double,8,8,72,;" +
"bl3,证券3占净值比例(%),single,4,9,80,;" +
"dm4,证券4代码,string,12,10,84,;" +
"sz4,证券4市值,double,8,11,96,;" +
"bl4,证券4占净值比例(%),single,4,12,104,;" +
"dm5,证券5代码,string,12,13,108,;" +
"sz5,证券5市值,double,8,14,120,;" +
"bl5,证券5占净值比例(%),single,4,15,128,;" +
"dm6,证券6代码,string,12,16,132,;" +
"sz6,证券6市值,double,8,17,144,;" +
"bl6,证券6占净值比例(%),single,4,18,152,;" +
"dm7,证券7代码,string,12,19,156,;" +
"sz7,证券7市值,double,8,20,168,;" +
"bl7,证券7占净值比例(%),single,4,21,176,;" +
"dm8,证券8代码,string,12,22,180,;" +
"sz8,证券8市值,double,8,23,192,;" +
"bl8,证券8占净值比例(%),single,4,24,200,;" +
"dm9,证券9代码,string,12,25,204,;" +
"sz9,证券9市值,double,8,26,216,;" +
"bl9,证券9占净值比例(%),single,4,27,224,;" +
"dm10,证券10代码,string,12,28,228,;" +
"sz10,证券10市值,double,8,29,240,;" +
"bl10,证券10占净值比例(%),single,4,30,248,";


break;
#endregion
#region 板块userdata\block
case DataTypes.bk:
fileName = "BLOCK.DEF";
startAddress = 0;
blockSize = 0;
recordSize = 248;
codeIsLong = false;
isIndexDataStruct = false;
fieldString =
"lb,类别,string,20,0,0,;" +
"bk,板块,string,20,1,10,;" +
"dm,证券代码,string,10,2,42,";
break;
#endregion
#region 评级
case DataTypes.pj:
fileName = "评级.str";
startAddress = 0;
blockSize = 256;
recordSize = 256;
codeIsLong = true;
isIndexDataStruct = false;
fieldString =
"dm,证券代码,string,12,0,0,;" +
"pj,评级,string,2,2,0,;" +
"sm,说明,string,244,2,0,";
break;
#endregion
#region 复权行情,计算而得
case DataTypes.hqfq:
fileName = "DAY.DAT";
startAddress = 0x41000;
blockSize = 8192;
recordSize = 32;
codeIsLong = false;
fieldString =
"dm,代码,code,10,0,0,;" +
"rq,日期,date,4,1,0,;" +
"kp,开盘复权价,single,4,2,4,B;" +
"zg,最高复权价,single,4,3,8,B;" +
"zd,最低复权价,single,4,4,12,B;" +
"sp,收盘复权价,single,4,5,16,B;" +
"sl,复权成交数量,single,4,6,20,A;" +
"je,成交金额,single,4,7,24,;"+
"spsyl,收盘收益率,single,4,0,0,";
break;
#endregion
}
string[] fieldLine = fieldString.Split(new char[] { ‘;‘ });
fields = new string[fieldLine.Length, 7];
for (int i = 0; i < fieldLine.Length; i++)
{
string[] field = fieldLine[i].Split(new char[]{‘,‘} ,7 );
for(int j=0;j<field.Length;j++)
{
fields[i,j]=field[j];
}
}
}

}
private string fxjPath = "";
private string fxjDataPath="";
private string[,] fxjMarket;
private string msg = "";
private DateTime date19700101 = new DateTime(1970, 1, 1);
private FileStream fs; private BinaryReader br;
private void checkFileStream(string fxjFileName)
{
if (this.fs == null || (this.fs != null && this.fs.Name.ToUpper() != fxjFileName))
{
if (this.fs != null)
{
fs.Close();
br.Close();
}
fs = new FileStream(fxjFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
br = new BinaryReader(fs);
}
}

public string Version
{
get
{
return ("0.7");
}
}
public int Error
{
get
{
if (msg != "") return 1;
else return 0;
}
}
public string Msg
{
get { return (msg); }
}
public string FxjPath //属性FxjPath
{
get
{
return (fxjPath);
}
set
{
fxjPath = value;
fxjPath = fxjPath.Trim().ToUpper();
if (fxjPath != "" && !fxjPath.EndsWith(@"\"))
{
fxjPath += @"\";
}
fxjPath = fxjPath.ToUpper();
}
}
public string FxjDataPath //属性FxjDataPath
{
get
{
return (fxjDataPath);
}
set
{
fxjDataPath = value;
fxjDataPath = fxjDataPath.Trim().ToUpper();
if (fxjDataPath!="" && !fxjDataPath.EndsWith(@"\"))
{
fxjDataPath += @"\";
}
fxjDataPath=fxjDataPath.ToUpper();
}
}

public void ShowAboutBox()
{
FinData.AboutBox ab = new AboutBox();
ab.ShowDialog();
}
public void ShowFxjConverter()
{
FxjConverter fxjConverter = new FxjConverter();
fxjConverter.ShowDialog();
}
public void ShowFxjReader()
{
FxjReader fxjReader = new FxjReader();
fxjReader.ShowDialog();
}

public string[,] GetMarkets()
{
return (fxjMarket);
}
public string[,] GetTables()
{
if (tableNames[0, 2] == "")
{
for (int i = 0; i < tableNames.GetLength(0); i++)
{
DataTypes d = (DataTypes)Enum.Parse(typeof(DataTypes), tableNames[i,0].ToLower());
fileStruct fxjFileStruct = new fileStruct(d);
tableNames[i, 2] = fxjFileStruct.fileName;
}

}

return tableNames;
}
public string GetTableDef(string dataType, string descDataType, bool delOldTable)
{
dataType = dataType.Trim(); descDataType = descDataType.Trim();
string result = "";
fileStruct fxjFileStruct = new fileStruct((DataTypes)Enum.Parse(typeof(DataTypes), dataType.ToLower()));
switch (descDataType.ToUpper())
{
case "SAS":
for (int i = 0; i < fxjFileStruct.fields.GetLength(0); i++)
{
if (result != "") result += ",";
result += fxjFileStruct.fields[i, 0];//字段
if (" ,code,string".IndexOf(fxjFileStruct.fields[i, 2]) > 0)
{
result += " char(" + fxjFileStruct.fields[i, 3] + ") format=$" + fxjFileStruct.fields[i, 3] + "."; //字符串
}
else if (" ,int,single,double".IndexOf(fxjFileStruct.fields[i, 2]) > 0)
{
result += " num "; //数值类型
}
else if (" ,date".IndexOf(fxjFileStruct.fields[i, 2]) > 0)
{
result += " num format=YYMMDD10."; //date类型
}
else if (" ,datetime".IndexOf(fxjFileStruct.fields[i, 2]) > 0)
{
result += " num format=datetime."; //datetime类型
}
result += " label=‘" + fxjFileStruct.fields[i, 1] + "‘";//标签

}
result = "create table FinData." + dataType + "(" + result + ");";
if (delOldTable == true)
{
result = "drop table FinData." + dataType + ";" + result;
}
result = "proc sql;" + result + "quit;";
break;
case "SASINPUT"://用于SAS直接读取数据时所用的INPUT语句,需进一步修改
for (int i = 0; i < fxjFileStruct.fields.GetLength(0); i++)
{
if (" ,code,string".IndexOf(fxjFileStruct.fields[i, 2]) > 0)
{
result += " @(p+" + fxjFileStruct.fields[i, 5] + ") " + fxjFileStruct.fields[i, 0] + " $" + fxjFileStruct.fields[i, 3] + "."; //字符串
}
else if (" ,int,date,datetime".IndexOf(fxjFileStruct.fields[i, 2]) > 0)
{
result += " @(p+" + fxjFileStruct.fields[i, 5] + ") " + fxjFileStruct.fields[i, 0] + " ib" + fxjFileStruct.fields[i, 3] + "."; //数值类型
}
else if (" ,single".IndexOf(fxjFileStruct.fields[i, 2]) > 0)
{
result += " @(p+" + fxjFileStruct.fields[i, 5] + ") " + fxjFileStruct.fields[i, 0] + " float" + fxjFileStruct.fields[i, 3] + "."; //数值类型
}
else if (" ,double".IndexOf(fxjFileStruct.fields[i, 2]) > 0)
{
result += " @(p+" + fxjFileStruct.fields[i, 5] + ") " + fxjFileStruct.fields[i, 0] + " rb" + fxjFileStruct.fields[i, 3] + "."; //数值类型
}
}
break;
case "FIELDS"://列出字段名称
for (int i = 0; i < fxjFileStruct.fields.GetLength(0); i++)
{
result += " " + fxjFileStruct.fields[i, 0] ;
}
break;

default:
result = "";
break;
}
return result;

}
public string GetCodeType(string code)
{
code = code.Trim().ToUpper();
if (Regex.IsMatch(code, @"(SH000300)") == true)
{
return "zs";
}
if (Regex.IsMatch(code, @"(SH60[0-8]\d{3})|(SH90\d{4})|(SZ00[01256789]\d{3})|(SZ20\d{4})|(SZ4[02]\d{4})") == true)
{
return "gp";
}
else if (Regex.IsMatch(code, @"(SH00000\d)|(SH00001[0-6])") == true)
{
return "zs";
}
else if (Regex.IsMatch(code, @"(SH[012]\d{5})|(SZ1[0123]\d{4})") == true && Regex.IsMatch(code, @"(SH181\d{3})") == false && Regex.IsMatch(code, @"(SH190\d{3})") == false)
{
return "zq";
}
else if (Regex.IsMatch(code, @"(SH5[01]\d{4})|(SZ184\d{3})|(SZ1[56]\d{4})") == true)
{
return "jj";
}
else if (Regex.IsMatch(code, @"(SH58\d{4})|(SZ03\d{4})") == true)
{
return "qz";
}
else if (Regex.IsMatch(code, @"(SH000\d{3})|(SZ399\d{3})|(SH8[013]\d{4})") == true)
{
return "zs";
}
return "";
}
private string [] GetCodes(string Market) //读取Day.dat中的代码
{
//沪市指数代码转换表,分析家同时保存沪市两类代码
string[,] codesRename = new string[,]
{
{"SH1A0001","SH000001"},
{"SH1A0002","SH000002"},
{"SH1A0003","SH000003"},
{"SH1B0001","SH000004"},
{"SH1B0002","SH000005"},
{"SH1B0004","SH000006"},
{"SH1B0005","SH000007"},
{"SH1B0006","SH000008"},
{"SH1B0007","SH000010"},
{"SH1B0008","SH000011"},
{"SH1B0009","SH000012"},
{"SH1B0010","SH000013"},
{"SH1C0003","SH000016"}
};
long len = -1;
long pos = 0;
int flag;
if (FxjDataPath == "")
{
msg = @"无法在注册表中到分析家数据文件目录,请自行将属性 FxjDataPath设置为有效路径,如c:\fxj\data\。";
return new string[1] { null };
}
Market = Market.Trim().ToUpper();
if (Market == "")
{
msg = "Market参数只能是市场简称,如沪市为SH,深市为SZ,香港为HK等。";
return null;
}
string FxjFile = fxjDataPath + Market+@"\DAY.DAT";
msg="";
if (!File.Exists(FxjFile)) //DAY.DAT文件不存在
{
msg = FxjFile + "不存在!";
return new string[1] { null };
}
try
{
this.checkFileStream(FxjFile);
int secCounts = 0;//文件中证券总数
string code = "";
len = fs.Length;
fs.Position=0;
flag = br.ReadInt32();
if (flag == -65823756) //0xFC139BF4
{
fs.Position = 12;
secCounts=br.ReadInt32();
string[] codes = new string[secCounts];
for (int i = 0; i < secCounts; i++)
{
pos = 24 + 64*i;
if (pos <= len)
{
fs.Position = pos;
code = new string(br.ReadChars(10));//分析家用10个字节保存代码,一般用6个字节
code = Market + code.Replace("\0", "");
code = code.Replace("HKHK", "HK"); //香港证券代码本身保存为HKxxxx
code = code.ToUpper();
for (int icode = 0; icode < codesRename.GetLength(0); icode++)
{
code = code.Replace(codesRename[icode, 0], codesRename[icode, 1]);
}
codes[i] = code;
}
}
//fs.Close();
msg = "";
return codes;
}
}
catch(Exception e)
{
msg=e.Message;

}
return new string[1] { null };

}
public string[,] GetFields(string dataType)
{
msg = "";
try
{
DataTypes d = (DataTypes)Enum.Parse(typeof(DataTypes), dataType.ToLower());
return GetFields(d);
}
catch
{
msg = @"输入的参数有误。参数只能是:";
foreach (string s in Enum.GetNames(typeof(DataTypes)))
msg += " \"" + s + "\"";
msg += @" 或者 ";
foreach (int i in Enum.GetValues(typeof(DataTypes)))
msg += " " + i.ToString();

return new string[1, 1] { { null } };
}

}
private string[,] GetFields(DataTypes dataType)
{
msg = "";
try
{
fileStruct fxjFileStruct = new fileStruct(dataType);
string[,] fields = new string[fxjFileStruct.fields.GetLength(0), 3];
//fields[0, 0] = "<字段名>"; fields[0, 1] = "<含义>"; fields[0, 2] = "<类型>";
for (int i = 0; i < fxjFileStruct.fields.GetLength(0); i++)
{
for (int j = 0; j < 3; j++)
{
fields[i, j] = fxjFileStruct.fields[i, j];
}
}

return fields;
}
catch
{
msg = "错误"; return new string[1, 1] { { null } };
}

}

public string[,] GetData(string dataType, string code)
{
return GetData(dataType, code, "");
}
public string[,] GetData(string dataType, string code, string newFileName)
{
try
{
DataTypes d = (DataTypes)Enum.Parse(typeof(DataTypes), dataType.ToLower());
return GetData(d, code,newFileName);
}
catch
{
msg = @"输入的参数有误。第一个参数只能是:";
foreach (string s in Enum.GetNames(typeof(DataTypes)))
msg += " \"" + s + "\"";
msg += @" 或者 ";
foreach (int i in Enum.GetValues(typeof(DataTypes)))
msg += " " + i.ToString() ;

return new string[1, 1] { { null } };
}
}
private string[,] GetData(DataTypes dataType,string code,string newFileName) //读取数据,重载
{
if (dataType == DataTypes.bk) return GetBK(code);
if (dataType == DataTypes.pj) return GetPJ(code);
if (dataType == DataTypes.hqfq) return GetHqfq(dataType,code,newFileName);
#region 读取数据前初始化
msg = "";
fileStruct fxjFileStruct = new fileStruct(dataType);
if (newFileName != "") fxjFileStruct.fileName = newFileName; //如果用户重新指定了文件名
code = code.Trim().ToUpper();
if (code == "")
{
msg = @"CODE参数不可为空。请提供证券代码,如SZ000001。";
return new string[1, 1] { { null } };
}
ArrayList recordList = new ArrayList();
int intField; float floatField; double doubleField; //string stringField;
System.Globalization.CultureInfo cnCultureInfo = new System.Globalization.CultureInfo("zh-CN");
string market = code.Substring(0, 2);
int recordCounts = 0;
short[] blocks = new short[25];
long len = -1;
long pos = 0;
if (this.FxjDataPath == "")
{
msg = @"无法在注册表中到分析家数据文件目录,请自行将属性 FxjDataPath设置为有效路径,如c:\fxj\data\。";
return new string[1, 1] { { null } };
}
string FxjFile = fxjDataPath + fxjFileStruct.fileName;
FxjFile = FxjFile.ToUpper();
if (!File.Exists(FxjFile))
{
FxjFile = fxjDataPath + market +@"\" +fxjFileStruct.fileName;
}
msg = "";
if (!File.Exists(FxjFile))
{
msg = fxjFileStruct.fileName + "没有找到!";
return new string[1, 1] { { null } };
}
#endregion
if (fxjFileStruct.isIndexDataStruct == true)
{
#region 处理DAY.DAT等结构(索引/数据)的数据
try
{
this.checkFileStream(FxjFile);
int secCounts = 0;//文件中证券总数
string code0 = "";
len = fs.Length;
fs.Position = 12;
secCounts = br.ReadInt32();
bool codeRead = false;
for (int i = 0; i < secCounts && codeRead==false; i++)
{
pos = 24 + 64 * i;
if (pos <= len)
{
fs.Position = pos;
//code0 = new string(br.ReadChars(10));//分析家用10个字节保存代码,一般用8个字节
code0 = System.Text.Encoding.Default.GetString(br.ReadBytes(10));
code0 = code0.Replace("\0", "");
code0 = code0.Replace("HKHK", "HK"); //香港证券代码本身保存为HKxxxx
if (fxjFileStruct.codeIsLong == false && code == market + code0 || fxjFileStruct.codeIsLong == true && code == code0)
{
recordCounts = br.ReadInt32();
for (int j = 0; j < 25; j++)
{
blocks[j] = br.ReadInt16();
}
codeRead = true;
}
}
}
int iRecord = 1;//记录
int iBlock = 0;//第iBlock块
int fieldCounts = fxjFileStruct.fields.GetLength(0);
while (iBlock < 25 && blocks[iBlock] != -1)
{
int r = 0;
while (iRecord < recordCounts + 1 && r < fxjFileStruct.blockSize / fxjFileStruct.recordSize) //16=3776/236
{
string[] record = new string[fieldCounts];
pos = fxjFileStruct.startAddress + blocks[iBlock] * fxjFileStruct.blockSize + r * fxjFileStruct.recordSize;
for (int iField = 0; iField < fieldCounts; iField++)
{
fs.Position = pos + Convert.ToInt64(fxjFileStruct.fields[iField, 5]);
switch (fxjFileStruct.fields[iField, 2].ToLower())
{
case "code":
//code0 = new string(br.ReadChars(8));//有12位,实际用了8位,第9-12位一般为\0,有时是错误字节,因为只读8位
//code0 = code0.Replace("\0", "");
record[iField] = code;
break;
case "date":
intField = br.ReadInt32();
record[iField] = (intField == 0 ? "" : (date19700101.AddDays(intField / 86400)).ToString("yyyy-MM-dd"));
break;
case "datetime":
intField = br.ReadInt32();
record[iField] = (intField == 0 ? "" : (date19700101.AddSeconds(intField)).ToString("yyyy-MM-dd HH:mm:ss"));
break;
case "int":
intField = br.ReadInt32();
record[iField] = intField.ToString("D", cnCultureInfo);
break;
case "single":
//floatField = br.ReadSingle();
//if (fxjFileStruct.fields[iField, 6].ToUpper() == "A") floatField *= 100;
//record[iField] = floatField.ToString("G", cnCultureInfo);
doubleField =(double) br.ReadSingle();
if (fxjFileStruct.fields[iField, 6].ToUpper() == "A") doubleField *= 100;
record[iField] = doubleField.ToString("_jj_qz".IndexOf(this.GetCodeType(code)) > 0 ? "F3" : "F", cnCultureInfo);
break;
case "double":
doubleField = br.ReadDouble();
record[iField] = doubleField.ToString("F", cnCultureInfo);
break;
case "string":
record[iField] = System.Text.Encoding.Default.GetString(br.ReadBytes(Convert.ToInt32(fxjFileStruct.fields[iField, 3]))).Replace("\0", "");
break;
}
}


recordList.Add(record);

r = r + 1;
iRecord = iRecord + 1;
}
iBlock = iBlock + 1;
}

//fs.Close();
string[,] records = new string[recordList.Count, fieldCounts];
for (int i = 0; i < recordList.Count; i++)
{
string[] record0 = (string[])recordList[i];
for (int j = 0; j < fieldCounts; j++)
{
records[i, j] = record0[j];
}
}
if (records.GetLength(0) == 0) msg = "没有读到数据!";
return records;
}
catch (Exception e)
{
msg = e.Message;
}
#endregion
}
else
{
switch (dataType)
{
case DataTypes.dm:
#region 代码表(处理STKINFO51.DAT等结构的数据)
try
{
this.checkFileStream(FxjFile);
string[,] codesRename = new string[,]
{
{"SH1A0001","SH000001"},
{"SH1A0002","SH000002"},
{"SH1A0003","SH000003"},
{"SH1B0001","SH000004"},
{"SH1B0002","SH000005"},
{"SH1B0004","SH000006"},
{"SH1B0005","SH000007"},
{"SH1B0006","SH000008"},
{"SH1B0007","SH000010"},
{"SH1B0008","SH000011"},
{"SH1B0009","SH000012"},
{"SH1B0010","SH000013"},
{"SH1C0003","SH000016"}
};
int secCounts = 0;//文件中证券总数
string code0 = "";
fs.Position = 8;
secCounts = br.ReadInt32();
int fieldCounts = fxjFileStruct.fields.GetLength(0);
for (int i = 0; i < secCounts; i++)
{
pos = fxjFileStruct.startAddress + i * fxjFileStruct.recordSize;
fs.Position = pos;
code0 = System.Text.Encoding.Default.GetString(br.ReadBytes(10));
code0 = code0.Replace("\0", "");
code0 = code0.Replace("HKHK", "HK"); //香港证券代码本身保存为HKxxxx
if (Regex.IsMatch(code0, @"(1[ABC]00\d\d)") == false)
{
string[] recordFieldName = new string[fieldCounts];
string[] record = new string[fieldCounts];
for (int iField = 0; iField < fieldCounts; iField++)
{
fs.Position = pos + Convert.ToInt64(fxjFileStruct.fields[iField, 5]);
switch (fxjFileStruct.fields[iField, 2].ToLower())
{
case "code":
record[iField] = fxjFileStruct.codeIsLong == true ? code0 : market + code0;
record[iField] = record[iField].Replace("HKHK", "HK");
for (int icode = 0; icode < codesRename.GetLength(0); icode++)
{
record[iField] = record[iField].Replace(codesRename[icode, 0], codesRename[icode, 1]);
}
break;
case "date":
intField = br.ReadInt32();
record[iField] = (intField == 0 ? "" : (date19700101.AddDays(intField / 86400)).ToString("yyyy-MM-dd"));
break;
case "datetime":
intField = br.ReadInt32();
record[iField] = (intField == 0 ? "" : (date19700101.AddSeconds(intField)).ToString("yyyy-MM-dd HH:mm:ss"));
break;
case "int":
intField = br.ReadInt32();
record[iField] = intField.ToString("D");
break;
case "single":
floatField = br.ReadSingle();
if (fxjFileStruct.fields[iField, 6].ToUpper() == "A") floatField *= 100;
record[iField] = floatField.ToString("F");
break;
case "double":
doubleField = br.ReadDouble();
record[iField] = doubleField.ToString("F");
break;
case "string":
record[iField] = System.Text.Encoding.Default.GetString(br.ReadBytes(Convert.ToInt32(fxjFileStruct.fields[iField, 3]))).Replace("\0", "");
break;
}

}
recordList.Add(record);
}

}

//fs.Close();
string[,] records = new string[recordList.Count, fieldCounts];
for (int i = 0; i < recordList.Count; i++)
{
string[] record0 = (string[])recordList[i];
for (int j = 0; j < fieldCounts; j++)
{
records[i, j] = record0[j];
}
}
if (records.GetLength(0) == 0) msg = "没有读到数据!";
return records;
}
catch (Exception e)
{
msg = e.Message;
}
#endregion
break;
case DataTypes.hq0:
#region 最新行情(处理STKINFO51.DAT等结构的数据)
try
{
this.checkFileStream(FxjFile);
int secCounts = 0;//文件中证券总数
string code0 = "";
fs.Position = 8;
secCounts = br.ReadInt32();
int fieldCounts = fxjFileStruct.fields.GetLength(0);
bool hasCode = false;
for (int i = 0; i < secCounts && hasCode==false; i++)
{
pos = fxjFileStruct.startAddress + i * fxjFileStruct.recordSize;
fs.Position = pos;
code0 = System.Text.Encoding.Default.GetString(br.ReadBytes(10));
code0 = code0.Replace("\0", "");
code0 = code0.Replace("HKHK", "HK"); //香港证券代码本身保存为HKxxxx
if (fxjFileStruct.codeIsLong == false && code == market + code0 || fxjFileStruct.codeIsLong == true && code == code0)
{
hasCode = true;
string[] record = new string[fieldCounts];
for (int iField = 0; iField < fieldCounts; iField++)
{
fs.Position = pos + Convert.ToInt64(fxjFileStruct.fields[iField, 5]);
switch (fxjFileStruct.fields[iField, 2].ToLower())
{
case "code":
record[iField] = code;
break;
case "date":
intField = br.ReadInt32();
record[iField] = (intField == 0 ? "" : (date19700101.AddDays(intField / 86400)).ToString("yyyy-MM-dd"));
break;
case "datetime":
intField = br.ReadInt32();
record[iField] = (intField == 0 ? "" : (date19700101.AddSeconds(intField)).ToString("yyyy-MM-dd HH:mm:ss"));
break;
case "int":
intField = br.ReadInt32();
record[iField] = intField.ToString("D");
break;
case "single":
//floatField = br.ReadSingle();
//if (fxjFileStruct.fields[iField, 6].ToUpper() == "A") floatField *= 100;
//record[iField] = Math.Round(floatField, 2).ToString("F");
doubleField = (double)br.ReadSingle();
if (fxjFileStruct.fields[iField, 6].ToUpper() == "A") doubleField *= 100;
record[iField] = doubleField.ToString("_jj_qz".IndexOf(this.GetCodeType(code)) > 0 ? "F3" : "F", cnCultureInfo);
break;
case "double":
doubleField = br.ReadDouble();
record[iField] = Math.Round(doubleField, 2).ToString("F");
break;
case "string":
record[iField] = System.Text.Encoding.Default.GetString(br.ReadBytes(Convert.ToInt32(fxjFileStruct.fields[iField, 3]))).Replace("\0", "");
break;
}

}
recordList.Add(record);

}

}

//fs.Close();
string[,] records = new string[recordList.Count, fieldCounts];
for (int i = 0; i < recordList.Count; i++)
{
string[] record0 = (string[])recordList[i];
for (int j = 0; j < fieldCounts; j++)
{
records[i, j] = record0[j];
}
}
if (records.GetLength(0) == 0) msg = "没有读到数据!";
return records;
}
catch (Exception e)
{
msg = e.Message;
}
#endregion
break;
case DataTypes.cq:
#region 分红送配(处理STKINFO51.DAT等结构的数据)
try
{
this.checkFileStream(FxjFile);
int secCounts = 0;//文件中证券总数
string code0 = "";
fileStruct fxjdmStruct = new fileStruct(DataTypes.dm);// 代码的结构
int dmpos=0;
fs.Position = 8;
secCounts = br.ReadInt32();
int fieldCounts = fxjFileStruct.fields.GetLength(0);
bool hasCode = false;
for (int i = 0; i < secCounts && hasCode==false; i++)
{
dmpos = fxjdmStruct.startAddress + i * fxjdmStruct.recordSize;
fs.Position = dmpos;
code0 = System.Text.Encoding.Default.GetString(br.ReadBytes(10));
code0 = code0.Replace("\0", "");
code0 = code0.Replace("HKHK", "HK"); //香港证券代码本身保存为HKxxxx
if (fxjdmStruct.codeIsLong == false && code == market + code0 || fxjdmStruct.codeIsLong == true && code == code0)
{
hasCode = true;
int iRecord=0;
pos = fxjFileStruct.startAddress + i * fxjFileStruct.blockSize + iRecord * fxjFileStruct.recordSize;
fs.Position=pos;
while (br.ReadInt32() != 0)
{
string[] record = new string[fieldCounts];
for (int iField = 0; iField < fieldCounts; iField++)
{
fs.Position = pos + Convert.ToInt64(fxjFileStruct.fields[iField, 5]);
switch (fxjFileStruct.fields[iField, 2].ToLower())
{
case "code":
record[iField] = code;
break;
case "date":
intField = br.ReadInt32();
record[iField] = (intField == 0 ? "" : (date19700101.AddDays(intField / 86400)).ToString("yyyy-MM-dd"));
break;
case "datetime":
intField = br.ReadInt32();
record[iField] = (intField == 0 ? "" : (date19700101.AddSeconds(intField)).ToString("yyyy-MM-dd HH:mm:ss"));
break;
case "int":
intField = br.ReadInt32();
record[iField] = intField.ToString("D");
break;
case "single":
floatField = br.ReadSingle();
if (fxjFileStruct.fields[iField, 6].ToUpper() == "A") floatField *= 100;
record[iField] = Math.Round(floatField, 2).ToString("F");
break;
case "double":
doubleField = br.ReadDouble();
record[iField] = Math.Round(doubleField, 2).ToString("F");
break;
case "string":
record[iField] = System.Text.Encoding.Default.GetString(br.ReadBytes(Convert.ToInt32(fxjFileStruct.fields[iField, 3]))).Replace("\0", "");
break;
}

}
recordList.Add(record);
iRecord = iRecord + 1;
pos = fxjFileStruct.startAddress + i * fxjFileStruct.blockSize + iRecord * fxjFileStruct.recordSize;
fs.Position = pos;

}

}

}

//fs.Close();
string[,] records = new string[recordList.Count, fieldCounts];
for (int i = 0; i < recordList.Count; i++)
{
string[] record0 = (string[])recordList[i];
for (int j = 0; j < fieldCounts; j++)
{
records[i, j] = record0[j];
}
}
if (records.GetLength(0) == 0) msg = "没有读到数据!";
return records;
}
catch (Exception e)
{
msg = e.Message;
}
#endregion
break;
case DataTypes.cw0:
#region 财务数据--简单(处理STKINFO51.DAT等结构的数据)
try
{
this.checkFileStream(FxjFile);
int secCounts = 0;//文件中证券总数
string code0 = "";
fileStruct fxjdmStruct = new fileStruct(DataTypes.dm);// 代码的结构
int dmpos = 0;
fs.Position = 8;
secCounts = br.ReadInt32();
int fieldCounts = fxjFileStruct.fields.GetLength(0);
bool hasCode = false;
for (int i = 0; i < secCounts && hasCode == false; i++)
{
dmpos = fxjdmStruct.startAddress + i * fxjdmStruct.recordSize;
fs.Position = dmpos;
code0 = System.Text.Encoding.Default.GetString(br.ReadBytes(10));
code0 = code0.Replace("\0", "");
code0 = code0.Replace("HKHK", "HK"); //香港证券代码本身保存为HKxxxx
if (fxjdmStruct.codeIsLong == false && code == market + code0 || fxjdmStruct.codeIsLong == true && code == code0)
{
hasCode = true;
int iRecord = 0;
pos = fxjFileStruct.startAddress + i * fxjFileStruct.blockSize + iRecord * fxjFileStruct.recordSize;
fs.Position = pos;
string[] record = new string[fieldCounts];
for (int iField = 0; iField < fieldCounts; iField++)
{
fs.Position = pos + Convert.ToInt64(fxjFileStruct.fields[iField, 5]);
switch (fxjFileStruct.fields[iField, 2].ToLower())
{
case "code":
record[iField] = code;
break;
case "date":
intField = br.ReadInt32();
record[iField] = (intField == 0 ? "" : (date19700101.AddDays(intField / 86400)).ToString("yyyy-MM-dd"));
break;
case "datetime":
intField = br.ReadInt32();
record[iField] = (intField == 0 ? "" : (date19700101.AddSeconds(intField)).ToString("yyyy-MM-dd HH:mm:ss"));
break;
case "int":
intField = br.ReadInt32();
record[iField] = intField.ToString("D");
break;
case "single":
floatField = br.ReadSingle();
if (fxjFileStruct.fields[iField, 6].ToUpper() == "A") floatField *= 100;
record[iField] = Math.Round(floatField, 2).ToString("F");
break;
case "double":
doubleField = br.ReadDouble();
record[iField] = Math.Round(doubleField, 2).ToString("F");
break;
case "string":
record[iField] = System.Text.Encoding.Default.GetString(br.ReadBytes(Convert.ToInt32(fxjFileStruct.fields[iField, 3]))).Replace("\0", "");
break;
}

}
recordList.Add(record);
}

}

//fs.Close();
string[,] records = new string[recordList.Count, fieldCounts];
for (int i = 0; i < recordList.Count; i++)
{
string[] record0 = (string[])recordList[i];
for (int j = 0; j < fieldCounts; j++)
{
records[i, j] = record0[j];
}
}
if (records.GetLength(0) == 0) msg = "没有读到数据!";
return records;
}
catch (Exception e)
{
msg = e.Message;
}
#endregion
break;
case DataTypes.hqmb:
#region 处理Report.DAT数据(结构类似DAY.DAT,但有些数值需要进一步计算而来)
try
{
this.checkFileStream(FxjFile);
int secCounts = 0;//文件中证券总数
string code0 = "";
len = fs.Length;
fs.Position = 12;
secCounts = br.ReadInt32();
bool codeRead = false;
for (int i = 0; i < secCounts && codeRead==false; i++)
{
pos = 24 + 64 * i;
if (pos <= len)
{
fs.Position = pos;
//code0 = new string(br.ReadChars(10));//分析家用10个字节保存代码,一般用8个字节
code0 = System.Text.Encoding.Default.GetString(br.ReadBytes(10));
code0 = code0.Replace("\0", "");
code0 = code0.Replace("HKHK", "HK"); //香港证券代码本身保存为HKxxxx
if (fxjFileStruct.codeIsLong == false && code == market + code0 || fxjFileStruct.codeIsLong == true && code == code0)
{
recordCounts = br.ReadInt32();
for (int j = 0; j < 25; j++)
{
blocks[j] = br.ReadInt16();
}
codeRead = true;
}
}
}
int iRecord = 1;//记录
int iBlock = 0;//第iBlock块
int fieldCounts = fxjFileStruct.fields.GetLength(0);
while (iBlock < 25 && blocks[iBlock] != -1)
{
int r = 0;
while (iRecord < recordCounts + 1 && r < fxjFileStruct.blockSize / fxjFileStruct.recordSize) //16=3776/236
{
string[] record = new string[fieldCounts];
pos = fxjFileStruct.startAddress + blocks[iBlock] * fxjFileStruct.blockSize + r * fxjFileStruct.recordSize;
for (int iField = 0; iField < fieldCounts; iField++)
{
fs.Position = pos + Convert.ToInt64(fxjFileStruct.fields[iField, 5]);
switch (fxjFileStruct.fields[iField, 0].ToLower()) //这里与读取DAY.DAT用法不同,判断的是代码而不是类型
{
case "dm":
record[iField] = code;
break;
case "rq":
intField = br.ReadInt32();
record[iField] = (intField == 0 ? "" : (date19700101.AddSeconds(intField)).ToString("yyyy-MM-dd HH:mm:ss"));
break;
case "zjcj":
case "zss":
case "je":
floatField = br.ReadSingle();
record[iField] = floatField.ToString("_jj_qz".IndexOf(this.GetCodeType(code)) > 0 ? "F3" : "F");
break;
case "mr1sl":
case "mr2sl":
case "mr3sl":
case "mc1sl":
case "mc2sl":
case "mc3sl":
record[iField] = br.ReadUInt16().ToString("D");
break;
case "mr1jg":
case "mr2jg":
case "mr3jg":
case "mc1jg":
case "mc2jg":
case "mc3jg":
float jg=br.ReadSByte();
if ("_jj_qz".IndexOf(this.GetCodeType(code)) > 0)
{
jg = Convert.ToSingle(record[2]) + jg / 1000;
record[iField] = jg.ToString("F3");
}
else
{
jg = Convert.ToSingle(record[2]) + jg / 100;
record[iField] = jg.ToString("F");
}
break;
case "xss":
record[iField] = "";//现手数在下面计算
break;
case "mm":
int mm = br.ReadSByte();
record[iField] = "";
if (mm == -128) record[iField] = "内盘"; //-128 = 0x80
if (mm == -64) record[iField] = "外盘"; //-64 = 0xC0
break;
}

}


recordList.Add(record);

r = r + 1;
iRecord = iRecord + 1;
}
iBlock = iBlock + 1;
}

//fs.Close();
float zssSaved = 0;
string[,] records = new string[recordList.Count, fieldCounts];
for (int i = 0; i < recordList.Count; i++)
{
string[] record0 = (string[])recordList[i];
for (int j = 0; j < fieldCounts; j++)
{
if (j == 5) //现手数
{
record0[j]= (Convert.ToSingle(record0[3]) - zssSaved).ToString();
zssSaved = Convert.ToSingle(record0[3]);
}
records[i, j] = record0[j];
}
}
if (records.GetLength(0) == 0) msg = "没有读到数据!";
return records;
}
catch (Exception e)
{
msg = e.Message;
}
#endregion
break;
}

}
msg = "返回空数组。";
return new string[1, 1] { { null } };

}
private string[,] GetBK(string code)//板块定义数据
{
msg = "";
fileStruct fxjFileStruct = new fileStruct(DataTypes.bk);
if (code == null) code = "";
code = code.Trim().ToUpper();
ArrayList recordList = new ArrayList();
if (this.FxjDataPath == "")
{
msg = @"无法在注册表中到分析家数据文件目录,请自行将属性 FxjDataPath设置为有效路径,如c:\fxj\data\。";
return new string[1, 1] { { null } };
}
string FxjBlockPath = fxjDataPath;
FxjBlockPath = FxjBlockPath.ToUpper().Replace("\\DATA\\", "\\USERDATA\\BLOCK\\") ; //假设目录中含有data文字
string FxjFile = FxjBlockPath + fxjFileStruct.fileName;

msg = "";
if (!File.Exists(FxjFile))
{
msg = "板块文件无法找到。";
return new string[1, 1] { { null } };
}
try
{
this.checkFileStream(FxjFile);
string bklines="";string lb="";string bk="";
string bkFile = ""; string dmLines = ""; int n = -1;
bklines=System.Text.Encoding.Default.GetString(br.ReadBytes((int)fs.Length));
string[] bks = bklines.Replace("\r\n","\n").Split(new Char[] { ‘\n‘ });
for(int i =0 ; i<bks.Length;i++)
{
if (bks[i] != "")
{
bks[i] = bks[i].Trim();
if (bks[i].StartsWith("[") && bks[i].EndsWith("]"))
{
lb = bks[i].Replace("[","").Replace("]","");
}
else
{
bk = bks[i];
if (bk != "")
{
if (code == "" || (code!="" && bk.ToUpper()==code) )
{
bkFile = FxjBlockPath + bk + ".blk";
if (File.Exists(bkFile))
{
StreamReader bkReader = new StreamReader(bkFile);
bkReader.Read(); bkReader.Read();
dmLines = bkReader.ReadToEnd();
dmLines = dmLines.Replace("\x05", "\0").Replace("\0Z00", "\0\0\0\0").Replace("\0\0\0\0", ",");
string[] dms = dmLines.Split(‘,‘);
string[,] record = new string[dms.Length, 3];
for (int r = 0; r < dms.Length; r++)
{
if (dms[r] != "")
{
n = n + 1;
record[r, 0] = lb;
record[r, 1] = bk;
record[r, 2] = dms[r];
}
}
recordList.Add(record);
}
}
}
}
}
}
//fs.Close();
if (n > 0)
{
string[,] records = new string[n+1, 3];
int rr = 0;
for (int i = 0; i < recordList.Count; i++)
{
string[,] record0 = (string[,])recordList[i];
for (int j = 0; j < record0.GetLength(0); j++)
{
if (record0[j, 0] != null && record0[j, 1] != null && record0[j,2]!=null)
{
records[rr, 0] = record0[j, 0];
records[rr, 1] = record0[j, 1];
records[rr, 2] = record0[j, 2];
rr = rr + 1;
}
}
}
if (records.GetLength(0) == 0) msg = "没有读到数据!";
return records;
}
}
catch (Exception e)
{
msg = e.Message;
}
return new string[1, 1] { { null } };

}
private string[,] GetPJ(string code)//评级数据
{
msg = "";
fileStruct fxjFileStruct = new fileStruct(DataTypes.pj);
code = code.Trim().ToUpper();
ArrayList recordList = new ArrayList();
if (this.FxjDataPath == "")
{
msg = @"无法在注册表中到分析家数据文件目录,请自行将属性 FxjDataPath设置为有效路径,如c:\fxj\data\。";
return new string[1, 1] { { null } };
}
string fxjSubPath = fxjDataPath;
fxjSubPath = fxjSubPath.ToUpper().Replace("\\DATA\\", "\\USERDATA\\SelfData\\"); //假设目录中含有data文字
string FxjFile = fxjSubPath + fxjFileStruct.fileName;

msg = "";
if (!File.Exists(FxjFile))
{
msg = fxjFileStruct.fileName +"无法找到。";
return new string[1, 1] { { null } };
}
try
{
this.checkFileStream(FxjFile);
int n = 0;
int pos =fxjFileStruct.startAddress + n * fxjFileStruct.recordSize;
fs.Position = pos;
while (br.PeekChar()!=-1)
{
string[] record = new string[3];
pos = fxjFileStruct.startAddress + n * fxjFileStruct.recordSize;
fs.Position = pos;
record[0]=System.Text.Encoding.Default.GetString(br.ReadBytes(8));//dm
if (code==""||(code!="" && code==record[0]))
{
fs.Position = pos+12;
record[2] = System.Text.Encoding.Default.GetString(br.ReadBytes(244));
record[1] = record[2].Substring(0,2).Trim();
record[2] = record[2].Replace("\0","").Trim();
if(record[0]!="") recordList.Add(record);
}
n = n + 1;
}
//fs.Close();
if (n > 0)
{
string[,] records = new string[recordList.Count, 3];
for (int i = 0; i < recordList.Count; i++)
{
string[] record0 = (string[])recordList[i];
if (record0[0] != null)
{
records[i, 0] = record0[0];
records[i, 1] = record0[1];
records[i, 2] = record0[2];
}
}
if (records.GetLength(0) == 0) msg = "没有读到数据!";
return records;
}
}
catch (Exception e)
{
msg = e.Message;
}
return new string[1, 1] { { null } };

}
private string[,] GetHqfq(DataTypes dataType, string code, string newFileName)//复权价格,分红再投资,向前复权法
{
FxjData fxj = new FxjData();
string[,] hq=fxj.GetData("hq", code, newFileName);
if (fxj.Error != 0 || hq.GetLength(1)<4 ) return new string[1, 1] { { null } };
string[,] x = new string[hq.GetLength(0),9];
string[,] cq = fxj.GetData("cq", code, newFileName);
string fmt = "_jj_qz".IndexOf(this.GetCodeType(code)) > 0 ? "F3" : "F";
if (fxj.Error != 0 || cq.GetLength(1) < 4 || cq.GetLength(0)==0) //没有除权信息
{
for (int i = 0; i < hq.GetLength(0); i++)
{
for (int j = 0; j < hq.GetLength(1); j++)
{
x[i, j] = hq[i, j];
}
if (i == 0)
{
x[i, hq.GetLength(1)] = "0.00000";
}
else
{
x[i, hq.GetLength(1)] = (Single.Parse(hq[i, 5]) / Single.Parse(hq[i - 1, 5]) - 1).ToString("0.00000");
}
}
}
else //有除权信息
{
DateTime[] cqdt = new DateTime[cq.GetLength(0)];
for (int j = 0; j < cq.GetLength(0); j++) cqdt[j] = new DateTime(int.Parse(cq[j, 1].Split(‘-‘)[0]), int.Parse(cq[j, 1].Split(‘-‘)[1]), int.Parse(cq[j, 1].Split(‘-‘)[2]));
int i0 = hq.GetLength(0) - 1;
DateTime hqdt_1,hqdt;
double kp_1,zg_1,zd_1,sp_1,kp,zg,zd,sp,kpx,zgx,zdx,spx,sgbl,kpsyl,zgsyl,zdsyl,spsyl, pgbl, pgjg, fh;
for (int k = 0; k < 8; k++) x[i0, k] = hq[i0, k]; //最后一条记录
x[0, 8] = "0.00000";
kpx = double.Parse(x[i0, 2]);
zgx = double.Parse(x[i0, 3]);
zdx = double.Parse(x[i0, 4]);
spx = double.Parse(x[i0, 5]);
for (int i = i0; i > 0; i--)
{
sgbl = 0; pgbl = 0; pgjg = 0; fh = 0;
hqdt_1 = new DateTime(int.Parse(hq[i - 1, 1].Split(‘-‘)[0]), int.Parse(hq[i - 1, 1].Split(‘-‘)[1]), int.Parse(hq[i - 1, 1].Split(‘-‘)[2]));
hqdt = new DateTime(int.Parse(hq[i, 1].Split(‘-‘)[0]), int.Parse(hq[i, 1].Split(‘-‘)[1]), int.Parse(hq[i, 1].Split(‘-‘)[2]));
for (int j = 0; j < cq.GetLength(0); j++)
{
if (hqdt_1 < cqdt[j] && cqdt[j] <= hqdt)
{
sgbl = double.Parse(cq[j, 2]);
pgbl = double.Parse(cq[j, 3]);
pgjg = double.Parse(cq[j, 4]);
fh = double.Parse(cq[j, 5]);
}
}
x[i-1, 0] = hq[i-1, 0];//dm
x[i-1, 1] = hq[i-1, 1];//rq
//syl=1+第t日收益率 =( t日收盘价*(1+送股比例+配股比例)+分红金额-配股价格*配股比例)/(t-1日收盘价)
kp = double.Parse(hq[i, 2]);
zg = double.Parse(hq[i, 3]);
zd = double.Parse(hq[i, 4]);
sp = double.Parse(hq[i, 5]);
kp_1 = double.Parse(hq[i-1, 2]);
zg_1 = double.Parse(hq[i-1, 3]);
zd_1 = double.Parse(hq[i-1, 4]);
sp_1 = double.Parse(hq[i-1, 5]);
kpsyl = (kp * (1 + sgbl + pgbl) + fh - pgjg * pgbl) / kp_1;
zgsyl = (zg * (1 + sgbl + pgbl) + fh - pgjg * pgbl) / zg_1;
zdsyl = (zd * (1 + sgbl + pgbl) + fh - pgjg * pgbl) / zd_1;
spsyl = (sp * (1 + sgbl + pgbl) + fh - pgjg * pgbl) / sp_1;
kpx = kpx / kpsyl;
zgx = zgx / zgsyl;
zdx = zdx / zdsyl;
spx = spx / spsyl;
x[i - 1, 2] = kpx.ToString(fmt);
x[i - 1, 3] = zgx.ToString(fmt);
x[i - 1, 4] = zdx.ToString(fmt);
x[i - 1, 5] = spx.ToString(fmt);
x[i - 1, 6] = hq[i - 1, 6];//sl 成交量未复权
x[i - 1, 7] = hq[i - 1, 7];//je
x[i, 8] = (spsyl - 1).ToString("0.00000");//spsyl 收盘价收益率

}

}

return x;

}
}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多