Class: Quant::Ticks::OHLC

Inherits:
Tick
  • Object
show all
Includes:
Quant::TimeMethods
Defined in:
lib/quant/ticks/ohlc.rb

Overview

A OHLC is a bar or candle for a point in time that has an open, high, low, and close price. It is the most common form of a Tick and is usually used to representa time period such as a minute, hour, day, week, or month.

The OHLC is used to represent the price action of an asset The interval of the OHLC is the time period that the OHLC represents, such has hourly, daily, weekly, etc.

Constant Summary

Constants included from Quant::TimeMethods

Quant::TimeMethods::EPOCH_DATE, Quant::TimeMethods::EPOCH_TIME

Instance Attribute Summary collapse

Attributes inherited from Tick

#indicators

Instance Method Summary collapse

Methods included from Quant::TimeMethods

epoch_date, epoch_time, #extract_time

Methods inherited from Tick

#assign_series, #assign_series!, #default_serializer_class, default_serializer_class, from, from_json, #interval, #series?, #to_csv, #to_h, #to_json

Constructor Details

#initialize(open_timestamp:, close_timestamp:, open_price:, high_price:, low_price:, close_price:, volume: nil, base_volume: nil, target_volume: nil, trades: nil, green: nil, doji: nil) ⇒ OHLC

Returns a new instance of OHLC.



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/quant/ticks/ohlc.rb', line 23

def initialize(
  open_timestamp:,
  close_timestamp:,

  open_price:,
  high_price:,
  low_price:,
  close_price:,

  volume: nil,
  base_volume: nil,
  target_volume: nil,

  trades: nil,
  green: nil,
  doji: nil
)
  @open_timestamp = extract_time(open_timestamp)
  @close_timestamp = extract_time(close_timestamp)

  @open_price = open_price.to_f
  @high_price = high_price.to_f
  @low_price = low_price.to_f
  @close_price = close_price.to_f

  @base_volume = (volume || base_volume).to_i
  @target_volume = (target_volume || @base_volume).to_i
  @trades = trades.to_i

  @green = green.nil? ? compute_green : green
  @doji = doji.nil? ? compute_doji : doji
  super()
end

Instance Attribute Details

#base_volumeObject (readonly) Also known as: volume

Returns the value of attribute base_volume.



20
21
22
# File 'lib/quant/ticks/ohlc.rb', line 20

def base_volume
  @base_volume
end

#close_priceObject (readonly) Also known as: price

Returns the value of attribute close_price.



19
20
21
# File 'lib/quant/ticks/ohlc.rb', line 19

def close_price
  @close_price
end

#close_timestampObject (readonly) Also known as: timestamp

Returns the value of attribute close_timestamp.



18
19
20
# File 'lib/quant/ticks/ohlc.rb', line 18

def close_timestamp
  @close_timestamp
end

#dojiObject (readonly)

Returns the value of attribute doji.



21
22
23
# File 'lib/quant/ticks/ohlc.rb', line 21

def doji
  @doji
end

#greenObject (readonly)

Returns the value of attribute green.



21
22
23
# File 'lib/quant/ticks/ohlc.rb', line 21

def green
  @green
end

#high_priceObject (readonly)

Returns the value of attribute high_price.



19
20
21
# File 'lib/quant/ticks/ohlc.rb', line 19

def high_price
  @high_price
end

#low_priceObject (readonly)

Returns the value of attribute low_price.



19
20
21
# File 'lib/quant/ticks/ohlc.rb', line 19

def low_price
  @low_price
end

#open_priceObject (readonly)

Returns the value of attribute open_price.



19
20
21
# File 'lib/quant/ticks/ohlc.rb', line 19

def open_price
  @open_price
end

#open_timestampObject (readonly)

Returns the value of attribute open_timestamp.



18
19
20
# File 'lib/quant/ticks/ohlc.rb', line 18

def open_timestamp
  @open_timestamp
end

#seriesObject (readonly)

Returns the value of attribute series.



17
18
19
# File 'lib/quant/ticks/ohlc.rb', line 17

def series
  @series
end

#target_volumeObject (readonly)

Returns the value of attribute target_volume.



20
21
22
# File 'lib/quant/ticks/ohlc.rb', line 20

def target_volume
  @target_volume
end

#tradesObject (readonly)

Returns the value of attribute trades.



