咱俩先来看一下股票(stock)音信的类,由此收藏夹里面的剧情照旧以IE飞快格局来保存

亟需小心的那一个只是赚取单只股票

您是不是蒙受您的储藏夹凌乱不堪,恐怕很多收藏网页地址即使分类,但是使用起来却感到不太好,有未有想过把您的珍藏夹内容自动生成二个网页的领航页目生成类似Hao1二三(http://www.hao123.com/),或然番茄花园导航(http://www.tomatolei.com/)同样的网页,用来急忙导航到协调的网站呢?

 代码的用途,通过这几个代码有炒股的敌人就能够写出差不离的机动止损和按自然价格上台的程序了。(国内标准证券商不补助那种成效,或然是为着以免部分事物。)

就算使用情形有争议,可是我们也来关切一下这种自动生成页面的技巧吧,说不定能够应用在适用的情状下,如下边笔者测试了多少个类型的贮藏夹Favorite目录下,在那之中“寻找引擎”和“消息互联网”七个目录是自己的测试收藏夹分类,Icon和Images是自身构造生成主页所急需的一些故事情节目录。我们根据Index.htm来生成index.htm来作为导航的主页面。

我们先来看一下股票(stock)新闻的类

图片 1

 namespace Qianfa.net.Library.Entity
{
    /*http://hq.sinajs.cn/list=sh600066  sh上海 sz深圳
     * 0:”大秦铁路”,期货(Futures)名字;
   一:”二七.5伍″,明日开盘价;
   二:”27.25″,明日收盘价;
   三:”贰陆.九1″,当前价位;//时间甘休后也正是收盘价了
   四:”2七.55″,前些天最高价;
   伍:”贰六.20″,前些天便宜;
   6:”26.91″,竞买价,即“买一”报价;
   7:”26.92″,竞卖价,即“卖一”报价;
  
捌:”2211426叁″,成交的证券数,由于股票交易以一百股为主导单位,所以在行使时,平时把该值除以一百;
  
玖:”589824680″,成交金额,单位为“元”,为了一目精通,平日以“万元”为成交金额的单位,所以一般把该值除以一万;
   10:”4695″,“买一”申请4695股,即47手;
   11:”26.91″,“买一”报价;
   12:”57590″,“买二”
   13:”26.90″,“买二”
   14:”14700″,“买三”
   15:”26.89″,“买三”
   16:”14300″,“买四”
   17:”26.88″,“买四”
   18:”15100″,“买五”
   19:”26.87″,“买五”
   20:”3100″,“卖一”申报3100股,即31手;
   21:”26.92″,“卖一”报价
   (2二, 二3), (二4, 25), (2六,27), (2八, 2玖)分别为“卖二”至“卖肆的气象”
   30:”2008-01-11″,日期;
   31:”15:05:32″,时间;
   */
    public class StockInfo
    {
        public string Name
        {
            get;
            set;
        }

鉴于大家不想更动收藏夹的IE快速格局的始末,由此收藏夹里面包车型地铁始末依旧以IE急迅格局来保存,如下图所示。

        public decimal TodayOpen
        {
            get;
            set;
        }

图片 2

        public decimal YesterdayClose
        {
            get;
            set;
        }

个中IE迅速格局的剧情如下所示,文件时接纳INI格式实行封存的。

        public decimal Current
        {
            get;
            set;
        }

[DEFAULT]
BASEURL=http://g.cn
[InternetShortcut]
URL=http://g.cn

        public decimal High
        {
            get;
            set;
        }

内部的Default中的BaseU大切诺基L是域名地址,InternetShortcut中的URAV四L是切实可行的网页地址,基本上那么些内容就能够协会成四个IE火速方式了。

        public decimal Low
        { get; set; }

壹体化运转的功用如下图所示。个中内容能够动态变化,由于选择了NVelocity引擎来扭转内容,速度相当慢,和你直接浏览三个html页面的快慢大致。

        /// <summary>
        /// 竟买价 买1
        /// </summary>
        public decimal Buy
        { get; set; }

图片 3

        /// <summary>
        /// 竟卖价 卖1
        /// </summary>
        public decimal Sell { get; set; }

 

        /// <summary>
        /// 成交数 单位股数 平常除于拾0成为手
        /// </summary>
        public int VolAmount { get; set; }

上边大家来具体介绍下哪些得以实现那么些页面包车型地铁自动生成吗。

        /// <summary>
        /// 成交多少钱,单位元
        /// </summary>
        public decimal VolMoney { get; set; }

单击Home主页的时候,大家就自动生成3个页面,生成代码如下所示。

        /// <summary>
        /// 今日头条是能够看出6个,伍档看盘 ,买壹-买五
        /// </summary>
        public List<GoodsInfo> BuyList { get; set; }

图片 4图片 5代码

        /// <summary>
        /// 卖1-卖5
        /// </summary>
        public List<GoodsInfo> SellList { get; set; }

        /// <summary>
        /// 导航到主页面
        /// </summary>
        public void GoHome()
        {
            string tempFile = “Favorite/index.txt”;
            try
            {
                HelperClassAdapter helper = new HelperClassAdapter(tempFile);
                helper.Execute();
                //MessageUtil.ShowTips(“生成成功”);

        /// <summary>
        /// Date and Time
        /// </summary>
        public DateTime Time { get; set; }

                bool found = false;
                foreach (IDockContent content in this.dockPanel.Documents)
                {
                    MainIE form = content as MainIE;
                    if (form != null && form.extendedWebBrowser一.DocumentTitle == “收藏夹导航”)
                    {
                        found = true;
                        form.Activate();
                        break;
                    }
                }
                if (!found)
                {
                    this._currentUrl = “my:home”;
                    AddMainIE();
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex);
                MessageUtil.ShowTips(ex.Message);
            }
        }

        public override string ToString()
        {
            return Name + “: ” + VolAmount + “:” + Current;
        }
       
    }

 

/*现行反革命爬小说的多数,原来的小说在http://www.cnblogs.com/lovebanyi/archive/2010/05/02/1725874.html */
}

那里实在根本的正是浮动代码的类HelperClassAdapter,那个类经过获得模版文件,通过Nevelocity引擎把钦赐格式的剧情附加到模版文件中,然后输出文件就能够。

 

图片 6图片 7代码

 

    public class HelperClassAdapter : AbstractAdapter
    {
        public HelperClassAdapter(string templateFile)
            : base(templateFile)
        {
        }

namespace Qianfa.net.Library
{

        public override void Execute()
        {
            string startPath = Path.Combine(Application.StartupPath, “Favorite”);
            if (!Directory.Exists(startPath))
            {
                Directory.CreateDirectory(startPath);
            }                        

///股票数据获得接口,你能够友善实现和讯yahoo…
    public interface IDataService
    {
         StockInfo GetCurrent(string stockCode);   
    }
}

            //遍历目录和文书,根据文件模版输出到文件中

 

            #region 依据目录放置的字典
            Dictionary<string, List<FavoriteInfo>> fileDict = new Dictionary<string, List<FavoriteInfo>>();
            string[] dirArray = Directory.GetDirectories(startPath);
            foreach (string dir in dirArray)
            {
                string dirName = new DirectoryInfo(dir).Name;
                if (dirName.ToLower() == “icon” || dirName.ToLower() == “images”) //系统Logo跳过
                    continue;

namespace Qianfa.net.DataServices
{
    public class Sina : IDataService
    {

                string[] fileArray = Directory.GetFiles(dir);
                List<FavoriteInfo> fileList = new List<FavoriteInfo>();
                FavoriteInfo info = null;
                foreach (string file in fileArray)
                {
                    if (!string.IsNullOrEmpty(file))
                    {
                        info = new FavoriteInfo();
                        info.Category = dirName;
                        info.Title = new FileInfo(file).Name.Replace(“.url”, “”);

        private const string dataurl =
http://hq.sinajs.cn/list=%7B0}”;
        #region IStockInfo Members
        HttpClient client;
        private StockInfo PrevInfo;
        public StockInfo GetCurrent(string stockCode)
        {
            try
            {
                if (client == null)
                {
                    client = new HttpClient();
                }
                if (stockCode.Substring(0, 2) == “60”)//上海是600打头
                {
                    stockCode = “sh” + stockCode;
                }
                else if(stockCode.Substring(0,2)==”00″)//深圳
                {
                    stockCode = “sz” + stockCode;
                }
                else if (stockCode.Substring(0, 二) == “5①”)//东京资金财产
                {
                    stockCode = “sh” + stockCode;
                }
                string url = string.Format(dataurl, stockCode);
                string data = client.DownloadString(string.Format(url,
stockCode));
                PrevInfo = Parse(data);
                return PrevInfo;
            }
            catch
            {
                return PrevInfo;
            }
           
        }

                        INIFileUtil iniUtil = new INIFileUtil(file);
                        info.Url = iniUtil.IniReadValue(“InternetShortcut”, “URL”);

        /// <summary>
        /// Parse Sina data to stock Info
        /// </summary>
        /// <param name=”input”></param>
        /// <returns></returns>
        public static StockInfo Parse(string content)
        {
           // var hq_str_sh40006陆 =
“宇通大巴,玖.二七,玖.35,玖.7陆,玖.80,玖.二7,玖.7七,玖.78,456785八,4430695二,3拾0,九.77,1200,九.7陆,20500,玖.7五,1400,玖.7四,15300,玖.7三,十030,九.7八,280玖三,玖.7玖,156八二柒,九.80,2800,九.八一,6400,九.捌二,二零零六-01-0九,一5:03:3贰”;
            int start = content.IndexOf(‘”‘)+1;
            int end = content.IndexOf(‘”‘,start);
            string input = content.Substring(start, end – start);
            string[] temp = input.Split(‘,’);
            if (temp.Length != 32)
            {
                return null;
            }
            StockInfo info = new StockInfo();
            info.Name = temp[0];
            info.TodayOpen = decimal.Parse(temp[1]);
            info.YesterdayClose = decimal.Parse(temp[2]);
            info.Current = decimal.Parse(temp[3]);
            info.High = decimal.Parse(temp[4]);
            info.Low = decimal.Parse(temp[5]);
            info.Buy = decimal.Parse(temp[6]);
            info.Sell = decimal.Parse(temp[7]);
            info.VolAmount = int.Parse(temp[8]);
            info.VolMoney = decimal.Parse(temp[9]);
            info.BuyList = new List<GoodsInfo>(5);
            int index = 10;
            for (int i = 0; i < 5; i++)
            {
                GoodsInfo goods = new GoodsInfo();
                goods.State = GoodsState.Buy;
                goods.Amount = int.Parse(temp[index]);
                index++;
                goods.Price = decimal.Parse(temp[index]);
                index++;
                info.BuyList.Add(goods);
            }
            info.SellList = new List<GoodsInfo>(5);

                        fileList.Add(info);
                    }

            for (int i = 0; i < 5; i++)
            {
                GoodsInfo goods = new GoodsInfo();
                goods.State = GoodsState.Sell;
                goods.Amount = int.Parse(temp[index]);
                index++;
                goods.Price = decimal.Parse(temp[index]);
                index++;
                info.SellList.Add(goods);
            }
            info.Time = DateTime.Parse(temp[30] + ” ” + temp[31]);
            return info;

                }
                if (!fileDict.ContainsKey(dir))
                {
                    fileDict.Add(dir, fileList);
                }
            } 
            #endregion

        }

            //设置输出文件名称和页面变量,然后输出文件
            this.FileNameOfOutput = Path.Combine(Application.StartupPath, “Favorite/index.htm”);
            context.Put(“FileDict”, fileDict); 
            OutputFile();
        }
    }

        #endregion
    }
}

 

 

 

 
    public class GoodsInfo
    {
        public int Amount
        { get; set; }
        public decimal Price
        {
            get;
            set;
        }
        public GoodsState State { get; set; }
    }

在那之中模版文件index.txt文件异常粗略,部分首要代码如下所示,当中主要关心有$开端的运算符和变量,那几个代码是实现目标到页面内容的调换的。在那之中#foreach($FavoriteList
in ${FileDict.Values})是遍历里面的靶子,实行巡回管理的,语法也很简短。

 要是你想要商业项目标股票(stock)接口能够能够跟本人联系哦。

