金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 1170|回复: 7

关于浮点数误差的问题

[复制链接]

103

主题

255

帖子

265

积分

Rank: 2

等级: 标准版

注册:
2023-2-16
曾用名:
发表于 2024-11-26 20:11 | 显示全部楼层 |阅读模式
股票601096,宏盛华源,2024年1月12号
截图202411262006108926.png
引用后收盘价是:
截图202411262006469165.png
而当天实际收盘价是6.74.
这样导致用以下公式识别涨停没识别出来,请问精度问题该如何解决?同样的逻辑,通达信就没问题...
isst:strfind(stkname,'st',1);//ÊÇ·ñst
iszb:(strleft(stklabel,2)='60' or strleft(stklabel,2)='00');//
ztv:if(isst,if(iszb,0.05,0.10),if(iszb,0.1,0.2));//

cond1:ABS(REF(CLOSE,1)-round((ztv+1)*round(REF(CLOSE,2)/0.01))/100)<=0.001;//本来这里小于0.001就是为了解决浮点数精度问题的,没想到差竟然能到0.01去

用上述公式算出的涨停价是:
截图202411262010397866.png

害得我调试半天...
请问老师应该怎么解决浮点数的问题?另外,为什么金字塔不直接出一个是否涨停的函数?
回复

使用道具 举报

103

主题

255

帖子

265

积分

Rank: 2

等级: 标准版

注册:
2023-2-16
曾用名:
 楼主| 发表于 2024-11-26 21:55 | 显示全部楼层
一个简单的Ref引用,前一天收盘价是13.29;用一个REF引用是13.295;
用金字塔论坛推荐的计算涨停价公式是round((ztv+1)*round(REF(CLOSE,2)/0.01))/100,算出来是13.3
我表示很无语.
这样导致我的盘端涨停条件现实不出信号来:
cond1:ABS(REF(CLOSE,1)-round((ztv+1)*round(REF(CLOSE,2)/0.01))/100)<0.0001;//
为0

jiage1:REF(CLOSE,1);
jiage2:round((ztv+1)*round(REF(CLOSE,2)/0.01))/100;

截图202411262149289944.png
截图202411262150582956.png
回复

使用道具 举报

0

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
gxx978
发表于 2024-11-27 09:07 | 显示全部楼层
那是因为数据的存储形式都是浮点型的,品种数据是四舍五入保留2为,指标显示默认是四舍五入保留3位,最多可以设置为显示7位的,这样直接比较就会导致有误差,如果要进行涨跌幅计算时,可以统一对CLOSE用函数rounds保留2位小数,然后进行计算就可以了。
截图202411270905531346.png
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

103

主题

255

帖子

265

积分

Rank: 2

等级: 标准版

注册:
2023-2-16
曾用名:
 楼主| 发表于 2024-11-27 10:38 | 显示全部楼层
那请老师帮我改一下,靠谱的判断涨停逻辑
iszb:=(strleft(stklabel,2)='60' or strleft(stklabel,2)='00');//&#199;&#248;·&#214;&#202;&#199;·&#241;&#214;÷°&#229;
ztv:=if(isst,if(iszb,0.05,0.10),if(iszb,0.1,0.2));//&#180;&#180;&#210;&#181;°&#229;&#185;&#230;&#212;ò&#184;&#180;&#212;&#211;&#163;&#172;&#213;&#199;&#181;&#248;&#205;&#163;&#202;&#253;&#214;&#181;&#178;&#187;&#200;·&#182;¨&#163;&#172;×&#238;&#186;&#195;&#178;&#187;&#210;&#170;&#211;&#166;&#211;&#195;&#212;&#218;&#213;&#226;&#201;&#207;&#195;&#230;&#161;&#163;

cond1:=ABS(REF(CLOSE,1)-round((ztv+1)*round(REF(CLOSE,2)/0.01))/100)<0.0001;//&#213;&#199;&#205;&#163;
回复

使用道具 举报

103

主题

255

帖子

265

积分

Rank: 2

等级: 标准版

注册:
2023-2-16
曾用名:
 楼主| 发表于 2024-11-27 10:38 | 显示全部楼层
截图202411271038291736.png
回复

使用道具 举报

0

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
gxx978
发表于 2024-11-27 10:47 | 显示全部楼层
参考如下:
FD:=IF(STRNCMP(STKLABEL,'30',2)=0 OR STRNCMP(STKLABEL,'688',3)=0,0.2,0.1);
ZT:ROUNDS(C,2)=ROUNDS(REF(C,1)*(1+FD),2);           //ZT=1,表示当天涨停
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

103

主题

255

帖子

265

积分

Rank: 2

等级: 标准版

注册:
2023-2-16
曾用名:
 楼主| 发表于 2024-11-27 10:57 | 显示全部楼层
尝试过了,不行,请老师自己实验一下,股票603332:
jiage1:Rounds(REF(CLOSE,1),2);
jiage2:rounds((0.1+1)*REF(CLOSE,2),2);
信号24年1月10日.
截图202411271057373632.png
回复

使用道具 举报

0

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
gxx978
发表于 2024-11-27 11:13 | 显示全部楼层
那我们这没有更好的算法了,这样算出来的价格应该是最接近涨停价了,如果实际的价格比这个涨停价还要,那可以判断为涨停了。只能用这个>=来优化下对是否涨停来判断了。
ZT:ROUNDS(C,2)>=ROUNDS(REF(C,1)*(1+FD),2);           //ZT=1,表示当天涨停
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2025-6-27 05:16 , Processed in 0.167665 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表