quant 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ 0.0.3 (2012-06-19)
2
+
3
+ * Tests organized
4
+
1
5
  0.0.2 (2012-06-18)
2
6
 
3
7
  * Donchian Channels added
data/lib/enumerable.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  module Enumerable
2
+
2
3
  def inject_with_index(injected)
3
4
  each_with_index{ |obj, index| injected = yield(injected, obj, index) }
4
5
  injected
5
6
  end
7
+
6
8
  end
data/lib/quant/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Quant
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/util.rb ADDED
@@ -0,0 +1,23 @@
1
+ module Util
2
+
3
+ def self.compare_2_arrays_of_floats(a, b)
4
+ delete_nans_and_truncate_floats_to_strings(a) == delete_nans_and_truncate_floats_to_strings(b)
5
+ end
6
+
7
+ def self.truncate_float_to_string(f)
8
+ "%.10f" % f
9
+ end
10
+
11
+ def self.delete_nans_and_truncate_floats_to_strings(a)
12
+ a.delete_if{ |e| e.nan? }.map{ |e| truncate_float_to_string(e) }
13
+ end
14
+
15
+ def self.ohlc(opens, highs, lows, closes)
16
+ o = []
17
+ opens.each_with_index do |e, i|
18
+ o << [opens[i], highs[i], lows[i], closes[i]]
19
+ end
20
+ o
21
+ end
22
+
23
+ end
@@ -0,0 +1,6 @@
1
+ require 'minitest/autorun'
2
+ require 'quant'
3
+ require 'enumerable'
4
+ require 'util'
5
+ require 'samples/ohlc'
6
+ require 'samples/ttr'
@@ -0,0 +1,43 @@
1
+ module Samples
2
+
3
+ module Ohlc
4
+
5
+ # 50 EURUSD OHLC, from 2010-06-01 to 2010-08-10
6
+
7
+ def self.eurusd_50_opens
8
+ [1.2306, 1.2207, 1.2244, 1.2159, 1.1944, 1.1916, 1.1962, 1.1983, 1.2105, 1.2119, 1.2211, 1.2323, 1.2299, 1.2377, 1.2429, 1.2313, 1.2308, 1.2325, 1.2377, 1.2278, 1.2186, 1.2232, 1.2514, 1.2553, 1.2535, 1.2623, 1.2629, 1.2691, 1.264, 1.2585, 1.2725, 1.2739, 1.2934, 1.2896, 1.2946, 1.2889, 1.2752, 1.2883, 1.2894, 1.2985, 1.2999, 1.2985, 1.3078, 1.3059, 1.3173, 1.3224, 1.3153, 1.3182, 1.329, 1.3223]
9
+ end
10
+
11
+ def self.eurusd_50_highs
12
+ [1.235, 1.227, 1.2324, 1.2213, 1.1988, 1.2006, 1.207, 1.2139, 1.2149, 1.2296, 1.2347, 1.235, 1.2408, 1.2414, 1.2464, 1.2351, 1.2384, 1.2392, 1.2395, 1.2287, 1.23, 1.2537, 1.2608, 1.256, 1.2659, 1.2661, 1.2709, 1.272, 1.2645, 1.2736, 1.2774, 1.2952, 1.3004, 1.2989, 1.3026, 1.291, 1.2927, 1.2962, 1.3003, 1.3043, 1.3039, 1.3104, 1.309, 1.3192, 1.3259, 1.3237, 1.3233, 1.3331, 1.3305, 1.3228]
13
+ end
14
+
15
+ def self.eurusd_50_lows
16
+ [1.211, 1.2174, 1.2151, 1.1954, 1.1875, 1.1901, 1.1923, 1.1955, 1.2044, 1.2114, 1.2167, 1.2254, 1.224, 1.2351, 1.2302, 1.2249, 1.226, 1.2253, 1.2264, 1.215, 1.2165, 1.2192, 1.248, 1.2507, 1.2478, 1.2551, 1.262, 1.2608, 1.255, 1.2522, 1.2681, 1.2708, 1.2888, 1.2869, 1.2838, 1.273, 1.2736, 1.2792, 1.2874, 1.2951, 1.2965, 1.2976, 1.2979, 1.3052, 1.3145, 1.313, 1.3117, 1.3156, 1.3215, 1.3073]
17
+ end
18
+
19
+ def self.eurusd_50_closes
20
+ [1.2207, 1.2244, 1.2159, 1.1964, 1.1915, 1.1962, 1.1983, 1.2105, 1.2092, 1.2211, 1.2322, 1.2299, 1.2377, 1.237, 1.2312, 1.2267, 1.2325, 1.2383, 1.2278, 1.2185, 1.2231, 1.2515, 1.2548, 1.2535, 1.2624, 1.263, 1.269, 1.2637, 1.2585, 1.2725, 1.274, 1.2934, 1.2924, 1.2947, 1.2889, 1.2753, 1.2883, 1.2913, 1.2984, 1.2999, 1.2985, 1.3079, 1.3028, 1.3174, 1.3224, 1.3153, 1.3182, 1.329, 1.3222, 1.3175]
21
+ end
22
+
23
+ # 150 USDJPY closes, from 2011-11-08 to 2010-06-04
24
+
25
+ def self.usdjpy_150_opens
26
+ [78.06, 77.71, 77.72, 77.63, 77.18, 77.08, 77.01, 77.0, 76.97, 76.87, 76.89, 76.95, 77.26, 77.11, 77.44, 78.06, 77.92, 77.56, 77.7, 78.08, 77.81, 77.7, 77.63, 77.6, 77.61, 77.92, 77.94, 78.06, 77.87, 77.74, 78.0, 77.8, 78.01, 78.14, 78.06, 77.98, 77.85, 77.91, 77.61, 76.94, 76.88, 76.71, 76.72, 77.09, 76.79, 76.83, 76.81, 76.86, 76.75, 76.88, 76.78, 76.81, 76.76, 77.08, 76.94, 76.95, 77.63, 77.69, 77.43, 76.74, 76.35, 76.28, 76.16, 76.16, 76.53, 76.56, 76.77, 77.02, 77.63, 77.63, 77.55, 78.39, 78.37, 78.87, 79.72, 79.6, 79.71, 80.28, 79.95, 81.58, 80.46, 80.49, 81.27, 81.11, 81.83, 81.49, 80.67, 81.14, 81.51, 82.42, 82.3, 82.95, 83.73, 83.6, 83.48, 83.36, 83.66, 83.4, 82.59, 82.42, 82.86, 83.17, 82.87, 82.38, 82.95, 82.07, 82.79, 82.4, 82.35, 81.53, 81.52, 80.71, 80.85, 80.85, 80.9, 80.41, 80.86, 81.26, 81.58, 81.56, 81.15, 81.31, 81.3, 80.97, 80.29, 79.8, 80.07, 80.11, 80.17, 79.77, 79.87, 79.86, 79.62, 79.88, 79.94, 79.84, 80.21, 80.31, 79.3, 79.2, 79.27, 79.96, 79.43, 79.56, 79.64, 79.46, 79.51, 79.09, 78.35, 78.06]
27
+ end
28
+
29
+ def self.usdjpy_150_highs
30
+ [78.06, 77.86, 77.85, 77.66, 77.22, 77.46, 77.12, 77.07, 77.01, 76.97, 77.3, 77.56, 77.31, 77.77, 78.21, 78.26, 78.13, 77.78, 78.05, 78.08, 77.83, 77.76, 77.77, 77.76, 77.97, 77.99, 78.13, 78.06, 77.94, 78.14, 78.03, 78.08, 78.18, 78.2, 78.08, 78.0, 78.01, 77.93, 77.72, 76.99, 76.94, 76.81, 77.22, 77.31, 76.98, 76.88, 77.01, 76.96, 76.98, 76.92, 76.85, 76.85, 77.29, 77.28, 77.06, 77.83, 78.26, 77.78, 77.46, 76.75, 76.39, 76.33, 76.22, 76.71, 76.78, 76.94, 77.16, 77.7, 77.78, 77.76, 78.51, 78.64, 78.94, 79.48, 79.86, 79.82, 80.38, 80.33, 80.98, 81.6, 80.76, 81.28, 81.36, 81.85, 81.84, 81.56, 81.2, 81.71, 82.62, 82.49, 83.06, 83.8, 84.15, 83.6, 83.54, 83.81, 84.07, 83.41, 82.92, 82.98, 83.36, 83.17, 82.94, 82.85, 83.28, 82.97, 82.91, 82.45, 82.53, 81.64, 81.84, 81.1, 81.11, 81.17, 80.92, 80.9, 81.54, 81.71, 81.75, 81.64, 81.37, 81.67, 81.4, 81.42, 80.36, 80.28, 80.59, 80.53, 80.36, 79.97, 80.05, 79.92, 79.99, 79.97, 80.16, 80.31, 80.53, 80.37, 79.44, 79.42, 80.12, 80.05, 79.61, 79.8, 79.65, 79.61, 79.54, 79.11, 78.65, 78.39]
31
+ end
32
+
33
+ def self.usdjpy_150_lows
34
+ [77.58, 77.52, 77.48, 77.03, 76.79, 76.89, 76.83, 76.89, 76.55, 76.74, 76.81, 76.9, 76.99, 77.1, 77.44, 77.6, 77.27, 77.46, 77.69, 77.67, 77.62, 77.6, 77.11, 77.47, 77.56, 77.62, 77.9, 78.06, 77.59, 77.74, 77.69, 77.67, 77.98, 77.98, 77.9, 77.77, 77.54, 77.57, 76.88, 76.85, 76.6, 76.59, 76.64, 76.95, 76.75, 76.75, 76.81, 76.65, 76.64, 76.68, 76.53, 76.63, 76.68, 76.89, 76.84, 76.94, 77.54, 77.27, 76.63, 76.19, 76.14, 76.0, 76.02, 76.12, 76.47, 76.49, 76.69, 77.01, 77.5, 77.37, 77.34, 78.16, 78.34, 78.77, 79.34, 79.53, 79.71, 79.83, 79.91, 80.11, 80.0, 80.23, 80.82, 81.07, 81.13, 80.57, 80.56, 81.07, 81.45, 82.09, 81.95, 82.87, 83.17, 83.6, 83.0, 83.3, 83.27, 83.4, 81.97, 82.41, 82.62, 82.59, 81.9, 81.81, 81.86, 81.53, 82.07, 81.81, 81.3, 81.18, 80.61, 80.56, 80.71, 80.82, 80.9, 80.31, 80.86, 81.15, 81.47, 80.95, 80.83, 81.06, 80.64, 80.33, 79.71, 79.62, 80.03, 80.08, 79.8, 79.62, 79.69, 79.41, 79.58, 79.71, 79.66, 79.79, 80.17, 79.11, 78.99, 79.08, 79.25, 79.19, 79.32, 79.48, 79.31, 79.35, 78.84, 78.19, 77.64, 77.96]
35
+ end
36
+
37
+ def self.usdjpy_150_closes
38
+ [77.71, 77.72, 77.62, 77.09, 77.08, 77.01, 77.0, 76.97, 76.89, 76.9, 76.95, 77.26, 77.11, 77.72, 78.06, 77.92, 77.56, 77.7, 77.96, 77.81, 77.7, 77.63, 77.6, 77.5, 77.93, 77.94, 78.06, 78.06, 77.78, 78.0, 77.8, 78.01, 78.13, 78.04, 77.98, 77.85, 77.91, 77.62, 76.94, 76.89, 76.7, 76.73, 77.09, 76.97, 76.83, 76.81, 76.86, 76.76, 76.93, 76.78, 76.81, 76.77, 77.08, 76.95, 76.96, 77.64, 77.69, 77.43, 76.66, 76.36, 76.28, 76.16, 76.16, 76.53, 76.55, 76.78, 77.02, 77.63, 77.6, 77.56, 78.39, 78.37, 78.86, 79.47, 79.6, 79.72, 80.28, 79.95, 80.98, 80.46, 80.49, 81.27, 81.11, 81.78, 81.49, 80.68, 81.15, 81.52, 82.39, 82.3, 82.95, 83.73, 83.6, 83.6, 83.36, 83.66, 83.4, 83.4, 82.32, 82.85, 83.17, 82.87, 82.38, 82.77, 82.06, 82.8, 82.4, 82.35, 81.51, 81.52, 80.72, 80.84, 80.85, 81.0, 80.91, 80.86, 81.26, 81.58, 81.54, 81.15, 81.3, 81.3, 80.97, 80.35, 79.8, 80.07, 80.11, 80.17, 79.82, 79.87, 79.86, 79.62, 79.87, 79.9, 79.84, 80.21, 80.31, 79.29, 79.05, 79.27, 79.96, 79.43, 79.56, 79.64, 79.45, 79.51, 79.09, 78.35, 78.12, 78.32]
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,43 @@
1
+ module Samples
2
+
3
+ module Ttr
4
+
5
+ # SMA
6
+
7
+ def self.eurusd_50_ttr_sma10
8
+ # SMA 10 of eurusd_50_closes generated with the TTR R package
9
+ [not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, 1.2084199999999998, 1.2095699999999998, 1.2101199999999999, 1.2123, 1.2163599999999999, 1.22033, 1.22338, 1.2268, 1.22958, 1.2314399999999999, 1.23118, 1.23027, 1.23243, 1.23414, 1.23579, 1.23891, 1.24254, 1.24619, 1.24873, 1.2517999999999998, 1.2571999999999999, 1.26229, 1.26648, 1.2702399999999998, 1.27436, 1.27701, 1.2782399999999998, 1.28017, 1.28293, 1.2869199999999998, 1.28966, 1.2921099999999999, 1.2935599999999998, 1.2946, 1.29687, 1.30022, 1.30422, 1.30721, 1.31098, 1.3133599999999999, 1.3151199999999998]
10
+ end
11
+
12
+ def self.usdjpy_150_ttr_sma25
13
+ # SMA 25 of usdjpy_150_closes generated with the TTR R package
14
+ [not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, 77.456, 77.46520000000001, 77.4788, 77.49640000000001, 77.524, 77.5608, 77.59240000000001, 77.6328, 77.6792, 77.7252, 77.7684, 77.8044, 77.8304, 77.85079999999999, 77.8196, 77.7728, 77.724, 77.6908, 77.66640000000001, 77.6268, 77.58760000000001, 77.552, 77.52120000000001, 77.4876, 77.46480000000001, 77.4188, 77.37360000000001, 77.322, 77.28280000000001, 77.2496, 77.208, 77.20160000000001, 77.1888, 77.1608, 77.10560000000001, 77.0408, 76.97800000000001, 76.908, 76.8496, 76.8332, 76.8196, 76.8228, 76.8344, 76.85600000000001, 76.88119999999999, 76.9104, 76.9736, 77.034, 77.118, 77.2196, 77.33239999999999, 77.4488, 77.5892, 77.70400000000001, 77.8652, 78.0052, 78.1192, 78.2624, 78.4096, 78.6144, 78.8196, 78.99560000000001, 79.1952, 79.4096, 79.644, 79.87400000000001, 80.1208, 80.3892, 80.628, 80.868, 81.1, 81.3108, 81.512, 81.6936, 81.80760000000001, 81.9376, 82.0756, 82.1792, 82.2764, 82.348, 82.412, 82.5044, 82.54960000000001, 82.5992, 82.58840000000001, 82.5896, 82.59120000000001, 82.57880000000002, 82.552, 82.4964, 82.4408, 82.35719999999999, 82.2584, 82.1776, 82.0952, 82.0068, 81.9124, 81.8284, 81.7312, 81.6524, 81.5304, 81.4064, 81.296, 81.2076, 81.0896, 81.002, 80.8844, 80.7732, 80.674, 80.6096, 80.5424, 80.522, 80.5008, 80.4384, 80.3604, 80.29480000000001, 80.25880000000001, 80.18560000000001, 80.10480000000001, 80.0288, 79.9608, 79.8892, 79.8008, 79.696, 79.6068, 79.5476]
15
+ end
16
+
17
+ # Donchian Channel
18
+
19
+ def self.eurusd_50_ttr_donchian_channel_20_highs
20
+ [not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, 1.2464, 1.2464, 1.2537, 1.2608, 1.2608, 1.2659, 1.2661, 1.2709, 1.272, 1.272, 1.2736, 1.2774, 1.2952, 1.3004, 1.3004, 1.3026, 1.3026, 1.3026, 1.3026, 1.3026, 1.3043, 1.3043, 1.3104, 1.3104, 1.3192, 1.3259, 1.3259, 1.3259, 1.3331, 1.3331, 1.3331]
21
+ end
22
+
23
+ def self.eurusd_50_ttr_donchian_channel_20_lows
24
+ [not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, 1.1875, 1.1875, 1.1875, 1.1875, 1.1875, 1.1901, 1.1923, 1.1955, 1.2044, 1.2114, 1.215, 1.215, 1.215, 1.215, 1.215, 1.215, 1.215, 1.215, 1.215, 1.215, 1.2165, 1.2192, 1.2478, 1.2478, 1.2478, 1.2522, 1.2522, 1.2522, 1.2522, 1.2522, 1.2681]
25
+ end
26
+
27
+ def self.usdjpy_150_ttr_donchian_channel_55_highs
28
+ [not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.51, 78.64, 78.94, 79.48, 79.86, 79.86, 80.38, 80.38, 80.98, 81.6, 81.6, 81.6, 81.6, 81.85, 81.85, 81.85, 81.85, 81.85, 82.62, 82.62, 83.06, 83.8, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.07, 84.07, 84.07]
29
+ end
30
+
31
+ def self.usdjpy_150_ttr_donchian_channel_55_lows
32
+ [not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, 76.53, 76.53, 76.53, 76.53, 76.53, 76.19, 76.14, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.02, 76.12, 76.47, 76.49, 76.69, 77.01, 77.34, 77.34, 77.34, 78.16, 78.34, 78.77, 79.34, 79.53, 79.62, 79.41, 79.41, 79.41, 79.41, 79.41, 79.41, 79.11, 78.99, 78.99, 78.99, 78.99, 78.99, 78.99, 78.99, 78.99, 78.84, 78.19, 77.64, 77.64]
33
+ end
34
+
35
+ private
36
+
37
+ def self.not_a_number
38
+ 0 / 0.0
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,29 @@
1
+ require 'common_requires'
2
+
3
+ class TestDonchianChannel < MiniTest::Unit::TestCase
4
+
5
+ def test_eurusd_50_donchian_channel_20_highs
6
+ c = Util.ohlc(Samples::Ohlc.eurusd_50_opens, Samples::Ohlc.eurusd_50_highs, Samples::Ohlc.eurusd_50_lows, Samples::Ohlc.eurusd_50_closes)
7
+ dc20_highs = Quant.donchian_channel(c, 20).inject([]) { |a, e| a << e[0] }
8
+ assert Util.compare_2_arrays_of_floats dc20_highs , Samples::Ttr.eurusd_50_ttr_donchian_channel_20_highs
9
+ end
10
+
11
+ def test_eurusd_50_donchian_channel_20_lows
12
+ c = Util.ohlc(Samples::Ohlc.eurusd_50_opens, Samples::Ohlc.eurusd_50_highs, Samples::Ohlc.eurusd_50_lows, Samples::Ohlc.eurusd_50_closes)
13
+ dc20_lows = Quant.donchian_channel(c, 20).inject([]) { |a, e| a << e[1] }
14
+ assert Util.compare_2_arrays_of_floats dc20_lows , Samples::Ttr.eurusd_50_ttr_donchian_channel_20_lows
15
+ end
16
+
17
+ def test_usdjpy_150_donchian_channel_55_highs
18
+ c = Util.ohlc(Samples::Ohlc.usdjpy_150_opens, Samples::Ohlc.usdjpy_150_highs, Samples::Ohlc.usdjpy_150_lows, Samples::Ohlc.usdjpy_150_closes)
19
+ dc55_highs = Quant.donchian_channel(c, 55).inject([]) { |a, e| a << e[0] }
20
+ assert Util.compare_2_arrays_of_floats dc55_highs , Samples::Ttr.usdjpy_150_ttr_donchian_channel_55_highs
21
+ end
22
+
23
+ def test_usdjpy_150_donchian_channel_55_lows
24
+ c = Util.ohlc(Samples::Ohlc.usdjpy_150_opens, Samples::Ohlc.usdjpy_150_highs, Samples::Ohlc.usdjpy_150_lows, Samples::Ohlc.usdjpy_150_closes)
25
+ dc55_lows = Quant.donchian_channel(c, 55).inject([]) { |a, e| a << e[1] }
26
+ assert Util.compare_2_arrays_of_floats dc55_lows , Samples::Ttr.usdjpy_150_ttr_donchian_channel_55_lows
27
+ end
28
+
29
+ end
data/test/test_sma.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'common_requires'
2
+
3
+ class TestSma < MiniTest::Unit::TestCase
4
+
5
+ def test_eurusd_50_sma10
6
+ assert Util.compare_2_arrays_of_floats Quant.sma(Samples::Ohlc.eurusd_50_closes, 10), Samples::Ttr.eurusd_50_ttr_sma10
7
+ end
8
+
9
+ def test_usdjpy_150_sma25
10
+ assert Util.compare_2_arrays_of_floats Quant.sma(Samples::Ohlc.usdjpy_150_closes, 25), Samples::Ttr.usdjpy_150_ttr_sma25
11
+ end
12
+
13
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quant
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-18 00:00:00.000000000 Z
12
+ date: 2012-06-19 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Quantitative Trading
15
15
  email:
