以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  开平仓语句顺序问题  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=145486)

--  作者:zxsd
--  发布时间:2016/12/29 13:18:52
--  开平仓语句顺序问题


我按照初级教程给的开平仓顺序——

1,平空

2,开多

3,平多

4,开空


这样来写的,是逐K线计算

但是今天实盘图表交易的时候,某根K线开盘时用OPEN开了空(代码在位置4),开空就设定开盘价之上20点止损线,在位置1执行CROSS(HIGH,OPEN+20点止损)平空止损,但是本根打了止损没执行,下一根才性质,导致亏损很多


位置1的平空语句中,有条件要求必须位置4开空后才能执行平空,我想就是这个原因导致本根止损没平,但我的问题是,实盘过程中,如果第一秒位置4的开空执行了,第10秒价格达到止损了,之后如果有100秒时间走完这根K线,那这100秒时间中,位置4的开空已执行这个条件不会被刷新吗?(我理解回测时每根K线只计算一遍,但实盘时候呢?)



有什么方法能补救这个问题吗?
--  作者:jinzhe
--  发布时间:2016/12/29 13:37:47
--  

1是本根打了止损没执行,下一根才性质,导致亏损很多
设置为固定时间间隔模式,不要用走完k线下单,

2顺序也很重要,但不是一定是顺序的问题,如果不是同一根k线开平仓,那么顺序影响的可能性就小了


--  作者:zxsd
--  发布时间:2016/12/29 14:09:27
--  
 谢谢回答,可是:
1,程序化交易运行模式,我就是使用的固定时间间隔,设置的1秒

2,我觉得很有可能是顺序问题,因为我下一根才执行平仓,触发的是另外一个平空语句(开盘价大于止损线时以开盘价平仓)(这语句也写在位置1,先是CROSS止损,之后防止万一开盘价超过止损,这两句前后挨着)。
同时我的开多和平多止损就不会出现这个问题,当根K线就会平仓,两种写法的开平仓只是方向不一样其他都一样,因为我觉得是开多和平多顺序顺序正确,而开空要在下一遍执行才能触发


3,假设我把位置1的平空原封不动复制一遍放在位置4后面,能解决这问题吗?会不会带来其他不好的结果?
--  作者:jinzhe
--  发布时间:2016/12/29 14:29:11
--  
把你写的发一下,看看实际的代码是什么样的
--  作者:zxsd
--  发布时间:2016/12/29 17:02:19
--  
 请看,螺纹钢连续,15分钟K线图
2016年12月28号01:15这根是多单止损,没问题
2016年12月29号02:45这根是空单止损,只能第二根平

求解决方法



VARIABLE:空单止损=0,空单入场标记=0,多单止损=0,多单入场标记=0;


向上均线:=REF(MA(CLOSE,30),5)<REF(MA(CLOSE,30),4) AND REF(MA(CLOSE,30),4)<REF(MA(CLOSE,30),3) AND REF(MA(CLOSE,30),3)<REF(MA(CLOSE,30),2) AND REF(MA(CLOSE,30),2)<REF(MA(CLOSE,30),1),NOAXIS;
向上成交量:=REF(VOL,5)>REF(VOL,4) AND REF(VOL,4)>REF(VOL,3) AND REF(VOL,3)>REF(VOL,2) AND REF(VOL,2)>REF(VOL,1),NOAXIS;

向下均线:=REF(MA(CLOSE,30),5)>REF(MA(CLOSE,30),4) AND REF(MA(CLOSE,30),4)>REF(MA(CLOSE,30),3) AND REF(MA(CLOSE,30),3)>REF(MA(CLOSE,30),2) AND REF(MA(CLOSE,30),2)>REF(MA(CLOSE,30),1),NOAXIS;
向下成交量:=REF(VOL,5)>REF(VOL,4) AND REF(VOL,4)>REF(VOL,3) AND REF(VOL,3)>REF(VOL,2) AND REF(VOL,2)>REF(VOL,1),NOAXIS;





