Completed
Push — master ( 762814...853e43 )
by
unknown
9s
created

HilbertTransformSinewaveIndicator   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 42
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 2

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 15
lcom 0
cbo 2
dl 0
loc 42
ccs 0
cts 19
cp 0
rs 10
c 0
b 0
f 0

1 Method

Rating   Name   Duplication   Size   Complexity  
C __invoke() 0 38 15
1
<?php
2
3
namespace Laratrade\Indicators;
4
5
use Illuminate\Support\Collection;
6
use Laratrade\Indicators\Contracts\Indicator;
7
use Laratrade\Indicators\Exceptions\NotEnoughDataPointsException;
8
9
/**
10
 * Hilbert Transform - Sinewave (MESA indicator)
11
 *
12
 *
13
 * We are actually using DSP
14
 * on the prices to attempt to get a lag-free/low-lag indicator.
15
 * This indicator can be passed an extra parameter and it will tell you in
16
 * we are in a trend or not. (when used as an indicator do not use in a trending market)
17
 */
18
class HilbertTransformSinewaveIndicator implements Indicator
19
{
20
21
    public function __invoke(Collection $ohlcv, bool $trend = false): int
22
    {
23
24
        $hts = trader_ht_sine($ohlcv->get('open'), $ohlcv->get('close'));
25
        if (false === $hts) {
26
            throw new NotEnoughDataPointsException('Not enough data points');
27
        }
28
29
30
        $dcsine = array_pop($hts[1]);
31
        $p_dcsine = array_pop($hts[1]);
32
        // leadsine is the first one it looks like.
33
        $leadsine = array_pop($hts[0]);
34
        $p_leadsine = array_pop($hts[0]);
35
36
        if ($trend) {
37
            /** if the last two sets of both are negative */
38
            if ($dcsine < 0 && $p_dcsine < 0 && $leadsine < 0 && $p_leadsine < 0) {
39
                return static::BUY; // uptrend
40
            }
41
            /** if the last two sets of both are positive */
42
            if ($dcsine > 0 && $p_dcsine > 0 && $leadsine > 0 && $p_leadsine > 0) {
43
                return static::SELL; // downtrend
44
            }
45
46
            return static::HOLD;
47
        }
48
49
        /** WE ARE NOT ASKING FOR THE TREND, RETURN A SIGNAL */
50
        if ($leadsine > $dcsine && $p_leadsine <= $p_dcsine) {
51
            return static::BUY; // buy
52
        }
53
        if ($leadsine < $dcsine && $p_leadsine >= $p_dcsine) {
54
            return static::SELL; // sell
55
        }
56
57
        return static::HOLD;
58
    }
59
}
60