金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 2566|回复: 9

求标准差

[复制链接]

171

主题

475

帖子

485

积分

Rank: 2

等级: 标准版

注册:
2021-5-31
曾用名:
发表于 2023-5-7 20:42 | 显示全部楼层 |阅读模式
请教如下:
策略运行在小时周期,定义一个变量n,需要计算前面n-1天的收盘价与当前小时K线的收盘价共同构成的一组数(共n个数)的标准差,请问应该怎么样写这段代码?谢谢!
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-5-8 09:10 | 显示全部楼层
没办法,直接用函数是无法很好的处理的。只能重构下算法才行:
[PEL] 复制代码
V1:=c;
V2:CALLSTOCK('',vtCLOSE,5,0);//小时周期的C
LEN:=60;//N



x:=(REF(sum(v1,len-1),1)+V2)/LEN;//均值

sum1:=0;
for i=1 to len-1 do 
begin 
if V1[BARPOS-i]<>0 then sum1:=sum1+pow(c[BARPOS-i]-x,2);
end 
sum1:=sum1+pow(V2-x,2);
result:SQRT(sum1/60);


//小时周期下对照组和result数值一样,说明算法重构是正确的
对照组:STDP(c,60);


算法比较复杂,可以先不管算法原理,想办法先校验下结果。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

171

主题

475

帖子

485

积分

Rank: 2

等级: 标准版

注册:
2021-5-31
曾用名:
 楼主| 发表于 2023-5-8 09:46 | 显示全部楼层
谢谢!
经过测试在逐K模式下运行对比正确,在序列模式下result无输出。
要得得到小时周期运行前面N-1个数是日线的C,最后一个数是小时的CLOSE,是不是v1应该是日线从昨天到的CLOSE,v2是本周期的CLOSE。下面这样修改正确吗?
V1:=CALLSTOCK('',vtCLOSE,6,-1);
V2:C;
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-5-8 09:50 | 显示全部楼层
本帖最后由 技术009 于 2023-5-8 09:53 编辑

序列下不行的。 这个指标只能在逐K下执行。

“要得得到小时周期运行前面N-1个数是日线的C,最后一个数是小时的CLOSE,是不是v1应该是日线从昨天到的CLOSE,v2是本周期的CLOSE”

这个指标默认运行在N-1对应的那个周期,v2调取单独引用的那个数据。
不过你如果N-1是对应日线,那其实你调用小时线没啥意义,调用到的小时线和最新日线的c是一样的呀。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

171

主题

475

帖子

485

积分

Rank: 2

等级: 标准版

注册:
2021-5-31
曾用名:
 楼主| 发表于 2023-5-8 10:09 | 显示全部楼层
这样写的意义,是“对照组60:STKINDI('','标准差.对照组',0,6,0)”这样取的数值有未来函数,在历史回测的时候,时间上运行到开盘第一小时就取的当天的收盘价了。
代码修改如下后,与直接取当天日线的标准差对比数值不一样,您看看问题在哪里?
//运行在小时周期进行对比
V1:=C;
V2:CALLSTOCK('',vtCLOSE,6,0);//小时周期的C
LEN:=60;//N



x:=(REF(sum(v1,len-1),1)+V2)/LEN;//均值

sum1:=0;
for i=1 to len-1 do
begin
if V1[BARPOS-i]<>0 then sum1:=sum1+pow(c[BARPOS-i]-x,2);
end
sum1:=sum1+pow(V2-x,2);
result:SQRT(sum1/60);


//小时周期下对照取日线本周的标准差与计算值进行对照,如果代码周期应该2个数相等
对照组60:STKINDI('','标准差.对照组',0,6,0);//用跨周期取日线今日标准差


回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-5-8 10:34 | 显示全部楼层
那我前面理解错了。
倒是不能直接在小时周期上算,可能要更麻烦点,不一定能实现,先试下吧。






金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

171

主题

475

帖子

485

积分

Rank: 2

等级: 标准版

注册:
2021-5-31
曾用名:
 楼主| 发表于 2023-5-8 10:40 | 显示全部楼层
谢谢您!
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-5-8 10:46 | 显示全部楼层
[PEL] 复制代码
N:=60;
x:(((N-1))*"ma.ma1##day"(N-1)+C)/N;//均值重构

sum1:=0;
for i=1 to N-1 do
begin
C1:CALLSTOCK('',vtCLOSE,6,-I);
if C1<>0 then sum1:=sum1+pow(C1-x,2);
end
sum1:=sum1+pow(C-x,2);
result:sqrt(sum1/60);

对照组:"std.对照组#day"(n);//对照组就是 60周期日线的stdp


这样就行了。
小时线和调用日线的结果在最新K上是一样的。
截图202305081046378623.png
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

171

主题

475

帖子

485

积分

Rank: 2

等级: 标准版

注册:
2021-5-31
曾用名:
 楼主| 发表于 2023-5-8 14:41 | 显示全部楼层
谢谢!我看这段代码直接运行运行在15分钟等其他周期上也能取得运行周期上的K线收盘于前面N-1天日线收盘价构成的标准差,不需要其他修改,这个看法是不是正确?
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-5-8 14:54 | 显示全部楼层
是这样的了。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-12 14:15 , Processed in 0.135037 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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