Comments (6)
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.
コメントありがとうございます。
教えていただいた内容を参考に以下のようなエージェント(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.
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.
すみません変更してもダメでした
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.
失礼しました。 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.
すみませんダメでした。ちょっと他に原因ありそうなので調べてみます。
お手数おかけしました。
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)
- How does the future works? HOT 2
- Rake spec should include sample_agents/spec HOT 4
- what's the benefits using process.post_exec{...}.value? HOT 1
- Question about tradeReduced. HOT 5
- CADJPYだけエージェントが動作しない。 HOT 6
- 現在の足のN本前から(N+M)本前までの期間Mの移動平均求める方法 HOT 2
- one spec in back_test_repository_spec failed when run isolated spec. HOT 1
- Can you support an agent in simple ruby file instead of text in mongo HOT 1
- next_tickの間隔について HOT 25
- If I create buy_limit order, where can I saw it? HOT 1
- Can I specific interval for agent in live trade? HOT 1
- リアルトレードとバックテスト実施中にMongoDBのエラーが発生しました HOT 2
- 通貨違いのエージェントを複数実行させた時にそれぞれ通貨でグラフを描画することは可能でしょうか HOT 3
- 初期化処理(post_create)について HOT 4
- Herokuでデプロイ出来ない。 HOT 1
- 初期設定:証券会社の設定 でエラー HOT 2
- MARKET_IF_TOUCHED_ORDER_REJECT HOT 4
- AWSとDockerを利用したシステムのセットアップにて躓きます HOT 10
- Docker for WindowsでOANDAに接続できない HOT 2
- [include Mongoid::Document]でエラーが発生 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from jiji2.