本人是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(); //开仓多头 } } } } }
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(); //开仓多头 } } }
谢谢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; //开仓多头 } } }