全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
我写的策略,在模拟盘运行时,不发单,请帮助
vdm666 分享到
2021-11-17 15:08

我写了一个策略,回测复盘时有交易信号。
加载到交易策略中自动运行,账户为股票模拟账户,数据源为次新股,肉眼观察,今天应该有3笔委托发单,但是一笔也没有,不知程序错在哪里,请指教,策略代码如下:

//------------------------------------------------------------------------
// 简称: zndk20211102_02_42
// 名称: 股票 次新股,突破5日前高入场,跟踪止盈
// 类别: 公式应用
// 类型: 用户应用
    //入场,30日内次新股,突破5日前高,入场价kdj_price,
    //资金管理,每单固定金额5万;
    //止损,成本的20%,k_Bstop = kdj_price*0.80;
    //止盈,跟踪止盈,1、连续15日,股价在5日线之上,5日线为止盈位;
    //               2、浮盈40%以上,零保护;
   
//------------------------------------------------------------------------
Params
    //此处添加参数
    //Numeric millsecs(1000);
    Numeric n(5);                //突破周期
    Numeric k(30);                //上市时间(小于30日)
    Numeric RiskRatio(50000);    //仓位轻重 (5万元)
    Numeric stop_bl(20);        //止损比例 (10~20%)
    
    Numeric lingbaohu(40);            //零保护位置 浮盈40%
    //Numeric jiacang(5);             //加仓次数(1~5)
    
Vars
    //此处添加变量
    Numeric lots;    //可开仓手数
    //Series<Numeric> OpenLots;   //历次建仓手数
    
    //Series<Numeric> ma2d;
    Series<Numeric> ma5d;    
        
    Global Numeric kdj_Price;        //kdj低位时的入场价
    
    //Global Numeric jiancang(0);    //建仓次数(1~5)
    
    
    Series<Numeric> k_ATR;  
    Global Numeric k_Bstop;   //止损价
    
    Numeric Highest_bs;// = Highest(high, BarsSinceLastEntry());//最后一次建仓以来的最高价
        
        
Defs
    //此处添加公式函数
    Numeric calcAvg(Numeric a,Numeric b)
    {
        return (a+b)/2;
    }

Events    

     OnInit()
    {
        //SubscribeBar(symbol(),"15m",20210301);//"i2109.DCE"
        //SubscribeBar(symbol(),"1D",20210301);//"i2109.DCE"
       
        Range[0:DataCount-1]
        {
            AddDataFlag(Enum_Data_RolloverBackWard());//设置后复权
            AddDataFlag(Enum_Data_RolloverRealPrice());//是否映射真实价格
            //AddDataFlag(Enum_Data_AutoSwapPosition());//设置自动换仓
            //AddDataFlag(Enum_Data_IgnoreSwapSignalCalc());//设置忽略换仓信号计算
        }
    
    }
    
    //此处实现事件函数
OnBar(ArrayRef<Integer> indexs)
{
        Highest_bs = Highest(high, BarsSinceLastEntry());//最后一次建仓以来的最高价
        
        //入场价位计算
        kdj_Price = Highest(high[1],n);
            
        //仓位计算
        lots = RiskRatio/kdj_Price;//计划购买股票手数
        lots = RoundUp(lots,-2); // 对小数向上取整
        
        
                
    //均线计算
    //ma2d  = Average(SMA(Close,2,1),2);//2日均线
    ma5d  = Average(SMA(Close,4,1),2);//5日均线
    
        Bool bool06 = high>kdj_Price;
        Bool bool08 = BarCount()<k;
        bool bool09 = open>ma5d[1] && close>ma5d[1];//价格持续在5日线之上
        
    //**********************
    //多头开、平仓
    //**********************
                
    If(MarketPosition <> 1 )
    {
        
        If(bool08 && Bool06)//突破5日高点
        {
            Buy(lots,max(kdj_price,open));
            k_Bstop =kdj_Price*(100 - stop_bl)/100;   //止损
            //jiancang = jiancang+1;
        }
    }
        
   
    //多头持仓,止损,止盈,加仓
    if(MarketPosition == 1)
    {
        k_Bstop =RoundUp(LastEntryPrice()*(100 - stop_bl)/100,2);   //止损
        
        //止损    
        If( Low<=k_Bstop )
        {
            Sell(0,k_Bstop);//止损平仓
        }
                        
        //跟踪止盈
        If(CountIf(bool09,15)>=15)
        {
            k_Bstop = ma5d[1];//Lowest(Low,3);
        }Else
        If( high>=Highest_bs && High>=LastEntryPrice()*(100+lingbaohu)/100)//有相当盈利后零保护
        {
            k_Bstop = Highest_bs/(100+lingbaohu)/100;            
        }
        
    }
    
    
}

//------------------------------------------------------------------------

tblaocai

您好!策略逻辑就不多做讨论,因为以TBQ提供的功能,用户代码可以写得非常复杂,我们是无法负责为客户调试代码的。我们只能做平台能做的事情,提供一些支持,希望您能理解。

粗看了下,策略没出现信号,可能有两个地方您需要检查下,一个是bool08 = BarCount()<k这个条件,我把K改成一个稍大的数字是能出信号的;第二个是If(CountIf(bool09,15)>=15) 这个条件,外面还套了个条件 if(MarketPosition == 1),这里的CountIf是序列函数,要放到最外面,把判断结果赋值给一个简单变量。

 

2021-11-17 22:26
vdm666

谢谢指教,我试一下

2021-11-18 08:03
您未登录,请先 登录注册 后发表评论
顶部