OQ初学的简单策略

Discussion in 'OpenQuant' started by odin19852, Oct 16, 2011.

  1. 本人是OQ的新手,模仿里面的策略写了一个简单的60日均线买卖策略,在没有仓位的情况下,高于60日均线就买,低于60日均线就卖。有仓位的情况出现相反的信号则平仓反手开仓。
    代码如下:
    但是在里面跑了之后发现只交易了两次,还都是买,所有交易均使用了限价单,也不知道合适不合适,希望高手给予指导,谢谢!

    using System;
    using System.Drawing;

    using OpenQuant.API;
    using OpenQuant.API.Indicators;

    public class MyStrategy : Strategy
    {
    [Parameter("Length of SMA1", "SMA")]
    int Length1 = 60;//计算60日均线,参数可以调整

    [Parameter("Color of SMA1", "SMA")]
    Color Color1 = Color.Yellow;//以黄色画线

    SMA sma1;//sma1为60日均线

    Order LongEntryOrder,
    LongExitOrder,
    ShortEntryOrder,
    ShortExitOrder;//挂单

    [Parameter("Order quantity (number of contracts to trade)")]
    double Qty = 100;//交易数量

    public override void OnStrategyStart()
    {
    sma1=new SMA(Bars,Length1,Color1);
    //初始化sma1

    Draw(sma1,0);
    //在同一张价格图上画出该曲线
    }

    public override void OnBar(Bar bar)
    {
    if(Bars.Count <Length1)
    {
    return;
    }

    if(!HasPosition)
    {
    //判断是否有持仓,没有持仓则开始判断价格与均线的位置
    if(Bar.Close>sma1.Last)//价格大于均线的情况
    {
    double LongEntryPrice=sma1.Last;
    LongEntryOrder=BuyLimitOrder(Qty,LongEntryPrice,"Long Entry");
    LongEntryOrder.Send();
    return;
    //Send the Buy Order
    }
    if(Bar.Close<sma1.Last)//价格小于均线的情况
    {
    double ShortEntryPrice=sma1.Last;
    ShortEntryOrder=SellLimitOrder(Qty,ShortEntryPrice,"Short Entry");
    ShortEntryOrder.Send();
    return;
    //send the Sell Order
    }
    else
    {
    if(Position.Side==PositionSide.Long&&Bar.Close<sma1.Last)//持有多头的时候收盘价小于均线,平仓后开仓做空
    {
    double LongExitPrice=Bar.Close;
    LongExitOrder=SellLimitOrder(Qty,LongExitPrice,"Long Exit");
    LongExitOrder.Send();
    //平掉多头头寸

    double ShortEntryPrice=Bar.Close;
    ShortEntryOrder=SellLimitOrder(Qty,ShortEntryPrice,"Short Entry");
    ShortEntryOrder.Send();
    //开仓空头
    }
    if(Position.Side==PositionSide.Short&&Bar.Close>sma1.Last)//持有空头的时候收盘价大于均线,平仓后开仓做多
    {
    double ShortExitPrice=Bar.Close;
    ShortExitOrder=BuyLimitOrder(Qty,ShortExitPrice,"Short Exit");
    ShortExitOrder.Send();
    //平掉空头头寸

    double LongEntryPrice=Bar.Close;
    LongEntryOrder=BuyLimitOrder(Qty,LongEntryPrice,"Long Entry");
    LongEntryOrder.Send();
    //开仓多头
    }
    }

    }
    }
    }
     
  2. using System;
    using System.Drawing;

    using OpenQuant.API;
    using OpenQuant.API.Indicators;

    public class MyStrategy : Strategy
    {
    [Parameter("Length of SMA1", "SMA")]
    int Length1 = 60;//计算60日均线,参数可以调整

    [Parameter("Color of SMA1", "SMA")]
    Color Color1 = Color.Yellow;//以黄色画线

    SMA sma1;//sma1为60日均线

    Order LongEntryOrder,
    LongExitOrder,
    ShortEntryOrder,
    ShortExitOrder;//挂单

    [Parameter("Order quantity (number of contracts to trade)")]
    double Qty = 100;//交易数量

    public override void OnStrategyStart()
    {
    sma1=new SMA(Bars,Length1,Color1);
    //初始化sma1

    Draw(sma1,0);
    //在同一张价格图上画出该曲线
    }

    public override void OnBar(Bar bar)
    {
    if(Bars.Count <Length1)
    {
    return;
    }

    if(!HasPosition)
    {
    //判断是否有持仓,没有持仓则开始判断价格与均线的位置
    if(Bar.Close>sma1.Last)//价格大于均线的情况
    {
    double LongEntryPrice=sma1.Last;
    LongEntryOrder=BuyLimitOrder(Qty,LongEntryPrice,"Long Entry");
    LongEntryOrder.Send();

    //Send the Buy Order
    }
    else if(Bar.Close<sma1.Last)//价格小于均线的情况
    {
    double ShortEntryPrice=sma1.Last;
    ShortEntryOrder=SellLimitOrder(Qty,ShortEntryPrice,"Short Entry");
    ShortEntryOrder.Send();

    // nd the Sell Order
    }
    }
    else if(Position.Side==PositionSide.Long&&Bar.Close<sma1.Last)//持有多头的时候收盘价小于均线,平仓后开仓做空
    {
    double LongExitPrice=Bar.Close;
    LongExitOrder=SellLimitOrder(Qty,LongExitPrice,"Long Exit");
    LongExitOrder.Send();
    //平掉多头头寸

    double ShortEntryPrice=Bar.Close;
    ShortEntryOrder=SellLimitOrder(Qty,ShortEntryPrice,"Short Entry");
    ShortEntryOrder.Send();
    //开仓空头
    }

    else if(Position.Side==PositionSide.Short&&Bar.Close>sma1.Last)//持有空头的时候收盘价大于均线,平仓后开仓做多
    {
    double ShortExitPrice=Bar.Close;
    ShortExitOrder=BuyLimitOrder(Qty,ShortExitPrice,"Short Exit");
    ShortExitOrder.Send();
    //平掉空头头寸

    double LongEntryPrice=Bar.Close;
    LongEntryOrder=BuyLimitOrder(Qty,LongEntryPrice,"Long Entry");
    LongEntryOrder.Send();
    //开仓多头
    }



    }
    }
     
  3. 谢谢fisher,在你的思路上我又稍微修改了一下,把第一个持仓判断后的括号加上,最后面的括号再少一个,最后结果跟想象的差不多。代码如下:
    using System;
    using System.Drawing;

    using OpenQuant.API;
    using OpenQuant.API.Indicators;

    public class MyStrategy : Strategy
    {
    [Parameter("Length of SMA1", "SMA")]
    int Length1 = 60;//计算60日均线,参数可以调整

    [Parameter("Color of SMA1", "SMA")]
    Color Color1 = Color.Yellow;//以黄色画线

    SMA sma1;//sma1为60日均线

    Order LongEntryOrder,
    LongExitOrder,
    ShortEntryOrder,
    ShortExitOrder;//挂单

    [Parameter("Order quantity (number of contracts to trade)")]
    double Qty = 100;//交易数量

    public override void OnStrategyStart()
    {
    sma1=new SMA(Bars,Length1,Color1);
    //初始化sma1

    Draw(sma1,0);
    //在同一张价格图上画出该曲线
    }

    public override void OnBar(Bar bar)
    {
    if(Bars.Count <Length1)
    {
    return;
    }

    if(!HasPosition)
    {
    //判断是否有持仓,没有持仓则开始判断价格与均线的位置
    if(Bar.Close>sma1.Last)//价格大于均线的情况
    {
    double LongEntryPrice=sma1.Last;
    LongEntryOrder=BuyLimitOrder(Qty,LongEntryPrice,"Long Entry");
    LongEntryOrder.Send();
    //Send the Buy Order
    }
    if(Bar.Close<sma1.Last)//价格小于均线的情况
    {
    double ShortEntryPrice=sma1.Last;
    ShortEntryOrder=SellLimitOrder(Qty,ShortEntryPrice,"Short Entry");
    ShortEntryOrder.Send();
    //send the Sell Order
    }
    }
    else if(Position.Side==PositionSide.Long&&Bar.Close<sma1.Last)
    {
    //持有多头的时候收盘价小于均线,平仓后开仓做空
    double LongExitPrice=Bar.Close;
    LongExitOrder=SellLimitOrder(Qty,LongExitPrice,"Long Exit");
    LongExitOrder.Send();
    //平掉多头头寸

    double ShortEntryPrice=Bar.Close;
    ShortEntryOrder=SellLimitOrder(Qty,ShortEntryPrice,"Short Entry");
    ShortEntryOrder.Send();
    return;
    //开仓空头
    }
    else if(Position.Side==PositionSide.Short&&Bar.Close>sma1.Last)//持有空头的时候收盘价大于均线,平仓后开仓做多
    {
    double ShortExitPrice=Bar.Close;
    ShortExitOrder=BuyLimitOrder(Qty,ShortExitPrice,"Short Exit");
    ShortExitOrder.Send();
    //平掉空头头寸

    double LongEntryPrice=Bar.Close;
    LongEntryOrder=BuyLimitOrder(Qty,LongEntryPrice,"Long Entry");
    LongEntryOrder.Send();
    return;
    //开仓多头
    }
    }
    }