Sub UO()
'''-----http://www.samurai-logic.com/
'''-----Project of Trading System Development
'''------------------------------------------------------------------
''----B列(日付)、C列(始値)、D列(高値)、E列(安値)、F列(終値)
''----TextBox1に期間1、TextBox2に期間2
''----TextBox3にの期間3
''--------------------------------------------------------------------
Dim length1%, length2%, length3%, LastRow&, i&, j%, j2&
Dim Temp!, Temp2!
Application.ScreenUpdating = False
Worksheets("UltimateOscillator").Activate
LastRow = Range("B4").End(xlDown).Row
Range("H5:I5000").ClearContents
length1 = CInt(ActiveSheet.TextBox1.Value) '期間1
length2 = CInt(ActiveSheet.TextBox2.Value) '期間2
length3 = CInt(ActiveSheet.TextBox3.Value) '期間3
Range("H5:I5000").ClearContents
Range("H3") = "UO:" & length1 & ":" & length2 & ":" & length3
Range("I3") = "UO:移動平均(5)"
If length3 < length2 Or length3 < length1 Then
MsgBox "期間3の設定を長くしてください", vbExclamation
Exit Sub
End If
Dim BP(3), TR(3) As Single
For i = length3 + 5 To LastRow
Temp = 0: Temp2 = 0: BP(1) = 0: TR(1) = 0
For j = 1 To length1
Temp = Cells((i - length1) + j, 6).Value - _
WorksheetFunction.Min(Range("E" & (i - length1) + j), _
Range("F" & (i - length1) + j - 1)) 'BP=当日の終値-TL
Temp2 = WorksheetFunction.Max(Range("D" & (i - length1) + j) - _
Range("F" & (i - length1) + j - 1), _
Range("F" & (i - length1) + j - 1) - _
Range("E" & (i - length1) + j), _
Range("D" & (i - length1) + j) - _
Range("E" & (i - length1) + j))
BP(1) = BP(1) + Temp 'Buying Pressure
TR(1) = TR(1) + Temp2 'True Range
Next j
BP(2) = 0: TR(2) = 0
Temp = 0: Temp2 = 0
For j = 1 To length2
Temp = Cells((i - length2) + j, 6).Value - _
WorksheetFunction.Min(Range("E" & (i - length2) + j), _
Range("F" & (i - length2) + j - 1)) 'BP=当日の終値-TL
Temp2 = WorksheetFunction.Max(Range("D" & (i - length2) + j) - _
Range("F" & (i - length2) + j - 1), _
Range("F" & (i - length2) + j - 1) - _
Range("E" & (i - length2) + j), _
Range("D" & (i - length2) + j) - _
Range("E" & (i - length2) + j))
BP(2) = BP(2) + Temp
TR(2) = TR(2) + Temp2
Next j
BP(3) = 0: TR(3) = 0
Temp = 0: Temp2 = 0
For j = 1 To length3
Temp = Cells((i - length3) + j, 6).Value - _
WorksheetFunction.Min(Range("E" & (i - length3) + j), _
Range("F" & (i - length3) + j - 1)) 'BP=当日の終値-TL
Temp2 = WorksheetFunction.Max(Range("D" & (i - length3) + j) - _
Range("F" & (i - length3) + j - 1), _
Range("F" & (i - length3) + j - 1) - _
Range("E" & (i - length3) + j), _
Range("D" & (i - length3) + j) - _
Range("E" & (i - length3) + j))
BP(3) = BP(3) + Temp
TR(3) = TR(3) + Temp2
Next j
Temp = (4 * BP(1) / TR(1)) + (2 * BP(2) / TR(2)) + (BP(3) / TR(3))
Temp2 = Temp / 7 * 100
Cells(i, 8).Value = Temp2
Cells(i, 9).Value = _
WorksheetFunction.Average(Range("H" & i, "H" & i - 4))
Next i
Range("H5", "I" & LastRow).NumberFormatLocal = "0.00"
Erase BP
Erase TR
Application.ScreenUpdating = True
End Sub