以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  请教如何实现以下想法呀?文字多但逻辑很简单  (http://weistock.com/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号平仓。