分级基金折溢价WinForm网络计算器

通过子/母基金代码,从 [ 东方财富网,天天基金网,新浪 ] 抓取分级基金的子母基金数据(代码,名称,净值,价格),

并计算出子基金(A基金,B基金)以及母基金的溢价率与折价率,

便于投资/投机客从中套利。

数据通过网站获取,使用基金净值,非估值,一般晚间网站会更新当天基金净值,不可用于实时计算。

------

效果图:

----

代码:

1.窗体如效果图

2.常用变量与数据抓取代码:

 namespace fundGetAndCal
{
public static class CONST
{
//获取母子基金代码
public static string fundF10Url = "http://fund.eastmoney.com/f10/jbgk_{%fundCode%}.html";
//获取净值
public static string fundValUrl = "http://fund.eastmoney.com/{%fundCode%}.html";
//获取价格
public static string fundPriceUrl = "http://hq.sinajs.cn/?list={%fundAllCode%}";
//母子基金列表
public static List<string[]> allFunCodeLst;
//读取完了
public static bool okFlg = false;
//状态显示文字
public static string show = "就绪";
public static int barMax = ;
public static int barNow = ; public static string GetHtml(string url, Encoding encode)
{
string strBuff = "";//定义文本字符串,用来保存下载的html
try
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
//若成功取得网页的内容,则以System.IO.Stream形式返回,若失败则产生ProtoclViolationException错 误。在此正确的做法应将以下的代码放到一个try块中处理。这里简单处理
Stream reader = webResponse.GetResponseStream();
///返回的内容是Stream形式的,所以可以利用StreamReader类获取GetResponseStream的内容,并以StreamReader类的Read方法依次读取网页源程序代码每一行的内容,直至行尾(读取的编码格式:UTF8)
StreamReader respStreamReader = new StreamReader(reader,/*Encoding.UTF8*/encode); strBuff = respStreamReader.ReadToEnd();
}
catch (Exception e)
{
Console.Write(url+"\n"+e.Message);
}
return strBuff;
}
}
}

