开拓者期货期权程序化系统交易论坛

标题: A_SendOrder开仓问题 [打印本页]

作者: masterhdd    时间: 2018-5-2 16:05:55     标题: A_SendOrder开仓问题

俺是新手,请多包涵啊........

双均线策略,A_SendOrder开平仓。
问题1:为何会出现持有2手多仓的情况?是什么原因导致的?
问题2:If(BKcond and TemB==0&&barstatus==2 && KC==True) //此处加上HasBK==0的限制条件,就一直不开仓了,去掉HasBK==0的限制就能正常开仓了,这是为何?错在哪里?
问题3:初始化全局变量if ( BarStatus==0 && GetGlobalVar(0)==InvalidNumeric)这样是正确的吗?这样能避免断线重连后不必要的再次初始化吗?
源码如下
Params
        Numeric FastLength(5);
        Numeric SlowLength(20);
        Numeric OffSet (8);//委托价格偏移
        Numeric Lots (1);
Vars
        NumericSeries AvgValue1;
        NumericSeries AvgValue2;
        Numeric TemB;//多头持仓
        Numeric TemS;//空头持仓
        BooL KC(False);//开仓许可
        BooL QC(False);//清仓必须
        Bool BKcond(False);
        bool SPcond(False);
        Numeric HasSP(0);//已平多仓标志
        Numeric HasBK (0);//已开多仓标志
       
       
Begin
        // 集合竞价和小节休息过滤
        If(!CallAuctionFilter()) Return;
       
if ( BarStatus==0 && GetGlobalVar(0)==InvalidNumeric)//初始化全局变量
{
HasSP = 0;
HasBK = 0;
SetGlobalVar (0 ,HasSP);
SetGlobalVar ( 1 , HasBK );
} ELse
{
HasSP = GetGlobalVar (0);
HasBK = GetGlobalVar (1);
Commentary("HasSP" +Text(HasSP));
Commentary("HasBK" +Text(HasBK));
}
        KC=time>=0.090000 and time<0.145800 || time>=0.0900 and time<0.1458 || time>=0.210000 and time<0.232800 || time>=0.2100 and time<0.2328;//允许开仓
  QC=time>=0.145800 and time<0.150000 || time>=0.1458 and time<0.1500 || time>=0.232800 and time<0.233000 || time>=0.2328 and time<0.2330;//必须清仓

        AvgValue1 = AverageFC(Close,FastLength);   
        AvgValue2 = AverageFC(Close,SlowLength);

        PlotNumeric("MA1",AvgValue1);
        PlotNumeric("MA2",AvgValue2);       
        BKcond=CrossOver (AvgValue1[1] , AvgValue2[1]);//开多的条件,  
        SPcond=CrossUnder (AvgValue1[1] , AvgValue2[1]);
        TemB = A_BuyPosition();//多头持仓
        TemS = A_SellPosition(); //空头持仓

        If(BKcond and TemB==0&&barstatus==2 && KC==True) //此处加上HasBK==0的条件,就不能开仓。
        {
                A_SendOrder(Enum_buy,Enum_Entry,Lots,Q_AskPrice+OffSet*MinMove*PriceScale);//A_SendOrder开多,
                SetGlobalVar(0,0);//允许平多仓
                SetGlobalVar(1,1);
               
        }
        If(TemB>0)
        {
        SetGlobalVar(0,0);//允许平多仓,hassp=0
        SetGlobalVar(1,1);//hasbk=1
       
        }
        If(SPcond and TemB>0&&barstatus==2 && HasSP==0 || TemB>0&&barstatus==2 && QC==True && HasSP==0)  
        {
                A_SendOrder(Enum_Sell,Enum_Exit,TemB,Q_BidPrice-offSet*MinMove*PriceScale);
                SetGlobalVar(0,1);//hassp=1
                SetGlobalVar(1,0);//hasbk=0
       
        }
       
        End
  
作者: 小米    时间: 2018-5-2 16:59:19

1,平仓里都会使用hasSP==0来控制发单次数,为啥在开仓里没有全局变量来控制次数呢?仅靠头寸来控制是不够的,因为成交以及回报到本地是需要时间的。
2,hasBk==0的条件在开仓时是一定需要的。使用fileappend在条件下输出0或1号全局变量的值,来跟踪一下是哪一个环节与预期的不一样,这样才好找到错在哪里。
3,个人建议,初始化只要使用getglobalvar(0)==invalidnumeric就可以了,不要加barstatus==0的。
作者: masterhdd    时间: 2018-5-2 18:14:17

小米 发表于 2018-5-2 16:59
1,平仓里都会使用hasSP==0来控制发单次数,为啥在开仓里没有全局变量来控制次数呢?仅靠头寸来控制是不够 ...

多谢指导。




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2