我写了一个策略,回测复盘时有交易信号。
加载到交易策略中自动运行,账户为股票模拟账户,数据源为次新股,肉眼观察,今天应该有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;
}
}
}
//------------------------------------------------------------------------
谢谢指教,我试一下
您好!策略逻辑就不多做讨论,因为以TBQ提供的功能,用户代码可以写得非常复杂,我们是无法负责为客户调试代码的。我们只能做平台能做的事情,提供一些支持,希望您能理解。
粗看了下,策略没出现信号,可能有两个地方您需要检查下,一个是bool08 = BarCount()<k这个条件,我把K改成一个稍大的数字是能出信号的;第二个是If(CountIf(bool09,15)>=15) 这个条件,外面还套了个条件 if(MarketPosition == 1),这里的CountIf是序列函数,要放到最外面,把判断结果赋值给一个简单变量。