您现在的位置:程序化交易>> 期货公式>> 交易开拓者(TB)>> 开拓者知识>>正文内容

TB写了两个交易指令来克服重启重发单,盘中测试不成功, [开拓者 TB]

  • 咨询内容: 我参照帖子,写了两个交易指令来克服重启重发单,结果测试部成功;请问问题出在哪?
    分别是
    Params
    Numeric SetPositionValue(0);                            //设置仓位值
    Numeric lots(1);
    Numeric length(2);
    Vars
    Numeric Position;                                        //1表示持有多头,-1表示持有空头,0为没有持仓
    NumericSeries Ma;
    NumericSeries Ma1;
    NumericSeries cl;
    Begin
        If(Date != Date[1] && High == Low) Return;
    Ma = Average(Close,Length);                                 // 均线
    Ma1 = Ma[1];
    cl=close[1];
        If (Position==InvalidNumeric)                               //状态初始化
        {
         Position = SetPositionValue;
        }
    SetTBProfileString("Trade","Position",Text(Position));
    Position = Value(GetTBProfileString("Trade","Position"));   //读写文件获取Position
       If (Position!=1 And CrossOver(cl,Ma1))
        {
         Buy(lots,open);
         Position=1;
        }
       If (Position!=-1 And CrossOver(Ma1,cl))
        {
         SellShort(lots,open);
         Position=-1;
        }
       SetTBProfileString("Trade","Position",Text(Position));      //将Position重置写入数据库
    End



    Params
    Numeric lots(1);
    Numeric length(2);
    Vars
    NumericSeries Ma;
    NumericSeries Ma1;
        NumericSeries cl;
        String RiQiDo;
    String RiQi;
    Begin
    If(Date != Date[1] && High == Low) Return;
    Ma = Average(Close,Length); // 均线
    Ma1 = Ma[1];
    cl=close[1];
        if(RiQiDo==InvalidString)
        {
        RiQiDo=="000000000000000000";
        }
    SetTBProfileString("JcYi","ruDo",RiQiDo);                  //写入文件
    RiQiDo=GetTBProfileString("JcYi","ruDo");                  // 初始化时设置
        If(MarketPosition==0 And CrossOver(cl,Ma1))
    {
               If (BarStatus==2)
               {
                 RiQi=DateTimeToString(Date+Time);
                 RiQi=Mid(RiQi,0,18);
                  If (RiQi==RiQiDo)
                 {
                     Return;
                  }
                }
                Buy(1,open);
                RiQiDo=DateTimeToString(Date+Time);
                RiQiDo=Mid(RiQiDo,0,18);
               SetTBProfileString("JcYi","ruDo",RiQiDo);        //重置后写入文件
    }
        If(MarketPosition==1 And CrossOver(Ma1,cl))   
    {
               sell(1,open);
    }
    end

    望能迅速解答,谢谢。

     

  • TB技术人员: 本帖最后由 穿堂风 于 2010-9-28 11:23 编辑

    程序里边怎么控制都是没用的,buy,sell这些是信号发单,你要出信号,它就会发单,除非你不要信号。我想了一个解决方法,就是barstatus==2的时候用A函数,历史行情用buy,sell这些,缺点就是当前bar无信号,我还是比较喜欢有信号,所以目前就还那样用着,真出现重启软件重复发单了,就手动平掉,唉。

     

  • TB客服: 另外,感觉你这块这样处理逻辑性不好:
       If (Position==InvalidNumeric)                               //状态初始化
        {
         Position = SetPositionValue;
        }
    SetTBProfileString("Trade","Position",Text(Position));//每次运行都被初始化了,拿不到真实值
    Position = Value(GetTBProfileString("Trade","Position"));   //每次拿到的都是你参数里的固定值

    你这块可以直接:
    if(barstatus == 0)
    {
    SetTBProfileString("Trade","Position",Text(SetPositionValue));
    }
    else
    {
    Position = Value(GetTBProfileString("Trade","Position"));
    }

     

  • 网友回复: A函数,试了一下,仍然无法控制

     

  • 网友回复:
    A函数,试了一下,仍然无法控制
    zhouqian 发表于 2010-9-28 14:35

    不会吧,你参考下我下边的伪代码,是不是你时间处理上有问题,记录一个打印看看。
    riqi = Text(Date)+Text(Time*1000000);//拿到当前bar的完整时间
    riqi = Mid(riqi,16);//取前16位
    riqido = GetTBProfileString(SymbolName,"riqido");//取上次发单时间,如果是第一个发单,结果就是无效值,没关系
    If(BarStatus == 2)
    {
            If(riqi == riqido)//如果当前bar已经下过单
            {
                    //重复发单
                    Return;
            }
            A_SendOrder();
            SetTBProfileString(symbolname,"riqido",riqi);//当前bar未下单,则下单,并记录下单bar时间
    }

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 262069696  点击在线交流进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容