sqa-tai 0.1.2 → 0.4.0
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.
- checksums.yaml +4 -4
- data/.claude/settings.local.json +33 -0
- data/.envrc +6 -1
- data/.loki +10 -0
- data/.quality/reek_baseline.txt +0 -0
- data/.rubocop.yml +221 -0
- data/CHANGELOG.md +30 -2
- data/Gemfile +0 -8
- data/Gemfile.local +19 -0
- data/README.md +9 -10
- data/Rakefile +163 -7
- data/lib/sqa/tai/cycle_indicators.rb +7 -19
- data/lib/sqa/tai/help/resource.rb +4 -3
- data/lib/sqa/tai/help.rb +16 -11
- data/lib/sqa/tai/momentum_indicators.rb +51 -110
- data/lib/sqa/tai/native.rb +497 -0
- data/lib/sqa/tai/overlap_studies.rb +13 -22
- data/lib/sqa/tai/pattern_recognition.rb +67 -61
- data/lib/sqa/tai/price_transform.rb +10 -4
- data/lib/sqa/tai/statistical_functions.rb +21 -21
- data/lib/sqa/tai/version.rb +1 -1
- data/lib/sqa/tai/volatility_indicators.rb +27 -31
- data/lib/sqa/tai/volume_indicators.rb +9 -3
- data/lib/sqa/tai.rb +38 -29
- data/mkdocs.yml +153 -15
- data/sqa-tai.gemspec +54 -0
- metadata +131 -13
- data/Gemfile.lock +0 -71
- data/lib/extensions/ta_lib_ffi.rb +0 -154
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
module SQA
|
|
4
4
|
module TAI
|
|
5
5
|
# Pattern Recognition (Candlestick Patterns)
|
|
6
|
+
#
|
|
7
|
+
# :reek:DataClump -- all 61 patterns intentionally take TA-Lib's own
|
|
8
|
+
# OHLC (+ optional penetration) signature as separate positional args;
|
|
9
|
+
# bundling them into a value object would be a breaking public API
|
|
10
|
+
# change for this gem and its downstream consumers (sqa, sqa-cli,
|
|
11
|
+
# sqa-advisor) and their 133 published indicator doc pages.
|
|
6
12
|
module PatternRecognition
|
|
7
13
|
# Doji candlestick pattern
|
|
8
14
|
# @param open [Array<Float>] Open prices
|
|
@@ -17,7 +23,7 @@ module SQA
|
|
|
17
23
|
validate_prices!(low)
|
|
18
24
|
validate_prices!(close)
|
|
19
25
|
|
|
20
|
-
|
|
26
|
+
Native.cdldoji([open, high, low, close])
|
|
21
27
|
end
|
|
22
28
|
|
|
23
29
|
# Hammer candlestick pattern
|
|
@@ -28,7 +34,7 @@ module SQA
|
|
|
28
34
|
validate_prices!(low)
|
|
29
35
|
validate_prices!(close)
|
|
30
36
|
|
|
31
|
-
|
|
37
|
+
Native.cdlhammer([open, high, low, close])
|
|
32
38
|
end
|
|
33
39
|
|
|
34
40
|
# Engulfing pattern
|
|
@@ -39,7 +45,7 @@ module SQA
|
|
|
39
45
|
validate_prices!(low)
|
|
40
46
|
validate_prices!(close)
|
|
41
47
|
|
|
42
|
-
|
|
48
|
+
Native.cdlengulfing([open, high, low, close])
|
|
43
49
|
end
|
|
44
50
|
|
|
45
51
|
# Morning Star pattern
|
|
@@ -50,7 +56,7 @@ module SQA
|
|
|
50
56
|
validate_prices!(low)
|
|
51
57
|
validate_prices!(close)
|
|
52
58
|
|
|
53
|
-
|
|
59
|
+
Native.cdlmorningstar([open, high, low, close], penetration: penetration)
|
|
54
60
|
end
|
|
55
61
|
|
|
56
62
|
# Evening Star pattern
|
|
@@ -61,7 +67,7 @@ module SQA
|
|
|
61
67
|
validate_prices!(low)
|
|
62
68
|
validate_prices!(close)
|
|
63
69
|
|
|
64
|
-
|
|
70
|
+
Native.cdleveningstar([open, high, low, close], penetration: penetration)
|
|
65
71
|
end
|
|
66
72
|
|
|
67
73
|
# Harami pattern
|
|
@@ -72,7 +78,7 @@ module SQA
|
|
|
72
78
|
validate_prices!(low)
|
|
73
79
|
validate_prices!(close)
|
|
74
80
|
|
|
75
|
-
|
|
81
|
+
Native.cdlharami([open, high, low, close])
|
|
76
82
|
end
|
|
77
83
|
|
|
78
84
|
# Piercing pattern
|
|
@@ -83,7 +89,7 @@ module SQA
|
|
|
83
89
|
validate_prices!(low)
|
|
84
90
|
validate_prices!(close)
|
|
85
91
|
|
|
86
|
-
|
|
92
|
+
Native.cdlpiercing([open, high, low, close])
|
|
87
93
|
end
|
|
88
94
|
|
|
89
95
|
# Shooting Star pattern
|
|
@@ -94,7 +100,7 @@ module SQA
|
|
|
94
100
|
validate_prices!(low)
|
|
95
101
|
validate_prices!(close)
|
|
96
102
|
|
|
97
|
-
|
|
103
|
+
Native.cdlshootingstar([open, high, low, close])
|
|
98
104
|
end
|
|
99
105
|
|
|
100
106
|
# Marubozu pattern
|
|
@@ -105,7 +111,7 @@ module SQA
|
|
|
105
111
|
validate_prices!(low)
|
|
106
112
|
validate_prices!(close)
|
|
107
113
|
|
|
108
|
-
|
|
114
|
+
Native.cdlmarubozu([open, high, low, close])
|
|
109
115
|
end
|
|
110
116
|
|
|
111
117
|
# Spinning Top pattern
|
|
@@ -116,7 +122,7 @@ module SQA
|
|
|
116
122
|
validate_prices!(low)
|
|
117
123
|
validate_prices!(close)
|
|
118
124
|
|
|
119
|
-
|
|
125
|
+
Native.cdlspinningtop([open, high, low, close])
|
|
120
126
|
end
|
|
121
127
|
|
|
122
128
|
# Dragonfly Doji pattern
|
|
@@ -127,7 +133,7 @@ module SQA
|
|
|
127
133
|
validate_prices!(low)
|
|
128
134
|
validate_prices!(close)
|
|
129
135
|
|
|
130
|
-
|
|
136
|
+
Native.cdldragonflydoji([open, high, low, close])
|
|
131
137
|
end
|
|
132
138
|
|
|
133
139
|
# Gravestone Doji pattern
|
|
@@ -138,7 +144,7 @@ module SQA
|
|
|
138
144
|
validate_prices!(low)
|
|
139
145
|
validate_prices!(close)
|
|
140
146
|
|
|
141
|
-
|
|
147
|
+
Native.cdlgravestonedoji([open, high, low, close])
|
|
142
148
|
end
|
|
143
149
|
|
|
144
150
|
# Two Crows pattern
|
|
@@ -149,7 +155,7 @@ module SQA
|
|
|
149
155
|
validate_prices!(low)
|
|
150
156
|
validate_prices!(close)
|
|
151
157
|
|
|
152
|
-
|
|
158
|
+
Native.cdl2crows([open, high, low, close])
|
|
153
159
|
end
|
|
154
160
|
|
|
155
161
|
# Three Black Crows pattern
|
|
@@ -160,7 +166,7 @@ module SQA
|
|
|
160
166
|
validate_prices!(low)
|
|
161
167
|
validate_prices!(close)
|
|
162
168
|
|
|
163
|
-
|
|
169
|
+
Native.cdl3blackcrows([open, high, low, close])
|
|
164
170
|
end
|
|
165
171
|
|
|
166
172
|
# Three Inside Up/Down pattern
|
|
@@ -171,7 +177,7 @@ module SQA
|
|
|
171
177
|
validate_prices!(low)
|
|
172
178
|
validate_prices!(close)
|
|
173
179
|
|
|
174
|
-
|
|
180
|
+
Native.cdl3inside([open, high, low, close])
|
|
175
181
|
end
|
|
176
182
|
|
|
177
183
|
# Three Line Strike pattern
|
|
@@ -182,7 +188,7 @@ module SQA
|
|
|
182
188
|
validate_prices!(low)
|
|
183
189
|
validate_prices!(close)
|
|
184
190
|
|
|
185
|
-
|
|
191
|
+
Native.cdl3linestrike([open, high, low, close])
|
|
186
192
|
end
|
|
187
193
|
|
|
188
194
|
# Three Outside Up/Down pattern
|
|
@@ -193,7 +199,7 @@ module SQA
|
|
|
193
199
|
validate_prices!(low)
|
|
194
200
|
validate_prices!(close)
|
|
195
201
|
|
|
196
|
-
|
|
202
|
+
Native.cdl3outside([open, high, low, close])
|
|
197
203
|
end
|
|
198
204
|
|
|
199
205
|
# Three Stars In The South pattern
|
|
@@ -204,7 +210,7 @@ module SQA
|
|
|
204
210
|
validate_prices!(low)
|
|
205
211
|
validate_prices!(close)
|
|
206
212
|
|
|
207
|
-
|
|
213
|
+
Native.cdl3starsinsouth([open, high, low, close])
|
|
208
214
|
end
|
|
209
215
|
|
|
210
216
|
# Three Advancing White Soldiers pattern
|
|
@@ -215,7 +221,7 @@ module SQA
|
|
|
215
221
|
validate_prices!(low)
|
|
216
222
|
validate_prices!(close)
|
|
217
223
|
|
|
218
|
-
|
|
224
|
+
Native.cdl3whitesoldiers([open, high, low, close])
|
|
219
225
|
end
|
|
220
226
|
|
|
221
227
|
# Abandoned Baby pattern
|
|
@@ -226,7 +232,7 @@ module SQA
|
|
|
226
232
|
validate_prices!(low)
|
|
227
233
|
validate_prices!(close)
|
|
228
234
|
|
|
229
|
-
|
|
235
|
+
Native.cdlabandonedbaby([open, high, low, close], penetration: penetration)
|
|
230
236
|
end
|
|
231
237
|
|
|
232
238
|
# Advance Block pattern
|
|
@@ -237,7 +243,7 @@ module SQA
|
|
|
237
243
|
validate_prices!(low)
|
|
238
244
|
validate_prices!(close)
|
|
239
245
|
|
|
240
|
-
|
|
246
|
+
Native.cdladvanceblock([open, high, low, close])
|
|
241
247
|
end
|
|
242
248
|
|
|
243
249
|
# Belt-hold pattern
|
|
@@ -248,7 +254,7 @@ module SQA
|
|
|
248
254
|
validate_prices!(low)
|
|
249
255
|
validate_prices!(close)
|
|
250
256
|
|
|
251
|
-
|
|
257
|
+
Native.cdlbelthold([open, high, low, close])
|
|
252
258
|
end
|
|
253
259
|
|
|
254
260
|
# Breakaway pattern
|
|
@@ -259,7 +265,7 @@ module SQA
|
|
|
259
265
|
validate_prices!(low)
|
|
260
266
|
validate_prices!(close)
|
|
261
267
|
|
|
262
|
-
|
|
268
|
+
Native.cdlbreakaway([open, high, low, close])
|
|
263
269
|
end
|
|
264
270
|
|
|
265
271
|
# Closing Marubozu pattern
|
|
@@ -270,7 +276,7 @@ module SQA
|
|
|
270
276
|
validate_prices!(low)
|
|
271
277
|
validate_prices!(close)
|
|
272
278
|
|
|
273
|
-
|
|
279
|
+
Native.cdlclosingmarubozu([open, high, low, close])
|
|
274
280
|
end
|
|
275
281
|
|
|
276
282
|
# Concealing Baby Swallow pattern
|
|
@@ -281,7 +287,7 @@ module SQA
|
|
|
281
287
|
validate_prices!(low)
|
|
282
288
|
validate_prices!(close)
|
|
283
289
|
|
|
284
|
-
|
|
290
|
+
Native.cdlconcealbabyswall([open, high, low, close])
|
|
285
291
|
end
|
|
286
292
|
|
|
287
293
|
# Counterattack pattern
|
|
@@ -292,7 +298,7 @@ module SQA
|
|
|
292
298
|
validate_prices!(low)
|
|
293
299
|
validate_prices!(close)
|
|
294
300
|
|
|
295
|
-
|
|
301
|
+
Native.cdlcounterattack([open, high, low, close])
|
|
296
302
|
end
|
|
297
303
|
|
|
298
304
|
# Dark Cloud Cover pattern
|
|
@@ -303,7 +309,7 @@ module SQA
|
|
|
303
309
|
validate_prices!(low)
|
|
304
310
|
validate_prices!(close)
|
|
305
311
|
|
|
306
|
-
|
|
312
|
+
Native.cdldarkcloudcover([open, high, low, close], penetration: penetration)
|
|
307
313
|
end
|
|
308
314
|
|
|
309
315
|
# Doji Star pattern
|
|
@@ -314,7 +320,7 @@ module SQA
|
|
|
314
320
|
validate_prices!(low)
|
|
315
321
|
validate_prices!(close)
|
|
316
322
|
|
|
317
|
-
|
|
323
|
+
Native.cdldojistar([open, high, low, close])
|
|
318
324
|
end
|
|
319
325
|
|
|
320
326
|
# Evening Doji Star pattern
|
|
@@ -325,7 +331,7 @@ module SQA
|
|
|
325
331
|
validate_prices!(low)
|
|
326
332
|
validate_prices!(close)
|
|
327
333
|
|
|
328
|
-
|
|
334
|
+
Native.cdleveningdojistar([open, high, low, close], penetration: penetration)
|
|
329
335
|
end
|
|
330
336
|
|
|
331
337
|
# Up/Down-gap side-by-side white lines pattern
|
|
@@ -336,7 +342,7 @@ module SQA
|
|
|
336
342
|
validate_prices!(low)
|
|
337
343
|
validate_prices!(close)
|
|
338
344
|
|
|
339
|
-
|
|
345
|
+
Native.cdlgapsidesidewhite([open, high, low, close])
|
|
340
346
|
end
|
|
341
347
|
|
|
342
348
|
# Hanging Man pattern
|
|
@@ -347,7 +353,7 @@ module SQA
|
|
|
347
353
|
validate_prices!(low)
|
|
348
354
|
validate_prices!(close)
|
|
349
355
|
|
|
350
|
-
|
|
356
|
+
Native.cdlhangingman([open, high, low, close])
|
|
351
357
|
end
|
|
352
358
|
|
|
353
359
|
# Harami Cross pattern
|
|
@@ -358,7 +364,7 @@ module SQA
|
|
|
358
364
|
validate_prices!(low)
|
|
359
365
|
validate_prices!(close)
|
|
360
366
|
|
|
361
|
-
|
|
367
|
+
Native.cdlharamicross([open, high, low, close])
|
|
362
368
|
end
|
|
363
369
|
|
|
364
370
|
# High-Wave Candle pattern
|
|
@@ -369,7 +375,7 @@ module SQA
|
|
|
369
375
|
validate_prices!(low)
|
|
370
376
|
validate_prices!(close)
|
|
371
377
|
|
|
372
|
-
|
|
378
|
+
Native.cdlhighwave([open, high, low, close])
|
|
373
379
|
end
|
|
374
380
|
|
|
375
381
|
# Hikkake pattern
|
|
@@ -380,7 +386,7 @@ module SQA
|
|
|
380
386
|
validate_prices!(low)
|
|
381
387
|
validate_prices!(close)
|
|
382
388
|
|
|
383
|
-
|
|
389
|
+
Native.cdlhikkake([open, high, low, close])
|
|
384
390
|
end
|
|
385
391
|
|
|
386
392
|
# Modified Hikkake pattern
|
|
@@ -391,7 +397,7 @@ module SQA
|
|
|
391
397
|
validate_prices!(low)
|
|
392
398
|
validate_prices!(close)
|
|
393
399
|
|
|
394
|
-
|
|
400
|
+
Native.cdlhikkakemod([open, high, low, close])
|
|
395
401
|
end
|
|
396
402
|
|
|
397
403
|
# Homing Pigeon pattern
|
|
@@ -402,7 +408,7 @@ module SQA
|
|
|
402
408
|
validate_prices!(low)
|
|
403
409
|
validate_prices!(close)
|
|
404
410
|
|
|
405
|
-
|
|
411
|
+
Native.cdlhomingpigeon([open, high, low, close])
|
|
406
412
|
end
|
|
407
413
|
|
|
408
414
|
# Identical Three Crows pattern
|
|
@@ -413,7 +419,7 @@ module SQA
|
|
|
413
419
|
validate_prices!(low)
|
|
414
420
|
validate_prices!(close)
|
|
415
421
|
|
|
416
|
-
|
|
422
|
+
Native.cdlidentical3crows([open, high, low, close])
|
|
417
423
|
end
|
|
418
424
|
|
|
419
425
|
# In-Neck pattern
|
|
@@ -424,7 +430,7 @@ module SQA
|
|
|
424
430
|
validate_prices!(low)
|
|
425
431
|
validate_prices!(close)
|
|
426
432
|
|
|
427
|
-
|
|
433
|
+
Native.cdlinneck([open, high, low, close])
|
|
428
434
|
end
|
|
429
435
|
|
|
430
436
|
# Inverted Hammer pattern
|
|
@@ -435,7 +441,7 @@ module SQA
|
|
|
435
441
|
validate_prices!(low)
|
|
436
442
|
validate_prices!(close)
|
|
437
443
|
|
|
438
|
-
|
|
444
|
+
Native.cdlinvertedhammer([open, high, low, close])
|
|
439
445
|
end
|
|
440
446
|
|
|
441
447
|
# Kicking pattern
|
|
@@ -446,7 +452,7 @@ module SQA
|
|
|
446
452
|
validate_prices!(low)
|
|
447
453
|
validate_prices!(close)
|
|
448
454
|
|
|
449
|
-
|
|
455
|
+
Native.cdlkicking([open, high, low, close])
|
|
450
456
|
end
|
|
451
457
|
|
|
452
458
|
# Kicking - bull/bear determined by the longer marubozu
|
|
@@ -457,7 +463,7 @@ module SQA
|
|
|
457
463
|
validate_prices!(low)
|
|
458
464
|
validate_prices!(close)
|
|
459
465
|
|
|
460
|
-
|
|
466
|
+
Native.cdlkickingbylength([open, high, low, close])
|
|
461
467
|
end
|
|
462
468
|
|
|
463
469
|
# Ladder Bottom pattern
|
|
@@ -468,7 +474,7 @@ module SQA
|
|
|
468
474
|
validate_prices!(low)
|
|
469
475
|
validate_prices!(close)
|
|
470
476
|
|
|
471
|
-
|
|
477
|
+
Native.cdlladderbottom([open, high, low, close])
|
|
472
478
|
end
|
|
473
479
|
|
|
474
480
|
# Long Legged Doji pattern
|
|
@@ -479,7 +485,7 @@ module SQA
|
|
|
479
485
|
validate_prices!(low)
|
|
480
486
|
validate_prices!(close)
|
|
481
487
|
|
|
482
|
-
|
|
488
|
+
Native.cdllongleggeddoji([open, high, low, close])
|
|
483
489
|
end
|
|
484
490
|
|
|
485
491
|
# Long Line Candle pattern
|
|
@@ -490,7 +496,7 @@ module SQA
|
|
|
490
496
|
validate_prices!(low)
|
|
491
497
|
validate_prices!(close)
|
|
492
498
|
|
|
493
|
-
|
|
499
|
+
Native.cdllongline([open, high, low, close])
|
|
494
500
|
end
|
|
495
501
|
|
|
496
502
|
# Matching Low pattern
|
|
@@ -501,7 +507,7 @@ module SQA
|
|
|
501
507
|
validate_prices!(low)
|
|
502
508
|
validate_prices!(close)
|
|
503
509
|
|
|
504
|
-
|
|
510
|
+
Native.cdlmatchinglow([open, high, low, close])
|
|
505
511
|
end
|
|
506
512
|
|
|
507
513
|
# Mat Hold pattern
|
|
@@ -512,7 +518,7 @@ module SQA
|
|
|
512
518
|
validate_prices!(low)
|
|
513
519
|
validate_prices!(close)
|
|
514
520
|
|
|
515
|
-
|
|
521
|
+
Native.cdlmathold([open, high, low, close], penetration: penetration)
|
|
516
522
|
end
|
|
517
523
|
|
|
518
524
|
# Morning Doji Star pattern
|
|
@@ -523,7 +529,7 @@ module SQA
|
|
|
523
529
|
validate_prices!(low)
|
|
524
530
|
validate_prices!(close)
|
|
525
531
|
|
|
526
|
-
|
|
532
|
+
Native.cdlmorningdojistar([open, high, low, close], penetration: penetration)
|
|
527
533
|
end
|
|
528
534
|
|
|
529
535
|
# On-Neck pattern
|
|
@@ -534,7 +540,7 @@ module SQA
|
|
|
534
540
|
validate_prices!(low)
|
|
535
541
|
validate_prices!(close)
|
|
536
542
|
|
|
537
|
-
|
|
543
|
+
Native.cdlonneck([open, high, low, close])
|
|
538
544
|
end
|
|
539
545
|
|
|
540
546
|
# Rickshaw Man pattern
|
|
@@ -545,7 +551,7 @@ module SQA
|
|
|
545
551
|
validate_prices!(low)
|
|
546
552
|
validate_prices!(close)
|
|
547
553
|
|
|
548
|
-
|
|
554
|
+
Native.cdlrickshawman([open, high, low, close])
|
|
549
555
|
end
|
|
550
556
|
|
|
551
557
|
# Rising/Falling Three Methods pattern
|
|
@@ -556,7 +562,7 @@ module SQA
|
|
|
556
562
|
validate_prices!(low)
|
|
557
563
|
validate_prices!(close)
|
|
558
564
|
|
|
559
|
-
|
|
565
|
+
Native.cdlrisefall3methods([open, high, low, close])
|
|
560
566
|
end
|
|
561
567
|
|
|
562
568
|
# Separating Lines pattern
|
|
@@ -567,7 +573,7 @@ module SQA
|
|
|
567
573
|
validate_prices!(low)
|
|
568
574
|
validate_prices!(close)
|
|
569
575
|
|
|
570
|
-
|
|
576
|
+
Native.cdlseparatinglines([open, high, low, close])
|
|
571
577
|
end
|
|
572
578
|
|
|
573
579
|
# Short Line Candle pattern
|
|
@@ -578,7 +584,7 @@ module SQA
|
|
|
578
584
|
validate_prices!(low)
|
|
579
585
|
validate_prices!(close)
|
|
580
586
|
|
|
581
|
-
|
|
587
|
+
Native.cdlshortline([open, high, low, close])
|
|
582
588
|
end
|
|
583
589
|
|
|
584
590
|
# Stalled Pattern
|
|
@@ -589,7 +595,7 @@ module SQA
|
|
|
589
595
|
validate_prices!(low)
|
|
590
596
|
validate_prices!(close)
|
|
591
597
|
|
|
592
|
-
|
|
598
|
+
Native.cdlstalledpattern([open, high, low, close])
|
|
593
599
|
end
|
|
594
600
|
|
|
595
601
|
# Stick Sandwich pattern
|
|
@@ -600,7 +606,7 @@ module SQA
|
|
|
600
606
|
validate_prices!(low)
|
|
601
607
|
validate_prices!(close)
|
|
602
608
|
|
|
603
|
-
|
|
609
|
+
Native.cdlsticksandwich([open, high, low, close])
|
|
604
610
|
end
|
|
605
611
|
|
|
606
612
|
# Takuri (Dragonfly Doji with very long lower shadow) pattern
|
|
@@ -611,7 +617,7 @@ module SQA
|
|
|
611
617
|
validate_prices!(low)
|
|
612
618
|
validate_prices!(close)
|
|
613
619
|
|
|
614
|
-
|
|
620
|
+
Native.cdltakuri([open, high, low, close])
|
|
615
621
|
end
|
|
616
622
|
|
|
617
623
|
# Tasuki Gap pattern
|
|
@@ -622,7 +628,7 @@ module SQA
|
|
|
622
628
|
validate_prices!(low)
|
|
623
629
|
validate_prices!(close)
|
|
624
630
|
|
|
625
|
-
|
|
631
|
+
Native.cdltasukigap([open, high, low, close])
|
|
626
632
|
end
|
|
627
633
|
|
|
628
634
|
# Thrusting pattern
|
|
@@ -633,7 +639,7 @@ module SQA
|
|
|
633
639
|
validate_prices!(low)
|
|
634
640
|
validate_prices!(close)
|
|
635
641
|
|
|
636
|
-
|
|
642
|
+
Native.cdlthrusting([open, high, low, close])
|
|
637
643
|
end
|
|
638
644
|
|
|
639
645
|
# Tristar pattern
|
|
@@ -644,7 +650,7 @@ module SQA
|
|
|
644
650
|
validate_prices!(low)
|
|
645
651
|
validate_prices!(close)
|
|
646
652
|
|
|
647
|
-
|
|
653
|
+
Native.cdltristar([open, high, low, close])
|
|
648
654
|
end
|
|
649
655
|
|
|
650
656
|
# Unique 3 River pattern
|
|
@@ -655,7 +661,7 @@ module SQA
|
|
|
655
661
|
validate_prices!(low)
|
|
656
662
|
validate_prices!(close)
|
|
657
663
|
|
|
658
|
-
|
|
664
|
+
Native.cdlunique3river([open, high, low, close])
|
|
659
665
|
end
|
|
660
666
|
|
|
661
667
|
# Upside Gap Two Crows pattern
|
|
@@ -666,7 +672,7 @@ module SQA
|
|
|
666
672
|
validate_prices!(low)
|
|
667
673
|
validate_prices!(close)
|
|
668
674
|
|
|
669
|
-
|
|
675
|
+
Native.cdlupsidegap2crows([open, high, low, close])
|
|
670
676
|
end
|
|
671
677
|
|
|
672
678
|
# Upside/Downside Gap Three Methods pattern
|
|
@@ -677,7 +683,7 @@ module SQA
|
|
|
677
683
|
validate_prices!(low)
|
|
678
684
|
validate_prices!(close)
|
|
679
685
|
|
|
680
|
-
|
|
686
|
+
Native.cdlxsidegap3methods([open, high, low, close])
|
|
681
687
|
end
|
|
682
688
|
end
|
|
683
689
|
end
|
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
module SQA
|
|
4
4
|
module TAI
|
|
5
5
|
# Price Transform
|
|
6
|
+
#
|
|
7
|
+
# :reek:DataClump -- these methods intentionally mirror TA-Lib's own
|
|
8
|
+
# C function signatures (high/low/close as separate positional args);
|
|
9
|
+
# bundling them into a value object would be a breaking public API
|
|
10
|
+
# change for this gem and its downstream consumers (sqa, sqa-cli,
|
|
11
|
+
# sqa-advisor) and their 133 published indicator doc pages.
|
|
6
12
|
module PriceTransform
|
|
7
13
|
# Average Price
|
|
8
14
|
# @param open [Array<Float>] Open prices
|
|
@@ -17,7 +23,7 @@ module SQA
|
|
|
17
23
|
validate_prices!(low)
|
|
18
24
|
validate_prices!(close)
|
|
19
25
|
|
|
20
|
-
|
|
26
|
+
Native.avgprice([open, high, low, close])
|
|
21
27
|
end
|
|
22
28
|
|
|
23
29
|
# Median Price
|
|
@@ -29,7 +35,7 @@ module SQA
|
|
|
29
35
|
validate_prices!(high)
|
|
30
36
|
validate_prices!(low)
|
|
31
37
|
|
|
32
|
-
|
|
38
|
+
Native.medprice([high, low])
|
|
33
39
|
end
|
|
34
40
|
|
|
35
41
|
# Typical Price
|
|
@@ -43,7 +49,7 @@ module SQA
|
|
|
43
49
|
validate_prices!(low)
|
|
44
50
|
validate_prices!(close)
|
|
45
51
|
|
|
46
|
-
|
|
52
|
+
Native.typprice([high, low, close])
|
|
47
53
|
end
|
|
48
54
|
|
|
49
55
|
# Weighted Close Price
|
|
@@ -57,7 +63,7 @@ module SQA
|
|
|
57
63
|
validate_prices!(low)
|
|
58
64
|
validate_prices!(close)
|
|
59
65
|
|
|
60
|
-
|
|
66
|
+
Native.wclprice([high, low, close])
|
|
61
67
|
end
|
|
62
68
|
end
|
|
63
69
|
end
|
|
@@ -5,31 +5,31 @@ module SQA
|
|
|
5
5
|
# Statistical Functions
|
|
6
6
|
module StatisticalFunctions
|
|
7
7
|
# Pearson's Correlation Coefficient
|
|
8
|
-
# @param
|
|
9
|
-
# @param
|
|
8
|
+
# @param prices_1 [Array<Float>] First array of prices
|
|
9
|
+
# @param prices_2 [Array<Float>] Second array of prices
|
|
10
10
|
# @param period [Integer] Time period (default: 30)
|
|
11
11
|
# @return [Array<Float>] Correlation values
|
|
12
|
-
def correl(
|
|
12
|
+
def correl(prices_1, prices_2, period: 30)
|
|
13
13
|
check_available!
|
|
14
|
-
validate_prices!(
|
|
15
|
-
validate_prices!(
|
|
16
|
-
validate_period!(period, [
|
|
14
|
+
validate_prices!(prices_1)
|
|
15
|
+
validate_prices!(prices_2)
|
|
16
|
+
validate_period!(period, [prices_1.size, prices_2.size].min)
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Native.correl(prices_1, prices_2, time_period: period)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
# Beta
|
|
22
|
-
# @param
|
|
23
|
-
# @param
|
|
22
|
+
# @param prices_1 [Array<Float>] First array of prices
|
|
23
|
+
# @param prices_2 [Array<Float>] Second array of prices
|
|
24
24
|
# @param period [Integer] Time period (default: 5)
|
|
25
25
|
# @return [Array<Float>] Beta values
|
|
26
|
-
def beta(
|
|
26
|
+
def beta(prices_1, prices_2, period: 5)
|
|
27
27
|
check_available!
|
|
28
|
-
validate_prices!(
|
|
29
|
-
validate_prices!(
|
|
30
|
-
validate_period!(period, [
|
|
28
|
+
validate_prices!(prices_1)
|
|
29
|
+
validate_prices!(prices_2)
|
|
30
|
+
validate_period!(period, [prices_1.size, prices_2.size].min)
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Native.beta(prices_1, prices_2, time_period: period)
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
# Variance
|
|
@@ -42,7 +42,7 @@ module SQA
|
|
|
42
42
|
validate_prices!(prices)
|
|
43
43
|
validate_period!(period, prices.size)
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
Native.var(prices, time_period: period, nbdev:)
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
# Standard Deviation
|
|
@@ -55,7 +55,7 @@ module SQA
|
|
|
55
55
|
validate_prices!(prices)
|
|
56
56
|
validate_period!(period, prices.size)
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
Native.stddev(prices, time_period: period, nbdev:)
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
# Linear Regression
|
|
@@ -67,7 +67,7 @@ module SQA
|
|
|
67
67
|
validate_prices!(prices)
|
|
68
68
|
validate_period!(period, prices.size)
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
Native.linearreg(prices, time_period: period)
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
# Linear Regression Angle
|
|
@@ -79,7 +79,7 @@ module SQA
|
|
|
79
79
|
validate_prices!(prices)
|
|
80
80
|
validate_period!(period, prices.size)
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
Native.linearreg_angle(prices, time_period: period)
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
# Linear Regression Intercept
|
|
@@ -91,7 +91,7 @@ module SQA
|
|
|
91
91
|
validate_prices!(prices)
|
|
92
92
|
validate_period!(period, prices.size)
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
Native.linearreg_intercept(prices, time_period: period)
|
|
95
95
|
end
|
|
96
96
|
|
|
97
97
|
# Linear Regression Slope
|
|
@@ -103,7 +103,7 @@ module SQA
|
|
|
103
103
|
validate_prices!(prices)
|
|
104
104
|
validate_period!(period, prices.size)
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
Native.linearreg_slope(prices, time_period: period)
|
|
107
107
|
end
|
|
108
108
|
|
|
109
109
|
# Time Series Forecast
|
|
@@ -115,7 +115,7 @@ module SQA
|
|
|
115
115
|
validate_prices!(prices)
|
|
116
116
|
validate_period!(period, prices.size)
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
Native.tsf(prices, time_period: period)
|
|
119
119
|
end
|
|
120
120
|
end
|
|
121
121
|
end
|