Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

4本値の取得方法 #309

Open
pdevty opened this issue Jul 6, 2017 · 6 comments
Open

4本値の取得方法 #309

pdevty opened this issue Jul 6, 2017 · 6 comments

Comments

@pdevty
Copy link

pdevty commented Jul 6, 2017

素晴らしいツールありがとうございます。
サンプルの移動平均エージェントをRSIやmacdに書き換えて試させていただいています。
同じ要領でdmiを試そうとしたのですが、
def next_tick(tick)のtickには4本値が渡って来ないようでうまくいきません。
4本値はどのように取得すべきでしょうか?

@unageanu
Copy link
Owner

unageanu commented Jul 6, 2017

4本値は next_tick(tick) 内で自前で集計する必要があります。以下、サンプルです。

@values = {}
current = tick[:USDJPY].bid
@values[:close] = current
@values[:open]  = current unless @values[:open]
@values[:high]  = current if @values[:high] < current
@values[:low]   = current if @values[:low] > current

これを任意の期間ごとに集計して、 順次 dmi に渡すようにしてみてください。

@pdevty
Copy link
Author

pdevty commented Jul 6, 2017

コメントありがとうございます。
教えていただいた内容を参考に以下のようなエージェント(dmi_agent.rb)を作成し、
テスト期間一週間、レート間隔15秒、通貨ペアUSDJPYでバックテストを行うとエラーに。
rubyよくわかってないのですが、アドバイスいただけたらありがたいです。

require 'jiji/model/agents/agent'

class DmiAgent

  include Jiji::Model::Agents::Agent

  def self.description
    <<-STR
DMIを使うエージェントです。
 -ゴールデンクロスで買い&売り建て玉をコミット。
 -デッドクロスで売り&買い建て玉をコミット。
      STR
  end

  # UIから設定可能なプロパティの一覧
  def self.property_infos
    [
      Property.new('range', '集計期間', 14),
      Property.new('interval', '集計間隔', 240) # 1時間
    ]
  end

  def post_create
    # DMIの算出クラス
    # 共有ライブラリのクラスを利用。
    @dmi=Signals::DMI.new(@range.to_i)
    @data=Data.new(@interval.to_i)
    @cross = Cross.new

    # DMIグラフ
    @graph_dmi = graph_factory.create('DMI',
      :line, :average, ['#FFCC33','#FF6633','#666699'])
  end

  # 次のレートを受け取る
  def next_tick(tick)
    # DMIを計算
    data = @data.next_data(tick[:USDJPY].bid)
    return unless data 
    values = {open: data.first,close: data.last, high: data.max, low: data.min}
    logger.debug values
    dmi = @dmi.next_data(values)
    return unless dmi
    logger.debug dmi
    # グラフに出力
    @graph_dmi << [dmi[:pdi],dmi[:mdi],dmi[:dx]]
    # ゴールデンクロス/デッドクロスを判定
    @cross.next_data(dmi[:pdi],dmi[:mdi])

    do_trade(dmi[:dx])
  end

  def do_trade(dx)
    if @cross.cross_up?
      # ゴールデンクロス
      # 売り建玉があれば全て決済
      close_exist_positions(:sell)
      # 新規に買い
      broker.buy(:USDJPY, 1)
    elsif @cross.cross_down?
      # デッドクロス
      # 買い建玉があれば全て決済
      close_exist_positions(:buy)
      # 新規に売り
      broker.sell(:USDJPY, 1)
    end
  end

  def close_exist_positions(sell_or_buy)
    @broker.positions.each do |p|
      p.close if p.sell_or_buy == sell_or_buy
    end
  end

  # エージェントの状態を返却
  def state
    {
      dmi: @dmi.state
    }
  end

  # 永続化された状態から元の状態を復元する
  def restore_state(state)
    return unless state[:dmi]
    @dmi.restore_state(state[:dmi])
  end

end

class Data < Signals::RangeSignal

  def calculate(data) #:nodoc:
    data
  end

end

ログ内容

