talib_ruby 1.0.4 → 1.0.5

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.
Files changed (4) hide show
  1. data/README.textile +12 -4
  2. data/example/ma.rb +2 -3
  3. data/ext/talib/talib.c +48 -24
  4. metadata +4 -10
data/README.textile CHANGED
@@ -11,16 +11,24 @@ Install ta-lib from "MacPorts":http://www.macports.org/ports.php?by=name&substr=
11
11
 
12
12
  bc. sudo port install ta-lib
13
13
 
14
+ Or install ta-lib from "Homebrew":https://github.com/mxcl/homebrew/blob/master/Library/Formula/ta-lib.rb:
15
+
16
+ bc. sudo brew install ta-lib
17
+
14
18
  Install the ruby wrapper talib_ruby:
15
19
 
16
20
  bc. sudo env ARCHFLAGS="-arch PLATFORM" gem install talib_ruby -- --with-talib-include=ABSOLUTE_PATH_TO_TALIB_HEADERS --with-talib-lib=ABSOLUTE_PATH_TO_TALIB_LIBS
17
21
 
18
22
  * PLATFORM = [i386 | x86_64 | ...]
19
- * ABSOLUTE_PATH_TO_TALIB_HEADERS = The path to the ta-lib header files (e.g. /opt/local/var/macports/software/ta-lib/0.4.0_0/opt/local/include/ta-lib)
20
- * ABSOLUTE_PATH_TO_TALIB_LIBS = The path to the ta-lib lib files (e.g. /opt/local/var/macports/software/ta-lib/0.4.0_0/opt/local/lib)
23
+ * ABSOLUTE_PATH_TO_TALIB_HEADERS = The path to the ta-lib header files
24
+ ** e.g. for Port: /opt/local/var/macports/software/ta-lib/0.4.0_0/opt/local/include/ta-lib
25
+ ** e.g. for Homebrew: /usr/local/Cellar/ta-lib/0.4.0/include/ta-lib
26
+ * ABSOLUTE_PATH_TO_TALIB_LIBS = The path to the ta-lib lib files
27
+ ** e.g. fo Port: /opt/local/var/macports/software/ta-lib/0.4.0_0/opt/local/lib)
28
+ ** e.g. fo Homebrew: /usr/local/Cellar/ta-lib/0.4.0/lib
21
29
 
22
30
  Now ta-lib can be used by using _require 'talib_ruby'_
23
- Works on Leopard and Snow Leopard. Has not been tested on Windows.
31
+ Needs at least Mac OSX 10.5. Has not been tested on Windows, but works there too what i've heard.
24
32
 
25
33
  h3. Example
26
34
 
@@ -52,4 +60,4 @@ h3. Useful links
52
60
 
53
61
  * "TA-Lib Forum":http://www.tadoc.org/forum/index.php?board=9.0
54
62
  * "XML explanation":http://ta-lib.svn.sourceforge.net/viewvc/ta-lib/trunk/ta-lib/ta_func_api.xml?view=markup of all supported Functions
55
- * "C/C++ API Documentation":http://ta-lib.org/d_api/d_api.html
63
+ * "C/C++ API Documentation":http://ta-lib.org/d_api/d_api.html
data/example/ma.rb CHANGED
@@ -11,10 +11,9 @@ a = Array.new
11
11
  # setup input parameter
12
12
  l.in_real(0,a);
13
13
  # setup optional parameter
14
- l.opt_int(0,k+2)
14
+ l.opt_int(0,k+2);
15
15
  # setup output parameter
16
- l.out_real(0,b)
17
- lb = l.lookback
16
+ l.out_real(0,b);
18
17
  l.call(0,9)
19
18
  p "k=#{k+2}"
20
19
  p b
data/ext/talib/talib.c CHANGED
@@ -1,5 +1,5 @@
1
1
  #include "ruby.h"
2
- #include "ta_abstract.h"
2
+ #include <ta-lib/ta_abstract.h>
3
3
 
4
4
  static VALUE rb_mTaLib;
5
5
  static VALUE rb_cTAFunction;
@@ -28,8 +28,8 @@ static VALUE rb_sOutParamInfo;
28
28
  // combine all heap storage to this struct and free only this on ta_free
29
29
  typedef struct _ph {
30
30
  TA_ParamHolder *p;
31
- double* in[IN_CNT]; // johnribera@Hotmail: the usual case (double)
32
- double* out[OUT_CNT];
31
+ double* in[IN_CNT]; // johnribera@Hotmail: the usual case (double)
32
+ double* out[OUT_CNT];
33
33
  } ParamHolder;
34
34
 
35
35
  /* :nodoc: */
@@ -104,7 +104,7 @@ static double* FLT2DBL(double **dest, VALUE in_array)
104
104
  VALUE *inp;
105
105
  int i;
106
106
 
107
- if NIL_P(in_array) return 0;
107
+ if(NIL_P(in_array)) return 0;
108
108
 
109
109
  inp = RARRAY_PTR(in_array);
