Giter Club home page Giter Club logo

Comments (6)

unageanu avatar unageanu commented on July 21, 2024

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 に渡すようにしてみてください。

from jiji2.

pdevty avatar pdevty commented on July 21, 2024

コメントありがとうございます。
教えていただいた内容を参考に以下のようなエージェント(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'

from jiji2.

unageanu avatar unageanu commented on July 21, 2024

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]

from jiji2.

pdevty avatar pdevty commented on July 21, 2024

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

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'

from jiji2.

unageanu avatar unageanu commented on July 21, 2024

失礼しました。 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?

from jiji2.

pdevty avatar pdevty commented on July 21, 2024

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

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'

from jiji2.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.