以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  公式模型编写问题提交  (http://222.73.7.161/bbs/list.asp?boardid=4)
----  开仓条件成立之后2天再开仓  (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=188107)

--  作者:fxrock4
--  发布时间:2021/4/29 10:28:56
--  开仓条件成立之后2天再开仓
开仓条件成立之后2天再开仓
图表和后台怎么写呢?

--  作者:yukizzc
--  发布时间:2021/4/29 10:37:17
--  
enterbars>2 or enterbars=-1
tenterbars(1)>2 or tenterbars(1)=-1


分别是图表和后台的,放到条件里去



--  作者:fxrock4
--  发布时间:2021/4/29 11:28:44
--  
数据刷新的周期是30分钟,是要开仓条件成立后2天再开仓哦
tenterbars(1)>2 or tenterbars(1)=-1 知道我要的是日级?

--  作者:FireScript
--  发布时间:2021/4/29 13:35:04
--  
是要刚好完整的跨越2个交易日(比如一天300个K,2天就是600K,必须跨度达到600K,日期上可能都不止2个交易日了),还是说只要开仓信号和满足条件的位置 是在跨2个交易日的日期上即可(按完整K线跨度算可能是不足2个交易日,但是日期是满足的)。

--  作者:FireScript
--  发布时间:2021/4/29 14:04:21
--  
 如果是要完整的2个交易日的跨度,这种试了下,是做不到的。因此只能按照第二种方式做,只要跨2个交易日即可,不管实际K线跨度是多少。

//参考这个思路。macdjc开仓,死叉平仓
input:p(26,20,100,8),s(12,5,40,4),m(9,2,60,6);
DIFF :=EMA(CLOSE,S) - EMA(CLOSE,P);
DEA  :=EMA(DIFF,M);
MACD1 :2*(DIFF-DEA), COLORSTICK;
macdjc:cross(diff,dea),NODRAW;//macd金叉
macdsc:cross(dea,diff),NODRAW;

DRAWICON(macdjc,h,1);//标记下金叉位置
DRAWICON(macdsc,l,2);
VARIABLE:dt:=0,datedif:=0;//datedif 纪录实际交易日天数

if date<>ref(date,1) then datedif:=datedif+1;

if macdjc and dt=0 then //满足金叉 且当前dt为0,纪录下此时的datedif
begin
dt:=datedif;
end

if datedif-dt>2 and dt<>0 and holding=0 then buy(1,1,market);//交易日跨度大于2开仓。1号纪录的,2,3都是交易的话,4号上就出开仓信号。

if macdsc and dt<>0 and holding<>0 then //平仓时候重置dt为0.下次金叉时候再给dt赋值。这里if后面的条件必须完完整整,无论你本地代码怎么的,红色部分的是不可少的。
begin
sell(1,holding,market);
dt:=0;
end



--  作者:fxrock4
--  发布时间:2021/4/29 14:09:10
--  
简单点就行
像27号有开仓信号到今天29号仍满足条件开仓条件即执行开仓。

--  作者:FireScript
--  发布时间:2021/4/29 14:24:10
--  
那也只要改这里的就行
 if datedif-dt>1 and dt<>0 and holding=0 then buy(1,1,market);//交易日跨度大于2开仓。1号纪录的,2,3都是交易的话,4号上就出开仓信号。

另外听你的意思不仅仅说信号满足后多少天开仓,而且还要当时也要满足条件才开仓?比如2个交易日后的那天的金叉才开仓或者之后金叉的位置才开仓?

--  作者:fxrock4
--  发布时间:2021/4/29 14:39:55
--  
像RM 
27号满足开仓条件了,但不开仓
29号仍满足开仓条件,则才开仓


--  作者:FireScript
--  发布时间:2021/4/29 14:47:01
--  
 if datedif-dt>2 and dt<>0 and holding=0 and macdjc  then buy(1,1,market);//交易日跨度大于2开仓。1号纪录的,2,3都是交易的话,4号上就出开仓信号。

开仓地方再加一个条件判断就行了。这样实际效果就是某条件满足后,2个交易日后的某个交易日如果再次满足就开仓。

具体效果和思路,你加载下面代码看下就知道了。笑脸是开仓条件满足位置,哭脸是平仓条件满足位置。


//参考这个思路。macdjc开仓,死叉平仓
input:p(26,20,100,8),s(12,5,40,4),m(9,2,60,6);
DIFF :=EMA(CLOSE,S) - EMA(CLOSE,P);
DEA  :=EMA(DIFF,M);
MACD1 :2*(DIFF-DEA), COLORSTICK;
macdjc:cross(diff,dea),NODRAW;//macd金叉
macdsc:cross(dea,diff),NODRAW;

DRAWICON(macdjc,h,1);//标记下金叉位置
DRAWICON(macdsc,l,2);
VARIABLE:dt:=0,datedif:=0;//datedif 纪录实际交易日天数

if date<>ref(date,1) then datedif:=datedif+1;

if macdjc and dt=0 then //满足金叉 且当前dt为0,纪录下此时的datedif
begin
dt:=datedif;
end

if datedif-dt>1 and dt<>0 and holding=0 and macdjc  then buy(1,1,market);//交易日跨度大于2开仓。1号纪录的,2,3都是交易的话,4号上就出开仓信号。

if macdsc and dt<>0 and holding<>0 then //平仓时候重置dt为0.下次金叉时候再给dt赋值。这里if后面的条件必须完完整整,无论你本地代码怎么的,红色部分的是不可少的。
begin
sell(1,holding,market);
dt:=0;
end