Excel VBA code (technical index for trading system)

Excel VBA Source Code --- Ultimate Oscillator(アルティメットオシレータ)

Technical code for trading system.

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