20
21
22
# File 'lib/quant/ticks/ohlc.rb', line 20

def trades
  @trades
end

Instance Method Details

#==(other) ⇒ Object

Two OHLC ticks are equal if their interval, close_timestamp, and close_price are equal.



74
75
76
# File 'lib/quant/ticks/ohlc.rb', line 74

def ==(other)
  [interval, close_timestamp, close_price] == [other.interval, other.close_timestamp, other.close_price]
end

#compute_dojiBoolean

Computes a doji candlestick pattern. A doji is a candlestick pattern that occurs when the open and close are the same or very close to the same. The high and low are also very close to the same. The doji pattern is a sign of indecision in the market. It is a sign that the market is not sure which way to go.

Returns:

  • (Boolean)


119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/quant/ticks/ohlc.rb', line 119

def compute_doji
  body_bottom, body_top = [open_price, close_price].sort

  body_length = body_top - body_bottom
  head_length = high_price - [open_price, close_price].max
  tail_length = [open_price, close_price].max - low_price

  body_ratio = 100.0 * (1 - (body_bottom / body_top))
  head_ratio = head_length / body_length
  tail_ratio = tail_length / body_length

  body_ratio < 0.025 && head_ratio > 1.0 && tail_ratio > 1.0
end

#compute_greenObject

Set the #green? property to true when the close_price is greater than or equal to the open_price.



99
100
101
# File 'lib/quant/ticks/ohlc.rb', line 99

def compute_green
  close_price >= open_price
end

#corresponding?(other) ⇒ Boolean

The corresponding? method helps determine that the other tick’s timestamp is the same as this tick’s timestamp, which is useful when aligning ticks between two separate series where one starts or ends at a different time, or when there may be gaps in the data between the two series.

Returns:

  • (Boolean)


69
70
71
# File 'lib/quant/ticks/ohlc.rb', line 69

def corresponding?(other)
  [open_timestamp, close_timestamp] == [other.open_timestamp, other.close_timestamp]
end

#daily_price_changeFloat

Returns the percent daily price change from open_price to close_price, ranging from 0.0 to 1.0. A positive value means the price increased, and a negative value means the price decreased. A value of 0.0 means no change.

Returns:

  • (Float)


82
83
84
85
86
87
# File 'lib/quant/ticks/ohlc.rb', line 82

def daily_price_change
  return open_price.zero? ? 0.0 : -1.0 if close_price.zero?
  return 0.0 if open_price == close_price

  (open_price / close_price) - 1.0
end

#daily_price_change_ratioFloat

Calculates the absolute change from the open_price to the close_price, divided by the average of the open_price and close_price. This method will give a value between 0 and 2, where 0 means no change, 1 means the price doubled, and 2 means the price went to zero. This method is useful for comparing the volatility of different assets.

Returns:

  • (Float)


94
95
96
# File 'lib/quant/ticks/ohlc.rb', line 94

def daily_price_change_ratio
  (open_price - close_price).abs / oc2
end

#doji?Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/quant/ticks/ohlc.rb', line 111

def doji?
  @doji
end

#green?Boolean

Returns:

  • (Boolean)


103
104
105
# File 'lib/quant/ticks/ohlc.rb', line 103

def green?
  @green
end

#hl2Object



61
# File 'lib/quant/ticks/ohlc.rb', line 61

def hl2; ((high_price + low_price) / 2.0) end

#hlc3Object



63
# File 'lib/quant/ticks/ohlc.rb', line 63

def hlc3; ((high_price + low_price + close_price) / 3.0) end

#inspectObject



133
134
135
# File 'lib/quant/ticks/ohlc.rb', line 133

def inspect
  "#<#{self.class.name} ct=#{close_timestamp.iso8601} o=#{open_price} h=#{high_price} l=#{low_price} c=#{close_price} v=#{volume}>"
end

#oc2Object



62
# File 'lib/quant/ticks/ohlc.rb', line 62

def oc2; ((open_price + close_price) / 2.0) end

#ohlc4Object



64
# File 'lib/quant/ticks/ohlc.rb', line 64

def ohlc4; ((open_price + high_price + low_price + close_price) / 4.0) end

#red?Boolean

Returns:

  • (Boolean)


107
108
109
# File 'lib/quant/ticks/ohlc.rb', line 107

def red?
  !green?
end