ææ°ç§»åå¹³åãç®åºãã
ææ°ç§»åå¹³åãç®åºããã©ã¤ãã©ãªã§ãã
- ã¡ãã£ã¨ãªãã¡ã¯ã¿ãã¦ã移åå¹³åãå é移åå¹³åã¨å ±éé¨åã親ã¯ã©ã¹ã«ç§»åãã¦ãã¾ãããã¡ã¤ã«ã1ã¤ã«çµ±åãã¦ãAPIãå¾®å¦ã«ä¿®æ£ãã¦ã¾ãã
- ãã¨ãå é移åå¹³åã®å éãé(å¤ããã®ãéè¦)ã ã£ãã®ãä¿®æ£ãã¦ã¾ããorz.
module Signal #===ä¸å®æéã®ã¬ã¼ããã¼ã¿ãå ã«å¤ãç®åºããã·ã°ãã«ã®åºåºã¯ã©ã¹ class RangeSignal def initialize( range=25 ) @datas = [] # ã¬ã¼ããè¨é²ãããããã¡ @range = range end def next_data( data ) # ãããã¡ã®ãã¼ã¿ãæ´æ° @datas.push data @datas.shift if @datas.length > @range # ãããã¡ãµã¤ãºãååã§ãªããã°ãnilãè¿ãã return nil if @datas.length != @range # ç®åº return calculate(@datas) end def calculate(datas) end end #===移åå¹³å class MovingAverage < RangeSignal def calculate(datas) MovingAverage.ma( datas ) end # 移åå¹³åå¤ãè¨ç®ããã def self.ma( datas ) total = datas.inject {|t,s| t += s; t } return total / datas.length end end #===å é移åå¹³å class WeightedMovingAverage < RangeSignal def calculate(datas) WeightedMovingAverage.wma( datas ) end # å é移åå¹³åå¤ãè¨ç®ããã def self.wma( datas ) weight = 1 total = datas.inject(0.0) {|t,s| t += s * weight weight += 1 t } return total / ( datas.length * (datas.length+1) /2 ) end end #===ææ°ç§»åå¹³å class ExponentialMovingAverage < RangeSignal def initialize( range=25, smoothing_coefficient=0.1 ) super(range) @sc = smoothing_coefficient end def calculate(datas) ExponentialMovingAverage.ema( datas, @sc ) end # ææ°ç§»åå¹³åå¤ãè¨ç®ããã def self.ema( datas, smoothing_coefficient ) datas[1..-1].inject( datas[0] ) {|t,s| t + smoothing_coefficient * (s - t) } end end end
移åå¹³åãå é移åå¹³åãææ°ç§»åå¹³åã®ã°ã©ãã表示ããã¨ã¼ã¸ã§ã³ãã®ãµã³ãã«ã§ãã
# # 移åå¹³åããããã試ãã¦ã¿ãã¨ã¼ã¸ã§ã³ãã®ãµã³ãã« # class MovingAveragesAgent < JIJI::PeriodicallyAgent include JIJI::Agent::Shared::Signal # ã¨ã¼ã¸ã§ã³ãã®èª¬æ def description "移åå¹³åãå é移åå¹³åãææ°ç§»åå¹³åã表示ãã" end # ã¨ã¼ã¸ã§ã³ããåæåããã def init @mvs = [ MovingAverage.new(@range), WeightedMovingAverage.new(@range), ExponentialMovingAverage.new(@range) ] @out = output.get( "移åå¹³å,å é移åå¹³å,ææ°ç§»åå¹³å", :graph, { :column_count=>3, :graph_type=>:rate, :colors=>["#8899aa","#aa8899","#99aa88"] } ) end # 次ã®ã¬ã¼ããåãåã def next_period_rates( rates ) res = @mvs.map{|mv| mv.next_data( rates[:EURJPY].bid.end ) } return if ( !res[0] || !res[1] || !res[2] ) @out.put( *res ) end # UIããè¨å®å¯è½ãªããããã£ã®ä¸è¦§ãè¿ãã def property_infos super().concat [ Property.new( "range", "éè¨æé", 25, :number ) ] end end