php - Nifty 指数价格的 20 周期移动平均线计算

标签 php mysql

  • nifty 是印度国家证券交易所的股票指数。 *

我有一个名为“livedata”的数据库,其中表名称为nifty,这是印度国家证券交易所的股票指数。我有一行名为

ID 作为主键,时间作为时间戳,cmp 表示特定的“漂亮”股票指数。白天(上午 09:15:01 到下午 03:29:59)一分钟内

(1) 我收到大约 5 个交易条目。

示例:-

ID |        time        |     cmp | 
-----------------------------------
1  |2014-10-17 10:55:05 | 7743.85 | 
2  |2014-10-17 10:55:15 | 7743.55 | 
3  |2014-10-17 10:55:22 | 7743.35 | 
4  |2014-10-17 10:55:34 | 7744.85 | 
5  |2014-10-17 10:55:45 | 7743.35 | 
6  |2014-10-17 10:55:56 | 7743.25 | this should be the last / closing trade Entry.
7  |2014-10-17 10:56:17 | 7743.15 | 
8  |2014-10-17 10:56:25 | 7742.85 | 
9  |2014-10-17 10:56:35 | 7742.25 | 
10 |2014-10-17 10:56:45 | 7743.35 | 
11 |2014-10-17 10:56:55 | 7742.65 | this should be the last / closing trade Entry.
12 |2014-10-17 10:57:23 | 7743.55 | 
13 |2014-10-17 10:57:37 | 7744.85 | 
14 |2014-10-17 10:57:46 | 7743.55 | 
15 |2014-10-17 10:57:53 | 7741.85 | 
16 |2014-10-17 10:57:56 | 7742.45 | this should be the last / closing trade Entry.
17 |2014-10-17 10:58:05 | 7743.85 | 
18 |2014-10-17 10:58:17 | 7743.55 | 
19 |2014-10-17 10:58:29 | 7743.35 | 
20 |2014-10-17 10:58:37 | 7744.85 | 
21 |2014-10-17 10:58:48 | 7743.35 | 
22 |2014-10-17 10:58:56 | 7743.25 | this should be the last / closing trade Entry.
23 |2014-10-17 10:59:17 | 7743.15 | 
24 |2014-10-17 10:59:21 | 7742.85 | 
25 |2014-10-17 10:59:33 | 7742.25 | 
26 |2014-10-17 10:59:43 | 7743.35 | 
27 |2014-10-17 10:59:50 | 7742.65 | 
28 |2014-10-17 10:59:57 | 7743.55 | this should be the last / closing trade Entry.
29 |2014-10-17 10:60:17 | 7744.85 | 
30 |2014-10-17 10:60:25 | 7743.55 | 
31 |2014-10-17 10:60:36 | 7741.85 | 
32 |2014-10-17 10:60:47 | 7742.45 |this should be the last / closing trade Entry.

我想根据每分钟的最后/收盘价计算移动平均线。对于一 (1) 分钟内的众多条目中的这一点,我

仅需要最后的交易条目。 示例基本期望结果:-

ID |          time      |     cmp |
-----------------------------------
6  |2014-10-17 10:55:56 | 7743.25 | 
11 |2014-10-17 10:56:55 | 7742.65 | 
16 |2014-10-17 10:57:56 | 7742.45 | 
22 |2014-10-17 10:58:56 | 7743.25 | 
28 |2014-10-17 10:59:57 | 7743.55 | 
32 |2014-10-17 10:60:47 | 7742.45 |

