以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  能否不用ignorecheckprice函数实现ignorecheckprice的功能  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=187943)

--  作者:sword8586
--  发布时间:2021/4/20 9:15:37
--  能否不用ignorecheckprice函数实现ignorecheckprice的功能
如题:
事实:在使用限价时,当策略发出信号但是有时限价在当根K线价格波动范围。这时必须使用ignorecheckprice函数保证发出信号,等待以后K线满足价格条件成交。
目的:能否不用ignorecheckprice函数实现ignorecheckprice的功能。保证在随后K线价格满足时成交
MA1:=REF(MA((HIGH+LOW+CLOSE)/3,AVGLENGTH),1);//定义MA1
UPPERBAND:=MA1+REF(MA(TR,40),1);//上轨
LOWERBAND:=MA1-REF(MA(TR,40),1);//下轨
ENTRYLONGCOND:=MA1>REF(MA1,1) ;//开多条件
EXITLONGCOND:=HIGH>=MA1;//平空条件
//交易系统
KDL:MAX(OPEN,UPPERBAND),COLORMAGENTA;
KKL:MIN(OPEN,LOWERBAND)-1*MINDIFF,COLORCYAN;
PKL:MIN(OPEN,MA1)+1*MINDIFF,COLORGREEN;
PDL:MAX(OPEN,MA1)-1*MINDIFF,COLORRED;
IF HOLDING=0 THEN BEGIN //若持仓为0
 IF ENTRYLONGCOND THEN //且满足开多条件
  BUY(between(KDL,L,H),手数,LIMIT,KDL),IGNORECHECKPRICE;//
  KPJ:=KDL;   
END
IF HOLDING>0 THEN BEGIN//若持有空单
 IF EXITLONGCOND THEN//且满足平空条件
  SELL(between(PDL,L,H),HOLDING,LIMIT,PDL),IGNORECHECKPRICE;//
  KPJ:=PDL; 
END
我的方法如下:
VARIABLE:KPJ=0,mKDPK=0,mKKPD=0,mKDL=0,mPDL=0,  mHolding=0;
MA1:=REF(MA((HIGH+LOW+CLOSE)/3,AVGLENGTH),1);//定义MA1
UPPERBAND:=MA1+REF(MA(TR,40),1);//上轨
LOWERBAND:=MA1-REF(MA(TR,40),1);//下轨
ENTRYLONGCOND:=MA1>REF(MA1,1) ;//开多条件
EXITLONGCOND:=HIGH>=MA1;//平空条件
//交易系统
KDL:MAX(OPEN,UPPERBAND),COLORMAGENTA;
KKL:MIN(OPEN,LOWERBAND)-1*MINDIFF,COLORCYAN;
PKL:MIN(OPEN,MA1)+1*MINDIFF,COLORGREEN;
PDL:MAX(OPEN,MA1)-1*MINDIFF,COLORRED;
IF HOLDING=0 and ENTRYLONGCOND THEN BEGIN //若持仓为0
  mKKPD:=0;
  mKDPK:=1;  
  mKDL:=KDL;  
END
IF HOLDING>0 and EXITLONGCOND THEN BEGIN//若持有空单
  mKKPD:=1;
  mKDPK:=0;  
  PDL:=PDL;   
END
IF HOLDING=0 and mKDPK=1 and between(mKDL,L,H) THEN BEGIN //若持仓为0
  BUY(1,手数,LIMIT,mKDL);//开多单  KPJ:=MAX(OPEN,UPPERBAND);
  mHolding:=1;      
END
IF HOLDING>0 and mKKPD=1 and between(mPDL,L,H) THEN BEGIN//若持有空单
  SELL(1,HOLDING,LIMIT,mPDL);//平空单
  mHolding:=0;    
END
问题:我的错误在哪?谢谢老师

--  作者:FireScript
--  发布时间:2021/4/20 9:38:12
--  
你是用全局变量纪录满足开仓条件位置的价格,然后再后面价格满足时候发信号?

你这里这样纪录
IF HOLDING=0 and ENTRYLONGCOND THEN BEGIN //若持仓为0
  mKKPD:=0;
  mKDPK:=1;  
  mKDL:=KDL;  
END

应该是有点问题的吧。

你应该在首次满足这个条件的时候纪录。否则其实后面
mKDL:=KDL; 

会一直执行的。

--  作者:sword8586
--  发布时间:2021/4/20 9:53:11
--  
是的,就只有一个信号。麻烦老师帮忙改改。谢谢


--  作者:FireScript
--  发布时间:2021/4/20 10:21:54
--  
 完整代码贴下。我好本地测试。你前面给的有部分变量 没给定义。AVGLENGTH没看到定义。

--  作者:sword8586
--  发布时间:2021/4/20 11:06:03
--  
AVGLENGTH、AVGLENGTH:=40;
--  作者:sword8586
--  发布时间:2021/4/20 11:17:43
--  
VARIABLE:KPJ=0,mKDPK=0,mKKPD=0,mKDL=0,mPDL=0,  mHolding=0;
MA1:=REF(MA((HIGH+LOW+CLOSE)/3,40),1);//定义MA1
UPPERBAND:=MA1+REF(MA(TR,40),1);//上轨
LOWERBAND:=MA1-REF(MA(TR,40),1);//下轨
ENTRYLONGCOND:=MA1>REF(MA1,1) ;//开多条件
EXITLONGCOND:=HIGH>=MA1;//平空条件
//交易系统
KDL:MAX(OPEN,UPPERBAND),COLORMAGENTA;
KKL:MIN(OPEN,LOWERBAND)-1*MINDIFF,COLORCYAN;
PKL:MIN(OPEN,MA1)+1*MINDIFF,COLORGREEN;
PDL:MAX(OPEN,MA1)-1*MINDIFF,COLORRED;
IF HOLDING=0 and ENTRYLONGCOND THEN BEGIN //若持仓为0
  mKKPD:=0;
  mKDPK:=1;  
  mKDL:=KDL;  
