【问题标题】:Conditional result based on previous result基于先前结果的条件结果
【发布时间】:2018-03-12 01:23:59
【问题描述】:

我有一个公式可以导致买入、卖出或持有。公式如下:=IF(D3>0.01,"Buy",IF(D3<-0.01,"Sell","Hold"))

正如您所看到的,它基于 D 列中的值,问题来自这样一个事实,即买入或卖出结果可以连续多次发布,但您可以想象您无法购买某样东西你已经买了,你不能卖你已经卖掉的东西。

所以我想要公式做的是,如果结果是 SELL,那么任何后续的 SELL 结果变为 HOLD,直到出现 BUY 结果,与 BUY 相同,任何额外的 BUY 结果都更改为 HOLD,直到 SELL 结果出现.即连续只有一次卖出或一次买入,并根据需要穿插尽可能多的持有结果。

希望这很清楚,很难用语言来解释。不确定它是否有帮助,但这是一个屏幕抓取。提前致谢。

【问题讨论】:

    标签: excel if-statement excel-formula


    【解决方案1】:

    您可以使用数组公式在 C 列为“买入”或“卖出”的当前行之前找到 MAX ROW,然后进行比较。

    SUMPRODUCT(MAX(ROW(C$1:C2)*--(C$1:C2="Buy")))
    //versus
    SUMPRODUCT(MAX(ROW(C$1:C2)*--(C$1:C2="Sell")))
    

    (SUMPRODUCT 只是确保这部分代码被评估为一个数组公式。C$1 意味着它在您向下拖动时锁定到顶部)

    将此作为您的IF 的一部分,因为您只想在最近的操作相反时进行买入/卖出。 (即仅在BuyRow ≤ SellRow 时购买,反之亦然)

    这意味着您的“购买时间”支票变为AND(D3>0.01, SUMPRODUCT(MAX(ROW(C$1:C2)*--(C$1:C2="Buy")))<=SUMPRODUCT(MAX(ROW(C$1:C2)*--(C$1:C2="Sell")))),因此完整公式变为:

    IF(AND(D3>0.01, SUMPRODUCT(MAX(ROW(C$1:C2)*--(C$1:C2="Buy")))<=SUMPRODUCT(MAX(ROW(C$1:C2)*--(C$1:C2="Sell")))), "Buy", IF(AND(D3<-0.01, SUMPRODUCT(MAX(ROW(C$1:C2)*--(C$1:C2="Buy")))>=SUMPRODUCT(MAX(ROW(C$1:C2)*--(C$1:C2="Sell")))), "Sell", "Hold"))
    

    (&gt;= 和 &lt;= 很重要,因为对于第一个操作,BuyRow 和 SellRow 都将是 0。这确实意味着通过更改其中一个要排除=,您可以告诉它先执行哪个操作!)

    【讨论】:

    • 您好 Chronocidal,我非常感谢您解释每个部分在做什么,我正在尝试了解它是如何工作的,而不仅仅是获得答案,但老实说,这真的超出了我的范围。好消息是它运行良好,非常感谢。
    • 实际上是 Chronocidal,它突然从第 18 行停止工作,我不知道为什么。可以让你看看吗? Microsoft One Drive 链接:1drv.ms/x/s!Ao0OmnEKfEp00XpgTfuo9rx05xR3
    • 查看您的数据,问题是在您在第 17 行卖出后,卖出 将使 %change 变为正数(但您不能卖出您不卖出的东西) t have) 但 buying 或 holding 将使其为负数(即“卖出或持有”区域)。这是因为在该点之后“实时价格”从未超过“最终价格”
    • 嗯,你在答案中有代码来决定你做的最后一件事是“买”还是“卖”。如果“整个时间”是指从第 1 行开始,您可以只使用MAX 和MIN,并且只锁定第一行(例如MAX(A$1:A2),但如果您的意思是从最后一个“卖出”/“买入”那么你需要一个数组公式来MIN/MAX 其中ROW ≥上一个动作
    • 要查看你最后做了什么,只需检查前 2 个SUMPRODUCTS 中的哪个更大,如下所示:=IF(SUMPRODUCT(MAX(ROW(C$1:C2)*--(C$1:C2="Buy")))&gt;SUMPRODUCT(MAX(ROW(C$1:C2)*--(C$1:C2="Sell"))), "Last action was Buy","Last action was Sell")。至于数值,这里是自上次“买入”以来的最大数字:=SUMPRODUCT(MAX(A$1:A2*--(ROW(A$1:A2)&gt;=SUMPRODUCT(MAX(ROW(C$1:C2)*--(C$1:C2="Buy")))))) 和自上次“卖出”以来的最小数字:=SUMPRODUCT(MIN(A$1:A2+1E+99*--(ROW(A$1:A2)&gt;=SUMPRODUCT(MAX(ROW(C$1:C2)*--(C$1:C2="Sell"))))))
    【解决方案2】:

    也许

    =IF(and(D3>0.01, c2<>"Buy"),"Buy", IF(and(D3<-0.01, c2<>"Sell"), "Sell", "Hold"))
    

    【讨论】:

    • 您的公式非常接近 Jeeped,但如果之前的持有是错误的信号,那么即使它已经是宝贵的买入或卖出,它也会产生新的买入或卖出。即:买入+5%,持有-0.8%,买入+4% 在上面的例子中,卖出从未被触发,所以我希望它不会在持有后产生另一个买入。
    猜你喜欢
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多