通达信DATETODAY和DAYTODATE怎么用?日期编码与自然日差排错

适用范围:通达信公式中的日期差与日期偏移。DATE是日期编码,不能直接靠两个编码相减得到自然日数。DATETODAY把指定编码换成相对基准日的天数,DAYTODATE把天数换回日期;自然日差与交易K线根数仍是两个问题。

通达信日期编码与自然日天数换算示意,非软件截图
原创日历换算示意,日期仅作算术核对,非客户端截图。

一、先确认DATE的编码

官方DATE条目说明其日期来自1900年之后的年月日编码,并举1000101表示2000年1月1日。DATE加19000000才得到通常看到的完整年月日数字,官方提醒不要在公式中直接把八位长日期数字当作这种日期常量。

例如2026年11月9日对应1261109。这个编码方便表达年月日字段,但编码差并不具有跨月、跨年的日数含义;1261201减1261130得到71,不是相邻两日的自然日差。

二、用转换后的天数计算差值

DAY_GAP:DATETODAY(1261109)-DATETODAY(1261106);
BACK_DATE:DAYTODATE(DATETODAY(1261109)-3);

按普通日历,2026年11月6日到11月9日相隔3个自然日;从11月9日往前3个自然日回到11月6日。这是日期算术例子,不是通达信客户端实测输出记录。公式中的日期均使用该软件约定的编码。

如果要用当前分析根的日期参与计算,可以把固定日期换成DATE,但必须先检查那根所在日期是否落在函数支持范围。不要把当前电脑系统日期与历史K线DATE混在同一条核对记录里。

三、两个函数的范围不一样

DATETODAY官方定义的基准日为1990年12月19日,示例DATETODAY(901219)返回0,有效日期编码范围为901219到1341231。DAYTODATE返回该基准日后第N天的日期,文档列出的N有效范围为0到20000,例子DAYTODATE(0)返回901219。

不能因为两个函数名字成对,就推断它们在任意极端输入上都能无限互转。减去天数后N可能变成负数,加上天数后也可能超范围;先核对范围,再讨论结果。非法日期、范围外值和缺失输入的处理没有在本文中验证。

四、3个自然日不等于3根日K线

星期五到星期一相隔3个自然日,但在有非交易日的环境中,K线序列不会每天都有一根。REF(CLOSE,3)取的是前3个分析周期的价格,不是把日历日期减3后自动寻找成交记录。停牌、节假日和周期选择还会让两种问法继续分离。

如果问题是“上一个有效周期”,应从REF引用与字段对齐入手;如果问题是“相差多少自然日”,才使用日期转换。原始DATE编码与时间字段可参考DATE和TIME说明。

五、把日期核对接回实际工作

先独立输出DAY_GAP和BACK_DATE,确认日期常量没有写成八位;再记录当前品种、周期、K线日期及目标日期。若最终要筛选历史区间,应另核对条件在每根K线上的位置,不要用一个自然日差代替交易周期窗口。

来源与限制

原始依据为通达信官方文档目录中的DATE、DATETODAY、DAYTODATE、REF条目。日期例子经过独立日历算术核对,未做客户端边界及各版本兼容实测,不用于预测未来行情。

更多公式排错入口见通达信教程中心。