怎么获取账户里的当前合约的持仓信息?

账户里明明有持仓,为什么获取不到呢?A_TotalPosition 和 A_GetPosition 都不行;用的账户是模拟账户

加载的图表内容信息,正如已经有同学怀疑,你品种用了888最好也提供可复现代码

回复:我用的是螺纹期货加权指数(交易所的那个0结尾的指数)

回复://------------------------------------------------------------------------ // 简称: EMA30Price // 名称: 价格与30日均线策略 // 类别: 策略应用 // 类型: 内建应用 //------------------------------------------------------------------------ Params Numeric EMA30Length(30); // 30日均线参数 Numeric MinDiff(0); // 与30线的最小价差 Numeric MaxDiff(10); // 与30线的最大价差 Vars Series<Numeric> EMA30Value; // 30日均线值 Numeric CurrentPrice; // 当前实时价格 Numeric Diff; Numeric longPosition; Numeric shortPosition; Bool Flag(False); Events //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作 OnInit() { //与数据源有关 Range[0:DataCount-1] { //=========数据源相关设置============== AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权 AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格 AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓 (据说只是回测时用的) AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算 //=========交易相关设置============== SetSlippage(Enum_Rate_PointPerHand,2); //设置滑点为2跳/手 SetOrderMap2MainSymbol(); //设置委托映射到主力 } } OnReady() { SetBackBarMaxCount(1 + EMA30Length); // 设置最大回溯条数 Range[0:DataSourceSize() - 1] { setPlotOption("EMA30", "begin-bar", EMA30Length); } // 设置 OnBarClose 的执行时间 If(Compare(Frequency(), "1d") == 0) { // 如果为日线级别, 设置收盘提前触发的时间点为0.145900(可根据实际需求调整) Array<Numeric> timePoint; ArrayPushBack(timePoint, 0.145900); ArrayPushBack(timePoint, 0.145930); ArrayPushBack(timePoint, 0.145957); SetTriggerBarClose(timePoint); } } OnBarClose(ArrayRef<Integer> indexs) { Print("OnBarClose 执行时间:" + DateTimeToString(MakeDateTime(Date, Time))); // 计算30日均线 EMA30Value = AverageFC(Close, EMA30Length); PlotNumeric("EMA30", EMA30Value); // 获取当前实时价格(当前bar的收盘价) CurrentPrice = Close[0]; Diff = CurrentPrice - EMA30Value[1]; FileAppend("d:/tb_data/ma30.tbf", "OnBarClose 执行时间: " +DateTimeToString(MakeDateTime(Date, Time)) + ", CurrentPrice: "+Text(CurrentPrice)+", EMA30: "+Text(EMA30Value[1])+", Diff: "+Text(Diff)+", MinDiff: "+Text(MinDiff)+", MaxDiff: "+Text(MaxDiff)); Position pos; //获取当前商品的仓位 String id = A_AccountID(); Numeric value = A_TotalPosition(); FileAppend("d:/tb_data/ma30.tbf", "accountId:" + id + ",A_TotalPosition:" + Text(value)); A_GetPosition("rb2601", pos); longPosition = pos.longCurrentVolume; shortPosition = pos.shortCurrentVolume; FileAppend("d:/tb_data/ma30.tbf", "持仓多头: "+Text(longPosition)+"持仓空头: "+Text(shortPosition)); // 均线上方 If(CurrentPrice > EMA30Value[1] and Diff >= MinDiff and Diff <= MaxDiff) { FileAppend("d:/tb_data/ma30.tbf", "进入多单流程: " +DateTimeToString(MakeDateTime(Date, Time))+", 持仓多头: "+Text(longPosition)+", 持仓空头: "+Text(shortPosition)); // 先平空单 If(shortPosition > 0) // 有空单 { Flag = BuyToCover(0, Close); FileAppend("d:/tb_data/ma30.tbf", "平空单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } // 再开多单 If(longPosition <= 0) // 没有多单 { Flag = Buy(0, Open); FileAppend("d:/tb_data/ma30.tbf", "开多单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } } // 均线下方 If(CurrentPrice < EMA30Value[1] and -Diff >= MinDiff and -Diff <= MaxDiff) { FileAppend("d:/tb_data/ma30.tbf", "进入空单流程: " +DateTimeToString(MakeDateTime(Date, Time))+", 持仓多头: "+Text(longPosition)+", 持仓空头: "+Text(shortPosition)); // 先平多单 If(longPosition > 0) // 有多单 { Flag = Sell(0, Close); FileAppend("d:/tb_data/ma30.tbf", "平多单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } // 再开空单 If(shortPosition <= 0) // 没有空单 { Flag = SellShort(0, Open); FileAppend("d:/tb_data/ma30.tbf", "开空单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } } } 这个是我的代码

