向大神们,求教。
最开始的公式代码执行是正常的。后来为了控制浮亏,加了额外的止损代码部分,如下:
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内走势轨迹的问题。
2、多次开仓的话
EntryPrice有啥用哩?
----------------------------------------------------------------------------------------------
一个建议:
诊断问题
可以尝试不同位置
用print打印各项关键值到控制台看看问题所在