iron_warbler 2.0.7.37 → 2.0.7.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7207f71989ba452eb0b9de7db2d9a66a6571112e23057a225519cbdab4fb1f79
4
- data.tar.gz: 4a2663f019822b6c6fded27cd41dcd23beb7cf12818e10d4f6057e8620449a6e
3
+ metadata.gz: c3d26b42528adce8dcac715a0dc3296c6a7dfe8aa69deae868baa38f207d9140
4
+ data.tar.gz: c947418c85ee93024ff05d64207ae159b852db6746b3104d5b14174d83dfd575
5
5
  SHA512:
6
- metadata.gz: 43c22a4d167d7b7c8095bcee5bc5280826586b2c583e92cb1353a30459ce578bfc6e603fdb008b3582f1dfadbca342dd4c866590f3a6b332f15198cd9a919818
7
- data.tar.gz: 0d5183d3b41c67afbb4dfdc3a9fade2ec65400483aacb2b71439d88f630b0e9f570755884d7d316d3feba71ad70c9d2cccd6d5c4e2b8676b028d1a0c78fa210d
6
+ metadata.gz: b5b4e030572f6781add522f5fb1b8bebdfdeffdc871153b8b408882f998de6be0069544eecfa58e14b4e8357877fd5a84ab2d153ffa8a463bda86fdab2783633
7
+ data.tar.gz: 707028e50d3b1aa4a5522765226ea09b5e5e81e397c1b1541432d46231355ab462569295d5375db958d8c41e6bf475340b073591a18b5a547a5488b0db1039b5
@@ -1,5 +1,9 @@
1
1
 
2
2
  //= require ./gameui
3
+ //= require ./stock
3
4
 
4
5
  // console.log('Loaded iron_warbler/application.js')
5
6
 
7
+ const appRouter = {
8
+ showStockPath: (symbol) => `/trading/stocks/${symbol}`,
9
+ }
@@ -0,0 +1,9 @@
1
+
2
+ $(document).ready(() => {
3
+
4
+ $('select[name="stock_selector"]').on('change', (ev) => {
5
+ // logg(ev, 'ev')
6
+ window.location = appRouter.showStockPath(ev.target.value)
7
+ })
8
+
9
+ })
@@ -1,4 +1,7 @@
1
1
 
2
+ ##
3
+ ## https://www.macrotrends.net/stocks/charts/META/meta-platforms/stock-price-history
4
+ ##
2
5
  class Iro::StocksController < Iro::ApplicationController
3
6
  before_action :set_stock, only: [:show, :edit, :update, :destroy]
4
7
 
@@ -57,6 +60,9 @@ class Iro::StocksController < Iro::ApplicationController
57
60
  @priceitems = ::Iro::Priceitem.where({
58
61
  ticker: @stock.ticker,
59
62
  })
63
+ @datapoints = Iro::Datapoint.where({
64
+ symbol: @stock.ticker,
65
+ }).order_by({ date: :desc }).limit(100)
60
66
 
61
67
  respond_to do |format|
62
68
  format.html
@@ -84,7 +90,12 @@ class Iro::StocksController < Iro::ApplicationController
84
90
  private
85
91
 
86
92
  def set_stock
87
- @stock = Iro::Stock.find(params[:id])
93
+ begin
94
+ @stock = Iro::Stock.find(params[:id])
95
+ rescue Mongoid::Errors::DocumentNotFound => e
96
+ @stock = Iro::Stock.find_by ticker: params[:id]
97
+ end
98
+ @stocks_list = Iro::Stock.tickers_list
88
99
  end
89
100
 
90
101
  def stock_params
@@ -1,5 +1,8 @@
1
1
 
2
-
2
+ ##
3
+ ## Datapoints are at most daily!
4
+ ## See Priceitem for intra-day data
5
+ ##
3
6
  class Iro::Datapoint
4
7
  include Mongoid::Document
5
8
  include Mongoid::Timestamps
@@ -31,25 +34,23 @@ class Iro::Datapoint
31
34
  SYMBOL_T20YR = 'T20YR'
32
35
  SYMBOL_T30YR = 'T30YR'
33
36
 
34
- field :date, type: Date ## @obsolete, use quote_at
37
+ field :date, type: Date
35
38
  index({ kind: -1, date: -1 })
39
+ validates :date, uniqueness: { scope: [ :symbol ] }
36
40
 
37
41
  field :quote_at, type: DateTime
38
42
  index({ kind: -1, quote_at: -1 })
39
- validates :quote_at, uniqueness: { scope: [ :kind, :symbol ] }
43
+ validates :quote_at, uniqueness: { scope: [ :kind, :symbol ] } ## scope-by-kind is unnecessary here? _vp_ 2024-08-08
40
44
 
41
45
  field :open, type: Float
42
46
  field :high, type: Float
43
47
  field :low, type: Float
48
+ def close; value; end
49
+ def close= a; value= a; end
44
50
 
45
51
  field :value, type: Float
46
52
  validates :value, presence: true
47
- def close
48
- value
49
- end
50
- def close= a
51
- value= a
52
- end
53
+
53
54
 
54
55
  field :volume, type: Integer
55
56
 
@@ -156,7 +157,7 @@ class Iro::Datapoint
156
157
  csv = CSV.read(path, headers: true)
157
158
  csv.each do |row|
158
159
  flag = create({
159
- kind: KIND_STOCK,
160
+ kind: KIND_STOCK,
160
161
  symbol: symbol,
161
162
  date: row['Date'],
162
163
  quote_at: row['Date'],
@@ -168,7 +169,11 @@ class Iro::Datapoint
168
169
  low: row['Low'],
169
170
  value: row['Close'],
170
171
  })
171
- print '.' if flag.persisted?
172
+ if flag.persisted?
173
+ print '^'
174
+ else
175
+ puts flag.errors.messages
176
+ end
172
177
  end
173
178
  puts 'ok'
174
179
  end
@@ -1,6 +1,7 @@
1
1
 
2
2
  ##
3
- ## specifically Option or Stock priceitem?
3
+ ## Specifically Option or Stock priceitem?
4
+ ## Priceitems are intra-day! See Datapoint for daily data
4
5
  ##
5
6
  class Iro::Priceitem
6
7
  include Mongoid::Document
@@ -8,7 +9,7 @@ class Iro::Priceitem
8
9
  store_in collection: 'iro_price_items'
9
10
 
10
11
  ## PUT, CALL, STOCK
11
- field :putCall, type: String
12
+ field :putCall, type: String ## kind
12
13
  field :symbol, type: String
13
14
  field :ticker, type: String
14
15
  # belongs_to :stock, inverse_of: :priceitems
@@ -24,6 +25,7 @@ class Iro::Priceitem
24
25
  field :highPrice, type: Float
25
26
  field :closePrice, type: Float
26
27
 
28
+ field :quote_at, type: DateTime
27
29
  field :quoteTimeInLong, type: Integer
28
30
  field :timestamp, type: Integer
29
31
  field :totalVolume, type: Integer
@@ -1,6 +1,9 @@
1
1
  include Math
2
2
  require 'business_time'
3
3
 
4
+ ##
5
+ ## https://www.macrotrends.net/stocks/charts/META/meta-platforms/stock-price-history
6
+ ##
4
7
  class Iro::Stock
5
8
  include Mongoid::Document
6
9
  include Mongoid::Timestamps
@@ -18,6 +21,8 @@ class Iro::Stock
18
21
  field :ticker
19
22
  validates :ticker, uniqueness: true, presence: true
20
23
  index({ ticker: -1 }, { unique: true })
24
+ def symbol; ticker; end
25
+ def symbol= a; ticker = a; end
21
26
 
22
27
  field :last, type: :float
23
28
  field :options_price_increment, type: :float
@@ -30,6 +35,8 @@ class Iro::Stock
30
35
  has_many :options, class_name: 'Iro::Option', inverse_of: :stock
31
36
  has_many :priceitems, inverse_of: :stock
32
37
 
38
+ default_scope { order_by({ ticker: :asc }) }
39
+
33
40
  ## my_find
34
41
  def self.f ticker
35
42
  self.find_by ticker: ticker
@@ -55,7 +62,14 @@ class Iro::Stock
55
62
  stock.volatility_from_yr
56
63
 
57
64
  =end
58
- def volatility duration:
65
+ field :volatility, type: :float
66
+ def volatility duration: 1.year, recompute: false
67
+ if self[:volatility]
68
+ if !recompute
69
+ return self[:volatility]
70
+ end
71
+ end
72
+
59
73
  stock = self
60
74
  begin_on = Time.now - duration - 1.day
61
75
  points = Iro::Datapoint.where( kind: 'STOCK', symbol: stock.ticker,
@@ -86,6 +100,7 @@ class Iro::Stock
86
100
  adjustment = 2.0
87
101
  out = out * adjustment
88
102
  puts! out, 'volatility (adjusted)'
103
+ self.update volatility: out
89
104
  return out
90
105
  end
91
106
 
@@ -9,17 +9,20 @@
9
9
  %td Ticker
10
10
  %td last price
11
11
  %td n priceitems
12
+ %td volatility
12
13
  %tbody
13
14
  - @stocks.each do |stock|
14
15
  %tr
15
16
  %td
16
17
  = link_to '[~]', edit_stock_path(stock)
17
18
  = link_to '[api]', stock_path(stock, format: :json)
18
- <b>#{stock.ticker}</b>
19
+ <b>#{link_to stock.ticker, stock_path(stock)}</b>
19
20
  %td
20
21
  #{pp_amount stock.last}
21
22
  %td
22
23
  = stock.priceitems.length
24
+ %td
25
+ = stock.volatility rescue nil
23
26
 
24
27
  %hr
25
28
  = render 'iro/stocks/form', stock: Iro::Stock.new
@@ -1,5 +1,27 @@
1
1
 
2
2
  .stocks-show.maxwidth
3
- %h4= @stock
3
+ .header
4
+ %h3.title
5
+ = select_tag :stock_selector, options_for_select( @stocks_list, selected: @stock.ticker ), class: 'select2'
4
6
 
5
- %h5 Max Pain
7
+ .row
8
+ .col-md-3
9
+ %h4 Datapoints
10
+ %table.bordered
11
+ %thead
12
+ %td Date
13
+ %td Value
14
+ %tbody
15
+ - @datapoints.each do |pt|
16
+ %tr
17
+ %td= pt.date
18
+ %td= pt.value
19
+
20
+
21
+ .col-md-9
22
+ %ul
23
+ %li
24
+ %b 1 yr volatility <br />
25
+ = @stock.volatility
26
+
27
+ %h4 Max Pain
@@ -38,6 +38,21 @@ namespace :iro do
38
38
  print '^'
39
39
  end
40
40
 
41
+ ## Expected headers: Date, Open, High, Low, Close
42
+ desc 'import_stock stock=<stock> path=<path>'
43
+ task :import_stock => :environment do
44
+ # puts! ARGV, 'ARGV'
45
+ # puts! ENV, 'ENV'
46
+ if ARGV.length != 3
47
+ puts! ''
48
+ puts! "Usage: import_stock <stock> <path>"
49
+ puts! 'Expected headers: Date, Open, High, Low, Close'
50
+ puts! ''
51
+ exit 0
52
+ end
53
+ Iro::Datapoint.import_stock symbol: ENV['stock'], path: ENV['path']
54
+ end
55
+
41
56
  desc 'import historic treasuries'
42
57
  task :import_1990_2023_treasuries => :environment do
43
58
  ::Iro::Iro.import_1990_2023_treasuries
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iron_warbler
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.7.37
4
+ version: 2.0.7.38
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Pudeyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-31 00:00:00.000000000 Z
11
+ date: 2024-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: business_time
@@ -217,6 +217,7 @@ files:
217
217
  - app/assets/config/iron_warbler_manifest.js
218
218
  - app/assets/javascript/iron_warbler/application.js
219
219
  - app/assets/javascript/iron_warbler/gameui.js
220
+ - app/assets/javascript/iron_warbler/stock.js
220
221
  - app/assets/stylesheets/iron_warbler/Card.scss
221
222
  - app/assets/stylesheets/iron_warbler/alerts.scss
222
223
  - app/assets/stylesheets/iron_warbler/application.css