分级基金折溢价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 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 + "]子母基金代码";
                 , fc.Length - )))
                     continue;
                 , fc.Length - )), Encoding.GetEncoding("gb2312"));

                 var result = regMJJ.Match(html).Groups;
                 )
                 {
                     // 1-3 代码,4-6 净值 7-9 价格 10 sz/ss 11-13 名称
                     ] { "", "", "", "", "", "", "", "", "", "", "", "", "" };
                     ].Value, "母子基金");
                     string[] t1 = Regex.Split(r, "(母)", RegexOptions.IgnoreCase);
                     geted.Add(t1[]);
                     allFC[] = t1[];
                     )
                     {
                         ].Split(' ');
                         ; i < t2.Length; i++)
                         {
                             geted.Add(t2[i].Replace("(子)", ""));
                             allFC[i + ] = t2[i].Replace("(子)", "");
                         }
                         )
                         {
                             allFC[] = fc.Substring(, );
                             allFCLst.Add(allFC);
                         }
                     }
                 }
                 //Thread.Sleep(1000);
             }
             CONST.barNow = CONST.barNow + ();
             CONST.allFunCodeLst = allFCLst;

             // 获取净值,名称
             foreach (string[] allFC in CONST.allFunCodeLst)
             {
                 ; 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;
                     )
                     {
                         allFC[ + i] = delStr(result[].Value, "");
                     }
                     result = regMC.Match(html).Groups;
                     ].Value, "").Split('(');
                     )
                     {
                         allFC[ + i] = a[];
                     }

                     //Thread.Sleep(1000);
                 }
             }
             CONST.barNow = CONST.barNow + ();

             // 获取价格
             foreach (string[] allFC in CONST.allFunCodeLst)
             {
                 ; i < ; i++)
                 {
                     CONST.show = "开始获取[" + allFC[i] + "]价格";
                     ] + allFC[i]), Encoding.GetEncoding("gb2312"));

                     string[] result = html.Split(',');
                     )
                     {
                         allFC[ + i] = result[];
                     }
                     //Thread.Sleep(1000);
                 }
             }
             CONST.barNow = CONST.barNow + ();
             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[];
                     dgvr.Cells[];
                     dgvr.Cells[];
                     dgvr.Cells[];
                     dgvr.Cells[];
                     dgvr.Cells[];
                     dgvr.Cells[];
                     dgvr.Cells[];
                     dgvr.Cells[];
                     dgvr.Cells[];
                     dgvr.Cells[];
                     ] != ] != "")
                     {
                         dgvr.Cells["yzj1"].Value = Math.Round((
                             (]) + ])) * ])) / ]) * , ) + "%"; ;
                         dgvr.Cells[]) - ])) / ]) * , ) + "%";
                         dgvr.Cells[]) - ])) / ]) * , ) + "%";

                         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 =  ?  :  ? ;//附件此处有错
                 }
             }
             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. [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化

    KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...

随机推荐

  1. 通过远程 http API 来控制 lnmp 环境的重启perl脚本

    #!/usr/bin/perl use DBD::mysql; use strict; use warnings; use DBI; use utf8; binmode(STDOUT, ':encod ...

  2. 炉石传说 C# 开发笔记 (续)

    炉石传说山寨的工作一直在进行着,在开发过程中深深体会到,对于业务的理解和整个程序的架构的整理远比开发难得多. 在开发过程中,如果你的模型不合理,不准确,很有可能造成代码的混乱,冗余,难以维护和扩展性比 ...

  3. 使用sql server profilter跟踪sql

    最近在研究EF延迟加载和贪婪加载的用法时,想要查看Linq生成的sql.一开始通过VS-->调试-->窗口-->IntelliTrace事件,来查看生成的sql,并不是十分准确.然后 ...

  4. 柯里化/偏函数/Curring用法

    把接受多个参数的函数变成一个单一参数的函数,并且返回接受余下的参数而有返回结果的新函数的技术 下面我们以实例说明: var toString = {}.toString; var isString = ...

  5. python模块time&amp;datetime&amp;json &amp; picle&amp;14.logging等

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...

  6. Web3D编程入门总结——面向对象的基础Web3D框架

    本篇主要通过分析Tony Parisi的sim.js库(原版代码托管于:https://github.com/tparisi/WebGLBook/tree/master/sim),总结基础Web3D框 ...

  7. asp 时间倒数后按钮可用

    <asp:Button runat="server" ID="btn" Text="免费获取验证码" onclick="bt ...

  8. 简单几步让Chrome浏览器也能打开Oracle EBS

    2016-12-14更新: Google Chrome浏览器从版本45开始正式禁用NPAPI插件(也就是原本JRE插件的实现架构).所以如果你的浏览器版本已经是45以上了,本文提供的方法将不再适用.以 ...

  9. ASP.NET Cookie 概述【转】

    来源:http://msdn.microsoft.com/zh-cn/library/ms178194(VS.80).aspx ASP.NET Cookie 概述 Cookie 提供了一种在 Web ...

  10. 如何解决android studio 运行时中文乱码的问题

    相信很多朋友都会遇到android studio 在MAC OS中运行的时候中文乱码.而在代码编辑的时候正常.经过几天的不断寻找解决办法,终于解决了 比如: Toast.makeText(MainAc ...