1 ! Copyright (C) 2008 John Benediktsson
2 ! See http://factorcode.org/license.txt for BSD license
4 USING: arrays kernel grouping math math.statistics sequences ;
8 : enumerate ( seq -- newseq )
9 #! Returns a sequence where each element and its index
10 -1 swap [ [ 1+ ] dip swap [ 2array ] keep swap ] { } map-as swap drop ;
12 : ema ( seq n -- newseq )
13 #! An exponentially-weighted moving average:
15 #! EMA[t] = (A * VAL[t]) + ((1-A) * EMA[t-1])
16 1+ 2.0 swap / dup 1 swap - swap rot
17 [ [ dup ] dip * ] map swap drop 0 swap
18 [ [ dup ] 2dip [ * ] dip + dup ] map
19 [ drop drop ] dip 1 tail-slice >array ;
21 : sma ( seq n -- newseq )
22 #! Simple moving average
25 : macd ( seq n1 n2 -- newseq )
26 #! Moving Average Convergence Divergence
27 #! MACD[t] = EMA2[t] - EMA1[t]
28 rot dup ema [ swap ema ] dip [ - ] 2map ;
30 : momentum ( seq n -- newseq )
32 #! M[t] = P[t] - P[t-n]
33 2dup tail-slice -rot swap [ length ] keep
34 [ - neg ] dip swap head-slice [ - ] 2map ;