//位置1——平空
//平空1
IF CROSS(HIGH,空单止损) AND OPEN<=空单止损 AND HOLDING<0 AND 空单入场标记=1 THEN
BEGIN
SELLSHORT(1,1,LIMITR,空单止损);
DRAWTEXT(1,LOW*0.995,\'    止损\'+NUMTOSTR(空单止损,0)),COLORWHITE;
空单止损:=99999;
空单入场标记:=0;
END

//平空2
IF OPEN>空单止损 AND HOLDING<0 AND 空单入场标记=1 THEN
BEGIN
SELLSHORT(1,1,LIMITR,OPEN);
DRAWTEXT(1,LOW*0.995,\'    开盘平\'+NUMTOSTR(OPEN,0)),COLORWHITE;
空单止损:=99999;
空单入场标记:=0;
END




//位置2——开多
//开多:
IF REF(向上均线,1) AND CROSS(MA(CLOSE,10),MA(CLOSE,60)) AND HOLDING=0 THEN
BEGIN
BUY(1,1,LIMITR,OPEN);
多单止损:=ENTERPRICE-20;
多单入场标记:=1;
END




//位置3——平多
//平多1
IF CROSS(多单止损,LOW) AND OPEN>=多单止损 AND HOLDING>0 AND 多单入场标记=1 THEN
BEGIN
SELL(1,1,LIMITR,多单止损);
DRAWTEXT(1,HIGH*1.005,\'    止损\'+NUMTOSTR(多单止损,0)),COLORWHITE;
多单止损:=0;
多单入场标记:=0;
END

//平多2
IF OPEN<多单止损 AND HOLDING>0 AND 多单入场标记=1 THEN
BEGIN
SELL(1,1,LIMITR,OPEN);
DRAWTEXT(1,HIGH*1.005,\'    开盘平\'+NUMTOSTR(OPEN,0)),COLORWHITE;
多单止损:=0;
多单入场标记:=0;
END




//位置4——开空
//开空:
IF REF(向下均线,1) AND CROSS(MA(CLOSE,60),MA(CLOSE,10)) AND REF(向下成交量,1) AND HOLDING=0  THEN
BEGIN
BUYSHORT(1,1,LIMITR,OPEN);
空单止损:=ENTERPRICE+20;
空单入场标记:=1;
END

--  作者:jinzhe
--  发布时间:2016/12/29 17:06:56
--  

看了下代码,有用到enterprice这类要获取开仓价以及enterbars获取开仓周期的函数做平仓条件的,那么平仓语句一定要写在开仓语句后面


--  作者:zxsd
--  发布时间:2016/12/29 17:19:26
--  
 请教一个不会出错的保险解决办法,比如把位置一的平仓语句再复制到位置4之后,这样同时存在两个平仓语句会不会出问题?两个相同的平仓语句在不同通位置,官方推荐这么写么?(毕竟再上实盘测试还是得赔钱才能看出来,所以直接问版主)


或者准确开仓价的获取,能否用其他方式?这样能维持原来的代码顺序不变?

非常感谢
[此贴子已经被作者于2016-12-29 17:21:12编辑过]

--  作者:jinzhe
--  发布时间:2016/12/29 17:25:04
--  
就如之前所言,这些是没有固定的路数的,看你具体的需求的。用enterprice和enterbars时做为平仓条件判断时,一定要在开仓语句后面,不然是不能正确的获取值的:获取值时会延迟一根k线,开仓当根k线获取不到,要开仓下一根k线才行
--  作者:zxsd
--  发布时间:2016/12/30 16:10:36
--  
版主,这个问题我早上又测试了一下,我修改了代码(注释掉了ENTERPRICE,改为OPEN),也测试了在位置4后面多复制一个位置1的平仓,但是我看历史数据图形还是一样的第二根开
我想确认一下,这样上实盘,OPEN价入场后到收线这段时间是不是一定会当根止损,我担心下一次出现这情况不知道什么时候亏笔大的。


螺纹钢连续,15分钟K线图
2016年12月28号01:15这根是多单止损,没问题
2016年12月29号02:45这根是空单止损,只能第二根平


 

VARIABLE:空单止损=0,空单入场标记=0,多单止损=0,多单入场标记=0;


向上均线:=REF(MA(CLOSE,30),5)<REF(MA(CLOSE,30),4) AND REF(MA(CLOSE,30),4)<REF(MA(CLOSE,30),3) AND REF(MA(CLOSE,30),3)<REF(MA(CLOSE,30),2) AND REF(MA(CLOSE,30),2)<REF(MA(CLOSE,30),1),NOAXIS;
向上成交量:=REF(VOL,5)>REF(VOL,4) AND REF(VOL,4)>REF(VOL,3) AND REF(VOL,3)>REF(VOL,2) AND REF(VOL,2)>REF(VOL,1),NOAXIS;

向下均线:=REF(MA(CLOSE,30),5)>REF(MA(CLOSE,30),4) AND REF(MA(CLOSE,30),4)>REF(MA(CLOSE,30),3) AND REF(MA(CLOSE,30),3)>REF(MA(CLOSE,30),2) AND REF(MA(CLOSE,30),2)>REF(MA(CLOSE,30),1),NOAXIS;
向下成交量:=REF(VOL,5)>REF(VOL,4) AND REF(VOL,4)>REF(VOL,3) AND REF(VOL,3)>REF(VOL,2) AND REF(VOL,2)>REF(VOL,1),NOAXIS;





//位置1——平空
//平空1
IF CROSS(HIGH,空单止损) AND OPEN<=空单止损 AND HOLDING<0 AND 空单入场标记=1 THEN
BEGIN
SELLSHORT(1,1,LIMITR,空单止损);
DRAWTEXT(1,LOW*0.995,\'    止损\'+NUMTOSTR(空单止损,0)),COLORWHITE;
空单止损:=99999;
空单入场标记:=0;
END

//平空2
IF OPEN>空单止损 AND HOLDING<0 AND 空单入场标记=1 THEN
BEGIN
SELLSHORT(1,1,LIMITR,OPEN);
DRAWTEXT(1,LOW*0.995,\'    开盘平\'+NUMTOSTR(OPEN,0)),COLORWHITE;
空单止损:=99999;
空单入场标记:=0;
END




//位置2——开多
//开多:
IF REF(向上均线,1) AND CROSS(MA(CLOSE,10),MA(CLOSE,60)) AND HOLDING=0 THEN
BEGIN
BUY(1,1,LIMITR,OPEN);
//多单止损:=ENTERPRICE-20;
多单止损:=OPEN-20;
多单入场标记:=1;
END




//位置3——平多
//平多1
IF CROSS(多单止损,LOW) AND OPEN>=多单止损 AND HOLDING>0 AND 多单入场标记=1 THEN
BEGIN
SELL(1,1,LIMITR,多单止损);
DRAWTEXT(1,HIGH*1.005,\'    止损\'+NUMTOSTR(多单止损,0)),COLORWHITE;
多单止损:=0;
多单入场标记:=0;
END

//平多2
IF OPEN<多单止损 AND HOLDING>0 AND 多单入场标记=1 THEN
BEGIN
SELL(1,1,LIMITR,OPEN);
DRAWTEXT(1,HIGH*1.005,\'    开盘平\'+NUMTOSTR(OPEN,0)),COLORWHITE;
多单止损:=0;
多单入场标记:=0;
END




//位置4——开空
//开空:
IF REF(向下均线,1) AND CROSS(MA(CLOSE,60),MA(CLOSE,10)) AND REF(向下成交量,1) AND HOLDING=0  THEN
BEGIN
BUYSHORT(1,1,LIMITR,OPEN);
//空单止损:=ENTERPRICE+20;
空单止损:=OPEN+20;
空单入场标记:=1;
END





{

//位置5——平空
//平空1
IF CROSS(HIGH,空单止损) AND OPEN<=空单止损 AND HOLDING<0 AND 空单入场标记=1 THEN
BEGIN
SELLSHORT(1,1,LIMITR,空单止损);
DRAWTEXT(1,LOW*0.995,\'    止损\'+NUMTOSTR(空单止损,0)),COLORWHITE;
空单止损:=99999;
空单入场标记:=0;
END

}
[此贴子已经被作者于2016-12-30 16:11:03编辑过]

--  作者:jinzhe
--  发布时间:2016/12/30 16:17:02
--  
一样的,平仓是开仓相关的条件,平仓语句都要写在开仓语句后面