全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
已解决
二维数组追加行的问题,求大佬解答
lucron 分享到
2023-12-05 13:40

发生的问题:请看一下图4,代码在最后

data-href=

data-href=

data-href=

data-href=


完整代码如下:

Params
	Numeric Length1(5);
	Numeric Length2(10);
Vars
	Series<Numeric> ma1;
	Series<Numeric> ma2;
	
	Bool jincha(False);
	Bool sicha(False);
	Series<Numeric> yihang;
	Series<Numeric> erzuhang;
	Global Array<Array<Numeric>> yizu;
	Global Array<Array<Numeric>> erzu;
Events
	//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
	OnBar(ArrayRef<Integer> indexs)
	{
		Range[0:DataSourceSize() - 1]
		{
			//均线赋值
			ma1=AverageFC(Close,Length1);
			ma2=AverageFC(Close,Length2);
			//判断是否显示画线
			If(Length1 > 0)
			{
				PlotNumeric(MA1,ma1);
			}
			If(Length2 > 0)
			{
				PlotNumeric(MA2,ma2);
			}
		}
		//判断金叉与死叉
		jincha=CrossOver(ma1,ma2);
		sicha=CrossUnder(ma1,ma2);
		//获取二维数组的行数 由于起始行为0 所以不用+1
		yihang=GetArraySize(yizu);
		erzuhang=GetArraySize(erzu);
		
		If(CurrentBar()==1)
		{
			//第二根K线插入
			ArrayInsert(yizu,yihang,0,1);
			ArrayInsert(yizu,yihang,1,CurrentBar());
			}
		Else If(jincha)
		{
			//均线金叉才插入
			ArrayInsert(erzu,erzuhang,0,2);
			ArrayInsert(erzu,erzuhang,1,CurrentBar());
			}
		Else If(sicha)
		{
			//均线死叉才插入
			ArrayInsert(yizu,yihang,0,-1);
			ArrayInsert(yizu,yihang,1,CurrentBar());
			}
		Else
			Commentary(当前不满足条件不追加数组。);
		
		//打印
		Commentary(当前K线数: + Text(CurrentBar()));
        Commentary(yizu行数: + Text(GetArraySize(yizu)) + ,内容: + TextArray(yizu));
        Commentary(erzu行数: + Text(GetArraySize(erzu)) + ,内容: + TextArray(erzu));
    }


kyover

因为你是global啊

历史bar一根只运行多次,只往里面添加一次

可是后面的实时bar是每个tick运行一次,你这日线,一根bar就会运行几万次,就会往里面添加几万个数据

两种方案

第一 global改成series

第二 还是global 但是一根bar写入数据的时机限定在开盘或者收盘,用onbaropen或者onbarclose,保证一根bar只运行一次

2023-12-06 10:56
lucron
@kyover

我发现实际的问题根源在IndustryAdaptor指标中的predictVol预测成交量,当它启用的时候最后5个Bar的数据才会出问题,如果关闭就是正常的。(预测成交量正好是以最近5天的同时段成交量对比)

当启用预测成交量的时候输出2,不启用的时候为1

DataCount()=2

DataSourceSize()=2

barexiststatus()=1


我现在想知道原理机制,如何在写指标的时候避免这种情况,就是在启用预测成交量的时候还可以正常计算,谢谢



//在新bar的第一次执行之前调用一次,参数为新bar的图层数组

OnBarOpen(ArrayRef<Integer> indexs)

{

//把计算内容放在这里也不行

}


2023-12-07 11:19
lucron

我发现实际的问题根源在IndustryAdaptor指标中的predictVol预测成交量,当它启用的时候最后5个Bar的数据才会出问题,如果关闭就是正常的。(预测成交量正好是以最近5天的同时段成交量对比)

当启用预测成交量的时候输出2,不启用的时候为1

DataCount()=2

DataSourceSize()=2

barexiststatus()=1


我现在想知道原理机制,如何在写指标的时候避免这种情况,就是在启用预测成交量的时候还可以正常计算,谢谢


//在新bar的第一次执行之前调用一次,参数为新bar的图层数组

OnBarOpen(ArrayRef<Integer> indexs)

{

//把计算内容放在这里也不行

}


2023-12-07 11:18
kyover

因为industryadaptor里面订阅了tick图层。代码都是公开的,你可以打开看看

建议测试自己公式的时候把其他公式都清除掉。现在公式之间是可以交互的,会影响执行结果

2023-12-07 11:22
lucron
@kyover

谢谢,明白了,刚转来tb才几天

那么公式之间是可以交互的,假设我加载了2个公式

一个myMA和myBOLL

在myMA中设置了一个全局变量Global integer ma20;

在myBOLL中设置了一个局部变量integer ma20;

这种情况下会交互吗?也就是myMA中的全局变量会不会影响myBOLL的同名变量?


2023-12-07 11:47
kyover
@lucron

这个不会,但是驱动机制,信号等是会共享的。

比如a公式开的仓,b公式可以平掉

建议看一下视频区的0基础视频补充好基础常识

2023-12-07 15:13
您未登录,请先 登录注册 后发表评论
顶部