talib_ruby 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
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