110
110
  if (*dest) free(*dest); // only on 1st use do we skip this step
@@ -289,6 +289,8 @@ static VALUE ta_func_setup_in_integer(VALUE self, VALUE param_index, VALUE in_ar
289
289
  ret_code = TA_SetInputParamIntegerPtr( param_holder->p, FIX2INT(param_index), (int*)(RARRAY_PTR(in_array)));
290
290
  if ( ret_code != TA_SUCCESS )
291
291
  rb_raise(rb_eRuntimeError, "unsuccess return code TA_SetInputParamIntegerPtr");
292
+
293
+ return T_TRUE;
292
294
  }
293
295
 
294
296
  /*
@@ -298,35 +300,41 @@ static VALUE ta_func_setup_in_integer(VALUE self, VALUE param_index, VALUE in_ar
298
300
  */
299
301
  static VALUE ta_func_setup_in_real(VALUE self, VALUE param_index, VALUE in_array)
300
302
  {
303
+ double** dp;
301
304
  TA_RetCode ret_code;
302
305
  ParamHolder *param_holder;
303
306
 
304
307
  Data_Get_Struct(self, ParamHolder, param_holder);
305
- double** dp = param_holder->in;
308
+ dp = param_holder->in;
306
309
  //FIXME: memory leak fixed: johnribera@hotmail.com (see: FL2DBL())
307
310
  ret_code = TA_SetInputParamRealPtr( param_holder->p, FIX2INT(param_index), FLT2DBL(&dp[FIX2INT(param_index)], in_array));
308
311
  if ( ret_code != TA_SUCCESS )
309
312
  rb_raise(rb_eRuntimeError, "unsuccess return code TA_SetInputParamRealPtr");
313
+ return T_TRUE;
310
314
  }
311
315
 
312
316
  static VALUE ta_func_setup_in_price(VALUE self, VALUE param_index, VALUE in_open, VALUE in_high, VALUE in_low, VALUE in_close, VALUE in_volume, VALUE in_oi)
313
317
  {
318
+ double **dp;
314
319
  TA_RetCode ret_code;
315
320
  ParamHolder *param_holder;
316
- Data_Get_Struct(self, ParamHolder, param_holder);
317
- double **dp = param_holder->in;
318
-
319
- ret_code = TA_SetInputParamPricePtr(
320
- param_holder->p,
321
- FIX2INT(param_index),
322
- FLT2DBL(&dp[0], in_open),
323
- FLT2DBL(&dp[1], in_high),
324
- FLT2DBL(&dp[2], in_low),
325
- FLT2DBL(&dp[3], in_close),
326
- FLT2DBL(&dp[4], in_volume),
327
- FLT2DBL(&dp[5], in_oi));
321
+ Data_Get_Struct(self, ParamHolder, param_holder);
322
+ dp = param_holder->in;
323
+
324
+ ret_code = TA_SetInputParamPricePtr(
325
+ param_holder->p,
326
+ FIX2INT(param_index),
327
+ FLT2DBL(&dp[0], in_open),
328
+ FLT2DBL(&dp[1], in_high),
329
+ FLT2DBL(&dp[2], in_low),
330
+ FLT2DBL(&dp[3], in_close),
331
+ FLT2DBL(&dp[4], in_volume),
332
+ FLT2DBL(&dp[5], in_oi)
333
+ );
328
334
  if ( ret_code != TA_SUCCESS )
329
335
  rb_raise(rb_eRuntimeError, "unsuccess return code TA_SetInputParamPricePtr");
336
+
337
+ return T_TRUE;
330
338
  }
331
339
 