图片 8图片 9代码

http://www.qianfa.net/StockInfoSoft.aspx

<DIV id=content>
  <!–/ sidebar–><!–/ board–>
<div class=box id=coolsites>
      <h2 align=”center” class=”style二”>收藏夹导航<a class=”” id=cslayout title=居中对齐/左对齐>居中对齐/左对齐</a></h②>
      <div id=list>
#foreach($FavoriteList in ${FileDict.Values})
        <dl>
#set($count = 0)
#foreach($FavoriteInfo in $FavoriteList)
#if($count==0)
          <dt><a href=”#”>[ ${FavoriteInfo.Category.ToString()} ]</a>
#end
#set($count = $count + 1)
          <dd><a href=”${FavoriteInfo.Url.ToString()}”>${FavoriteInfo.Title.ToString()}</a>
#end
        </dd></dl>
#end
      </div>
    </div>
  </div>

 

 别的FavoriteInfo是有的大旨特性的实体类,代码很简短:

图片 10图片 11代码

    public class FavoriteInfo
    {
        private string m_category;//目录分类名称
        private string m_title;//网页题目
        private string m_url;//网页链接

        /// <summary>
        /// 目录分类名称
        /// </summary>
        public string Category
        {
            get { return m_category; }
            set { m_category = value; }
        }

        /// <summary>
        /// 网页标题
        /// </summary>
        public string Title
        {
            get { return m_title; }
            set { m_title = value; }
        }

        /// <summary>
        /// 网页链接
        /// </summary>
        public string Url
        {
            get { return m_url; }
            set { m_url = value; }
        }
    }

 

 HelperClassAdapter的基类如下所示,主倘使概念一些公家的属性别变化量及操作,方便被接续成各连串型的子类。

