TBQ标准版,买入或卖出开仓后,多次发单,造成图表与真实账户持仓数量不一致,无法调取longCurrentVolume数据,无法按照真实账户longCurrentVolume平仓,请问如何解决?谢谢!
我只能说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;
}
}
}
}