332
340
  /*
@@ -342,6 +350,8 @@ static VALUE ta_func_setup_opt_in_integer(VALUE self, VALUE param_index, VALUE v
342
350
  ret_code = TA_SetOptInputParamInteger( param_holder->p, FIX2INT(param_index), FIX2INT(val));
343
351
  if ( ret_code != TA_SUCCESS )
344
352
  rb_raise(rb_eRuntimeError, "unsuccess return code TA_SetOptInputParamIntegerPtr");
353
+
354
+ return val;
345
355
  }
346
356
 
347
357
  /*
@@ -358,6 +368,8 @@ static VALUE ta_func_setup_opt_in_real(VALUE self, VALUE param_index, VALUE val)
358
368
  ret_code = TA_SetOptInputParamReal( param_holder->p, FIX2INT(param_index), NUM2DBL(val));
359
369
  if ( ret_code != TA_SUCCESS )
360
370
  rb_raise(rb_eRuntimeError, "unsuccess return code TA_SetOptInputParamRealPtr");
371
+
372
+ return val;
361
373
  }
362
374
 
363
375
  /*
@@ -370,35 +382,47 @@ static VALUE ta_func_setup_out_real(VALUE self, VALUE param_index, VALUE out_arr
370
382
  TA_RetCode ret_code;
371
383
  ParamHolder *param_holder;
372
384
  long idx = FIX2INT(param_index);
385
+ double **dp;
373
386
  if (idx > 2)
374
387
  rb_raise(rb_eRuntimeError, "param_index must be 0..2");
388
+
375
389
  Data_Get_Struct(self, ParamHolder, param_holder);
376
390
  rb_ary_store(rb_iv_get(self, "@result"), idx, out_array);
377
391
  // FIXME: malloc w/o free: johnribera@hotmail.com fixed
378
- double **dp = &(param_holder->out[idx]);
379
- if (*dp) free(*dp); // not true only 1st time called (reusing same ptrs)
392
+ dp = &(param_holder->out[idx]);
393
+ if (*dp) free(*dp); // not true only 1st time called (reusing same ptrs)
394
+
380
395
  *dp = (double*)malloc(RARRAY_LEN(out_array) * sizeof(double));
381
396
  ret_code = TA_SetOutputParamRealPtr(param_holder->p, idx, *dp);
397
+
382
398
  if ( ret_code != TA_SUCCESS )
383
399
  rb_raise(rb_eRuntimeError, "unsuccess return code TA_SetOutputParamRealPtr");
400
+
401
+ return out_array;
384
402
  }
385
403
 
386
404
  static VALUE ta_func_setup_out_integer(VALUE self, VALUE param_index, VALUE out_array)
387
405
  {
388
406
  TA_RetCode ret_code;
389
407
  ParamHolder *param_holder;
390
- long idx = FIX2INT(param_index);
408
+ long idx = FIX2INT(param_index);
409
+ int **ip;
391
410
  if (idx > 2)
392
411
  rb_raise(rb_eRuntimeError, "param_index must be 0..2");
412
+
393
413
  Data_Get_Struct(self, ParamHolder, param_holder);
394
414
  rb_ary_store(rb_iv_get(self, "@result"), idx, out_array);
415
+
395
416
  // FIXME: malloc w/o free FIXED: johnribera@Hotmail.com
396
- int **ip = (int**)&(param_holder->out[idx]);
397
- if (*ip) free(*ip); // not true only very 1st time in
417
+ ip = (int**)&(param_holder->out[idx]);
418
+ if (*ip) free(*ip); // not true only very 1st time in
398
419
  *ip = (int*)malloc(RARRAY_LEN(out_array) * sizeof(int));
399
- ret_code=TA_SetOutputParamIntegerPtr( param_holder->p, idx, *ip);
420
+
421
+ ret_code = TA_SetOutputParamIntegerPtr( param_holder->p, idx, *ip);
400
422
  if ( ret_code != TA_SUCCESS )
401
423
  rb_raise(rb_eRuntimeError, "unsuccess return code TA_SetOutputParamIntegerPtr");
424
+
425
+ return out_array;
402
426
  }
403
427
 
404
428
  /*
@@ -443,7 +467,7 @@ static VALUE ta_func_lookback(VALUE self)
443
467
  if ( ret_code != TA_SUCCESS )
444
468
  rb_raise(rb_eRuntimeError, "unsuccess return code TA_GetLookback");
445
469
 
446
- return INT2FIX(out_lookback);
470
+ return INT2FIX(out_lookback);
447
471
  }
448
472
 
449
473
  void Init_talib()
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: talib_ruby
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
5
4
  prerelease: false
6
5
  segments:
7
6
  - 1
8
7
  - 0
9
- - 4
10
- version: 1.0.4
8
+ - 5
9
+ version: 1.0.5
11
10
  platform: ruby
12
11
  authors:
13
12
  - Valentin Treu
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2011-07-22 00:00:00 +02:00
17
+ date: 2013-04-07 00:00:00 +02:00
19
18
  default_executable:
20
19
  dependencies: []
21
20
 
@@ -33,7 +32,6 @@ files:
33
32
  - ext/talib/talib.c
34
33
  - lib/talib_ruby.rb
35
34
  - README.textile
36
- - ext/talib/extconf.rb
37
35
  has_rdoc: true
38
36
  homepage: http://github.com/rivella50/talib-ruby
39
37
  licenses: []
@@ -44,27 +42,23 @@ rdoc_options: []
44
42
  require_paths:
45
43
  - lib
46
44
  required_ruby_version: !ruby/object:Gem::Requirement
47
- none: false
48
45
  requirements:
49
46
  - - ">="
50
47
  - !ruby/object:Gem::Version
51
- hash: 3
52
48
  segments:
53
49
  - 0
54
50
  version: "0"
55
51
  required_rubygems_version: !ruby/object:Gem::Requirement
56
- none: false
57
52
  requirements:
58
53
  - - ">="
59
54
  - !ruby/object:Gem::Version
60
- hash: 3
61
55
  segments:
62
56
  - 0
63
57
  version: "0"
64
58
  requirements: []
65
59
 
66
60
  rubyforge_project:
67
- rubygems_version: 1.3.7
61
+ rubygems_version: 1.3.6
68
62
  signing_key:
69
63
  specification_version: 3
70
64
  summary: Ruby Wrapper for ta-lib