图片 12图片 13代码

    public abstract class AbstractAdapter : IAdapter
    {
        #region 敬重成员变量

        protected VelocityContext context;
        protected Template template;

        protected string templateFile;

        protected const string NVELOCITY_PROPERTY = “nvelocity.properties”;

        #endregion

        #region 成员变量及集体性质

        private string fileExtension = “.htm”; //输出的文书后缀名,如”.cs”。
        private string directoryOfOutput = “Articles”; //输出文件的文书夹名称
        private string fileNameOfOutput; //输出的文件名称

        /// <summary>
        /// 输出文件的文件夹名称, 如”Entity”,”Common”等
        /// </summary>
        public string DirectoryOfOutput
        {
            set { directoryOfOutput = value; }
            get { return directoryOfOutput; }
        }

        /// <summary>
        /// 输出的文件名称. 假诺想出口的文书为 “A.cs”, 那么文件名字为”A”.
        /// 私下认可的文件名叫模板文件的名号,没有后缀名.
        /// </summary>
        public string FileNameOfOutput
        {
            set { fileNameOfOutput = value; }
            get { return fileNameOfOutput; }
        }

        /// <summary>
        /// 输出的文书后缀名,如”.cs”。
        /// </summary>
        public string FileExtension
        {
            get { return fileExtension; }
            set { fileExtension = value; }
        }

        #endregion

        /// <summary>
        /// 依据参数伊始化基类的Adapter
        /// </summary>
        /// <param name=”templateFile”>模板文件名称</param>
        public AbstractAdapter(string templateFile)
        {
            #region 决断输入的参数是不是行得通

            if (templateFile == null)
            {
                const string error = “Invalid parameter of templateFile.”;

                LogHelper.Error(error);
                throw new ArgumentException(error, “templateFile”);
            }

            #endregion

            this.templateFile = templateFile;
          
            InitTemplateEngine(); //发轫化模板引擎

            fileNameOfOutput = GetFileNameFromTemplate(templateFile); // 暗许情况下, 输出的文件名称叫模板名称           
            directoryOfOutput = “Articles”; // 暗许情状下,放到Common目录下边
        }

        /// <summary>
        /// 成立输出到文件中的方法
        /// </summary>
        public virtual void Execute()
        {
        }

        /// <summary>
        ///依照模板创造输出的文件
        /// </summary>
        public virtual void OutputFile()
        {
            if (template != null)
            {
                string filePath = Path.GetDirectoryName(this.fileNameOfOutput);
                DirectoryInfo dir = new DirectoryInfo(filePath);
                if (!dir.Exists)
                {
                    dir.Create();
                }

                LogHelper.Debug(string.Format(“Class file output path:{0}”, this.fileNameOfOutput));
                using (StreamWriter writer = new StreamWriter(this.fileNameOfOutput, false))
                {
                    template.Merge(context, writer);
                }
            }
        }

        /// <summary>
        /// 依照模板创制代码输出到字符串流中
        /// </summary>
        /// <returns>依据模板生成的代码</returns>
        public virtual string OutputString()
        {
            string code = string.Empty;

            if (template != null)
            {
                using (StringWriter writer = new StringWriter())
                {
                    template.Merge(context, writer);
                    code =  writer.GetStringBuilder().ToString();
                }
            }
            return code;
        }

        /// <summary>
        /// 初步化NVelocity模板引擎并加载程序的安插新闻e
        /// </summary>
        protected void InitTemplateEngine()
        {
            Velocity.Init(NVELOCITY_PROPERTY);
            //Velocity.Init();

            // Make a context object and populate with the data.  This is where the Velocity engine 
            // gets the data to resolve the references (ex. $foreignList) in the template
            context = new VelocityContext();

            try
            {
                template = Velocity.GetTemplate(templateFile);
            }
            catch (ResourceNotFoundException re)
            {
                string error = string.Format(“Cannot find template ” + templateFile);

                LogHelper.Error(error);
                throw new Exception(error, re);
            }
            catch (ParseErrorException pee)
            {
                string error = string.Format(“Syntax error in template ” + templateFile + “:” + pee.StackTrace);

                LogHelper.Error(error);
                throw new Exception(error, pee);
            }

        }

        #region 帮忙方法

        /// <summary>
        /// 从沙盘文件名称获取输出文件名的不二法门
        /// </summary>
        /// <param name=”templateFileName”>带后缀名的模板文件名</param>
        /// <returns>输出的文本名(无后缀名)</returns>
        private string GetFileNameFromTemplate(string templateFileName)
        {
            int sindex1 = templateFileName.LastIndexOf(‘/’);
            int sindex2 = templateFileName.LastIndexOf(‘\\’);

            int sindex = (sindex1 > sindex2) ? sindex1 : sindex2;
            int eindex = templateFileName.IndexOf(‘.’);

            if (sindex < eindex)
            {
                return templateFileName.Substring(sindex + 1, eindex – sindex – 1);
            }
            else
            {
                return templateFileName.Substring(sindex);
            }
        }

        #endregion
    }

 

    public interface IAdapter
    {
        /// <summary>
        /// 创设输出到文件中的方法
        /// </summary>
        void Execute();
    }

 

 此外,读取INI文件,需求的援救类代码INIFileUtil如下所示。

