我想写个简单的策略,在1分钟的K线图上,如果当日最高价大于开盘价*1.005,计数器就从0变成1,如果当日最高价大于开盘价*1.01,计数器就从1变成2.但写出来发现计数器在每一根bar上都不停累加。代码如下
Params
//此处添加参数
Vars
Series<Numeric> JSQ;
Numeric HIGHESTH;
Defs
//此处添加策略函数
Events
OnBar(ArrayRef<Integer> indexs)
{
IF (Date != Date[1])
{
JSQ = 0;
}
Else
{
JSQ = JSQ[1];
}
HIGHESTH = Highest(H,BarsSinceToday);
IF (HIGHESTH > OpenD(0)*1.005)
{
JSQ = JSQ[1] + 1;
}
Commentary(JSQ: + Text(JSQ));
PlotNumeric(MA1,OpenD(0)*1.005);
}
如图所示,价格突破白线后,在每根bar上JSQ都会+1。我明白这是因为每根bar都要运行一次,当日最高价也确实突破了白线,所以每次都满足条件并且+1,但是我不知道该怎么改。我想改成今日最高价大于今日开盘价*1.005就+1一次变成1,然后不再每根bar都叠加,然后今日最高价大于开盘价*1.01就再加一次变成2.请教老师帮我改改或者说一下思路,谢谢!
其实你简单加个限制就好了
IF (HIGHESTH > OpenD(0)*1.005 and JSQ == 0)
{
JSQ = JSQ[1] + 1;
}
应该是我表述的太简单了,我想实现的功能是,当日开盘价分别*1.005/1.01/1.015.......一共出来6条线,然后每天根据其他规则选出其中的两条线来使用,用哪两条不一定,当价格突破选出两条线的其中一条时JSQ就+1,突破另一条+1,最大就是2。所以用 JSQ == 0 这个限制条件好像没法解决问题。(想实现这个功能主要是想判断每天开仓前价格是否已经突破了选中的两条线,比如我设置满足开仓后开仓10手,但如果还没满足开仓条件时价格就已经突破了选中的其中一条线,我就只开仓5手。因此想根据JSQ返回的数字来判断)
我的想法是,反正你的数值小,最大值只有2,就不需要做成计数器,单纯赋值成1或2这样会简单点,JSQ = 1和JSQ = 2