D, [2017-07-06T14:58:02.938973 #1] DEBUG -- : {:open=>112.157, :close=>112.159, :high=>112.179, :low=>112.115}

D, [2017-07-06T14:58:02.939202 #1] DEBUG -- : {:pdi=>0.0, :mdi=>0.0, :dx=>NaN, :adx=>NaN}

E, [2017-07-06T14:58:02.939578 #1] ERROR -- : NaN (FloatDomainError)
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:43:in `to_r'
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:43:in `+'
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:43:in `update_context'
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:24:in `block in merge'
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:22:in `each'
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:22:in `each_with_index'
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:22:in `merge'
/app/jiji2/src/jiji/model/graphing/internal/graph_data_saver.rb:47:in `updata'
/app/jiji2/src/jiji/model/graphing/internal/graph_data_saver.rb:20:in `save_data_if_required'
/app/jiji2/src/jiji/model/graphing/graph.rb:79:in `block in save_data'
/app/jiji2/src/jiji/model/graphing/graph.rb:78:in `each'
/app/jiji2/src/jiji/model/graphing/graph.rb:78:in `save_data'
/app/jiji2/src/jiji/model/graphing/graph_factory.rb:40:in `block in save_data'
/app/jiji2/src/jiji/model/graphing/graph_factory.rb:39:in `each'
/app/jiji2/src/jiji/model/graphing/graph_factory.rb:39:in `save_data'
/app/jiji2/src/jiji/model/trading/jobs/notify_next_tick_job.rb:53:in `save_graph_data'
/app/jiji2/src/jiji/model/trading/jobs/notify_next_tick_job.rb:88:in `after_do_next'
/app/jiji2/src/jiji/model/trading/jobs/notify_next_tick_job.rb:18:in `exec'
/app/jiji2/src/jiji/model/trading/jobs/notify_next_tick_job.rb:74:in `exec'
/app/jiji2/src/jiji/model/trading/process.rb:37:in `do_next_job'
/app/jiji2/src/jiji/model/trading/process.rb:30:in `run'
/app/jiji2/src/jiji/model/trading/process.rb:24:in `block in start'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:67:in `call'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:67:in `execute'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:405:in `block (2 levels) in spawn_thread'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:372:in `loop'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:372:in `block in spawn_thread'

@unageanu
Copy link
Owner

unageanu commented Jul 6, 2017

dx の値が nil になっているのが原因のようです。

@graph_dmi << [dmi[:pdi],dmi[:mdi],dmi[:dx]]

を、以下のように変更して試してみてください。

@graph_dmi << [dmi[:pdi],dmi[:mdi],dmi[:dx]] if dmi[:dx] && dmi[:pdi] && dmi[:mdi]

@pdevty
Copy link
Author

pdevty commented Jul 6, 2017

すみません変更してもダメでした

D, [2017-07-06T21:09:49.220361 #1] DEBUG -- : {:open=>112.157, :close=>112.159, :high=>112.179, :low=>112.115}

D, [2017-07-06T21:09:49.220543 #1] DEBUG -- : {:pdi=>0.0, :mdi=>0.0, :dx=>NaN, :adx=>NaN}

E, [2017-07-06T21:09:49.220861 #1] ERROR -- : NaN (FloatDomainError)
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:43:in `to_r'
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:43:in `+'
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:43:in `update_context'
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:24:in `block in merge'
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:22:in `each'
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:22:in `each_with_index'
/app/jiji2/src/jiji/model/graphing/internal/aggregation_strategies.rb:22:in `merge'
/app/jiji2/src/jiji/model/graphing/internal/graph_data_saver.rb:47:in `updata'
/app/jiji2/src/jiji/model/graphing/internal/graph_data_saver.rb:20:in `save_data_if_required'
/app/jiji2/src/jiji/model/graphing/graph.rb:79:in `block in save_data'
/app/jiji2/src/jiji/model/graphing/graph.rb:78:in `each'
/app/jiji2/src/jiji/model/graphing/graph.rb:78:in `save_data'
/app/jiji2/src/jiji/model/graphing/graph_factory.rb:40:in `block in save_data'
/app/jiji2/src/jiji/model/graphing/graph_factory.rb:39:in `each'
/app/jiji2/src/jiji/model/graphing/graph_factory.rb:39:in `save_data'
/app/jiji2/src/jiji/model/trading/jobs/notify_next_tick_job.rb:53:in `save_graph_data'
/app/jiji2/src/jiji/model/trading/jobs/notify_next_tick_job.rb:88:in `after_do_next'
/app/jiji2/src/jiji/model/trading/jobs/notify_next_tick_job.rb:18:in `exec'
/app/jiji2/src/jiji/model/trading/jobs/notify_next_tick_job.rb:74:in `exec'
/app/jiji2/src/jiji/model/trading/process.rb:37:in `do_next_job'
/app/jiji2/src/jiji/model/trading/process.rb:30:in `run'
/app/jiji2/src/jiji/model/trading/process.rb:24:in `block in start'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:67:in `call'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:67:in `execute'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:405:in `block (2 levels) in spawn_thread'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:372:in `loop'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:372:in `block in spawn_thread'

@unageanu
Copy link
Owner

unageanu commented Jul 6, 2017

失礼しました。 nil ではなく NaN ですね。
NaN チェックも追加してみてください。

@graph_dmi << [dmi[:pdi],dmi[:mdi],dmi[:dx]] if dmi[:dx] && dmi[:pdi] && dmi[:mdi] && !dmi[:dx].nan? && !dmi[:pdi].nan? && !dmi[:mdi].nan?

@pdevty
Copy link
Author

pdevty commented Jul 6, 2017

すみませんダメでした。ちょっと他に原因ありそうなので調べてみます。
お手数おかけしました。

D, [2017-07-06T23:33:44.976815 #1] DEBUG -- : {:open=>112.362, :close=>112.362, :high=>112.362, :low=>112.362}

D, [2017-07-06T23:33:44.977033 #1] DEBUG -- : {:pdi=>NaN, :mdi=>NaN, :dx=>NaN, :adx=>NaN}

E, [2017-07-06T23:33:44.977235 #1] ERROR -- : undefined method `>' for nil:NilClass (NoMethodError)
/app/jiji2/src/jiji/model/agents/builtin_files/cross.rb:79:in `calculate_state'
/app/jiji2/src/jiji/model/agents/builtin_files/cross.rb:41:in `next_data'
agent/dmi_agent.rb:55:in `next_tick'
/app/jiji2/src/jiji/model/agents/agents.rb:35:in `block in next_tick'
/app/jiji2/src/jiji/model/agents/agents.rb:33:in `each'
/app/jiji2/src/jiji/model/agents/agents.rb:33:in `next_tick'
/app/jiji2/src/jiji/model/trading/jobs/notify_next_tick_job.rb:17:in `exec'
/app/jiji2/src/jiji/model/trading/jobs/notify_next_tick_job.rb:74:in `exec'
/app/jiji2/src/jiji/model/trading/process.rb:37:in `do_next_job'
/app/jiji2/src/jiji/model/trading/process.rb:30:in `run'
/app/jiji2/src/jiji/model/trading/process.rb:24:in `block in start'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:67:in `call'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:67:in `execute'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:405:in `block (2 levels) in spawn_thread'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:372:in `loop'
/usr/local/bundle/gems/thread-0.2.2/lib/thread/pool.rb:372:in `block in spawn_thread'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants