TBQ标准版,请问无法按照真实账户longCurrentVolume平仓,该如何解决?谢谢!

TBQ标准版,买入或卖出开仓后,多次发单,造成图表与真实账户持仓数量不一致,无法调取longCurrentVolume数据,无法按照真实账户longCurrentVolume平仓,请问如何解决?谢谢!

主要问题是在于A_GetPosition无法获取实时的持仓信息吗?我也发现了,用A函数交易后,longCurrentVolume和shortCurrentVolume 都是0

回复:a函数和图表函数就不是一个系统的

我只能说getposition函数是没问题的,position结构体也是好的,就算是要帮你改,也必须提供一个可运行的demo来调试,否则就只能你自己调试代码

另外即使我把图表删除,全部改为A函数执行,也无法解决上面的问题。

你们的很多相关问题以及视频教程看了,尝试了没能解决。麻烦老师再看一下另外两张图片。Bool ret = A_Sell(MainSymbol, pos.longCurrentVolume, Q_BidPrice, orders, , );这里面的pos.longCurrentVolume无法获取A_GetPosition读出来的longCurrentVolume实时数据,无法全平多头26手,只会默认平1手,而把pos.longCurrentVolume改为其他常数数据如10,它就能按照常数数据平仓10手。我的主要问题是如何调用longCurrentVolume或shortCurrentVolume实时数据?谢谢!

写了一大堆东西,但是我确实看不明白你想表达什么,有点乱。这里有一些使用a函数报单的策略编写实例,你看看有没有帮助吧。 https://space.bilibili.com/31053817/channel/seriesdetail?sid=2531821 https://www.bilibili.com/video/BV1Gw411k7bD/?spm_id_from=333.999.0.0

遍历每个账户。获取每个账户指定符号(MainSymbol)的当前持仓。检查市场持仓是否为零(即是否有持仓)。如果市场持仓为多(MarketPosition == 1),并且是Bar的末尾(BarStatus == 2)且尚未发送订单(sendCount == 0),则:发送一个卖出订单以关闭当前的多头仓位。将sendCount递增,表示已发送订单。该代码使用诸如A_GetPosition之类的函数来检索持仓信息,使用A_Sell来发送卖出订单。它还使用Print将信息输出到控制台,用于调试或记录。以下是代码主要元素的更详细分解:OnBar(ArrayRef<Integer> indexs):这看起来是在价格图表形成新Bar时调用的主函数。For i = 0 To A_AccountCount - 1:一个循环,遍历每个账户。Range[0:DataCount - 1]:这一行不清楚是什么作用,因为它不是标准的构造。它可能是特定于您使用的脚本语言或软件的。Position pos:一个用于存储持仓信息的变量。Bool ret = A_GetPosition(MainSymbol, pos, \"\", i):一个函数调用,获取账户i的MainSymbol的当前持仓。函数的结果存储在布尔变量ret中。Print(\"A_GetPosition:\" + IIFString(ret, \"True\", \"False\") + \",\" + Text(pos)):输出持仓检索结果。If (ret && MarketPosition != 0):检查持仓检索是否成功且市场持仓不为零。If (MarketPosition == 1 && BarStatus == 2 && sendCount == 0):检查当前持仓是否为多,是否为Bar的末尾,以及是否尚未发送订单。A_Sell(MainSymbol, pos.longCurrentVolume, Q_BidPrice, orders, \"\", \"\"):发送一个卖出订单以关闭多头仓位。Print(\"A_Sell:\" + IIFString(ret, \"True\", \"False\") + \",\" + TextArray(orders)):输出卖出订单的结果。sendCount = sendCount + 1:递增sendCount,表示已发送订单。

相关代码如下:OnBar(ArrayRef<Integer> indexs) { Integer i; For i = 0 To A_AccountCount - 1 Range[0:DataCount - 1] { // 获取每个账户的持仓信息 Position pos; //获取指定合约当前仓位 Bool ret = A_GetPosition(MainSymbol, pos, \"\", i); Print(\"A_GetPosition:\" + IIFString(ret, \"True\", \"False\") + \",\" + Text(pos)); If (ret && MarketPosition != 0) { // 如果持仓不为零,则平仓 If (MarketPosition == 1 ) { if(BarStatus == 2 && sendCount == 0) {//发平仓单 Array<Integer> orders; //指定账户指定合约多头平仓 Bool ret = A_Sell(MainSymbol, pos.longCurrentVolume, Q_BidPrice, orders, \"\", \"\"); Print(\"A_Sell:\" + IIFString(ret, \"True\", \"False\") + \",\" + TextArray(orders)); Print(\"pos.longCurrentVolume:\" + IIFString(ret, \"True\", \"False\") + \",\"+ Text(pos.longCurrentVolume)); if(ret) { sendCount = sendCount + 1; } } } }

OnBar(ArrayRef<Integer> indexs) { ……

相关代码如下:// 遍历所有账户 Integer i; For i = 0 To A_AccountCount - 1 Range[0:DataCount - 1] { // 获取每个账户的持仓信息 Position pos; //获取指定合约当前仓位 Bool ret = A_GetPosition(MainSymbol, pos, \"\", i); Print(\"A_GetPosition:\" + IIFString(ret, \"True\", \"False\") + \",\" + Text(pos)); If (ret && MarketPosition != 0) { // 如果持仓不为零,则平仓 If (MarketPosition == 1 ) { if(BarStatus == 2 && sendCount == 0) {//发平仓单 Array<Integer> orders; //指定账户指定合约多头平仓 Bool ret = A_Sell(MainSymbol, pos.longCurrentVolume, Q_BidPrice, orders, \"\", \"\"); Print(\"A_Sell:\" + IIFString(ret, \"True\", \"False\") + \",\" + TextArray(orders)); Print(\"pos.longCurrentVolume:\" + IIFString(ret, \"True\", \"False\") + \",\"+ Text(pos.longCurrentVolume)); if(ret) { sendCount = sendCount + 1; } } } }