例如。 (移动平均线 = 添加 20 个周期,即过去 20 分钟内每分钟的最后交易入场点并除以 20。该值应出现在

前端可能正在使用 $result= mysql_query($query) 或 die (mysql_error());请建议..

如果我想获取每分钟的最后一个条目,我该如何编写 PHP 代码?现在我正在使用

获取条目
$query= "SELECT FROM nifty WHERE time BETWEEN '2014-10-17 10:55:05' AND '2014-10-17 10:60:47'"; 

实际结果:-

ID      Date Stamp        CMP
1   2014-10-17 10:55:05 7743.85
2   2014-10-17 10:55:14 7743.75
3   2014-10-17 10:55:18 7745.30
4   2014-10-17 10:55:21 7745.35
5   2014-10-17 10:55:32 7745.10
6   2014-10-17 10:55:36 7744.85
7   2014-10-17 10:55:46 7744.40
8   2014-10-17 10:55:50 7744.70
9   2014-10-17 10:55:59 7745.60 this should be the last / closing trade Entry.
10  2014-10-17 10:56:06 7745.80
11  2014-10-17 10:56:11 7745.40
12  2014-10-17 10:56:23 7746.50
13  2014-10-17 10:56:32 7747.30
14  2014-10-17 10:56:34 7747.35
15  2014-10-17 10:56:41 7747.65
16  2014-10-17 10:56:52 7747.80
17  2014-10-17 10:56:56 7748.20 this should be the last / closing trade Entry.
18  2014-10-17 10:57:01 7747.80
19  2014-10-17 10:57:13 7747.75
20  2014-10-17 10:57:16 7747.55
21  2014-10-17 10:57:28 7747.50
22  2014-10-17 10:57:32 7746.95
23  2014-10-17 10:57:38 7746.55
24  2014-10-17 10:57:40 7746.70
25  2014-10-17 10:57:50 7747.25
26  2014-10-17 10:57:58 7746.55 this should be the last / closing trade Entry.
27  2014-10-17 10:58:09 7746.70
28  2014-10-17 10:58:11 7746.90
29  2014-10-17 10:58:17 7747.20
30  2014-10-17 10:58:26 7746.75
31  2014-10-17 10:58:33 7746.70
32  2014-10-17 10:58:37 7746.55 this should be the last / closing trade Entry.
33  2014-10-17 11:30:28 7748.35
34  2014-10-17 11:30:32 7748.95
35  2014-10-17 11:30:40 7749.95
36  2014-10-17 11:30:45 7749.05
37  2014-10-17 11:30:58 7748.95 this should be the last / closing trade Entry.
38  2014-10-17 11:31:03 7748.80
39  2014-10-17 11:31:08 7749.90
40  2014-10-17 11:31:12 7751.80
41  2014-10-17 11:31:26 7752.70
42  2014-10-17 11:31:33 7753.80
43  2014-10-17 11:31:33 7753.60
44  2014-10-17 11:31:39 7752.55
45  2014-10-17 11:31:50 7752.65
46  2014-10-17 11:31:56 7754.60 this should be the last / closing trade Entry.
47  2014-10-17 11:32:18 7755.15
48  2014-10-17 11:32:18 7755.35
49  2014-10-17 11:32:26 7755.25
50  2014-10-17 11:32:36 7754.45
51  2014-10-17 11:32:40 7754.90
52  2014-10-17 11:32:56 7754.40 this should be the last / closing trade Entry.
53  2014-10-17 11:33:10 7754.35
54  2014-10-17 11:33:12 7753.65
55  2014-10-17 11:33:15 7753.45
56  2014-10-17 11:33:22 7753.50
57  2014-10-17 11:33:25 7753.35
58  2014-10-17 11:33:34 7753.45
59  2014-10-17 11:33:39 7754.20
60  2014-10-17 11:33:49 7756.35
61  2014-10-17 11:33:50 7755.65
62  2014-10-17 11:33:54 7757.15 this should be the last / closing trade Entry.
63  2014-10-17 11:34:01 7759.05

我们可以使用loop、while、do while来实现这个吗? 请帮忙解决这个问题,非常感谢。

使用SELECT LOOP WHILE DO WHILE等预期的结果

最佳答案

MySQL 不支持分析函数,这使得此类任务比许多其他 RDBMS 引擎要困难得多。

虽然仍然可以使用纯粹的基于集合的 SQL 方法,但这比使用 user variable 的一点捷径更难理解,而且效率可能要低得多。 :

SELECT AVG(cmp) FROM (
    SELECT   cmp, @t:=time - INTERVAL SECOND(time) SECOND
    FROM     nifty, (SELECT @t:=CURRENT_TIMESTAMP) init
    WHERE    time < @t
    ORDER BY time DESC
    LIMIT    20
) x

查看 sqlfiddle .

外部查询应该是相当不言自明的:它只是从内部查询中获取 cmp 值的平均值。

由于其 ORDER BY 子句,内部查询在 nifty 表上向后移动;使用变量 @t 来跟踪我们已经计算过的最新分钟,WHERE 子句确保只考虑该分钟之前的条目 - 而第二项每当找到匹配项时,SELECT 列表中的 @t 就会更新为找到的分钟的开始时间。最后,LIMIT 子句确保一旦找到第 20 条记录,内部查询就会终止。

如果存在一个复合索引,其中 (time, cmp) 是最左边的列(按该顺序),则此查询的计算效率最高。例如:

ALTER TABLE nifty ADD INDEX (time, cmp)

关于php - Nifty 指数价格的 20 周期移动平均线计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28461747/

相关文章:

php - Magento 客户登录在某些帐户上挂起

php - 在 yii 2 中构建 'AND' 查询

javascript - ajax数据类型json jquery成功

mysql - 带有 MySQL 的 Entity Framework 6 - 类库

MySQL: Cannot add foreign key constraint in school project 报错

PHP 变量到 Javascript 变量

php - 将日期字符串 (Y-m-d) 转换为 "Mar 2nd"php/mysql

mysql - 使用 cron job + git 自动备份实时数据库

mysql - Spring @Transactional 死锁

php - PHP中的HL7解析