zhouqian 发表于 2010-9-28 10:22:32

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 && High == Low) Return;
Ma = Average(Close,Length);                                 // 均线
Ma1 = Ma;
cl=close;
    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 && High == Low) Return;
Ma = Average(Close,Length); // 均线
Ma1 = Ma;
cl=close;
    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

望能迅速解答,谢谢。

穿堂风 发表于 2010-9-28 11:18:15

本帖最后由 穿堂风 于 2010-9-28 11:23 编辑

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

穿堂风 发表于 2010-9-28 11:31:03

另外,感觉你这块这样处理逻辑性不好:
   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"));
}

zhouqian 发表于 2010-9-28 14:35:55

A函数,试了一下,仍然无法控制

穿堂风 发表于 2010-9-28 15:37:46

A函数,试了一下,仍然无法控制
zhouqian 发表于 2010-9-28 14:35 http://www.tradeblazer.net/forum/images/common/back.gif
不会吧,你参考下我下边的伪代码,是不是你时间处理上有问题,记录一个打印看看。
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时间
}

穿堂风 发表于 2010-9-28 15:41:43

你上边的处理逻辑是有问题的,永远不会出现ruDo == RiQiDo的情况

SetTBProfileString("JcYi","ruDo",RiQiDo);                  //写入文件
RiQiDo=GetTBProfileString("JcYi","ruDo");                  // 初始化时设置

rookies 发表于 2012-3-13 09:23:48

留个记号,方便以后来看

ggyyff 发表于 2012-5-9 00:14:08

穿堂风 发表于 2010-9-28 11:18 static/image/common/back.gif
程序里边怎么控制都是没用的,buy,sell这些是信号发单,你要出信号,它就会发单,除非你不要信号。我想了一 ...

穿堂风老大 最近一直被重复发单的问题困扰着 我是用buy sellshort 发单 最开始marketposion控制不住 后来用全局变量 但是信号就闪了一下 而且不是每次都发单  没有未来函数之类的 在坛子里逛  看大家好像都是全局变量配合A函数发单
帮助文件中的A_SendOrder已经看过了
请您讲解一下 全局变量+A函数 全局变量+buy sellshort 这两种模式的机制上有何区别呢?

这篇帖子倒是提供了一个新思路 学习了

yml6363 发表于 2012-7-3 23:10:05

提供了一个新思路 学习了

sqj888 发表于 2012-9-28 12:59:41

马克一下
页: [1] 2
查看完整版本: TB重启重复发单,盘中测试不成功,求助……