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

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



怎么获取当前持仓品种的持仓市值
TBQ如何获取当前账户的持仓情况?
如何获取连续合约的映射合约持仓信息
888合约下A函数如何获取实时持仓信息
如果获取连续合约(888合约)图表上的连续合约对应主力合约的账户实际持仓?
请问如何获得账户持仓信息
获取品种当前的所有合约数据
怎么在回测环境下获取当前持仓的市值
怎么在回测环境下获取当前持仓的市值
交易账户的持仓统计没有上日的商品持仓信息

加载的图表内容信息,正如已经有同学怀疑,你品种用了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单!


帮忙回答下啊