【直播分享TBQ3-稳定截面策略2025版】
//------------------------------------------------------------------------
// 简称: super_ifmhc
// 名称: 
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
// 来源: wangkaiming
//------------------------------------------------------------------------
////////本公式图层0使用指数
Params
    //此处添加参数

Vars
    //此处添加变量
    Series<Numeric> quote_chg;
    Series<array<Numeric>> array_chg;
    array<Integer> id1;
Events
    OnInit()
    {
        //记得第一个商品是 期货商品指数
        //手动的话全部自己订阅
        //代码订阅则全部代码订阅
        //SubscribeBar("tbf000.TBFT","15m",20250101);
        //SubscribeBar("rb888.SHFE","15m",20250101);
    }
    OnBar(ArrayRef<Integer> indexs)
    {
        
        Numeric i;
        //range[0:datacount-1]
        //计算每个图层的涨跌幅,并把所有涨跌幅放进data0的序列数组里
        //
        Range[i=0:datacount-1] //i可以在range内被使用,指定为当前操作图层 *
        {
            quote_chg = (c - c[1])/c[1]*100;//涨跌幅 *
            Commentary("data["+text(i)+"].quote_chg = "+text(quote_chg));
            data[0].array_chg[0][i] = quote_chg;// [0]表示的是回溯,[i]数组的下标 **
        }
        //开始排序
        array<Integer> id1;
        for i = 1 to GetArraySize(array_chg[1])-1 //根据涨跌幅数组的大小生成下标数组
        {
            Commentary("array_chg[1]["+text(i)+"]="+text(array_chg[1][i]));
            id1[i]=i;//排序数组的一个初始化,0,1,2,3,4,5  
        }
        array<Numeric> q1 = array_chg[1];// array_chg[1] 上一个周期的涨跌幅数组
        Na1Sort2(q1,id1,1,GetArraySize(q1)-1,false);//****
        //对一维数组排序,  返回下标, 不改变原数组 
        //执行完之后,id1就变了,当前下标新排序号,下标数组值为数组原序号(找到下单的品种)
        //id1的值表示图层号 id顺序其实就是已经排序的顺序
        for i=1 to GetArraySize(q1)-1
        {
            Commentary("id1["+text(i)+"]:"+ text(id1[i]));//输出id[i]
            //常见错误:以为 id1[i] 就是图层的data[i] 对应的.. 值
            //id1[1]:4  => 错误的翻译认为 图层1排第四 X  
            //正确的结论是 图层4排第一
            // data[id[2]] , id[第几]
            if( i == 10)
            {
                Commentary("排第10的品种是:"+(data[id1[i]].SymbolName  ));
            }
        }
        
        ///////////////////////////////////////
        //换仓  **
        for i=1 to GetArraySize(id1)-1
        {
            if(i==1)//  if(i < 10) 
            {
                if(data[id1[i]].MarketPosition <=0)// 如果上一根有仓,代表选入过
                {
                    data[id1[i]].buy(1,open);
                }
            }
            else if(i == GetArraySize(id1)-1) // i>90
            {
                if(data[id1[i]].MarketPosition >=0)
                {
                    data[id1[i]].sellshort(1,open);
                }
            }
            else//平仓
            {
                data[id1[i]].sell(0,open);
                data[id1[i]].BuyToCover(0,open);
            }
        }
    }

本周四代码,供学习使用,无订阅版本。

具体可以回放视频。


有订阅版本 ↓


//------------------------------------------------------------------------
// 简称: super_ifmhc
// 名称: 
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
// 来源: wangkaiming
//------------------------------------------------------------------------
////////本公式图层0使用指数
Params
    //此处添加参数

Vars
    //此处添加变量
    Series<Numeric> quote_chg;
    Series<array<Numeric>> array_chg;
    array<Integer> id1;
Events
    OnInit()
    {
        //记得第一个商品是 期货商品指数
        //手动的话全部自己订阅
        //代码订阅则全部代码订阅
        SubscribeBarCounts("tbf000.TBFT","15m",1000);//订阅商品指数,商品指数用来填充
        array<string> get_sym;
        GetDicValue("TB_INDUSTRY","F1020200001",SystemDateTime,get_sym);
        //print(TextArray(get_sym));
        Numeric i;
        for i = 0 to GetArraySize(get_sym)-1
        {
            SubscribeBarCounts(get_sym[i],"15m",200);
        }
    }
    OnBar(ArrayRef<Integer> indexs)
    {
        
        Numeric i;
        //range[0:datacount-1]
        //计算每个图层的涨跌幅,并把所有涨跌幅放进data0的序列数组里
        //
        Range[i=0:datacount-1] //i可以在range内被使用,指定为当前操作图层 *
        {
            quote_chg = (c - c[1])/c[1]*100;//涨跌幅 *
            Commentary("data["+text(i)+"].quote_chg = "+text(quote_chg));
            data[0].array_chg[0][i] = quote_chg;// [0]表示的是回溯,[i]数组的下标 **
        }
        //开始排序
        array<Integer> id1;
        for i = 1 to GetArraySize(array_chg[1])-1 //根据涨跌幅数组的大小生成下标数组
        {
            Commentary("array_chg[1]["+text(i)+"]="+text(array_chg[1][i]));
            id1[i]=i;//排序数组的一个初始化,0,1,2,3,4,5  
        }
        array<Numeric> q1 = array_chg[1];// array_chg[1] 上一个周期的涨跌幅数组
        Na1Sort2(q1,id1,1,GetArraySize(q1)-1,false);//****
        //对一维数组排序,  返回下标, 不改变原数组 
        //执行完之后,id1就变了,当前下标新排序号,下标数组值为数组原序号(找到下单的品种)
        //id1的值表示图层号 id顺序其实就是已经排序的顺序
        for i=1 to GetArraySize(q1)-1
        {
            Commentary("id1["+text(i)+"]:"+ text(id1[i]));//输出id[i]
            //常见错误:以为 id1[i] 就是图层的data[i] 对应的.. 值
            //id1[1]:4  => 错误的翻译认为 图层1排第四 X  
            //正确的结论是 图层4排第一
            // data[id[2]] , id[第几]
            if( i == 10)
            {
                Commentary("排第10的品种是:"+(data[id1[i]].SymbolName  ));
            }
        }
        
        ///////////////////////////////////////
        //换仓  **
        for i=1 to GetArraySize(id1)-1
        {
            if(i==1)//  if(i < 10) 
            {
                if(data[id1[i]].MarketPosition <=0)// 如果上一根有仓,代表选入过
                {
                    data[id1[i]].buy(1,open);
                }
            }
            else if(i == GetArraySize(id1)-1) // i>90
            {
                if(data[id1[i]].MarketPosition >=0)
                {
                    data[id1[i]].sellshort(1,open);
                }
            }
            else//平仓
            {
                data[id1[i]].sell(0,open);
                data[id1[i]].BuyToCover(0,open);
            }
        }
    }



旧链接

https://bbs.tbquant.net/thread/forum12353

【直播公式分享】20240222直播公式,稳定横截面品种切换(解决闪烁)
截面策略如何写
截面策略统计单品种收益
TB中怎么实现横截面策略
福利来了!周四在线直播策略模型开发!
截面策略小周期开仓
期货的横截面多空策略如何编程?
如何实现横截面交易策略
【直播公式分享】20240425 快速排序代码(带注释)
程序化交易经验分享——智能交易策略