我正在努力想出这个问题的标题,因为我无法弄清楚如何最好地把它。我相信我能用照片更好地解释我的问题。
这也可能对公式要求太高,需要VBA编码
我想生成一个分析2列值范围的公式。第一列是股票的调整后收盘价。第二列是一个计算振荡器,旨在预测超过和未完成状态。
在这个公式中,如果计算的振荡器低于30,则认为股票处于买入低位,如果高于80,则认为超买。因此,我想计算第一次发生的未买入与下一次超买实例之间的收盘价差异。
然后我希望这个公式循环遍历当年股票价格的所有实例。从理论上讲,股票多次出现并且超买。
我基本上考虑了这些范围。期间的开始是超买价值的最后一个实例之后的超买数字的第一个实例。期末是下一个超买价值。
股票处于低位/超买状态的天数范围很广,因此需要采用动态公式。
我考虑使用嵌套的if和choose语句,但我不能提出足够强大的东西。有人能指出我正确的方向,用什么功能来实现这个目标?这是否需要VBA?
我想做的例子
感谢您花时间阅读并思考这一点。如果我能为您澄清任何内容,请告诉我。
答案 0 :(得分:0)
您需要针对此类问题设置一个小型有限状态机,如果您使用VBA或辅助列,则无关紧要。
所以有三种状态
(1)初始状态
(2)'Primed'州
(3)处于期间状态
和三个过渡
(A)从(1)到(2)发现超买股票时
(B)从(2)到(3)当下次未买入股票时发现
(C)从(3)回到(1)当发现下一个超买股票时。
因此,您需要设置一个列来处理包含公式
的状态和转换=IF(AND(I2=1,H3>80),2,IF(AND(I2=2,H3<30),3,IF(AND(I2=3,H3>80),1,I2)))
从(比方说)I3开始(I2设为1)。
然后你需要两个辅助列来计算句点结束和开始
=IF(AND(I1=2,I2=3),MAX(J$1:J1)+1,"")
=IF(AND(I1=3,I2=1),MAX(K$1:K1)+1,"")
最后是一个选择差异的专栏
=IFERROR(INDEX(G$2:G$100,MATCH(ROWS(L$1:L1),J$2:J$100,0))-INDEX(G$2:G$100,MATCH(ROWS(L$1:L1),K$2:K$100,0)),"")
找到第n个时期的差异的VBA看起来如下 - 你会这样称之为(比如说)I2
=IFERROR(stock(G$2:G$100,H$2:H$100,ROWS(N$1:N1)),"")
所以当你拉下公式时,它会寻找下一个时期。
Option Explicit
Function Stock(Actual As Range, Predicted As Range, n As Integer) As Variant
Dim i, rows, LastRow, period As Long
Dim state As Integer
Dim startFound, endFound As Boolean
Dim actualValue, predictedValue, startValue, endValue As Double
state = 1
period = 0
startFound = False
endFound = False
rows = Actual.rows.Count
If rows <> Predicted.rows.Count Then
Stock = CVErr(xlErrValue)
Return
End If
For i = 1 To rows
actualValue = Actual.Cells(i, 1).Value
predictedValue = Predicted.Cells(i, 1).Value
If state = 1 And predictedValue > 80 Then
state = 2
Else
If state = 2 And predictedValue < 30 Then
state = 3
period = period + 1
If period = n Then
startValue = actualValue
startFound = True
End If
Else
If state = 3 And predictedValue > 80 Then
state = 1
If period = n Then
endValue = actualValue
endFound = True
Exit For
End If
End If
End If
End If
Next I
If startFound And endFound Then
Stock = startValue - endValue
Else
Stock = CVErr(xlErrValue)
End If
End Function