tb数据库读写bug
前提,用A程序写入数据库变量,频率很低,只有发生信号才会写,6个B程序读取A写入的数据库变量,B程序是tick出发读取,不写入。发现绝大部分程序运行正常,但小概率事件会出现,其中5个B程序读取正常,1个B程序读取错误,这个错误并不是invalidstring类型,而是数据库别的某个变量值。这个数值正确与否比较难判断。
很闹心,万一读错了,造成大量开仓和平仓是件非常可怕的事情。希望tb能解决上述数据库读写bug。
补充一下:每个程序分别占用一个图表。 是的,我也发现了,特别是读写的程序一多,就会出现读写错误,会读写到别的健名上,比如我这里有30个公式(A01—A30)每个TICK对数据库进行读写,30个公式分别读写同一个块名(Section)下30个不同键名(Key)下的值(Value),经常就会出现交叉写入跟交叉读取的情况,比如A01公式正常是读写键名A01下的值,却读到键名A05的值,写数据时写到键名A12下。这个情况发生的几率很低,只是偶尔会出现,原因不明,现在我暂时的处理就是在每个值后面加上一个编号标识,然后在公式里验证,防止错误。 superwin 发表于 2016-1-13 16:22 static/image/common/back.gif
是的,我也发现了,特别是读写的程序一多,就会出现读写错误,会读写到别的健名上,比如我这里有30个公式( ...
你说的确实是个不错的解决方案,我试试。 我也发现读写数据库有问题,希望tb马上处理。 if(xxxx==InvalidNumeric){return;}都无效。 读写数据库有问题,我是这样发现的。我的目的是公式每5分钟检查一下数据库持仓和实际持仓(A_BuyPosition、A_SellPosition)的差别,以便按数据库持仓为准来调整实际持仓,因交易时间或其他原因会造成实际持仓和数据库持仓的不同步。
我当初以为是函数A_BuyPosition、A_SellPosition有问题,看来不是。后来我在读数据库持仓时,加入if(xxxx==InvalidNumeric){return;}也无法避免错误出现。也就是说,当我的数据库持仓和实际持仓相等时,程序也会做出调整持仓的动作(其实是错误的),而后又出现纠错的调整(这次是正确的)。这样就造成无谓的交易动作,损失手续费的同时,还有可能出现交易损失(当然有可能出现交易获利),非常郁闷,找不出具体问题根源,希望tb做出回应,如确实是读写数据库问题,请尽快纠正。 buycc=A_BuyPosition();
sellcc=A_SellPosition();
if(buycc==InvalidNumeric or sellcc==InvalidNumeric or buycc>10000 or sellcc>10000 or BuyLotsz01==InvalidNumeric or BuyLotsz02==InvalidNumeric or BuyLotsz01>10000 or BuyLotsz02>10000) {return;}
if(TimeDiff(GetGlobalVar(44),SystemDateTime)>300)
{
if(strValued_x=="x+1" and buycc<>BuyLotsz01)
{
if(buycc>BuyLotsz01) {A_SendOrder(Enum_Sell,Enum_Exit,buycc-BuyLotsz01,Q_BidPrice-3*chajia);SetGlobalVar(44,SystemDateTime);return;}
if(buycc<BuyLotsz01) {A_SendOrder(Enum_Buy,Enum_Entry,BuyLotsz01-buycc,Q_AskPrice+3*chajia);SetGlobalVar(44,SystemDateTime);return;}
}
if(strValuek_x=="x-1" and sellcc<>BuyLotsz02)
{
if(sellcc>BuyLotsz02) {A_SendOrder(Enum_Buy,Enum_Exit,sellcc-BuyLotsz02,Q_AskPrice+3*chajia);SetGlobalVar(44,SystemDateTime);return;}
if(sellcc<BuyLotsz02) {A_SendOrder(Enum_Sell,Enum_Entry,BuyLotsz02-sellcc,Q_BidPrice-3*chajia);SetGlobalVar(44,SystemDateTime);return;}
}
if(strValued_x=="xdt" and buycc<>0) {A_SendOrder(Enum_Sell,Enum_Exit,buycc,Q_BidPrice-3*chajia);SetGlobalVar(44,SystemDateTime);return;}
if(strValuek_x=="xkt" and sellcc<>0) {A_SendOrder(Enum_Buy,Enum_Exit,sellcc,Q_AskPrice+3*chajia);SetGlobalVar(44,SystemDateTime);return;}
}
if((strValued_x=="x+1" and buycc<>BuyLotsz01) or (strValuek_x=="x-1" and sellcc<>BuyLotsz02) or (strValued_x=="xdt" and buycc<>0) or (strValuek_x=="xkt" and sellcc<>0)) {return;} 本帖最后由 fqxing95 于 2016-1-22 14:33 编辑
strValued_x=="x+1"-------多头有持仓
strValuek_x=="x-1"--------空头有持仓
BuyLotsz01-------数据库多头持仓数量
BuyLotsz02-------数据库空头持仓数量
strValued_x=="xdt"---------多头无持仓
strValuek_x=="xkt"---------空头无持仓
以上读数据库出现问题,也没有什么规律,而是偶尔出现错误。