Tuesday, May 14, 2019

(TB)交易开拓者SetGlobalVar和SetTBProfileString函数

SetGlobalVar和GetGlobalVar函数可以读写全局变量,但程序的可读性差,老要注释,程序执行速度应该可以,但不能写字符串,读写小数也很麻烦.
SetTBProfileString和GetTBProfileString函数已放弃了参数文件的读写,改用读写数据库Data_Q,速度比读文件系统快,但保存数值也很麻烦,需要转换函数.
请管理员给我综合评估一下,是否要放弃使用全局变量,改用读写数据库.全局变量还要处理网络中断、程序重启等问题,也是麻烦的很。
谢谢了!
不是对性能特别敏感的代码段,能用SetTBProfileString还是用这个比较好。

毕竟这是写到数据库,比SetGlobalVar写在内存中要强。

也可以这样:
如果下次打开交易软件仍然需要的数据,用SetTBProfileString。
下次打开交易软件,就重新计算的数据,用SetGlobalVar。

可以使用TBProfileString的,p_b_yu 是指在短线的情况下,全局变量会被清空,和TBProfileString比,较不稳定,所以p_b_yu建议使用TBProfileString
http://bbs.tradeblazer.net/forum.php?mod=viewthread&tid=6919
http://bbs.tradeblazer.net/forum.php?mod=viewthread&tid=12419
2
关于断线重连的全局变量
如下:

If(BarStatus==0)//初始化
{
setGlobalVar(1,InvalidNumeric);
setGlobalVar(0,InvalidNumeric);
SetTBProfileString(Symbol,"sm",Text(0));
SetTBProfileString(Symbol,"buym",Text(0));
SetTBProfileString(Symbol,"bm",Text(0));
SetTBProfileString(Symbol,"sellm",Text(0));  
}

断线重连后全局变量是不是又被初始化?
4#
[转载](TB)SetGlobalVar和SetTBProfileString函数 发表于 2010-11-3 16:05:00 |只看该作者
本帖最后由 efrog 于 2010-11-3 16:12 编辑

错了!应该:
If( BarStatus==0 && getglobalvar(0)==InvalidNumeric )
{
//初始化
}
说明:第一个Bar是由于公共变量没有使用过,所以其值为InvalidNumeric,一旦初始化其值就有效了,以后即使遇行情中断,程序再次从BarStatus==0从新执行,由于getglobalvar(0)已经不为InvalidNumeric,所以不会被重新初始化。
上善若水,无欲则刚
1# jsz123

请教SetTBProfileString(Symbol,"sm",Text(0));是什么意思?问题弱了点。不好意思
文韦 发表于 2010-11-20 16:35

Symbol是返回图表的商品名函数,这里用作数据库的名称。
"sm”是关键字名,相当于变量名。
Text(0),将sm设置为"0"。必须转换成字符串,这是TB所谓“数据库”的弱点!
http://bbs.tradeblazer.net/forum.php?mod=viewthread&tid=10933
3

说简单一点:
第一、OpenD(0)在集合竟价的时候会不会把上一个交易日的Open当做今天的open?
第二、If(BarStatus==0)//初始化setGlobalVar
{
SetTBProfileString(Symbol,"s1",Text(0));
SetTBProfileString(Symbol,"buy",Text(0));
SetTBProfileString(Symbol,"bm",Text(0));
SetTBProfileString(Symbol,"sell",Text(0));
}
可不可以不要?不初始化。可以避免不小心归零,照成反复开平仓。可不可以不要?
发表于 2010-10-20 14:08:00 |只看该作者
1.集合竟价的时候OpenD(0)为昨日的开盘价
2.这个只在图上第一个bar的时候初始化,这段代码不会造成反复开平仓

http://bbs.tradeblazer.net/forum.php?mod=viewthread&tid=10755
4
回复 3# 文韦


使用的是否V4版本?
请在数据库中检查一下是否有20110817这个信息。
文件-数据管理-配置工具
5
帖前已专门就此问题搜索过论坛的相关帖子,采用全局变量控制发单次数,但重复发单的问题还是没有解决。代码如下:
vars
numeric  trn;

if (BarStatus==0) SetGlobalVar(5,1);   //或者 if (BarStatus==0) trn=1;

if (BarStatus==2 && GetGlobalVar(5)==1) {   //或者        if (BarStatus==2 && trn==1)       
  if (AccountDataExist && a_totalposition>=0)
      {
       SetGlobalVar(5,0);                                  //或者 trn=0;
       if (a_totalposition>0) A_SendOrder(enum_sell,enum_exit,1,close-6);
       A_SendOrder(enum_sell,enum_entry,1,close-6);                     
     }
                                                                                  

本意是想空头开仓1手,但实盘运行开仓不止1手。也曾试过采用序列变量的方式控制发单次数,问题依旧。疑问:1、全局变量和序列变量的赋值时间是否很长?以至于在一个tick周期内变量值来不及改变导致重复发单?2、如果不采用延时的方式,有无其他更好的方法避免重复发单?
5#
[转载](TB)SetGlobalVar和SetTBProfileString函数 发表于 2011-12-21 10:11:00 |只看该作者
你的5号全局变量只是在某指定条件下给其赋了值,赋值貌似没有与发单有关。
请叁考F1帮助文档--公式系统---公式的使用----策略进阶----A函数下撤单与全局变量的应用。
6
想在日内交易1分钟周期中,胶、白糖、豆油、PTA、股指,这五个品种必须全部满足(不一定要同时满足)收盘价在各自的MA(CLOSE,60)之上,才同时做多这五个品种,用公式要如何表达?thankU
用SetTBProfileString、GetTBProfileString吧
以上品种图表都打开,并用SetTBProfileString记录各个品种条件,供其他品种调用判断。
将收盘价大于MA(C,60)条件记录下来
if(close[1]>AverageFC(Close,60))
    settbprofilestring(symbol,"ma","true");
获取三个品种的条件,判断是否满足
rucon = gettbprofilesting("ru1205","ma");
tacon = gettbprofilesting("ta1205","ma");
ifcon = gettbprofilesting("if1205","ma");

if(rucon == "true" && tacon == "true" && ifcon == "true" )
{
    buy(1,close);
}
lh948 发表于 2012-5-11 14:31
将收盘价大于MA(C,60)条件记录下来
if(close[1]>AverageFC(Close,60))
    settbprofilestring(symbol,"ma ...


另外在公式前部加上
If(time<0.10) return;
 
 http://blog.sina.com.cn/s/blog_63ea37fc0101ey29.html

No comments: