Module: Macd

Included in:
Array
Defined in:
lib/ruby-technical-analysis/indicators/macd.rb

Overview

Moving Average Convergence Divergence (MACD) indicator Returns an array of current macd value and signal value

Instance Method Summary collapse

Instance Method Details

#macd(fast_period, slow_period, signal_period) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/ruby-technical-analysis/indicators/macd.rb', line 8

def macd(fast_period, slow_period, signal_period)
  if size < (slow_period + signal_period)
    raise ArgumentError,
          "Closes array passed to MACD cannot be less than the (slow period + signal period) arguments."
  end

  fast_pct = (2.0 / (fast_period + 1)).truncate(6)
  slow_pct = (2.0 / (slow_period + 1)).truncate(6)
  sig_pct = (2.0 / (signal_period + 1)).truncate(6)

  fast_arr = []
  slow_arr = []

  seed = true
  each do |i|
    if seed
      fast_arr << i
      slow_arr << i
      seed = false
    else
      fast_arr << ((i * fast_pct) + ((fast_arr[-1]) * (1 - fast_pct))).round(3)
      slow_arr << ((i * slow_pct) + ((slow_arr[-1]) * (1 - slow_pct))).round(3)
    end
  end

  sig_arr = []

  (0..signal_period - 1).each do |i|
    sig_arr << (fast_arr[slow_period + i - 1] - slow_arr[slow_period + i - 1]).round(3)
  end

  signal = ((sig_arr[-1] * sig_pct) + ((sig_arr[-2]) * (1 - sig_pct))).round(3)

  [(fast_arr[-1] - slow_arr[-1]).round(4), signal, (fast_arr[-1] - slow_arr[-1]).round(4) - signal]
end