[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [GT] New EMA



Weigert, Thomas wrote:
With all these problems with EMA I decided to rewrite this indicator. I
first tried to understand what the original authors were doing, but as
coded it seems to do things differently from the definition of EMA and
from what I see in other tools. In particular, it makes the data it
depends on dynamically dependent on the series it works on. Then there
are many more calculations that are not in the definition of the EMA, as
far as I can tell.

I took the straightforward approach and followed the text books.

The EMA is computed in the following manner:

alpha = 2 / ( N + 1 )
EMA[n] = EMA[n-1] + alpha * ( INPUT - EMA[n-1] )

Where EMA[n] refers to the EMA at period n, and INPUT is the value of
the input series at period n.

The starting point is usually computed as the SMA(n) over the period
from start - n to start. (One could also start with the actual value of
the series, in which case there would be no dependency on past data.
Maybe I make that an option.

when operating at the start of data it complained:
ras [ 5148 ] %    ./display_indicator.pl --start 1993-01-04 --end 1993-07-01 I:EMA 13000
Indicator I:EMA has 1 value ... all values selected
       I:EMA/1  <=> EMA[20,{I:Prices CLOSE}]

       timeframe day, time periods 0 .. 123
Calculating indicator ...
Use of uninitialized value in subtraction (-) at ../GT/Indicators/EMA.pm line 126.
Use of uninitialized value in addition (+) at ../GT/Indicators/EMA.pm line 126.
EMA[20,{I:Prices CLOSE}][1993-01-05 00:00:00] = 1.9978
EMA[20,{I:Prices CLOSE}][1993-01-06 00:00:00] = 3.7676
EMA[20,{I:Prices CLOSE}][1993-01-07 00:00:00] = 5.3456

so i hacked around and came up with

my $ema; for (my $i = $first+1; $i <= $last; $i++) {
       my $oldema = $indic->get($name, $i - 1);
       ( defined($oldema) )
         ? $ema = $alpha * ($self->{'args'}->get_arg_values($calc, $i, 2) - $oldema) + $oldema
         : $ema = $alpha * ($self->{'args'}->get_arg_values($calc, $i, 2));
       $indic->set($name, $i, $ema);
   }

you may have a better option, but it solves the issue noted above and i think
the answers remain the same.

but it falls on its face when attempting the emaema:
ras [ 5172 ] %    ./display_indicator.pl --start 1993-01-04 --end 1993-07-01 I:EMA 13000 20 '{I:EMA 20 {I:Prices CLOSE}'
Indicator I:EMA has 1 value ... all values selected
       I:EMA/1  <=> EMA[20,{I:EMA 20 {I:Prices CLOSE}}]

       timeframe day, time periods 0 .. 123
Calculating indicator ...
Use of uninitialized value in multiplication (*) at ../GT/Indicators/EMA.pm line 127.
Use of uninitialized value in multiplication (*) at ../GT/Indicators/EMA.pm line 127.
Use of uninitialized value in subtraction (-) at ../GT/Indicators/EMA.pm line 127.
Use of uninitialized value in multiplication (*) at ../GT/Indicators/EMA.pm line 127.
Use of uninitialized value in subtraction (-) at ../GT/Indicators/EMA.pm line 127.
Use of uninitialized value in multiplication (*) at ../GT/Indicators/EMA.pm line 127.

to fix the warning, one could cheat and put
no warnings "uninitialized";
inside that for statement, or block the trinary statement and put the pragma in the block
       {
       no warnings "uninitialized";
       ( defined($oldema) )
         ? $ema = $alpha * ($self->{'args'}->get_arg_values($calc, $i, 2) - $oldema) + $oldema
         : $ema = $alpha * ($self->{'args'}->get_arg_values($calc, $i, 2));
       }


this is excellent work
i think major progress has been made, little thanks to me

aloha

ras

ps -- i added the 1; at end of file, have yet to know why -- but all cpan
modules have it. -- ras

pps -- ema is used in a slue (bunch) of indicators:
../GT/Indicators/AT3.pm:18
../GT/Indicators/CHAIKIN.pm:4
../GT/Indicators/DSS.pm:8
../GT/Indicators/ENV.pm:6
../GT/Indicators/ElderRay.pm:2
../GT/Indicators/KirshenbaumBands.pm:5
../GT/Indicators/MACD.pm:10
../GT/Indicators/MASS.pm:4
../GT/Indicators/PFE.pm:5
../GT/Indicators/PGO.pm:5
../GT/Indicators/REMA.pm:17
../GT/Indicators/RMI.pm:1
../GT/Indicators/SMI.pm:4
../GT/Indicators/T3.pm:18
../GT/Indicators/TRIX.pm:8
../GT/Indicators/TRIXkw.pm:8
../GT/Indicators/WWMA.pm:1
-- sure wish there was a good way to validate them -- ras



Please find this indicator attached. I compared it with the output from
TA_lib and metastock. I also ran my tests. It depends only on the past n
data points (if we use the SMA start computation). It is not affected
whether called directly or in another indicator.

Please do your own testing. But I think it works better and faster than
the existing EMA.

Cheers, Th.