以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://222.73.7.161/bbs/index.asp) -- 公式模型编写问题提交 (http://222.73.7.161/bbs/list.asp?boardid=4) ---- 请教如何实现以下想法呀?文字多但逻辑很简单 (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=183732) |
-- 作者:Tiffany1 -- 发布时间:2021/1/4 12:00:18 -- 请教如何实现以下想法呀?文字多但逻辑很简单 1.如果今天是12月15日之后的第一个交易日(比如从12月16日开始找,如果12月16日是非交易日就再往后找12月17日,如果还是非交易日就再找12月18日,以此类推,直到找到第一个交易日为止)。 2.如果上面条件满足,则取得12月16日以前,离12月16日最相邻的一个交易日的收盘价为基准(比如12月15日离12月16日最相邻,那就取得12月15日的收盘价。如果12月15日为节假日等非交易日,则再往前取12月14日收盘价,如果还是非交易日则再往前找12月13日,以此类推一直找下去,直到找到最相邻的一个交易日的收盘价为止) 3.以这个最相邻的收盘价为基准,如果今天的收盘价>它 就做多,如果今天的收盘价<它 就做空。 如果今天的收盘价=它 就什么都不做并等下一交易日(第2个交易日),如果下一交易日收盘价>它 就做多,如果<它就做空,如果还是=它 就再等下一交易日(第3个交易日),以此类推一直找下去,直到不=它为止,然后照样判断>就做多,<就做空。 4.如果今天是12月15日之后的第2个交易日(包含)到6月16日之前跟6月16日最相邻的交易日(包含)之间的日子,则当天收盘价金叉条件2中的基准收盘价就平掉全部仓位并做多,如果死叉条件2中的基准收盘价就平掉全部仓位并做空。 5.如果今天是6月15日之后的第一个交易日,则以当天收盘价无论盈亏都平仓。
|
-- 作者:FireScript -- 发布时间:2021/1/4 14:24:20 -- 1.你这里1和2 其实不需要额外处理。只要交易坐标选择 交易日坐标就行了。非交易日会被自然过滤掉的。 2.“今天的收盘价>它 就做多,如果今天的收盘价<它 就做空” 你交易的周期是什么周期? 3.“.如果今天是12月15日之后的第2个交易日(包含)到6月16日之前跟6月16日最相邻的交易日(包含)之间的日子” 这个就不好判断了。没有办法判断下一个日期 是否是交易日。 |
-- 作者:Tiffany1 -- 发布时间:2021/1/4 16:46:27 -- 回复:(FireScript) 1.你这里1和2 其实不需要额... 对你第二个问题的回答:日线 你第3点说不好弄,意思我的这个想法无法实现程序化罗?那我用自然日坐标就可以避开寻找交易日的麻烦了吗?我就直接指定自然日 那我用自然日坐标改为下面这个,程序应该怎么写呢? 1.如果今天是2005年12月16日,则以2005年12月15日的收盘价为基准,今日收盘>它 就做多,<它 就做空,=它 就什么都不做。 2.如果今天的日期>2005年12月16日 且<2006年6月16日,则当天收盘价金叉2005年12月15日的基准收盘价就做多,死叉它就做空,=它就什么都不做。 3.如果今天的日期是2006年6月16日,则以收盘价平掉所有仓位。 上面3点都用日线级别。 这个就大大简化了,那么这个该怎么写程序呢?
|
-- 作者:FireScript -- 发布时间:2021/1/4 17:13:25 -- 你这个思路 大致就是 以某个日期的收盘价作为基准 ,后续在某个日期之前 每天的价格大于它就开多,小于就开空。但是你这里缺少具体平仓条件。是反向的时候就平仓? |
-- 作者:Tiffany1 -- 发布时间:2021/1/4 17:29:48 -- 回复:(FireScript)你这个思路 大致就是 以某个日期... 哦 我上面写错了一点点 重新写过: 1.如果今天是2005年12月16日,则以2005年12月15日的收盘价为基准,今日收盘>它 就做多,<它 就做空,=它 就什么都不做。 2.如果今天的日期>2005年12月16日 且<2006年6月16日,则当天收盘价金叉2005年12月15日的基准收盘价就平仓并做多,死叉它就平仓并做空,=它就什么都不做。 3.如果今天的日期是2006年6月16日,则以收盘价平掉所有仓位,并不再开仓。 这回都有平仓了,这个程序该怎么写啊? |
-- 作者:FireScript -- 发布时间:2021/1/5 9:46:20 -- INPUT:year1(2016,1990,2100,1),year2(2017,1990,2100,1),month1(12,1,12,1),month2(6,1,12,1),day1(16,1,30,1),day2(16,1,30,1);//日期以参数形式调整 cd1:year=year1 and MONTH=month1 and day>=day1; cd2:year=year2 and MONTH=month2 and day>=day2; p1:VALUEWHEN(cd1 and not(ref(cd1,1)),c);//日期1以后的第一个交易日的收盘价,包含日期1 p2:VALUEWHEN(cd2 and not(ref(cd2,1)),1);//判断是否过了日期2 cd:ref(cd1,1) and not(ref(cd1,2));//指定日期1之后的第2个交易日 if cd then //第二个交易日上的开仓 begin buy(c>p1,1,market); buyshort(c<p1,1,market); end DRAWICON(cd,h,1);//标记下日期1 之后第二个交易日的位置 if cross(c,p1) and p1 and not(p2=1) then begin sellshort(1,holding,market); buy(holding=0,1,market); end if cross(p1,c) and p1 and not(p2=1) then begin sell(1,holding,market); buyshort(holding=0,1,market); end if cd2 then begin 到期平仓1:sell(1,holding,market); 到期平仓2:sellshort(1,holding,market); end 持仓:holding; 日期设置成了参数,你自行调整就行了。另外你图表上的数据必须覆盖到这个日期区间。
|
-- 作者:Tiffany1 -- 发布时间:2021/1/5 11:05:14 -- 回复:(FireScript) INPUT:year1(2016,1990,21... 多谢。请问你是按照我第一次发的文字(以交易日为准绳),还是按照我第三次发的修改后文字(以自然日为准绳)写的程序啊? |
-- 作者:FireScript -- 发布时间:2021/1/5 11:08:11 -- 交易日操作的。5楼的那个。 |
-- 作者:Tiffany1 -- 发布时间:2021/1/5 11:24:15 -- 回复:(FireScript) 交易日操作的。5楼的那个。... 好的。昨天你2楼说:没有办法判断下一个日期 是否是交易日。 今天你写的程序里解决这个问题了否?能判断了吗?
|
-- 作者:FireScript -- 发布时间:2021/1/5 11:27:32 -- 不能。代码里是后知后觉 发现过了指定日期后 立即平仓。比如限定的是16号 且恰好是非交易日,前一个交易日是15号。这种就只能16号之后的第一个交易日平仓,无法在15号平仓。 |