开发例子 转http://www.google.com.hk/search?newwindow=1&safe=strict&client=firefox-a&hs=Gzw&rls=org.mozilla%3Azh-CN%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哪边,这样就可以方便的看你的策略运行的数据对不对了。 

 

你可能感兴趣的:(firefox)