OQ实现Dual Thrust交易系统中碰到问题,请大家帮忙解决

Discussion in 'OpenQuant' started by besturn, May 3, 2010.

  1. 最近在学习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();
    			}
    		}
    	}
    }
    结果是这样:
    [​IMG]

    问题是在1月10日的bar上怎么会发生两笔的交易,1月20日的bar上更是产生5笔的交易?OnBarOpen事件每bar应该只触发一次,按照代码来看,一bar上应该最多只能发生一次交易。
     
  2. 在OnBarOpen 增加以下代码
    Code:
    	
           	              foreach(Order currOrder in Orders)
    		{
    		   currOrder.Cancel();
    		}
    
    
     
  3. 谢谢fisher兄!
    原来我以为OpenQuant中Order处理会与wld中一样只是在一bar中有效。