【问题标题】:How can I calculate the time until the US stock market is next open?如何计算美国股市下一次开市的时间?
【发布时间】:2022-09-29 13:00:16
【问题描述】:

单元格G7 应该在HH : MM : SS 中显示时间,直到美国股市下一次开市。

单元格G4 计算OPENCLOSED,具体取决于在ALGORITHM 表中搜索FALSETRUEVLOOKUP 是否每天市场开放(周末标记为@ 987654334@ 和任何假期一样)并且如果当前时间(在单元格 B10 中找到)落在显示在 K6M6 的市场时间内。

当前公式:

G7 : =IF(G4=\"OPEN\",M6-B10,K6-B10)

G4 : =IF(AND(VLOOKUP(B4,ALGORITHM!D5:ALGORITHM!J369,5,),B10>=K$6,B10<M$6),\"OPEN\",\"CLOSED\")

任何人都可以为此建议一个潜在的公式或 VBA 解决方案吗?

  • 我建议您编写一个 VBA 例程,使用 Application.OnTime 方法用信息填充这些单元格,以触发宏以您选择的时间间隔运行。如果市场开市,您也可以选择暂停“市场开市时间”。
  • 所以 now() 和下一个开放时间的区别。这里也有基于函数的答案,可以在午夜处理。
  • 您所要求的全部范围都非常复杂。考虑节假日、周末、时区、时间格式将涉及大量代码。我知道因为我已经编写了这些确切的例程至少是 3 种不同的编码语言。我可能愿意在计时器上放置一些计算下次打开时间的基本代码——这将基于前两个海报提到的那种事情。
  • 我认为你的问题可能被误解了。您已经有了开放日、假期等的表格。我相信您只是想确定 NOW() 之后的下一个开放日期/时间,并确定从现在开始有多少 hh:mm:ss。如果这是正确的并且您使用的是 Excel O365,我可以在单元格 G7 中发布一个可行的答案。但是我不想在不知道我正确理解您要做什么的情况下对其进行测试和发布。
  • Max,这是正确的,但是我不在 O365 上,遗憾的是我在使用 Excel 16.65 的 maxcOS 上。我还没有很多有用的功能。

标签: excel vba math excel-formula vba7


【解决方案1】:

当您只尝试在一个条件下匹配时,生活会更轻松。您构建问题的方式,您的 HOME 查找公式必须查看当前工作表中的时间,以及算法表中的日期。这使每个比较变得复杂。当您可以查看 ONE 单元格或 ONE 范围并测试 ONE 条件以获得结果时,会更容易。有时,这样做涉及创建“帮助列”。问题是存在无法使用辅助列的用例。但是在您的情况下,算法表是“非美学的”并且可以支持辅助列。

因此,将两个“帮助”列添加到 Algorithm 表中,因此您的表如下所示:

1 A B C D E (My Notes)
2 Date Market Open Remarks untilOpen untilClose
3 9/24/2022 FALSE - - - Blank because Past
4 9/25/2022 FALSE - - - Blank because Past
5 9/26/2022 TRUE - - - Blank because Past
6 9/27/2022 TRUE - - - Blank because Past
7 9/28/2022 TRUE - - - Blank because Past
8 9/29/2022 TRUE - 0.44085 0.71168 Next Opening/closing
9 9/30/2022 TRUE - 1.44085 1.71168
10 10/1/2022 FALSE - - -
11 10/2/2022 FALSE - - -
12 10/3/2022 TRUE - 4.44085 4.71168
13 10/4/2022 TRUE - 5.44085 5.71168
14 10/5/2022 TRUE - 6.44085 6.71168
15 10/6/2022 TRUE - 7.44085 7.71168
16 10/7/2022 TRUE - 8.44085 8.71168
17 10/8/2022 FALSE - - -
18 10/9/2022 FALSE - - -
19 10/10/2022 FALSE Holiday - - Blank because holiday
20 10/11/2022 TRUE - 12.44085 12.71168
21 10/12/2022 TRUE - 13.44085 13.71168

我的 D 列是距离下一次打开多长时间的日期/时间戳。 E 是距离下一次收盘还有多长时间。这些是动态的,并在每次工作表重新计算时基于 NOW 进行更新。 (在 Excel 中,整数部分是天数,小数部分是部分天数,仍然可以格式化为“d hh:mm:ss”。)我让你来使用 Excel 格式来获得你想要的外观。

我桌子的时间戳是基于 9 月 28 日晚上的,我还在 22 年 10 月 10 日放了一个假假期以作说明。

以下是这些单元格的公式,然后将其复制到每一列到所有行:

B2我改用比你更简单的公式来确定工作日/节假日(并将其复制下来):

=AND(WEEKDAY(A2,2)<=5,C2="-")
  • 如果是周一到周五,B2 为 TRUE,并且备注为“-”。

D2

=LET( open, A2 + TIME(9,30,0) - NOW(), IF( AND( B2, open > 0), open, "-"))
  • 这表示使变量“打开”= 该行的日期加上上午 9:30 减去现在,这意味着这是该行打开时间之前的时间的 Excel 时间戳。
  • 如果这个时间还在未来,并且这是一个开放日,则将此时间戳放在单元格中,否则将其设为“=”。

E2

=LET( close, A2 + TIME(16,0,0) - NOW(), IF( AND( B2, close > 0), close, "-"))
  • 执行相同操作,但针对此行的关闭时间。

看看我做了什么?大部分逻辑在算法表中。因为我空白的过去几天和节假日的时间戳,我的查找实际上就是这么简单:

  • 到下一次开盘的天/小时/分钟/秒只是=MIN(D2:D21)

  • 下一次关闭也一样,即=MIN(E2:E21)

唯一剩下的逻辑是让您的主页确定市场当前是开市还是收市。

事实上,从“现在”开始的下一个打开/关闭事件只是 =MIN(D2:E21),因为打开时间一过,每一行中的打开时间都会变为空白。换句话说,您主页上的小时和分钟可以总是只需来自=MIN(D2:E21),您所要做的就是确定当前状态是否已关闭。

我们现在已经从查找中消除了所有复杂性。重要的是要决定要放置逻辑的位置,在复杂的查找中通常不是最好的位置。我们将逻辑移至调度表。

顺便说一句,关于您的示例的一些建议:

  1. 在 Excel 中,它非常重要,高度建议避免使用合并单元格。您对合并单元格的使用不会增加额外的美感或可用性。合并单元格会降低逻辑和公式的直观性,可能会使格式复杂化等。仅当合并单元格具有无法以其他方式实现的特定好处时,才使用合并单元格。您可以设置行高和列宽以获得更好的结果。

  2. 您的数据未针对查找和计算进行标准化。如果市场在任何工作日开盘和收盘都相同,那么只需设置周一至周五的行,其中包含 9:30 和下午 4:00。如果您希望能够支持每个工作日的不同时间,则有 10 个单元格(5 行 x 2 列)包含打开和关闭时间,然后让算法表进行查找。你已经创造了一个星期几逻辑的美学外观,但它吸引了有经验的人的眼睛,实际上并没有,而且时间表“只是为了展示”。

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多