Class: JIJI::Dao::TradeResultDao

Inherits:
Object
  • Object
show all
Defined in:
lib/jiji/dao/trade_result_dao.rb

Overview

取引結果DAO

Defined Under Namespace

Classes: TradeAggregator

Instance Method Summary collapse

Constructor Details

#initialize(data_dir, scales = []) ⇒ TradeResultDao

Returns a new instance of TradeResultDao.



16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/jiji/dao/trade_result_dao.rb', line 16

def initialize( data_dir, scales=[] )
  @data_dir = data_dir
  @scales = scales

  aggregators = @scales.map {|s| TradeAggregator.new(s) }
  @trade_dao = dao( "trade", aggregators )

  aggregators = @scales.map {|s| LastAggregator.new(s) }
  @profit_or_loss_dao = dao( "profit_or_loss", aggregators )

  @position_dir = "#{data_dir}/positions"
  FileUtils.mkdir_p @position_dir unless File.exists? @position_dir
end

Instance Method Details

#each(scale = :raw, start_date = nil, end_date = nil, &block) ⇒ Object

指定の期間の損益データを得る。



73
74
75
76
77
# File 'lib/jiji/dao/trade_result_dao.rb', line 73

def each( scale=:raw, start_date=nil, end_date=nil, &block )
  @profit_or_loss_dao.each_data( scale, start_date, end_date ) {|row, time|
    yield row
  }
end

#flush(time) ⇒ Object

取引結果を強制的に記録する。



88
89
90
91
# File 'lib/jiji/dao/trade_result_dao.rb', line 88

def flush( time )
  # 取引結果のみ(損益データは出力しない)
  @trade_dao.flush(time)
end

#list_positions(scale, start_date = nil, end_date = nil) ⇒ Object

指定期間のトレードデータを得る。



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/jiji/dao/trade_result_dao.rb', line 51

def list_positions( scale, start_date=nil, end_date=nil )
  ids = Set.new
  @trade_dao.each_data( scale, start_date, end_date ) {|r, t|
    ids += r[0].split(" ")
  }
  
  # バッファ内に取得期間内のデータがある場合、それも追加する。
  aggregator = @trade_dao.aggregator.find {|a| a.scale == scale }
  if  aggregator  && aggregator.values
     aggregator.values.each {|v|  ids << v  }
  end
  ids.inject({}) {|r,id| 
    v = load(id)
    if ( v && !( start_date && v[:fix_date] != 0 && v[:fix_date] < start_date.to_i ) \
      && !( end_date &&  v[:date]  > end_date.to_i ))
      r[id] = v
    end
    r 
  }
end

#load(id) ⇒ Object

ポジションデータをロードする。



39
40
41
42
43
44
45
46
47
48
# File 'lib/jiji/dao/trade_result_dao.rb', line 39

def load( id )
  props = {}
  file = "#{@position_dir}/#{id}.yaml"
  if ( File.exist? file )
    FileLock.new( file ).readlock {|f|
      props = YAML.load f
    }
  end
  props
end

#next(operator, time) ⇒ Object

取引結果を記録する。



80
81
82
83
84
85
# File 'lib/jiji/dao/trade_result_dao.rb', line 80

def next( operator, time )
  @profit_or_loss_dao << BasicTimedData.new(
    [operator.profit_or_loss, operator.fixed_profit_or_loss, operator.win_rate], time)
  ids = operator.positions.map {|p| p[1].position_id }
  @trade_dao << BasicTimedData.new( [ids], time)
end

#save(position) ⇒ Object

ポジションデータを保存する



31
32
33
34
35
36
37
# File 'lib/jiji/dao/trade_result_dao.rb', line 31

def save( position )
  props = position.values
  file = "#{@position_dir}/#{position.position_id}.yaml"
  FileLock.new( file ).writelock {|f|
    f.write( YAML.dump(props) )
  }
end