dim v$( 100) ' Each array term stores a particular SMA of period p in p*10 bytes nomainwin WindowWidth =1080 WindowHeight = 780 graphicbox #w.gb1, 20, 20, 1000, 700 open "Running averages to smooth data" for window as #w #w "trapclose quit" #w.gb1 "down" old.x = 0 old.y.orig =500 ' black old.y.3.SMA =350 ' red old.y.20.SMA =300 ' green for i =0 to 999 step 1 scan v =1.1 +sin( i /1000 *2 *3.14159265) + 0.2 *rnd( 1) ' sin wave with added random noise x =i /6.28318 *1000 y.orig =500 -v /2.5 *500 #w.gb1 "color black ; down ; line "; i-1; " "; old.y.orig; " "; i; " "; y.orig; " ; up" y.3.SMA =500 -SMA( 1, v, 3) /2.5 *500 ' SMA given ID of 1 is to do 3-term running average #w.gb1 "color red ; down ; line "; i-1; " "; old.y.3.SMA +50; " "; i; " "; y.3.SMA +50; " ; up" y.20.SMA =500 -SMA( 2, v, 20) /2.5 *500 ' SMA given ID of 2 is to do 20-term running average #w.gb1 "color green ; down ; line "; i-1; " "; old.y.20.SMA +100; " "; i; " "; y.20.SMA +100; " ; up" 'print "Supplied with "; v; ", so SMAs are now "; using( "###.###", SMA( 1, v, 3)); " over 3 terms or "; using( "###.###", SMA( 2, v, 5)) ; " over 5 terms." ' ID, latest data, period old.y.orig =y.orig old.y.3.SMA =y.3.SMA old.y.20.SMA =y.20.SMA next i wait sub quit j$ close #w end end sub function SMA( ID, Number, Period) v$( ID) =right$( " " +str$( Number), 10) +v$( ID) ' add new number at left, lose last number on right v$( ID) =left$( v$( ID), Period *10) 'print "{"; v$( ID); "}", k =0 ' number of terms read total =0 ' sum of terms read do p$ =mid$( v$( ID), 1 +k *10, 10) if p$ ="" then exit do vv =val( p$) total =total +vv k =k +1 loop until p$ ="" if k