图片 14图片 15代码

    public class INIFileUtil
    {
        public string path;

        public INIFileUtil(string INIPath)
        {
            path = INIPath;
        }

        [DllImport(“kernel32”)]
        private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);

        [DllImport(“kernel32”)]
        private static extern int GetPrivateProfileString(string section,string key,string def, StringBuilder retVal,int size,string filePath);

    
        [DllImport(“kernel32”)]
        private static extern int GetPrivateProfileString(string section, string key, string defVal, Byte[] retVal, int size, string filePath);

        /// <summary>
        /// 写INI文件
        /// </summary>
        /// <param name=”Section”></param>
        /// <param name=”Key”></param>
        /// <param name=”Value”></param>
        public void IniWriteValue(string Section,string Key,string Value)
        {
            WritePrivateProfileString(Section,Key,Value,this.path);
        }

        /// <summary>
        /// 读取INI文件
        /// </summary>
        /// <param name=”Section”></param>
        /// <param name=”Key”></param>
        /// <returns></returns>
        public string IniReadValue(string Section,string Key)
        {
            StringBuilder temp = new StringBuilder(255);
            int i = GetPrivateProfileString(Section,Key,””,temp, 255, this.path);
            return temp.ToString();
        }

        public byte[] IniReadValues(string section, string key)
        {
            byte[] temp = new byte[255];
            int i = GetPrivateProfileString(section, key, “”, temp, 255, this.path);
            return temp;

        }

        /// <summary>
        /// 删除ini文件下全部段子
        /// </summary>
        public void ClearAllSection()
        {
            IniWriteValue(null,null,null);
        }
        /// <summary>
        /// 删除ini文件下personal段落下的所有键
        /// </summary>
        /// <param name=”Section”></param>
        public void ClearSection(string Section)
        {
            IniWriteValue(Section,null,null);
        }
    }