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 进行 有偿 编写!(不贵!点击查看价格!)
相关文章
-
没有相关内容