如何自定义一个股票交易策略?
我们的软件是允许用户自定义一下交易策略的。在这篇文章里,我们将教你如何自定义一个股票交易策略。
直接下载我们的例子。解压到 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哪边,这样就可以方便的看你的策略运行的数据对不对了。