3.窗体按钮等事件代码:

 namespace fundGetAndCal
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
getFundCode();
}
private void btnFundCodeRead_Click(object sender, EventArgs e)
{
getFundCode();
}
private void getFundCode()
{
string waitFuncCodes = ConfigurationManager.AppSettings.Get("fundCode");
waitFuncCodes = waitFuncCodes.Replace(",", "\r\n");
fundCodeLst.Text = waitFuncCodes;
}
private string delStr(string org, string other)
{
if (!other.Equals(""))
org = org.Replace(other, "");
return Regex.Replace(org, @"<.*?>", "");
}
private void btnStart_Click(object sender, EventArgs e)
{
Thread thread = new Thread(getData);
thread.IsBackground = true;
CONST.barMax = ;
CONST.barNow = ; btnStart.Enabled = false;
btnStop.Enabled = true;
CONST.okFlg = false; thread.Start();
timer1.Start();
} private void getData()
{
/// 提取母子基金代码 // 提取母基金正则
Regex regMJJ = new Regex(@"母子基金.*?<\/td>");
// 提取基金净值正则
Regex regJZ = new Regex(@"<span class=\'left12\'>.*?<\/span>");
// 提取基金名称正则
Regex regMC = new Regex(@"<title.*?<\/title>");
string[] fcl = fundCodeLst.Text.Replace("\r\n", ",").Split(',');
List<string[]> allFCLst = new List<string[]>();
List<string> geted = new List<string>(); foreach (string fc in fcl)
{
CONST.show = "开始获取[" + fc + "]子母基金代码";
if (geted.Contains(fc.Substring(, fc.Length - )))
continue;
string html = CONST.GetHtml(CONST.fundF10Url.Replace("{%fundCode%}", fc.Substring(, fc.Length - )), Encoding.GetEncoding("gb2312")); var result = regMJJ.Match(html).Groups;
if (result.Count > )
{
// 1-3 代码,4-6 净值 7-9 价格 10 sz/ss 11-13 名称
string[] allFC = new string[] { "", "", "", "", "", "", "", "", "", "", "", "", "" };
var r = delStr(result[].Value, "母子基金");
string[] t1 = Regex.Split(r, "(母)", RegexOptions.IgnoreCase);
geted.Add(t1[]);
allFC[] = t1[];
if (t1.Length > )
{
string[] t2 = t1[].Split(' ');
for (int i = ; i < t2.Length; i++)
{
geted.Add(t2[i].Replace("(子)", ""));
allFC[i + ] = t2[i].Replace("(子)", "");
}
if (t2.Length == )
{
allFC[] = fc.Substring(, );
allFCLst.Add(allFC);
}
}
}
//Thread.Sleep(1000);
}
CONST.barNow = CONST.barNow + (int)Math.Floor((decimal)CONST.barMax / );
CONST.allFunCodeLst = allFCLst; // 获取净值,名称
foreach (string[] allFC in CONST.allFunCodeLst)
{
for (int i = ; i < ; i++)
{
CONST.show = "开始获取[" + allFC[i] + "]净值与名称";
string html = CONST.GetHtml(CONST.fundValUrl.Replace("{%fundCode%}", allFC[i]), Encoding.GetEncoding("gb2312")); var result = regJZ.Match(html).Groups;
if (result.Count > )
{
allFC[ + i] = delStr(result[].Value, "");
}
result = regMC.Match(html).Groups;
string[] a = delStr(result[].Value, "").Split('(');
if (a.Length > )
{
allFC[ + i] = a[];
} //Thread.Sleep(1000);
}
}
CONST.barNow = CONST.barNow + (int)Math.Floor((decimal)CONST.barMax / ); // 获取价格
foreach (string[] allFC in CONST.allFunCodeLst)
{
for (int i = ; i < ; i++)
{
CONST.show = "开始获取[" + allFC[i] + "]价格";
string html = CONST.GetHtml(CONST.fundPriceUrl.Replace("{%fundAllCode%}", allFC[] + allFC[i]), Encoding.GetEncoding("gb2312")); string[] result = html.Split(',');
if (result.Length > )
{
allFC[ + i] = result[];
}
//Thread.Sleep(1000);
}
}
CONST.barNow = CONST.barNow + (int)Math.Floor((decimal)CONST.barMax / );
CONST.okFlg = true; } private void timer1_Tick(object sender, EventArgs e)
{
if (CONST.okFlg)
{
CONST.show = "开始获取计算溢折价,并输出";
// 计算A,B基金溢折价,母基金溢折价
dataGridView1.Rows.Clear();
dataGridView1.Columns.Clear();
dataGridView1.Columns.Add("code1", "母代码");
dataGridView1.Columns.Add("name1", "母名称");
dataGridView1.Columns.Add("val1", "母净值");
dataGridView1.Columns.Add("yzj1", "母溢折价");
dataGridView1.Columns.Add("code2", "A代码");
dataGridView1.Columns.Add("name2", "A名称");
dataGridView1.Columns.Add("val2", "A净值");
dataGridView1.Columns.Add("price2", "A价格");
dataGridView1.Columns.Add("yzj2", "A溢折价");
dataGridView1.Columns.Add("code3", "B代码");
dataGridView1.Columns.Add("name3", "B名称");
dataGridView1.Columns.Add("val3", "B净值");
dataGridView1.Columns.Add("price3", "B价格");
dataGridView1.Columns.Add("yzj3", "B溢折价");
foreach (string[] allFC in CONST.allFunCodeLst)
{
DataGridViewRow dgvr = new DataGridViewRow();
dataGridView1.Rows.Add(dgvr);
dgvr = dataGridView1.Rows[dataGridView1.Rows.Count - ];
dgvr.Cells["code1"].Value = allFC[];
dgvr.Cells["code2"].Value = allFC[];
dgvr.Cells["code3"].Value = allFC[];
dgvr.Cells["name1"].Value = allFC[];
dgvr.Cells["name2"].Value = allFC[];
dgvr.Cells["name3"].Value = allFC[];
dgvr.Cells["val1"].Value = allFC[];
dgvr.Cells["val2"].Value = allFC[];
dgvr.Cells["val3"].Value = allFC[];
dgvr.Cells["price2"].Value = allFC[];
dgvr.Cells["price3"].Value = allFC[];
if (allFC[] != "" && allFC[] != "")
{
dgvr.Cells["yzj1"].Value = Math.Round((
(double.Parse(allFC[]) + double.Parse(allFC[])) * 0.5 - double.Parse(allFC[])) / double.Parse(allFC[]) * , ) + "%"; ;
dgvr.Cells["yzj2"].Value = Math.Round((double.Parse(allFC[]) - double.Parse(allFC[])) / double.Parse(allFC[]) * , ) + "%";
dgvr.Cells["yzj3"].Value = Math.Round((double.Parse(allFC[]) - double.Parse(allFC[])) / double.Parse(allFC[]) * , ) + "%"; if (dgvr.Cells["yzj1"].Value.ToString().StartsWith("-"))
{
dgvr.Cells["yzj1"].Style.ForeColor = Color.Green;
}
else
{
dgvr.Cells["yzj1"].Style.ForeColor = Color.Red;
}
if (dgvr.Cells["yzj2"].Value.ToString().StartsWith("-"))
{
dgvr.Cells["yzj2"].Style.ForeColor = Color.Green;
}
else
{
dgvr.Cells["yzj2"].Style.ForeColor = Color.Red;
}
if (dgvr.Cells["yzj3"].Value.ToString().StartsWith("-"))
{
dgvr.Cells["yzj3"].Style.ForeColor = Color.Green;
}
else
{
dgvr.Cells["yzj3"].Style.ForeColor = Color.Red;
}
}
}
StatusLabel.Text = "就绪";
ProgressBar.Value = CONST.barMax;
CONST.okFlg = false;
timer1.Stop();
btnStart.Enabled = true;
btnStop.Enabled = false;
}
else
{
StatusLabel.Text = CONST.show;
ProgressBar.Maximum = CONST.barMax;
ProgressBar.Value = CONST.barNow > CONST.barMax ? CONST.barMax : CONST.barNow;
}
} private void btnFundCodeSave_Click(object sender, EventArgs e)
{
// 写入参数设置
string fundCode = fundCodeLst.Text.Replace("\r\n", ",");
Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
configuration.AppSettings.Settings["fundCode"].Value = fundCode;
configuration.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
MessageBox.Show("保存成功");
} private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
if (e.Column.HeaderText.EndsWith("溢折价"))
{
// 按数字排序
if (e.CellValue1 == null || "".equals(e.CellValue1))//附件此处有错
{
e.SortResult = -1;//附件此处有错
}
else if (e.CellValue2 == null || "".equals(e.CellValue2))//附件此处有错
{
e.SortResult = ;//附件此处有错
}
else
{
e.SortResult = double.Parse(e.CellValue1.ToString().Replace("%", "")) - double.Parse(e.CellValue1.ToString().Replace("%", "")) > ? : double.Parse(e.CellValue1.ToString().Replace("%", "")) - double.Parse(e.CellValue1.ToString().Replace("%", "")) < ? -1 : ;//附件此处有错
}
}
else
{
// 按字符串排序
e.SortResult = String.Compare(Convert.ToString(e.CellValue1), Convert.ToString(e.CellValue2));
}e.Handled = true;//附件此处有错,如此才能反映到winform上去
}
}
}

