zoukankan      html  css  js  c++  java
  • 开发例子 转http://www.google.com.hk/search?newwindow=1&safe=strict&client=firefoxa&hs=Gzw&rls=org.mozilla%3AzhCN%3Aofficial&q=%E5%8D%83%E5%8F%91&oq=%E5% 武胜

    如何自定义一个股票交易策略?
    我们的软件是允许用户自定义一下交易策略的。在这篇文章里,我们将教你如何自定义一个股票交易策略。
    
    直接下载我们的例子。解压到 D:\Projects\MACD2\目录下。
    用VS2010打开 D:\Projects\MACD2\MACD2.sln。
    我们可以看到有一个文件叫作 MACDTractic2.cs 这个文件就是我们的MACD交易策略文件了。
    它继承于 AbstractTrade类型
    /// <summary>
        /// 所有的自定义交易策略必须继承于它
        /// </summary>
        public abstract class AbstractTrade
        {
            /// <summary>
            /// 作者
            /// </summary>
            public abstract string Author
            { get; }
            
            /// <summary>
            /// 策略描述
            /// </summary>
            public abstract string Description
            { get; }
    
            /// <summary>
            /// 名字
            /// </summary>
            public abstract string Name
            { get; }
    
            /// <summary>
            /// 具体的策略实现是否可以买
            /// </summary>
            /// <param name="context"></param>
            /// <returns></returns>
            public abstract TradeBuyInfo BuyCheck(TradeContext context);
            /// <summary>
            /// 具体的策略实现是否可以卖
            /// </summary>
            /// <param name="context"></param>
            /// <returns></returns>
            public abstract TradeSellInfo SellCheck(TradeContext context);
    
            /// <summary>
            /// 得到可以买的最大数量
            /// </summary>
            /// <param name="context"></param>
            /// <returns></returns>
            protected virtual int GetMaxAmount(TradeContext context,float buyPrice)
            {
                int amount = BuyAmount.Calculate(context.StockAndFundInfo.FundInfo.AvailableMoney, buyPrice);
                return amount;
            }
    
          
    
            /// <summary>
            /// 得到购买的价格
            /// 当前价格的再加千分之一
            /// </summary>
            /// <param name="context"></param>
            /// <returns></returns>
            protected virtual float GetBuyPrice(TradeContext context)
            {
                return context.CurrentPrice * (1 + 0.001f);
            }
    
            /// <summary>
            /// 得到卖出的价格
            /// 当前价格的减去 千分之一
            /// </summary>
            /// <param name="context"></param>
            /// <returns></returns>
            protected virtual float GetSellPrice(TradeContext context)
            {
                return context.CurrentPrice * (1 - 0.001f);
            }
    
            /// <summary>
            /// 得到当前可以卖出的的股票数
            /// </summary>
            /// <param name="context"></param>
            /// <returns></returns>
            protected virtual int GetAvailableAmount(TradeContext context)
            {
                ExistStock existStock=context.StockAndFundInfo.Stocks.FirstOrDefault(it => it.StockCode==context.StockCode);
                if (existStock!=null&&existStock.AvailableAmout>0)
                {
                    return (int)existStock.AvailableAmout;
                }
                return 0;
            }
    
            /// <summary>
            /// 得到总的数量
            /// </summary>
            /// <param name="context"></param>
            /// <returns></returns>
            protected virtual int GetAmount(TradeContext context)
            {
                ExistStock existStock = context.StockAndFundInfo.Stocks.FirstOrDefault(it => it.StockCode == context.StockCode);
                if (existStock != null && existStock.Amount > 0)
                {
                    return (int)existStock.Amount;
                }
                return 0;
            }
            /// <summary>
            /// 是否有股票可以卖
            /// </summary>
            /// <param name="context"></param>
            /// <returns></returns>
            protected virtual bool IsHaveStockToSell(TradeContext context)
            {
                ExistStock existStock=context.StockAndFundInfo.Stocks.FirstOrDefault(it => it.StockCode==context.StockCode);
                if (existStock!=null&&existStock.AvailableAmout>0)
                {
                    return true;
                }
                return false;
            }
    
            /// <summary>
            /// 是否已经有这个股票了 (必须有数量)
            /// 有的话返回true没有返回false
            /// </summary>
            /// <param name="context"></param>
            /// <returns></returns>
            protected virtual bool IsHaveTheStockAlready(TradeContext context)
            {
                return context.StockAndFundInfo.Stocks.FirstOrDefault(it => it.StockCode == context.StockCode&&it.Amount>0) != null;
            }
    
    
            public AbstractTrade Clone()
            {
                return this.MemberwiseClone() as AbstractTrade;
            }
        }
    我们需要实现的方法有 Author Description Name 最重要的 BuyCheck 和SellCheck 这两个方法来判断是否需要买入和卖出。
    
    如果你自己需要再创建新的策略,只要记得添加一个新的类,并实现AbstractTrade类就可以达到目的了。
    还需要注意的一点有 第11行 [Export(typeof(AbstractTrade))] 我们是通过这个来向我们的程序说我们有这个接口。
    只有把这个加到类的attribute哪边。才是最终完成的。
    
    如何进行调试
    在VS2010 哪里按 快捷键 F5 进入调试状态,股票自动交易软件会被自动打开,下一个断点到Description 27行。
    在股票自动交易软件哪边 选择系统设置 策略设置 选择 "MACD 5 分钟交易DEMO"
    我们可以看到断点就自动断在了 27行哪边了。 在自动化交易运行的时候你同样可以把断点设在BuyCheck和SellCheck哪边,这样就可以方便的看你的策略运行的数据对不对了。 
  • 相关阅读:
    斜率DP小结
    CF 1059 D Nature Reserve(double 精度问题)
    ZOJ 3747 Attack on Titans(DP+思维)
    BZOJ 1933 Bookcase 书柜的尺寸
    异或的一些性质
    (学习5 分治思想)最短对的问题
    (学习4)二分归并排序
    mac上git与github的联动
    (学习3)二分法与二叉查找树
    (学习2)Floyd和Dijkstra算法
  • 原文地址:https://www.cnblogs.com/zeroone/p/3053978.html
Copyright © 2011-2022 走看看