Class: JIJI::AgentManager

Inherits:
Object
  • Object
show all
Includes:
Enumerable, AgentUtil
Defined in:
lib/jiji/agent/agent_manager.rb

Defined Under Namespace

Classes: State

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from AgentUtil

#safe

Constructor Details

#initialize(process_id, agent_registry, logger, failsafe = true) ⇒ AgentManager

コンストラクタ

process_id

プロセスID

agent_registry

エージェントレジストリ

logger

ロガー

failsafe

レートを通知した際にエージェントで発生したエラーを無視するかどうか?



25
26
27
28
29
30
31
32
33
34
# File 'lib/jiji/agent/agent_manager.rb', line 25

def initialize( process_id, agent_registry, logger, failsafe=true )
  @process_id = process_id
  @agents = {}
  @agent_registry = agent_registry
  @logger = logger
  # エージェントでエラーが発生した場合にエラーを無視し実行を継続するか
  # true の場合、ログ出力後エラーを握って処理を継続(RMTはこちらで動作する)
  # false の場合、ログ出力後エラーを再スロー(バックテストはこちらで動作する)
  @failsafe = failsafe
end

Instance Attribute Details

#agent_registryObject

Returns the value of attribute agent_registry.



131
132
133
# File 'lib/jiji/agent/agent_manager.rb', line 131

def agent_registry
  @agent_registry
end

#confObject

Returns the value of attribute conf.



134
135
136
# File 'lib/jiji/agent/agent_manager.rb', line 134

def conf
  @conf
end

#operatorObject

Returns the value of attribute operator.



133
134
135
# File 'lib/jiji/agent/agent_manager.rb', line 133

def operator
  @operator
end

#output_managerObject

Returns the value of attribute output_manager.



135
136
137
# File 'lib/jiji/agent/agent_manager.rb', line 135

def output_manager
  @output_manager
end

#trade_result_daoObject

Returns the value of attribute trade_result_dao.



132
133
134
# File 'lib/jiji/agent/agent_manager.rb', line 132

def trade_result_dao
  @trade_result_dao
end

Instance Method Details

#add(agent_id, agent, agent_name = "") ⇒ Object

エージェントを追加する



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/jiji/agent/agent_manager.rb', line 37

def add( agent_id, agent, agent_name="" )
  if @agents.key? agent_id
    raise UserError.new( JIJI::ERROR_ALREADY_EXIST, "agent is already exist. id=#{agent_id}")
  end
  output = @output_manager.create( @process_id, agent_id )
  output.agent_name = agent_name
  op = AgentOperator.new( @operator, agent_name )
  safe( conf.get( [:agent,:safe_level], 4) ){
    agent.operator = op
    agent.logger = @logger
    agent.output = output
    agent.init
  }
  @agents[agent_id] = State.new( agent, output, op, true )
end

#clearObject

エージェントをすべて破棄する



72
73
74
# File 'lib/jiji/agent/agent_manager.rb', line 72

def clear
  @agents.clear
end

#each(&block) ⇒ Object

エージェントの一覧を得る



62
63
64
# File 'lib/jiji/agent/agent_manager.rb', line 62

def each( &block )
  @agents.each( &block )
end

#flush(time) ⇒ Object

取引結果データを強制的にファイルに出力する。



126
127
128
129
# File 'lib/jiji/agent/agent_manager.rb', line 126

def flush( time )
  @trade_result_dao.flush( time )
  @operator.flush
end

#get(name) ⇒ Object

エージェントを得る



67
68
69
# File 'lib/jiji/agent/agent_manager.rb', line 67

def get( name )
  @agents[name]
end

#next_rates(rates) ⇒ Object

レートを受け取ってエージェントに通知する。



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/jiji/agent/agent_manager.rb', line 101

def next_rates( rates )
  @operator.next_rates( rates )
  @agents.each_pair {|n,a|
      a.output.time = rates.time
  }
  safe( conf.get( [:agent,:safe_level], 4) ){
    @agents.each_pair {|n,a|
      next unless a.active
      if @failsafe
        JIJI::Util.log_if_error( @logger ) {
          next unless a.active
          a.agent.next_rates( rates )
        }
      else
        JIJI::Util.log_if_error_and_throw( @logger ) {
          a.agent.next_rates( rates )
        }
      end
     }
  }
  # 取引結果の集計
  @trade_result_dao.next( operator, rates.time )
end

#off(agent_name) ⇒ Object

エージェントへのイベント通知を停止する



85
86
87
88
89
90
# File 'lib/jiji/agent/agent_manager.rb', line 85

def off( agent_name )
  unless @agents.key? agent_name
    raise UserError.new( JIJI::ERROR_NOT_FOUND, "agent not found. name=#{agent_name}")
  end
  @agents[agent_name].active = false
end

#on(agent_name) ⇒ Object

エージェントへのイベント通知を開始する



77
78
79
80
81
82
# File 'lib/jiji/agent/agent_manager.rb', line 77

def on( agent_name )
  unless @agents.key? agent_name
    raise UserError.new( JIJI::ERROR_NOT_FOUND, "agent not found. name=#{agent_name}")
  end
  @agents[agent_name].active = true
end

#on?(agent_name) ⇒ Boolean

エージェントへのイベント通知状態を取得する

Returns:

  • (Boolean)


93
94
95
96
97
98
# File 'lib/jiji/agent/agent_manager.rb', line 93

def on?( agent_name )
  unless @agents.key? agent_name
    raise UserError.new( JIJI::ERROR_NOT_FOUND, "agent not found. name=#{agent_name}")
  end
  @agents[agent_name].active
end

#remove(name) ⇒ Object

エージェントを破棄する



54
55
56
57
58
59
# File 'lib/jiji/agent/agent_manager.rb', line 54

def remove( name )
  unless @agents.key? name
    raise UserError.new( JIJI::ERROR_NOT_FOUND, "agent not found. name=#{name}")
  end
  @agents.delete name
end