読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

OpenSTAのTimers.csvを解析するクラス

Ruby OpenSTA

OpenSTAの「Timer List」-「Export」で出力できるTimers.csvを解析するクラスを書きました。

  • 処理時間をTimerごとに集計し、以下の値を算出します。
  • 計測期間のうち、前後の指定された期間のログをカットする機能付きです。
require 'time'

# タイマーごとの処理時間を集計する
module OpenSTA
  class TimerResult
    def initialize( file, period=20*60, cut=1*60 )
      @period = period
      @file = file
      @cut = cut
      @result = {}
      load
    end
    def each( &block )
      @result.each( &block )
    end
    def [](key)
      @result[key]
    end
    attr_reader :results
  private
    def load
      @tmp = {}
      open( @file, "r" ) {|f|
        # 最初の1行はヘッダなので無視
        f.gets
        while( line = f.gets )
          add_line( line.split(",,"))
        end
      }
      @tmp.each_pair {|k,v|
        avg = v[:sum].to_f / v[:count]
        @result[k.to_sym] = Result.new( 
          avg, v[:max], v[:min], @ative_user/avg )
      }
    end
    def add_line( values )
      @date = Time.parse( "#{values[6]} #{values[7]}" )
      @ative_user = values[4].to_i unless @ative_user
      unless @start
        @start = @date + @cut
        @end = @date + @period - @cut
      end
      return if @date < @start || @date > @end
      time = (values[5].to_f * 1000).to_i
      map = (@tmp[values[3]] ||= {:sum=>0,:max=>nil,:min=>nil,:count=>0})
      map[:count] += 1
      map[:sum] += time
      map[:max] = time if !map[:max] || map[:max] < time 
      map[:min] = time if !map[:min] || map[:min] > time
    end
  end
  Result = Struct.new(:avg,:max,:min,:tp)
end

利用例は以下。

result = OpenSTA::TimerResult.new( "Timers.csv" )
result.each {|r|
  puts "#{r[0]} : " + [
    r[1].avg, r[1].max, r[1].min, r[1].tp
  ].map{|v| sprintf("%#.03f", v) }.join(", ")
}

実行結果です。

T_LOGIN : 5.243, 30.000, 0.000, 1.907
T_LOGOUT : 44.822, 130.000, 20.000, 0.223
...