


账户里明明有持仓,为什么获取不到呢?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.SHFE
A_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单!
帮忙回答下啊