在分钟图上不显示信号了
//------------------------------------------------------------------------
// 简称: EMA30Price
// 名称: 均线斜率
// 1.跌破前低就止损
// 2.止损以后下一根K线不开仓
// 类别: 策略应用
// 类型: 内建应用
//------------------------------------------------------------------------
Params
    Numeric EMA30Length(30); // 30日均线参数
    Numeric MinDiff(0);   // 与30线的最小价差
    Numeric MaxDiff(100);   // 与30线的最大价差
    Numeric DiffPrice(3);   // 多几跳去买/卖
    Numeric SlopeCnt(5);   // 近N天均线值的斜率
    Numeric SlopeVal(1); // 斜率
    Numeric DiffPercent(0.02); // 价差
    Numeric LHKCnt(15); // 价差
Vars
    Series<Numeric> ema30; // 30日均线值
    Series<Numeric> slope; // 30日均线值
    Numeric CurrentPrice; // 当前实时价格
    Numeric Diff;
    Numeric longPosition;
    Numeric shortPosition;
    Bool Flag(False);
    String mainSymbol;
    Numeric Cnt(1);   // 手数
    Global Numeric Skip; // 止损以后跳过的K线(跳过几根K线再开仓)
    //此处添加变量
    Plot plt;
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(ArrayRef<Integer> indexs)
    {
        Numeric endTime = data1.RealEndDateTime();
        Numeric currentTime = SystemDateTime();

        Print("OnBarClose 执行时间:" +DateTimeToString(currentTime)+ ", RealEndDateTime: " +DateTimeToString(endTime));

        data1.Commentary("Skip: " + Text(Skip));

        if (endTime < currentTime)
        {
            Print("跳过回测K线 " + DateTimeToString(MakeDateTime(Date, Time)));
            return;
        }

        if (Skip > 0)
        {
            Print("跳过执行, Skip: " + Text(Skip) + DateTimeToString(MakeDateTime(Date, Time)));
            Skip = Skip - 1;
            return;
        }

        // 获取当前实时价格(当前bar的close价)
        CurrentPrice = data1.Close();

        // 计算分钟线的最低价格/最高价格
        Numeric i;
        Numeric curPrice;
        Numeric backCnt;
        Numeric lowest = 99999999;
        for i = 1 to LHKCnt
        {
            curPrice = data1.Close[i];

            if(curPrice<lowest)
            {
                backCnt = i;
                lowest = curPrice;
            }
        }

        Bar barVal;
        Bool ret = data1.GetBar(barVal, backCnt);
        data1.Commentary("Lowest: " + Text(lowest) + "," +DateTimeToString(barVal.dateTime));


        Numeric highest = 0;

        for i = 1 to LHKCnt
        {
            curPrice = data1.Close[i];
            if(highest<curPrice)
            {
                backCnt = i;
                highest = curPrice;
            }
        }
        ret = data1.GetBar(barVal, backCnt);
        data1.Commentary("Highest: " + Text(highest)  + "," + DateTimeToString(barVal.dateTime));

        //获取当前商品的仓位
        Position pos;
        mainSymbol = MainSymbol(Symbol());

        A_GetPosition(mainSymbol, pos);
        longPosition = pos.longCurrentVolume;
        shortPosition = pos.shortCurrentVolume;

        Print("多单量: " + Text(longPosition) + ", 空单量 : " + Text(shortPosition) + ", " +DateTimeToString(MakeDateTime(Date, Time)));

            Numeric TargetPrice = Round(lowest * (1+DiffPercent), 1);
            data1.Commentary("跌到: " + Text(TargetPrice) + " 开多");
            if (CurrentPrice > lowest && CurrentPrice <= TargetPrice)
            {
                if(longPosition <= 0) // 没有多单
                {
                    Print("开多单, data0.slope: " + Text(data0.slope) + ", SlopeVal: " + Text(SlopeVal) + ", ema30: " + Text(data0.ema30) + ", CurrentPrice: " + Text(CurrentPrice) + ", lowest: " + Text(lowest) + ", " + DateTimeToString(MakeDateTime(Date, Time)));

		            plt.text("Text",Low, "开多");

                    Flag = data1.Buy(Cnt, CurrentPrice + DiffPrice); // 尽量成交,减少偷价
                    FileAppend("d:/tb_data/ma30.tbf", "开多单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0)));
                }
            }
    }


以上是相关代码,data0是日线,data1是分钟线;

原来是用 data1.MarketPosition 判断信号的,可正确在分钟图上显示入场/出场信号,如下图:


但是改为 A_GetPosition(mainSymbol, pos);  判断仓位以后,在分钟图上就不显示信号了,信号跑到日线图上了,如下图:



麻烦各位老师帮忙看看

策略里PlotNumeric显示的线条可否有些显示在主图上,有些显示在子图上
持仓量指标能显示在主图上吗
主图上显示指标
严重问题TBQ多图层信号,显示和持仓显示不匹配!
请教,用日线数据在5分钟图上画线,这个怎么写?
在5分钟图上,怎么样获取过去3天的最高价?
求教怎么把输出的图显示在子图上
简语言变量参数在K线图上的显示
在附图上增加标注
在5分钟图上,怎么样获取过去3天的最高价?

A_GetPosition是实时函数,你没登账户不会有持仓,而且实时是没有历史的

我登录账户了,用的是模拟账户;另外我的平多单的方法已经被触发了,而且执行到Sell函数了,Flag 的值显示为1, 但是怎么持有的多单就是没有被平仓掉啊?我这个多单是手动开仓的

另外我用 A_GetPosition 已经拿到持有的多单数量了


图表和A函数混用是不会有什么正确结果的

你A_GetPosition 取到有什么用,刷新一下看看 图表上还会在吗?

意思是 推荐用MarketPosition 做真正的持仓信号是吗?用A_GetPosition是因为可以拿到真正的持仓信息,以免MarketPosition发生信号闪烁导致重复开仓;

图表系统就用图表信号


那我上面那个sell函数被触发了,但是却没有平仓,是因为 MarketPosition 的原因啊?还是因为我这个单子是手动开仓的单子引起的啊?

另外我的平多单的方法已经被触发了,而且Flag 的值显示为1, 但是怎么持有的多单就是没有被平仓掉啊?我这个多单是手动开仓的

原来使用 data1.MarketPosition 判断仓位的时候,可在分钟图上看到信号,但是改为 A_GetPosition(mainSymbol, pos); 判断仓位以后,在分钟图上就看不到信号了

不同图层需要加前缀运行