回复://------------------------------------------------------------------------// 简称: EMA30Price// 名称: 价格与30日均线策略// 类别: 策略应用// 类型: 内建应用//------------------------------------------------------------------------Params Numeric EMA30Length(30); // 30日均线参数 Numeric MinDiff(0); // 与30线的最小价差 Numeric MaxDiff(10); // 与30线的最大价差Vars Series<Numeric> EMA30Value; // 30日均线值 Numeric CurrentPrice; // 当前实时价格 Numeric Diff; Numeric longPosition; Numeric shortPosition; Bool Flag(False);Events //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作 OnInit() { //与数据源有关 Range[0:DataCount-1] { //=========数据源相关设置============== AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权 AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格 AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓 (据说只是回测时用的) AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算 //=========交易相关设置============== SetSlippage(Enum_Rate_PointPerHand,2); //设置滑点为2跳/手 SetOrderMap2MainSymbol(); //设置委托映射到主力 } } OnReady() { SetBackBarMaxCount(1 + EMA30Length); // 设置最大回溯条数 Range[0:DataSourceSize() - 1] { setPlotOption("EMA30", "begin-bar", EMA30Length); } // 设置 OnBarClose 的执行时间 If(Compare(Frequency(), "1d") == 0) { // 如果为日线级别, 设置收盘提前触发的时间点为0.145900(可根据实际需求调整) Array<Numeric> timePoint; ArrayPushBack(timePoint, 0.145900); ArrayPushBack(timePoint, 0.145930); ArrayPushBack(timePoint, 0.145957); SetTriggerBarClose(timePoint); } } OnBarClose(ArrayRef<Integer> indexs) { Print("OnBarClose 执行时间:" + DateTimeToString(MakeDateTime(Date, Time))); // 计算30日均线 EMA30Value = AverageFC(Close, EMA30Length); PlotNumeric("EMA30", EMA30Value); // 获取当前实时价格(当前bar的收盘价) CurrentPrice = Close[0]; Diff = CurrentPrice - EMA30Value[1]; FileAppend("d:/tb_data/ma30.tbf", "OnBarClose 执行时间: " +DateTimeToString(MakeDateTime(Date, Time)) + ", CurrentPrice: "+Text(CurrentPrice)+", EMA30: "+Text(EMA30Value[1])+", Diff: "+Text(Diff)+", MinDiff: "+Text(MinDiff)+", MaxDiff: "+Text(MaxDiff)); Position pos; //获取当前商品的仓位 String id = A_AccountID(); Numeric value = A_TotalPosition(); FileAppend("d:/tb_data/ma30.tbf", "accountId:" + id + ",A_TotalPosition:" + Text(value)); A_GetPosition("rb2601", pos); longPosition = pos.longCurrentVolume; shortPosition = pos.shortCurrentVolume; FileAppend("d:/tb_data/ma30.tbf", "持仓多头: "+Text(longPosition)+"持仓空头: "+Text(shortPosition)); // 均线上方 If(CurrentPrice > EMA30Value[1] and Diff >= MinDiff and Diff <= MaxDiff) { FileAppend("d:/tb_data/ma30.tbf", "进入多单流程: " +DateTimeToString(MakeDateTime(Date, Time))+", 持仓多头: "+Text(longPosition)+", 持仓空头: "+Text(shortPosition)); // 先平空单 If(shortPosition > 0) // 有空单 { Flag = BuyToCover(0, Close); FileAppend("d:/tb_data/ma30.tbf", "平空单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } // 再开多单 If(longPosition <= 0) // 没有多单 { Flag = Buy(0, Open); FileAppend("d:/tb_data/ma30.tbf", "开多单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } } // 均线下方 If(CurrentPrice < EMA30Value[1] and -Diff >= MinDiff and -Diff <= MaxDiff) { FileAppend("d:/tb_data/ma30.tbf", "进入空单流程: " +DateTimeToString(MakeDateTime(Date, Time))+", 持仓多头: "+Text(longPosition)+", 持仓空头: "+Text(shortPosition)); // 先平多单 If(longPosition > 0) // 有多单 { Flag = Sell(0, Close); FileAppend("d:/tb_data/ma30.tbf", "平多单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } // 再开空单 If(shortPosition <= 0) // 没有空单 { Flag = SellShort(0, Open); FileAppend("d:/tb_data/ma30.tbf", "开空单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } } }

回复:能复现吗??

回复:不是告诉你问题在哪了吗?看了你描述也知道没法获得持仓让他们复现多此一举😯

坦率的说合约代码是 rb2601.SHFEA_GetPosition(MainSymbol(Symbol()), Pos)

回复:好的,我再试试

我盲猜一下,你不会用的是888映射主力合约交易buysell吧......

回复:我用的是螺纹期货加权指数(交易所的那个0结尾的指数)

