为什么日k线下,必须加入“BarsSinceEntry>1”,而有的公式不加入也没关系,也没影响正常的开仓平仓。

向大神们,求教。最开始的公式代码执行是正常的。后来为了控制浮亏,加了额外的止损代码部分,如下:Numeric zs(10);//参数定义Bool bool_zs_buy;//布尔定义Bool bool_zs_sell;//布尔定义bool_zs_buy = close <= EntryPrice *(1-zs/100) and MarketPosition<>-1;//止损条件定义bool_zs_sell = close >= EntryPrice *(1+zs/100) and MarketPosition<>1;//止损条件定义//以下是最开始的止损条件If( MarketPosition<>-1 and bool_zs_buy ) { Sell(0,close); } If( MarketPosition<>1 and bool_zs_sell ) { BuyToCover(0,close); }在日k线周期下,上述止损代码加入后,原代码止损正常,但是紧跟着的下一次或多次开仓信号下,会出现当根k线(日线周期),当根开当根平(即开即日平)的情况。之后我在“止损条件定义”中加入了“BarsSinceEntry>1”,问题得到解决。但现在的问题是,我没想明白为什么日k线下,必须加入“BarsSinceEntry>1”,而有的公式(比如双均线下的公式)不加入也没关系,也没影响正常的开仓平仓。

原因是,当一根bar上同时出现开仓和平仓信号时,实际上你无法区分到底时开仓条件先发生还是平仓条件县发生。信号生成是按你程序代码编写顺序结构执行的。对于历史k线,你先写开仓命令,那么模型按照历史k线收盘状态判断是否满足开仓命令。开仓命令判断执行完毕后,再判断平仓命令,按照收盘状态判断是否满足平仓命令。程序的顺序结构规定了信号一定是先开再平。换句话说,历史k线是按照收盘状态来判断是否满足开平命令。但是实盘的时候就不一样了,你无法确定开平条件的先后顺序。举个例子。一根k线,开盘价1000,最低价900,最高价1100,收盘价1000。你的策略是开盘价回落50点开多,然后高于开盘价50点平多。也就是950买入,1050卖出。如果这根k线的内部走势轨迹是先跌倒900,然后涨到1100,最后回归到1000,那么标记950买入,1050卖出毫无问题。关键在于,如果走势轨迹是先涨到1100,再跌倒900,最后又涨回1000,你如何做到再950买入,1050卖出?跌到950以后,再也没有涨到1050过,怎么平这个仓呢?这个问题的关键就是以收盘状态运行模型会导致的无法确定bar内走势轨迹的问题。

1、BarsSinceEntry 如果当日开场不想止损,只能用这个了2、多次开仓的话EntryPrice有啥用哩?AvgEntryPrice这个是平均价不过问题是 如果用连续合约 AvgEntryPrice,BarsSinceEntry等函数,换月都会出问题----------------------------------------------------------------------------------------------一个建议:诊断问题可以尝试不同位置用print打印各项关键值到控制台看看问题所在