最近在学习OpenQuant,恰好在海洋上看到一个讲Dual Thrust交易系统的帖子,感觉这个系统不是很复杂,就用OpenQuant写了第一个交易策略。 Dual Thrust交易系统大致是这样: 具体可看这个http://74.54.18.242/~hylt/vb/showthread.php?t=18385 我写的源码: Code: using System; using System.Drawing; using OpenQuant.API; using OpenQuant.API.Indicators; public class MyStrategy : Strategy { [Parameter("Order quantity (number of contracts to trade)")] double Qty = 100; [Parameter("K Value")] double K = 0.7; double delta = 0; Order buyOrder; Order sellOrder; public override void OnStrategyStart() { } public override void OnBar(Bar bar) { delta = Math.Max(bar.High - bar.Close,bar.Close - bar.Low)*K; } public override void OnBarOpen(Bar bar) { if(delta > 0) { if(HasPosition) { if(Position.Side == PositionSide.Long) { SellStop(Qty*2,bar.Open - delta); } else { BuyStop(Qty*2,bar.Open + delta); } } else { buyOrder = BuyStopOrder(Qty,bar.Open + delta); buyOrder.OCAGroup = "Oca group"; buyOrder.Send(); sellOrder = SellStopOrder(Qty,bar.Open - delta); sellOrder.OCAGroup = "Oca group"; sellOrder.Send(); } } } } 结果是这样: 问题是在1月10日的bar上怎么会发生两笔的交易,1月20日的bar上更是产生5笔的交易?OnBarOpen事件每bar应该只触发一次,按照代码来看,一bar上应该最多只能发生一次交易。