Sub MACD()
'''-----http://www.samurai-logic.com/
'''-----Project of Trading System Development
'''------------------------------------------------------------------
''----B列(日付)、C列(始値)、D列(高値)、E列(安値)、F列(終値)
''----
''----TextBox1にEMA1の期間、TextBox2にEMA2の期間、
''----TextBox3にシグナルの期間
''--------------------------------------------------------------------
Dim length1%, length2%, length3%, LastRow&, i&, Temp!, Temp2!
Application.ScreenUpdating = False
Worksheets("MACD").Activate
LastRow = (Range("B4").End(xlDown).Row)
Range("H5:I5000").ClearContents
length1 = CInt(ActiveSheet.TextBox1.Value) 'EMAの期間 1
length2 = CInt(ActiveSheet.TextBox2.Value) 'EMAの期間 2
length3 = CInt(ActiveSheet.TextBox3.Value) 'Macd signal
If (length1) > (length2) Then ''期間の長さが逆の場合切り替え
length1 = ActiveSheet.TextBox2.Value
length2 = ActiveSheet.TextBox1.Value
End If
Range("H3") = "MACD(" & length1 & ":" & length2 & ")"
Range("I3") = "MACD Singal(" & length3 & ")"
Temp = 0: Temp2 = 0
'1つ目のEMAの値Temp & 2つ目のEMAの値Temp2を算出して代入
For i = length1 + 4 To LastRow
If i = (length1 + 4) Then
Temp = _
WorksheetFunction.Average(Range("F" & i - (length1) + 1, "F" & i))
ElseIf i = (length2 + 4) Then
Temp2 = _
WorksheetFunction.Average(Range("F" & i - (length2) + 1, "F" & i))
End If
If i > (length1 + 4) And i > (length2 + 4) Then
Temp = Temp + ((Cells(i, 6).Value - Temp) * 2 / (1 + length1))
Temp2 = Temp2 + ((Cells(i, 6).Value - Temp2) * 2 / (1 + length2))
Cells(i, 8).Value = Temp - Temp2
If (i > (length2) + (length3 + 3)) Then
Cells(i, 9).Value = _
WorksheetFunction.Average(Range("H" & i, "H" & i - length3 + 1))
End If
ElseIf i > (length1 + 4) And i <= (length2 + 4) Then
Temp = Temp + ((Cells(i, 6).Value - Temp) * 2 / (1 + length1))
End If
Next
Range("H5", "I" & LastRow).NumberFormatLocal = "0.00"
Application.ScreenUpdating = False
End Sub