[求助]这里无法执行信号是合约数据有错还是代码错 (文华财经随身行Android   5.2.5(225))

投资者咨询:[求助]这里无法执行信号是合约数据有错还是代码错 (文华财经随身行Android   5.2.5(225))
来源:文华财经  日期:2018-6-16 16:26
代码和代码注释如下,老师可以直接复制使用:

//回测标的物:螺纹指数,1小时周期,2014年2月14日 --  2014年2月28日

//XFX形态定义:连续五根K线满足以下以形态
XFX := L>=REF(L,2) && REF(L,1)>=REF(L,2) && REF(L,2)<=REF(L,3) && REF(L,2)<=REF(L,4);

//取形态XFX到当前K线的周期数
XFX_N ^^ BARSLAST(XFX);

//AMA1自适应均线定义
DIRECTION1 := CLOSE-REF(CLOSE,10);
VOLATILITY1 := SUM(ABS((CLOSE-REF(CLOSE,1))),10);
ER1 := ABS(DIRECTION1/VOLATILITY1);
FASTSC1 := 2/(2+1);
SLOWSC1 := 2/(30+1);
SSC1 := ER1*(FASTSC1-SLOWSC1)+SLOWSC1;
CONSTANT1 := SSC1*SSC1;
AMA1 ^^ EMA(DMA(CLOSE,CONSTANT1),2);

//开仓条件1:从XFX形态的第四根K线开始 到  当前K线前一根K线,发生过K线最高价 大于等于 AMA1
TJ1 := REF(EXIST(H >= AMA1,XFX_N+1),1);

//当前K线下破前两根K线的最低价时,开空单:

SKVOL=0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);
SKVOL>0 && TJ1 && L<=LV(L,2),SK(1);

//TICK级回测
MULTSIG(0,0,1,0);



/*问题说明:

在2014-2-25 14:00这根K线,已经满足了所有进场条件,却未进场,经查发现是未满足开仓条件1.

但是根据实际数据看,2014-2-25 11:00这根K线已经满足了最高价大于等于AMA1:也就是说条件1已经被满足,其它条件也满足,就应该开仓了。

可是事实上就是没有开仓

请老师帮忙检查一下问题在哪里?

*/

图示如下:


图片点击可在新窗口打开查看
         
技术人员回复
日期:2018-6-16 16:42
 您加载的是哪个合约周期上?我们对应分析下
投资者咨询:[求助]这里无法执行信号是合约数据有错还是代码错 (文华财经随身行Android   5.2.5(225))
来源:文华财经  日期:2018-6-16 16:26
原文中有写://回测标的物:螺纹指数,1小时周期,2014年2月14日 -- 2014年2月28日
技术人员回复
日期:2018-6-17 18:10

SKVOL应该是等于零,而不是开盘价,这样改下

 

 

//XFX形态定义:连续五根K线满足以下以形态
XFX := L>=REF(L,2) && REF(L,1)>=REF(L,2) && REF(L,2)<=REF(L,3) && REF(L,2)<=REF(L,4);


//取形态XFX到当前K线的周期数
XFX_N ^^ BARSLAST(XFX);


//AMA1自适应均线定义
DIRECTION1 := CLOSE-REF(CLOSE,10);
VOLATILITY1 := SUM(ABS((CLOSE-REF(CLOSE,1))),10);
ER1 := ABS(DIRECTION1/VOLATILITY1);
FASTSC1 := 2/(2+1);
SLOWSC1 := 2/(30+1);
SSC1 := ER1*(FASTSC1-SLOWSC1)+SLOWSC1;
CONSTANT1 := SSC1*SSC1;
AMA1 ^^ EMA(DMA(CLOSE,CONSTANT1),2);


//开仓条件1:从XFX形态的第四根K线开始 到  当前K线前一根K线,发生过K线最高价 大于等于 AMA1
TJ1 := REF(EXIST(H >= AMA1,XFX_N+1),1);


//当前K线下破前两根K线的最低价时,开空单:
SKVOL=0 && TJ1 && L<=LV(L,2),SK(1);


//TICK级回测
MULTSIG(0,0,1,0);

投资者咨询:[求助]这里无法执行信号是合约数据有错还是代码错 (文华财经随身行Android   5.2.5(225))
来源:文华财经  日期:2018-6-16 16:26
谢谢老师。这个应该是我手误,我的原版程序写的是skvol=0,但结果仍然不对。
投资者咨询:[求助]这里无法执行信号是合约数据有错还是代码错 (文华财经随身行Android   5.2.5(225))
来源:文华财经  日期:2018-6-16 16:26
 找到问题了:

REF函数和EXIST函数搭配不当的问题。

      文华系统函数说明里写的很模糊,比如,求:当前K线向左边追溯N个周期是否满足过COND条件,但不要包括当前K线:

一般写法是:REF(EXIST(COND,N-1),1);

但经过此例发现,要这样写才正常:REF(EXIST(COND,N),1);

应该是N-1才合理 ,这个函数设计逻辑有点让人费解。又或者,REF函数不是用来定位K线的,而是表示只取到当前K的前K,这样解释才合理
   
技术人员回复
日期:2018-6-18 15:12
 这里不是问题的,使用REF向前引用就表示引用的是前一根K线上EXIST(COND,N)的返回值

您可以参考原帖回复理解一下:http://help.wenhua.com.cn/dispbbs.asp?BoardID=14&ID=712972