[原][C#][winForm]分级基金折溢价WinForm网络计算器

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

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

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

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

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

------

效果图:

----

代码:

1.窗体如效果图

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

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

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

  1 namespace fundGetAndCal
  2 {
  3     public partial class Form1 : Form
  4     {
  5         public Form1()
  6         {
  7             InitializeComponent();
  8         }
  9
 10         private void Form1_Load(object sender, EventArgs e)
 11         {
 12             getFundCode();
 13         }
 14         private void btnFundCodeRead_Click(object sender, EventArgs e)
 15         {
 16             getFundCode();
 17         }
 18         private void getFundCode()
 19         {
 20             string waitFuncCodes = ConfigurationManager.AppSettings.Get("fundCode");
 21             waitFuncCodes = waitFuncCodes.Replace(",", "\r\n");
 22             fundCodeLst.Text = waitFuncCodes;
 23         }
 24         private string delStr(string org, string other)
 25         {
 26             if (!other.Equals(""))
 27                 org = org.Replace(other, "");
 28             return Regex.Replace(org, @"<.*?>", "");
 29         }
 30         private void btnStart_Click(object sender, EventArgs e)
 31         {
 32             Thread thread = new Thread(getData);
 33             thread.IsBackground = true;
 34             CONST.barMax = 100;
 35             CONST.barNow = 0;
 36
 37             btnStart.Enabled = false;
 38             btnStop.Enabled = true;
 39             CONST.okFlg = false;
 40
 41             thread.Start();
 42             timer1.Start();
 43         }
 44
 45         private void getData()
 46         {
 47             /// 提取母子基金代码
 48
 49             // 提取母基金正则
 50             Regex regMJJ = new Regex(@"母子基金.*?<\/td>");
 51             // 提取基金净值正则
 52             Regex regJZ = new Regex(@"<span class=\‘left12\‘>.*?<\/span>");
 53             // 提取基金名称正则
 54             Regex regMC = new Regex(@"<title.*?<\/title>");
 55             string[] fcl = fundCodeLst.Text.Replace("\r\n", ",").Split(‘,‘);
 56             List<string[]> allFCLst = new List<string[]>();
 57             List<string> geted = new List<string>();
 58
 59             foreach (string fc in fcl)
 60             {
 61                 CONST.show = "开始获取[" + fc + "]子母基金代码";
 62                 if (geted.Contains(fc.Substring(2, fc.Length - 2)))
 63                     continue;
 64                 string html = CONST.GetHtml(CONST.fundF10Url.Replace("{%fundCode%}", fc.Substring(2, fc.Length - 2)), Encoding.GetEncoding("gb2312"));
 65
 66                 var result = regMJJ.Match(html).Groups;
 67                 if (result.Count > 0)
 68                 {
 69                     // 1-3 代码,4-6 净值 7-9 价格 10 sz/ss 11-13 名称
 70                     string[] allFC = new string[13] { "", "", "", "", "", "", "", "", "", "", "", "", "" };
 71                     var r = delStr(result[0].Value, "母子基金");
 72                     string[] t1 = Regex.Split(r, "(母)", RegexOptions.IgnoreCase);
 73                     geted.Add(t1[0]);
 74                     allFC[0] = t1[0];
 75                     if (t1.Length > 1)
 76                     {
 77                         string[] t2 = t1[1].Split(‘ ‘);
 78                         for (int i = 0; i < t2.Length; i++)
 79                         {
 80                             geted.Add(t2[i].Replace("(子)", ""));
 81                             allFC[i + 1] = t2[i].Replace("(子)", "");
 82                         }
 83                         if (t2.Length == 2)
 84                         {
 85                             allFC[9] = fc.Substring(0, 2);
 86                             allFCLst.Add(allFC);
 87                         }
 88                     }
 89                 }
 90                 //Thread.Sleep(1000);
 91             }
 92             CONST.barNow = CONST.barNow + (int)Math.Floor((decimal)CONST.barMax / 3);
 93             CONST.allFunCodeLst = allFCLst;
 94
 95             // 获取净值,名称
 96             foreach (string[] allFC in CONST.allFunCodeLst)
 97             {
 98                 for (int i = 0; i < 3; i++)
 99                 {
100                     CONST.show = "开始获取[" + allFC[i] + "]净值与名称";
101                     string html = CONST.GetHtml(CONST.fundValUrl.Replace("{%fundCode%}", allFC[i]), Encoding.GetEncoding("gb2312"));
102
103                     var result = regJZ.Match(html).Groups;
104                     if (result.Count > 0)
105                     {
106                         allFC[3 + i] = delStr(result[0].Value, "");
107                     }
108                     result = regMC.Match(html).Groups;
109                     string[] a = delStr(result[0].Value, "").Split(‘(‘);
110                     if (a.Length > 0)
111                     {
112                         allFC[10 + i] = a[0];
113                     }
114
115                     //Thread.Sleep(1000);
116                 }
117             }
118             CONST.barNow = CONST.barNow + (int)Math.Floor((decimal)CONST.barMax / 3);
119
120             // 获取价格
121             foreach (string[] allFC in CONST.allFunCodeLst)
122             {
123                 for (int i = 1; i < 3; i++)
124                 {
125                     CONST.show = "开始获取[" + allFC[i] + "]价格";
126                     string html = CONST.GetHtml(CONST.fundPriceUrl.Replace("{%fundAllCode%}", allFC[9] + allFC[i]), Encoding.GetEncoding("gb2312"));
127
128                     string[] result = html.Split(‘,‘);
129                     if (result.Length > 4)
130                     {
131                         allFC[6 + i] = result[3];
132                     }
133                     //Thread.Sleep(1000);
134                 }
135             }
136             CONST.barNow = CONST.barNow + (int)Math.Floor((decimal)CONST.barMax / 3);
137             CONST.okFlg = true;
138
139         }
140
141         private void timer1_Tick(object sender, EventArgs e)
142         {
143             if (CONST.okFlg)
144             {
145                 CONST.show = "开始获取计算溢折价,并输出";
146                 // 计算A,B基金溢折价,母基金溢折价
147                 dataGridView1.Rows.Clear();
148                 dataGridView1.Columns.Clear();
149                 dataGridView1.Columns.Add("code1", "母代码");
150                 dataGridView1.Columns.Add("name1", "母名称");
151                 dataGridView1.Columns.Add("val1", "母净值");
152                 dataGridView1.Columns.Add("yzj1", "母溢折价");
153                 dataGridView1.Columns.Add("code2", "A代码");
154                 dataGridView1.Columns.Add("name2", "A名称");
155                 dataGridView1.Columns.Add("val2", "A净值");
156                 dataGridView1.Columns.Add("price2", "A价格");
157                 dataGridView1.Columns.Add("yzj2", "A溢折价");
158                 dataGridView1.Columns.Add("code3", "B代码");
159                 dataGridView1.Columns.Add("name3", "B名称");
160                 dataGridView1.Columns.Add("val3", "B净值");
161                 dataGridView1.Columns.Add("price3", "B价格");
162                 dataGridView1.Columns.Add("yzj3", "B溢折价");
163                 foreach (string[] allFC in CONST.allFunCodeLst)
164                 {
165                     DataGridViewRow dgvr = new DataGridViewRow();
166                     dataGridView1.Rows.Add(dgvr);
167                     dgvr = dataGridView1.Rows[dataGridView1.Rows.Count - 1];
168                     dgvr.Cells["code1"].Value = allFC[0];
169                     dgvr.Cells["code2"].Value = allFC[1];
170                     dgvr.Cells["code3"].Value = allFC[2];
171                     dgvr.Cells["name1"].Value = allFC[10];
172                     dgvr.Cells["name2"].Value = allFC[11];
173                     dgvr.Cells["name3"].Value = allFC[12];
174                     dgvr.Cells["val1"].Value = allFC[3];
175                     dgvr.Cells["val2"].Value = allFC[4];
176                     dgvr.Cells["val3"].Value = allFC[5];
177                     dgvr.Cells["price2"].Value = allFC[7];
178                     dgvr.Cells["price3"].Value = allFC[8];
179                     if (allFC[7] != "" && allFC[8] != "")
180                     {
181                         dgvr.Cells["yzj1"].Value = Math.Round((
182                             (double.Parse(allFC[7]) + double.Parse(allFC[8])) * 0.5 - double.Parse(allFC[3])) / double.Parse(allFC[3]) * 100, 2) + "%"; ;
183                         dgvr.Cells["yzj2"].Value = Math.Round((double.Parse(allFC[7]) - double.Parse(allFC[4])) / double.Parse(allFC[4]) * 100, 2) + "%";
184                         dgvr.Cells["yzj3"].Value = Math.Round((double.Parse(allFC[8]) - double.Parse(allFC[5])) / double.Parse(allFC[5]) * 100, 2) + "%";
185
186                         if (dgvr.Cells["yzj1"].Value.ToString().StartsWith("-"))
187                         {
188                             dgvr.Cells["yzj1"].Style.ForeColor = Color.Green;
189                         }
190                         else
191                         {
192                             dgvr.Cells["yzj1"].Style.ForeColor = Color.Red;
193                         }
194                         if (dgvr.Cells["yzj2"].Value.ToString().StartsWith("-"))
195                         {
196                             dgvr.Cells["yzj2"].Style.ForeColor = Color.Green;
197                         }
198                         else
199                         {
200                             dgvr.Cells["yzj2"].Style.ForeColor = Color.Red;
201                         }
202                         if (dgvr.Cells["yzj3"].Value.ToString().StartsWith("-"))
203                         {
204                             dgvr.Cells["yzj3"].Style.ForeColor = Color.Green;
205                         }
206                         else
207                         {
208                             dgvr.Cells["yzj3"].Style.ForeColor = Color.Red;
209                         }
210                     }
211                 }
212                 StatusLabel.Text = "就绪";
213                 ProgressBar.Value = CONST.barMax;
214                 CONST.okFlg = false;
215                 timer1.Stop();
216                 btnStart.Enabled = true;
217                 btnStop.Enabled = false;
218             }
219             else
220             {
221                 StatusLabel.Text = CONST.show;
222                 ProgressBar.Maximum = CONST.barMax;
223                 ProgressBar.Value = CONST.barNow > CONST.barMax ? CONST.barMax : CONST.barNow;
224             }
225         }
226
227         private void btnFundCodeSave_Click(object sender, EventArgs e)
228         {
229             // 写入参数设置
230             string fundCode = fundCodeLst.Text.Replace("\r\n", ",");
231             Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
232             configuration.AppSettings.Settings["fundCode"].Value = fundCode;
233             configuration.Save(ConfigurationSaveMode.Modified);
234             ConfigurationManager.RefreshSection("appSettings");
235             MessageBox.Show("保存成功");
236         }
237
238         private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
239         {
240             if (e.Column.HeaderText.EndsWith("溢折价"))
241             {
242                 // 按数字排序
243                 if (e.CellValue1 == null)
244                 {
245                     e.SortResult = -1;//附件此处有错
246                 }
247                 else if (e.CellValue2 == null)
248                 {
249                     e.SortResult = 1;//附件此处有错
250                 }
251                 else
252                 {
253                     e.SortResult = double.Parse(e.CellValue1.ToString().Replace("%", "")) - double.Parse(e.CellValue1.ToString().Replace("%", "")) > 0 ? 1 : double.Parse(e.CellValue1.ToString().Replace("%", "")) - double.Parse(e.CellValue1.ToString().Replace("%", "")) < 0 ? -1 : 0;//附件此处有错
254                 }
255             }
256             else
257             {
258                 // 按字符串排序
259                 e.SortResult = String.Compare(Convert.ToString(e.CellValue1), Convert.ToString(e.CellValue2));
260             }e.Handled = true;//附件此处有错,如此才能反映到winform上去
261         }
262     }
263 }

---

源码及程序下载地址:

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

时间: 2024-11-06 10:36:40

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

详解分级基金(杠杆基金)【精华】 【转】

http://blog.sina.com.cn/s/blog_6cc9694701017m3c.html 分级基金又叫“结构型基金”,是指在一个投资组合下,通过对基金收益或净资产的分解,形成两级(或多级)风险收益表现有一定差异化基金份额的基金品种.它 的主要特点是将基金产品分为两类份额,并分别给予不同的收益分配.从目前已经成立和正在发行的分级基金来看,通常分为低风险收益端(优先份额)子基金和高 风险收益端(进取份额)子基金两类份额. 母基金净值与子基金净值的关系: 母基金净值=A类份额子基金净值

我国的分级基金都有哪些

目前我国国内基金市场总共有三只分级基金.这三只分级基金分别是瑞福分级.长盛同庆.瑞和分级. 三只分级基金在分级方式.杠杆机制.交易模式.份额比例等诸多方面存在差异,是根据客户不同的细分市场需求而创设的产品,可以满足不同投资人的需求. 一位长期玩转瑞福进取的投资人也表示,他购买带杠杆的基金,就是希望借助杠杆机制,在市场上涨过程中,能比普通基金赚得多,但以前的分级基金,是涨得快,跌得也多,瑞福进取.同庆B都有类似表现.如今瑞和分级基金通过全新的设计,能在面值以下进一步下跌时,卸掉杠杆,这种“助涨不助

经济--分级基金

风险性, 基督教  圣父,圣子,圣灵,三位一体 股票买卖要缴纳印花税. 开放式基金,申购赎回税. 分级  券商 多空分级基金. 做空工具. 儿童财商教育 分级基金篇. 低估值的蓝筹股 投资 要搞清,我对手是谁. 股市无专业,一家赢家,一家输家. 不要投资黄金. 很敏感的话题,散户到底能不能听消息炒股票? 根据技术分析炒股票靠不靠普 支持这个牛市的根本是什么? 如何看待创业板 如何看待这次牛市 这轮牛市还能持续多久呢? 用历年的事件来预测. 7.1号m 股市市值在GDP 1倍-1.5 倍 基本就会

光和热分级基金更好更快个割将格的电话

http://www.wenbing.cn/q2512050.htmlhttp://www.wenbing.cn/q2512049.htmlhttp://www.wenbing.cn/q2512051.htmlhttp://www.wenbing.cn/q2512052.htmlhttp://www.wenbing.cn/q2512053.htmlhttp://www.wenbing.cn/q2512054.htmlhttp://www.wenbing.cn/q2512055.htmlhttp:

Winform使用外部浏览器解决webbrowser问题

对于还是一个菜鸟的我,在最近自己接手了个项目,搞的自己也是醉了,身边也有没大神的现场指导,只能靠度娘和谷歌的大力帮助,要不然这么个小项目可定现在还交不了,不过在这过程种也确确实实学到了不少东西,我先说说在winform中嵌入浏览器的问题.在winform嵌入浏览器,其实winform中有自己的控件-----WebBrowser控件,对于这个控件的使用,大家可以点击WebBrowser查看很详细的介绍以及使用方法,但是我想说的使用这个控件传递参数或是使用ip访问我是不会的,要是大家有会的,还请告知

Winform中DockPanel(引用WeifenLuo.WinFormsUI.Docking.dll组件)的使用

WeiFenLuo.WinFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库,可实现像Visual Studio的窗口停靠.拖拽等功能.WeifenLuo.WinFormsUI.Docking是一个很强大的界面布局控件,可以保存自定义的布局为XML文件,可以加载XML配置文件.DockPanel中提供了几个可用的类,重要的有两个:DockPanel和DockContent.DockPanel是从Panel继承出来的,用于为可浮动的dock的子窗口提供进行浮动

Java进击C#——应用开发之WinForm开发

本章简言 上一章笔者介绍了关于WinForm环境.这一章笔者将继续讲WinForm.只不过更加的面向开发了.事实就是在学习工具箱里面的控件.对于WinForm开发来讲,企业对他的要求并没有那么高.但是如果是游戏相关的话,不好意思!笔者觉得你可能选错语言了.C++可能更合适你.有一点希望读者们明白.下列讲到的内容是笔者在开发用的.只能辅助你学习,却不能成为教材.上一章讲到WinForm开发就是JAVA的Awt和Swing编程.笔者在做Awt和Swing已经过去四年多了.如果记得没有错的话,在设计窗

NanUI for Winform 使用示例【第二集】——做一个所见即所得的Markdown编辑器

经过了这一个多星期的调整与修复,NanUI for .NET Winform的稳定版已经发布.应广大群友的要求,现已将NanUI的全部代码开源. GitHub: https://github.com/NetDimension/NanUI Release: https://github.com/NetDimension/NanUI/releases 这次发布的是一个相对稳定的版本,解决和改善了如下问题: 页面随机白屏问题(主要原因是GC自动回收后,造成内存地址不可读) NanUI编译版本改为.NE

十八、EnterpriseFrameWork框架核心类库之Winform控制器

回<[开源]EnterpriseFrameWork框架系列文章索引> EFW框架源代码下载:http://pan.baidu.com/s/1qWJjo3U EFW框架中的WinController控制器可以说是整个Winform版中最具有价值的地方,能够熟练使用它的话,可以让你写得代码结构清晰不知多少倍,真正的做到了CS开发的界面层与逻辑层的完全隔离:更重要的是改变了你写界面代码的思维,让你一次性写出功能完善的代码,真的,传统的那种事件驱动的方式编码会让你的代码变得越来越臃肿,就算你懂得不断重