开发例子 转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哪边,这样就可以方便的看你的策略运行的数据对不对了。 
原文地址:https://www.cnblogs.com/zeroone/p/3053978.html