---

源码及程序下载地址:

http://download.csdn.net/detail/wangxsh42/8754241

[原][C#][winForm]分级基金折溢价WinForm网络计算器的更多相关文章

  1. winform 窗体最大化 分类: WinForm 2014-07-17 15:57 215人阅读 评论(0) 收藏

    1:窗体首次加载时最大化 (1):主窗体 this.WindowState = FormWindowState.Maximized; //窗体显示中间部分,不显示窗体名称和最小化.最大化.关闭按钮   ...

  2. {VS2010C#}{WinForm}{ActiveX}VS2010C#开发基于WinForm的ActiveX控件

    在VS2010中使用C#开发基于WinForm的ActiveX控件 常见的一些ActiveX大部分是使用VB.Delphi.C++开发,使用C#开发ActiveX要解决下面三个问题: 使.NET组件可 ...

  3. 关于WinForm引用WPF窗体---在Winform窗体中使用WPF控件

    项目中有个界面展示用WPF实现起来比较简单,并且能提供更酷炫的效果,但是在WinForm中使用WPF窗体出现了问题,在网上找了一下有些人说Winform不能引用WPF的窗体,我就很纳闷,Win32都能 ...

  4. winform 曲线(贝塞尔) 分类: WinForm 2014-12-29 16:52 109人阅读 评论(0) 收藏

    <span style="font-size:14px;">//覆盖OnPaint事件</span> <span style="font-s ...

  5. winform 猜猜看 分类: WinForm 2014-08-21 14:12 267人阅读 评论(0) 收藏

    说明: 1>窗体应用程序. 2>一个窗体(Form1),一个按钮(btnStart),一个文本(labTime) 3>截图: 4>代码如下: using System; usi ...

  6. winform 播放声音方式 分类: WinForm 2014-07-25 14:16 194人阅读 评论(0) 收藏

    声音文件folder.wav放置在bin目录下debug下 1.通过API调用 [c-sharp] view plaincopy using System.Runtime.InteropService ...

  7. winform 加密 解密 分类: WinForm 2014-05-16 15:05 400人阅读 评论(0) 收藏

    界面显示: 加密: 解密: 代码实现: public string EncryptString(string str)         {             #region 加密程序       ...

  8. winform 导出TXT 分类: WinForm 2014-05-15 15:29 128人阅读 评论(0) 收藏

    截图: 代码实现:(导出txt按钮事件) using System.IO; using System.Data.OleDb; private void btnOutTxt_Click(object s ...

  9. Winform安装包出现无法访问网络位置

    1.原因:安装包的安装路径出现了问题 2.如下图:错误路径 3.如下图:正确路径

随机推荐

  1. 将数据从MySQL迁移到Oracle的注意事项

    将数据从MySQL迁移到Oracle的注意事项1.自动增长的数据类型处理MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值.ORACLE没有自动增长的数据类型,需要建立一个自动 ...

  2. rabbitMQ第五篇:Spring集成RabbitMQ

    前面几篇讲解了如何使用rabbitMq,这一篇主要讲解spring集成rabbitmq. 首先引入配置文件org.springframework.amqp,如下 <dependency> ...

  3. SSIS Design7:数据类型的选择

    对于SSIS的数据类型,容易遗漏精度的是DateTime,不正确的使用DateTime,time,decimal 等数据类型,可能导致溢出或数据丢失. 1,Variable 和 Parameter的D ...

  4. .NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化

             所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 微软Infer.NET机器学习组件:http://www.cnblo ...

  5. 爬虫技术 -- 进阶学习(十一)【补充】获取html中meta标签中的content的内容

    上一篇网易新闻页面信息抓取 -- htmlagilitypack搭配scrapysharp中提及了很多如何快速抓取html中的文本的语句, 但是meta标签中的content内容的抓取,没有提及到! ...

  6. 分享一段数据库中表数据更新SQL

    应用场景 我们在应用程序开发的时候,经常会遇到这样的一种情况:附属表更新了,主表的数据没有更新,这个关联表不只是外键的关联(通过附属表 ID 关联),主表中还会存在一些附属表的字段,这样一般做的目的是 ...

  7. 史上最详细的iOS之事件的传递和响应机制

    前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事件的处理)->找到最合适的view后 ...

  8. 【Android】《App研发录》总结

    说明 看这本书的时候,总感觉怪怪的. 因为在地铁上看完的,作者书中基本都是他自己工作中遇到的问题和坑,虽说这样会让人感觉找到了解决方案,可以再进行深入的研究,可是某些地方介绍的有点片面,仅仅是引用部分 ...

  9. 原来css中的border还可以这样玩

    原来css中的border还可以这样玩 前面的话: 在看这篇文章之前你可能会觉得border只是简单的绘制边框,看了这篇文章,我相信你也会跟我一样说一句"我靠,原来css中的border还可 ...

  10. 关于C#的继承结论

    1.继承:继承是一个类可以使用另一个类的属性和方法(成员) 2.子类继承父类使用的符号为“  : ”(冒号) 3.子类可以继承父类私有成员,但不能访问(不能使用) 4.父类的构造,子类不能被继承 5. ...