END
IF HOLDING>0 and EXITLONGCOND THEN BEGIN//若持有空单
  mKKPD:=1;
  mKDPK:=0;  
  PDL:=PDL;   
END
IF HOLDING=0 and mKDPK=1 and between(mKDL,L,H) THEN BEGIN //若持仓为0
  BUY(1,手数,LIMIT,mKDL);//开多单  KPJ:=MAX(OPEN,UPPERBAND);
  mHolding:=1;      
END
IF HOLDING>0 and mKKPD=1 and between(mPDL,L,H) THEN BEGIN//若持有空单
  SELL(1,HOLDING,LIMIT,mPDL);//平空单
  mHolding:=0;    
END

--  作者:FireScript
--  发布时间:2021/4/20 14:53:28
--  
 1.我只修正了一个地方。就是纪录开仓价格地方,需要在首次满足的地方纪录。

2.你有个笔误,导致平仓价格没纪录到。


手数:=1;
VARIABLE:KPJ:=0,mKDPK:=0,mKKPD:=0,mKDL:=0,mPDL:=0,mHolding:=0;

MA1:=REF(MA((HIGH+LOW+CLOSE)/3,40),1);//定义MA1
UPPERBAND:=MA1+REF(MA(TR,40),1);//上轨
LOWERBAND:=MA1-REF(MA(TR,40),1);//下轨
ENTRYLONGCOND:=MA1>REF(MA1,1) ;//开多条件
EXITLONGCOND:=HIGH>=MA1;//平空条件
//交易系统
KDL:=MAX(OPEN,UPPERBAND),COLORMAGENTA;
KKL:=MIN(OPEN,LOWERBAND)-1*MINDIFF,COLORCYAN;
PKL:=MIN(OPEN,MA1)+1*MINDIFF,COLORGREEN;
PDL:=MAX(OPEN,MA1)-1*MINDIFF,COLORRED;


cd1:HOLDING=0 and ENTRYLONGCOND;
IF cd1 and not(ref(cd1,1)) THEN BEGIN //若持仓为0
  mKKPD:=0;
  mKDPK:=1;  
  mKDL:=KDL;  
END
cd2:HOLDING>0 and EXITLONGCOND;
IF  cd2 and not(ref(cd2,1)) THEN BEGIN//若持有空单
mKKPD:=1;
mKDPK:=0;  
mPDL:=PDL;   
END


IF HOLDING=0 and mKDPK=1 and between(mKDL,L,H) THEN BEGIN //若持仓为0
  BUY(1,手数,LIMIT,mKDL);//开多单  KPJ:=MAX(OPEN,UPPERBAND);
  mHolding:=1;      
END
IF HOLDING>0 and mKKPD=1 and between(mPDL,L,H) THEN BEGIN//若持有空单
  SELL(1,HOLDING,LIMIT,mPDL);//平空单
  mHolding:=0;    
END


--  作者:sword8586
--  发布时间:2021/4/20 15:12:55
--  
老师:的确可以正常开平仓了,但是计算出的结果完全不等同于ignorcheckprice函数。
问题出在哪呢?字面上理解ignorcheckprice,找不出问题来。老师能否更详细的描述其机制呢?
可以的话,请老师帮忙在修改下。

--  作者:FireScript
--  发布时间:2021/4/20 15:39:32
--  
这个结果肯定会不一样的。ignorcheckprice 是忽略价格检查。也就是说系统默认是有价格检查的。价格不在当前K范围内是发不出信号,开不了仓的。

你现在这个做法 是将开仓位置完全移动到价格满足的位置上去了,从原本应该出信号的位置 到最后实际出信号的位置,这中间一段行情 在你现在模型里面是被完全忽略掉的。如果按照之前做法用ignorcheckprice 那么这段行情是该干嘛干嘛。

--  作者:sword8586
--  发布时间:2021/4/20 16:04:13
--  
这个结果肯定会不一样的。ignorcheckprice 是忽略价格检查。也就是说系统默认是有价格检查的。价格不在当前K范围内是发不出信号,开不了仓的。

你现在这个做法 是将开仓位置完全移动到价格满足的位置上去了,从原本应该出信号的位置 到最后实际出信号的位置,这中间一段行情 在你现在模型里面是被完全忽略掉的。如果按照之前做法用ignorcheckprice 那么这段行情是该干嘛干嘛。

老,我比较纠结“ignorcheckprice 是忽略价格检查"这句话。结合我的上面的替代策略,我的理解不知道是否出偏差:

1、若KDL价格不在当根K线范围,不加ignorcheckprice不能发出信号!加上,在当根K线发出信号,但是是假信号,不会引起成交,也不会在以后的K线依据KDL价格成交!!
1、若KDL价格在当根K线范围,不加与ignorcheckprice均能发出信号!正常成交。