@@ -27,8 +27,13 @@ files:
27
27
  - lib/enumerable.rb
28
28
  - lib/quant.rb
29
29
  - lib/quant/version.rb
30
+ - lib/util.rb
30
31
  - quant.gemspec
31
- - test/test_quant.rb
32
+ - test/common_requires.rb
33
+ - test/samples/ohlc.rb
34
+ - test/samples/ttr.rb
35
+ - test/test_donchian_channel.rb
36
+ - test/test_sma.rb
32
37
  homepage: ''
33
38
  licenses: []
34
39
  post_install_message:
@@ -54,4 +59,8 @@ signing_key:
54
59
  specification_version: 3
55
60
  summary: Quantitative Trading
56
61
  test_files:
57
- - test/test_quant.rb
62
+ - test/common_requires.rb
63
+ - test/samples/ohlc.rb
64
+ - test/samples/ttr.rb
65
+ - test/test_donchian_channel.rb
66
+ - test/test_sma.rb
data/test/test_quant.rb DELETED
@@ -1,125 +0,0 @@
1
- require "minitest/autorun"
2
- require "quant"
3
- require "enumerable"
4
-
5
- class TestQuant < MiniTest::Unit::TestCase
6
-
7
- def test_eurusd_50_sma10
8
- assert compare_2_arrays_of_floats Quant.sma(eurusd_50_closes, 10), eurusd_50_ttr_sma10
9
- end
10
-
11
- def test_usdjpy_150_sma25
12
- assert compare_2_arrays_of_floats Quant.sma(usdjpy_150_closes, 25), usdjpy_150_ttr_sma25
13
- end
14
-
15
- def test_eurusd_50_donchian_channel_20_highs
16
- c = ohlc(eurusd_50_opens, eurusd_50_highs, eurusd_50_lows, eurusd_50_closes)
17
- dc20_highs = Quant.donchian_channel(c, 20).inject([]) { |a, e| a << e[0] }
18
- assert compare_2_arrays_of_floats dc20_highs , eurusd_50_ttr_donchian_channel_20_highs
19
- end
20
-
21
- def test_eurusd_50_donchian_channel_20_lows
22
- c = ohlc(eurusd_50_opens, eurusd_50_highs, eurusd_50_lows, eurusd_50_closes)
23
- dc20_lows = Quant.donchian_channel(c, 20).inject([]) { |a, e| a << e[1] }
24
- assert compare_2_arrays_of_floats dc20_lows , eurusd_50_ttr_donchian_channel_20_lows
25
- end
26
-
27
- def test_usdjpy_150_donchian_channel_55_highs
28
- c = ohlc(usdjpy_150_opens, usdjpy_150_highs, usdjpy_150_lows, usdjpy_150_closes)
29
- dc55_highs = Quant.donchian_channel(c, 55).inject([]) { |a, e| a << e[0] }
30
- assert compare_2_arrays_of_floats dc55_highs , usdjpy_150_ttr_donchian_channel_55_highs
31
- end
32
-
33
- def test_usdjpy_150_donchian_channel_55_lows
34
- c = ohlc(usdjpy_150_opens, usdjpy_150_highs, usdjpy_150_lows, usdjpy_150_closes)
35
- dc55_lows = Quant.donchian_channel(c, 55).inject([]) { |a, e| a << e[1] }
36
- assert compare_2_arrays_of_floats dc55_lows , usdjpy_150_ttr_donchian_channel_55_lows
37
- end
38
-
39
- private
40
-
41
- def eurusd_50_opens
42
- [1.2306, 1.2207, 1.2244, 1.2159, 1.1944, 1.1916, 1.1962, 1.1983, 1.2105, 1.2119, 1.2211, 1.2323, 1.2299, 1.2377, 1.2429, 1.2313, 1.2308, 1.2325, 1.2377, 1.2278, 1.2186, 1.2232, 1.2514, 1.2553, 1.2535, 1.2623, 1.2629, 1.2691, 1.264, 1.2585, 1.2725, 1.2739, 1.2934, 1.2896, 1.2946, 1.2889, 1.2752, 1.2883, 1.2894, 1.2985, 1.2999, 1.2985, 1.3078, 1.3059, 1.3173, 1.3224, 1.3153, 1.3182, 1.329, 1.3223]
43
- end
44
-
45
- def eurusd_50_highs
46
- [1.235, 1.227, 1.2324, 1.2213, 1.1988, 1.2006, 1.207, 1.2139, 1.2149, 1.2296, 1.2347, 1.235, 1.2408, 1.2414, 1.2464, 1.2351, 1.2384, 1.2392, 1.2395, 1.2287, 1.23, 1.2537, 1.2608, 1.256, 1.2659, 1.2661, 1.2709, 1.272, 1.2645, 1.2736, 1.2774, 1.2952, 1.3004, 1.2989, 1.3026, 1.291, 1.2927, 1.2962, 1.3003, 1.3043, 1.3039, 1.3104, 1.309, 1.3192, 1.3259, 1.3237, 1.3233, 1.3331, 1.3305, 1.3228]
47
- end
48
-
49
- def eurusd_50_lows
50
- [1.211, 1.2174, 1.2151, 1.1954, 1.1875, 1.1901, 1.1923, 1.1955, 1.2044, 1.2114, 1.2167, 1.2254, 1.224, 1.2351, 1.2302, 1.2249, 1.226, 1.2253, 1.2264, 1.215, 1.2165, 1.2192, 1.248, 1.2507, 1.2478, 1.2551, 1.262, 1.2608, 1.255, 1.2522, 1.2681, 1.2708, 1.2888, 1.2869, 1.2838, 1.273, 1.2736, 1.2792, 1.2874, 1.2951, 1.2965, 1.2976, 1.2979, 1.3052, 1.3145, 1.313, 1.3117, 1.3156, 1.3215, 1.3073]
51
- end
52
-
53
- def eurusd_50_closes
54
- # 50 EURUSD closes, from 2010-06-01 to 2010-08-10
55
- [1.2207, 1.2244, 1.2159, 1.1964, 1.1915, 1.1962, 1.1983, 1.2105, 1.2092, 1.2211, 1.2322, 1.2299, 1.2377, 1.237, 1.2312, 1.2267, 1.2325, 1.2383, 1.2278, 1.2185, 1.2231, 1.2515, 1.2548, 1.2535, 1.2624, 1.263, 1.269, 1.2637, 1.2585, 1.2725, 1.274, 1.2934, 1.2924, 1.2947, 1.2889, 1.2753, 1.2883, 1.2913, 1.2984, 1.2999, 1.2985, 1.3079, 1.3028, 1.3174, 1.3224, 1.3153, 1.3182, 1.329, 1.3222, 1.3175]
56
- end
57
-
58
- def eurusd_50_ttr_sma10
59
- # SMA 10 of eurusd_50_closes generated with the TTR R package
60
- [not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, 1.2084199999999998, 1.2095699999999998, 1.2101199999999999, 1.2123, 1.2163599999999999, 1.22033, 1.22338, 1.2268, 1.22958, 1.2314399999999999, 1.23118, 1.23027, 1.23243, 1.23414, 1.23579, 1.23891, 1.24254, 1.24619, 1.24873, 1.2517999999999998, 1.2571999999999999, 1.26229, 1.26648, 1.2702399999999998, 1.27436, 1.27701, 1.2782399999999998, 1.28017, 1.28293, 1.2869199999999998, 1.28966, 1.2921099999999999, 1.2935599999999998, 1.2946, 1.29687, 1.30022, 1.30422, 1.30721, 1.31098, 1.3133599999999999, 1.3151199999999998]
61
- end
62
-
63
- def eurusd_50_ttr_donchian_channel_20_highs
64
- [not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, 1.2464, 1.2464, 1.2537, 1.2608, 1.2608, 1.2659, 1.2661, 1.2709, 1.272, 1.272, 1.2736, 1.2774, 1.2952, 1.3004, 1.3004, 1.3026, 1.3026, 1.3026, 1.3026, 1.3026, 1.3043, 1.3043, 1.3104, 1.3104, 1.3192, 1.3259, 1.3259, 1.3259, 1.3331, 1.3331, 1.3331]
65
- end
66
-
67
- def eurusd_50_ttr_donchian_channel_20_lows
68
- [not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, 1.1875, 1.1875, 1.1875, 1.1875, 1.1875, 1.1901, 1.1923, 1.1955, 1.2044, 1.2114, 1.215, 1.215, 1.215, 1.215, 1.215, 1.215, 1.215, 1.215, 1.215, 1.215, 1.2165, 1.2192, 1.2478, 1.2478, 1.2478, 1.2522, 1.2522, 1.2522, 1.2522, 1.2522, 1.2681]
69
- end
70
-
71
- def usdjpy_150_opens
72
- [78.06, 77.71, 77.72, 77.63, 77.18, 77.08, 77.01, 77.0, 76.97, 76.87, 76.89, 76.95, 77.26, 77.11, 77.44, 78.06, 77.92, 77.56, 77.7, 78.08, 77.81, 77.7, 77.63, 77.6, 77.61, 77.92, 77.94, 78.06, 77.87, 77.74, 78.0, 77.8, 78.01, 78.14, 78.06, 77.98, 77.85, 77.91, 77.61, 76.94, 76.88, 76.71, 76.72, 77.09, 76.79, 76.83, 76.81, 76.86, 76.75, 76.88, 76.78, 76.81, 76.76, 77.08, 76.94, 76.95, 77.63, 77.69, 77.43, 76.74, 76.35, 76.28, 76.16, 76.16, 76.53, 76.56, 76.77, 77.02, 77.63, 77.63, 77.55, 78.39, 78.37, 78.87, 79.72, 79.6, 79.71, 80.28, 79.95, 81.58, 80.46, 80.49, 81.27, 81.11, 81.83, 81.49, 80.67, 81.14, 81.51, 82.42, 82.3, 82.95, 83.73, 83.6, 83.48, 83.36, 83.66, 83.4, 82.59, 82.42, 82.86, 83.17, 82.87, 82.38, 82.95, 82.07, 82.79, 82.4, 82.35, 81.53, 81.52, 80.71, 80.85, 80.85, 80.9, 80.41, 80.86, 81.26, 81.58, 81.56, 81.15, 81.31, 81.3, 80.97, 80.29, 79.8, 80.07, 80.11, 80.17, 79.77, 79.87, 79.86, 79.62, 79.88, 79.94, 79.84, 80.21, 80.31, 79.3, 79.2, 79.27, 79.96, 79.43, 79.56, 79.64, 79.46, 79.51, 79.09, 78.35, 78.06]
73
- end
74
-
75
- def usdjpy_150_highs
76
- [78.06, 77.86, 77.85, 77.66, 77.22, 77.46, 77.12, 77.07, 77.01, 76.97, 77.3, 77.56, 77.31, 77.77, 78.21, 78.26, 78.13, 77.78, 78.05, 78.08, 77.83, 77.76, 77.77, 77.76, 77.97, 77.99, 78.13, 78.06, 77.94, 78.14, 78.03, 78.08, 78.18, 78.2, 78.08, 78.0, 78.01, 77.93, 77.72, 76.99, 76.94, 76.81, 77.22, 77.31, 76.98, 76.88, 77.01, 76.96, 76.98, 76.92, 76.85, 76.85, 77.29, 77.28, 77.06, 77.83, 78.26, 77.78, 77.46, 76.75, 76.39, 76.33, 76.22, 76.71, 76.78, 76.94, 77.16, 77.7, 77.78, 77.76, 78.51, 78.64, 78.94, 79.48, 79.86, 79.82, 80.38, 80.33, 80.98, 81.6, 80.76, 81.28, 81.36, 81.85, 81.84, 81.56, 81.2, 81.71, 82.62, 82.49, 83.06, 83.8, 84.15, 83.6, 83.54, 83.81, 84.07, 83.41, 82.92, 82.98, 83.36, 83.17, 82.94, 82.85, 83.28, 82.97, 82.91, 82.45, 82.53, 81.64, 81.84, 81.1, 81.11, 81.17, 80.92, 80.9, 81.54, 81.71, 81.75, 81.64, 81.37, 81.67, 81.4, 81.42, 80.36, 80.28, 80.59, 80.53, 80.36, 79.97, 80.05, 79.92, 79.99, 79.97, 80.16, 80.31, 80.53, 80.37, 79.44, 79.42, 80.12, 80.05, 79.61, 79.8, 79.65, 79.61, 79.54, 79.11, 78.65, 78.39]
77
- end
78
-
79
- def usdjpy_150_lows
80
- [77.58, 77.52, 77.48, 77.03, 76.79, 76.89, 76.83, 76.89, 76.55, 76.74, 76.81, 76.9, 76.99, 77.1, 77.44, 77.6, 77.27, 77.46, 77.69, 77.67, 77.62, 77.6, 77.11, 77.47, 77.56, 77.62, 77.9, 78.06, 77.59, 77.74, 77.69, 77.67, 77.98, 77.98, 77.9, 77.77, 77.54, 77.57, 76.88, 76.85, 76.6, 76.59, 76.64, 76.95, 76.75, 76.75, 76.81, 76.65, 76.64, 76.68, 76.53, 76.63, 76.68, 76.89, 76.84, 76.94, 77.54, 77.27, 76.63, 76.19, 76.14, 76.0, 76.02, 76.12, 76.47, 76.49, 76.69, 77.01, 77.5, 77.37, 77.34, 78.16, 78.34, 78.77, 79.34, 79.53, 79.71, 79.83, 79.91, 80.11, 80.0, 80.23, 80.82, 81.07, 81.13, 80.57, 80.56, 81.07, 81.45, 82.09, 81.95, 82.87, 83.17, 83.6, 83.0, 83.3, 83.27, 83.4, 81.97, 82.41, 82.62, 82.59, 81.9, 81.81, 81.86, 81.53, 82.07, 81.81, 81.3, 81.18, 80.61, 80.56, 80.71, 80.82, 80.9, 80.31, 80.86, 81.15, 81.47, 80.95, 80.83, 81.06, 80.64, 80.33, 79.71, 79.62, 80.03, 80.08, 79.8, 79.62, 79.69, 79.41, 79.58, 79.71, 79.66, 79.79, 80.17, 79.11, 78.99, 79.08, 79.25, 79.19, 79.32, 79.48, 79.31, 79.35, 78.84, 78.19, 77.64, 77.96]
81
- end
82
-
83
- def usdjpy_150_closes
84
- # 150 USDJPY closes, from 2011-11-08 to 2010-06-04
85
- [77.71, 77.72, 77.62, 77.09, 77.08, 77.01, 77.0, 76.97, 76.89, 76.9, 76.95, 77.26, 77.11, 77.72, 78.06, 77.92, 77.56, 77.7, 77.96, 77.81, 77.7, 77.63, 77.6, 77.5, 77.93, 77.94, 78.06, 78.06, 77.78, 78.0, 77.8, 78.01, 78.13, 78.04, 77.98, 77.85, 77.91, 77.62, 76.94, 76.89, 76.7, 76.73, 77.09, 76.97, 76.83, 76.81, 76.86, 76.76, 76.93, 76.78, 76.81, 76.77, 77.08, 76.95, 76.96, 77.64, 77.69, 77.43, 76.66, 76.36, 76.28, 76.16, 76.16, 76.53, 76.55, 76.78, 77.02, 77.63, 77.6, 77.56, 78.39, 78.37, 78.86, 79.47, 79.6, 79.72, 80.28, 79.95, 80.98, 80.46, 80.49, 81.27, 81.11, 81.78, 81.49, 80.68, 81.15, 81.52, 82.39, 82.3, 82.95, 83.73, 83.6, 83.6, 83.36, 83.66, 83.4, 83.4, 82.32, 82.85, 83.17, 82.87, 82.38, 82.77, 82.06, 82.8, 82.4, 82.35, 81.51, 81.52, 80.72, 80.84, 80.85, 81.0, 80.91, 80.86, 81.26, 81.58, 81.54, 81.15, 81.3, 81.3, 80.97, 80.35, 79.8, 80.07, 80.11, 80.17, 79.82, 79.87, 79.86, 79.62, 79.87, 79.9, 79.84, 80.21, 80.31, 79.29, 79.05, 79.27, 79.96, 79.43, 79.56, 79.64, 79.45, 79.51, 79.09, 78.35, 78.12, 78.32]
86
- end
87
-
88
- def usdjpy_150_ttr_donchian_channel_55_highs
89
- [not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.26, 78.51, 78.64, 78.94, 79.48, 79.86, 79.86, 80.38, 80.38, 80.98, 81.6, 81.6, 81.6, 81.6, 81.85, 81.85, 81.85, 81.85, 81.85, 82.62, 82.62, 83.06, 83.8, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.15, 84.07, 84.07, 84.07]
90
- end
91
-
92
- def usdjpy_150_ttr_donchian_channel_55_lows
93
- [not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, 76.53, 76.53, 76.53, 76.53, 76.53, 76.19, 76.14, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.0, 76.02, 76.12, 76.47, 76.49, 76.69, 77.01, 77.34, 77.34, 77.34, 78.16, 78.34, 78.77, 79.34, 79.53, 79.62, 79.41, 79.41, 79.41, 79.41, 79.41, 79.41, 79.11, 78.99, 78.99, 78.99, 78.99, 78.99, 78.99, 78.99, 78.99, 78.84, 78.19, 77.64, 77.64]
94
- end
95
-
96
- def usdjpy_150_ttr_sma25
97
- # SMA 25 of usdjpy_150_closes generated with the TTR R package
98
- [not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, not_a_number, 77.456, 77.46520000000001, 77.4788, 77.49640000000001, 77.524, 77.5608, 77.59240000000001, 77.6328, 77.6792, 77.7252, 77.7684, 77.8044, 77.8304, 77.85079999999999, 77.8196, 77.7728, 77.724, 77.6908, 77.66640000000001, 77.6268, 77.58760000000001, 77.552, 77.52120000000001, 77.4876, 77.46480000000001, 77.4188, 77.37360000000001, 77.322, 77.28280000000001, 77.2496, 77.208, 77.20160000000001, 77.1888, 77.1608, 77.10560000000001, 77.0408, 76.97800000000001, 76.908, 76.8496, 76.8332, 76.8196, 76.8228, 76.8344, 76.85600000000001, 76.88119999999999, 76.9104, 76.9736, 77.034, 77.118, 77.2196, 77.33239999999999, 77.4488, 77.5892, 77.70400000000001, 77.8652, 78.0052, 78.1192, 78.2624, 78.4096, 78.6144, 78.8196, 78.99560000000001, 79.1952, 79.4096, 79.644, 79.87400000000001, 80.1208, 80.3892, 80.628, 80.868, 81.1, 81.3108, 81.512, 81.6936, 81.80760000000001, 81.9376, 82.0756, 82.1792, 82.2764, 82.348, 82.412, 82.5044, 82.54960000000001, 82.5992, 82.58840000000001, 82.5896, 82.59120000000001, 82.57880000000002, 82.552, 82.4964, 82.4408, 82.35719999999999, 82.2584, 82.1776, 82.0952, 82.0068, 81.9124, 81.8284, 81.7312, 81.6524, 81.5304, 81.4064, 81.296, 81.2076, 81.0896, 81.002, 80.8844, 80.7732, 80.674, 80.6096, 80.5424, 80.522, 80.5008, 80.4384, 80.3604, 80.29480000000001, 80.25880000000001, 80.18560000000001, 80.10480000000001, 80.0288, 79.9608, 79.8892, 79.8008, 79.696, 79.6068, 79.5476]
99
- end
100
-
101
- def not_a_number
102
- 0/0.0
103
- end
104
-
105
- def compare_2_arrays_of_floats(a, b)
106
- delete_nans_and_truncate_floats_to_strings(a) == delete_nans_and_truncate_floats_to_strings(b)
107
- end
108
-
109
- def truncate_float_to_string(f)
110
- "%.10f" % f
111
- end
112
-
113
- def delete_nans_and_truncate_floats_to_strings(a)
114
- a.delete_if{ |e| e.nan? }.map{ |e| truncate_float_to_string(e) }
115
- end
116
-
117
- def ohlc(opens, highs, lows, closes)
118
- o = []
119
- opens.each_with_index do |e, i|
120
- o << [opens[i], highs[i], lows[i], closes[i]]
121
- end
122
- o
123
- end
124
-
125
- end