回复://------------------------------------------------------------------------ // 简称: EMA30Price // 名称: 价格与30日均线策略 // 类别: 策略应用 // 类型: 内建应用 //------------------------------------------------------------------------ Params Numeric EMA30Length(30); // 30日均线参数 Numeric MinDiff(0); // 与30线的最小价差 Numeric MaxDiff(10); // 与30线的最大价差 Vars Series<Numeric> EMA30Value; // 30日均线值 Numeric CurrentPrice; // 当前实时价格 Numeric Diff; Numeric longPosition; Numeric shortPosition; Bool Flag(False); Events //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作 OnInit() { //与数据源有关 Range[0:DataCount-1] { //=========数据源相关设置============== AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权 AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格 AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓 (据说只是回测时用的) AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算 //=========交易相关设置============== SetSlippage(Enum_Rate_PointPerHand,2); //设置滑点为2跳/手 SetOrderMap2MainSymbol(); //设置委托映射到主力 } } OnReady() { SetBackBarMaxCount(1 + EMA30Length); // 设置最大回溯条数 Range[0:DataSourceSize() - 1] { setPlotOption("EMA30", "begin-bar", EMA30Length); } // 设置 OnBarClose 的执行时间 If(Compare(Frequency(), "1d") == 0) { // 如果为日线级别, 设置收盘提前触发的时间点为0.145900(可根据实际需求调整) Array<Numeric> timePoint; ArrayPushBack(timePoint, 0.145900); ArrayPushBack(timePoint, 0.145930); ArrayPushBack(timePoint, 0.145957); SetTriggerBarClose(timePoint); } } OnBarClose(ArrayRef<Integer> indexs) { Print("OnBarClose 执行时间:" + DateTimeToString(MakeDateTime(Date, Time))); // 计算30日均线 EMA30Value = AverageFC(Close, EMA30Length); PlotNumeric("EMA30", EMA30Value); // 获取当前实时价格(当前bar的收盘价) CurrentPrice = Close[0]; Diff = CurrentPrice - EMA30Value[1]; FileAppend("d:/tb_data/ma30.tbf", "OnBarClose 执行时间: " +DateTimeToString(MakeDateTime(Date, Time)) + ", CurrentPrice: "+Text(CurrentPrice)+", EMA30: "+Text(EMA30Value[1])+", Diff: "+Text(Diff)+", MinDiff: "+Text(MinDiff)+", MaxDiff: "+Text(MaxDiff)); Position pos; //获取当前商品的仓位 String id = A_AccountID(); Numeric value = A_TotalPosition(); FileAppend("d:/tb_data/ma30.tbf", "accountId:" + id + ",A_TotalPosition:" + Text(value)); A_GetPosition("rb2601", pos); longPosition = pos.longCurrentVolume; shortPosition = pos.shortCurrentVolume; FileAppend("d:/tb_data/ma30.tbf", "持仓多头: "+Text(longPosition)+"持仓空头: "+Text(shortPosition)); // 均线上方 If(CurrentPrice > EMA30Value[1] and Diff >= MinDiff and Diff <= MaxDiff) { FileAppend("d:/tb_data/ma30.tbf", "进入多单流程: " +DateTimeToString(MakeDateTime(Date, Time))+", 持仓多头: "+Text(longPosition)+", 持仓空头: "+Text(shortPosition)); // 先平空单 If(shortPosition > 0) // 有空单 { Flag = BuyToCover(0, Close); FileAppend("d:/tb_data/ma30.tbf", "平空单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } // 再开多单 If(longPosition <= 0) // 没有多单 { Flag = Buy(0, Open); FileAppend("d:/tb_data/ma30.tbf", "开多单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } } // 均线下方 If(CurrentPrice < EMA30Value[1] and -Diff >= MinDiff and -Diff <= MaxDiff) { FileAppend("d:/tb_data/ma30.tbf", "进入空单流程: " +DateTimeToString(MakeDateTime(Date, Time))+", 持仓多头: "+Text(longPosition)+", 持仓空头: "+Text(shortPosition)); // 先平多单 If(longPosition > 0) // 有多单 { Flag = Sell(0, Close); FileAppend("d:/tb_data/ma30.tbf", "平多单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } // 再开空单 If(shortPosition <= 0) // 没有空单 { Flag = SellShort(0, Open); FileAppend("d:/tb_data/ma30.tbf", "开空单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } } } 这是我的代码

回复:不用看代码了我简单解释一下getposition在使用的时候,如果你没有指定合约smbol参数,那么默认就根据你图表是什么symbol就查什么品种你开了映射,所以你账户里的品种和图表实际不是一个symbol图表是000 账户里 2601你查鲁迅,关我周树人什么事?所以,你可以再看一下函数手册,getposition是有指定symbol的用法的。你可以用relativesymbol来获取000对应的主力合约2601,这样查就有了

头寸管理里挂上账户了吗?

回复:我已经把账户id打印出来了啊,能够拿到账户id,这是应该挂成功了吧?而且我用 A_GetPosition("rb2601", pos); 直接获取持仓的主力合约也拿不到持仓信息

回复:确认你这个语句执行在实时

回复:是实时执行了啊,打印的日志里都有时间,而且订单也触发了,总共下了29单!

回复:帮忙回答下啊