iron_warbler 2.0.7.26 → 2.0.7.27

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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/iron_warbler/purses.scss +31 -0
  3. data/app/assets/stylesheets/iron_warbler/utils.scss +28 -3
  4. data/app/controllers/iro/api/stocks_controller.rb +7 -4
  5. data/app/controllers/iro/positions_controller.rb +27 -21
  6. data/app/controllers/iro/stocks_controller.rb +19 -0
  7. data/app/models/iro/datapoint.rb +1 -1
  8. data/app/models/iro/option.rb +23 -11
  9. data/app/models/iro/position.rb +51 -53
  10. data/app/models/iro/{price_item.rb → priceitem.rb} +5 -1
  11. data/app/models/iro/purse.rb +9 -2
  12. data/app/models/iro/stock.rb +2 -0
  13. data/app/models/iro/strategy.rb +87 -50
  14. data/app/models/tda/option.rb +1 -1
  15. data/app/models/tda/stock.rb +1 -1
  16. data/app/views/iro/_main_header.haml +4 -3
  17. data/app/views/iro/api/stocks/index.json.jbuilder +5 -0
  18. data/app/views/iro/api/stocks/show.json.jbuilder +11 -0
  19. data/app/views/iro/api/stocks/show.json.jbuilder-bk +12 -0
  20. data/app/views/iro/positions/_form.haml +4 -2
  21. data/app/views/iro/positions/_gameui_short_credit_call_spread.haml +38 -0
  22. data/app/views/iro/positions/_header_short_credit_call_spread.haml +50 -0
  23. data/app/views/iro/positions/_new.haml +23 -0
  24. data/app/views/iro/positions/_prepare_short_credit_call_spread.haml +1 -0
  25. data/app/views/iro/purses/_form_extra_fields.haml +18 -22
  26. data/app/views/iro/purses/_header.haml +8 -17
  27. data/app/views/iro/purses/show.haml +3 -2
  28. data/app/views/iro/stocks/_form.haml +4 -3
  29. data/app/views/iro/stocks/edit.haml +4 -0
  30. data/app/views/iro/stocks/index.haml +21 -6
  31. data/app/views/iro/strategies/_form.haml +14 -11
  32. data/app/views/iro/strategies/_show.haml +1 -1
  33. data/config/routes.rb +2 -1
  34. data/lib/iro/engine.rb +1 -0
  35. data/lib/iron_warbler.rb +0 -2
  36. data/lib/tasks/iro_tasks.rake +2 -2
  37. metadata +12 -4
  38. data/app/views/iro/api/stocks/show.jbuilder +0 -11
@@ -8,56 +8,74 @@ class Iro::Strategy
8
8
  field :slug
9
9
  validates :slug, presence: true, uniqueness: true
10
10
 
11
- LONG = 'is_long'
11
+ field :description
12
+
13
+ LONG = 'is_long'
12
14
  SHORT = 'is_short'
13
15
  field :long_or_short, type: :string
14
16
  validates :long_or_short, presence: true
15
17
 
16
- field :description
17
-
18
- has_many :positions, class_name: 'Iro::Position', inverse_of: :strategy
19
18
 
19
+ has_many :positions, class_name: 'Iro::Position', inverse_of: :strategy
20
+ has_one :next_position, class_name: 'Iro::Position', inverse_of: :next_strategy
20
21
  belongs_to :stock, class_name: 'Iro::Stock', inverse_of: :strategies
21
22
  has_and_belongs_to_many :purses, class_name: 'Iro::Purse', inverse_of: :strategies
22
23
 
23
- KIND_COVERED_CALL = 'covered_call'
24
- KIND_LONG_DEBIT_CALL_SPREAD = 'long_debit_call_spread'
25
- KIND_SHORT_DEBIT_PUT_SPREAD = 'short_debit_put_spread'
24
+ KIND_COVERED_CALL = 'covered_call'
25
+ KIND_IRON_CONDOR = 'iron_condor'
26
+ KIND_LONG_CREDIT_PUT_SPREAD = 'long_credit_put_spread'
27
+ KIND_LONG_DEBIT_CALL_SPREAD = 'long_debit_call_spread'
28
+ KIND_SHORT_CREDIT_CALL_SPREAD = 'short_credit_call_spread'
29
+ KIND_SHORT_DEBIT_PUT_SPREAD = 'short_debit_put_spread'
26
30
  KINDS = [ nil,
27
31
  KIND_COVERED_CALL,
32
+ KIND_IRON_CONDOR,
33
+ KIND_LONG_CREDIT_PUT_SPREAD,
28
34
  KIND_LONG_DEBIT_CALL_SPREAD,
35
+ KIND_SHORT_CREDIT_CALL_SPREAD,
29
36
  KIND_SHORT_DEBIT_PUT_SPREAD,
30
37
  ]
31
38
  field :kind
32
39
 
33
- def kind_short
40
+ def put_call
34
41
  case kind
35
- when KIND_COVERED_CALL
36
- 'cc'
37
- when KIND_LONG_DEBIT_CALL_SPREAD
38
- 'long-spread'
39
- when KIND_SHORT_DEBIT_PUT_SPREAD
40
- 'short-spread'
41
- else
42
- '@TODO-zez'
42
+ when Iro::Strategy::KIND_LONG_DEBIT_CALL_SPREAD
43
+ put_call = 'CALL'
44
+ when Iro::Strategy::KIND_SHORT_CREDIT_CALL_SPREAD
45
+ put_call = 'CALL'
46
+ when Iro::Strategy::KIND_SHORT_DEBIT_PUT_SPREAD
47
+ put_call = 'PUT'
48
+ when Iro::Strategy::KIND_COVERED_CALL
49
+ put_call = 'CALL'
43
50
  end
44
51
  end
45
52
 
46
- field :buffer_above_water, type: :float
47
- field :threshold_delta, type: :float
48
- field :threshold_netp, type: :float
49
- field :min_dte, type: :integer, default: 0
53
+ field :threshold_buffer_above_water, type: :float
54
+ field :threshold_delta, type: :float
55
+ field :threshold_netp, type: :float
56
+ field :threshold_dte, type: :integer, default: 1
50
57
 
51
- field :next_inner_delta, type: :float
52
- field :next_outer_delta, type: :float
53
- field :next_inner_strike, type: :float
54
- field :next_outer_strike, type: :float
55
- field :next_spread_amount, type: :float # e.g. $20 for a $2000 NVDA spread
58
+ field :next_inner_delta, type: :float
59
+ field :next_inner_strike, type: :float
60
+ field :next_outer_delta, type: :float
61
+ field :next_outer_strike, type: :float
62
+ field :next_spread_amount, type: :float # e.g. $20 for a $2000 NVDA spread
56
63
  field :next_buffer_above_water, type: :float
57
64
 
58
- def self.for_ticker ticker
59
- where( ticker: ticker )
65
+
66
+
67
+
68
+
69
+
70
+ def begin_delta_covered_call p
71
+ p.inner.begin_delta
60
72
  end
73
+ def begin_delta_long_debit_call_spread p
74
+ p.outer.begin_delta - p.inner.begin_delta
75
+ end
76
+ alias_method :begin_delta_short_debit_put_spread, :begin_delta_long_debit_call_spread
77
+ alias_method :begin_delta_short_credit_call_spread, :begin_delta_long_debit_call_spread
78
+
61
79
 
62
80
  def breakeven_covered_call p
63
81
  p.inner.strike + p.inner.begin_price
@@ -67,27 +85,32 @@ class Iro::Strategy
67
85
  end
68
86
  alias_method :breakeven_short_debit_put_spread, :breakeven_long_debit_call_spread
69
87
 
88
+
89
+ def end_delta_covered_call p
90
+ p.inner.end_delta
91
+ end
92
+ def end_delta_long_debit_call_spread p
93
+ p.outer.end_delta - p.inner.end_delta
94
+ end
95
+ alias_method :end_delta_short_debit_put_spread, :end_delta_long_debit_call_spread
96
+ alias_method :end_delta_short_credit_call_spread, :end_delta_long_debit_call_spread
97
+
98
+
70
99
  def max_gain_covered_call p
71
100
  p.inner.begin_price * 100 - 0.66 # @TODO: is this *100 really?
72
101
  end
73
102
  def max_gain_long_debit_call_spread p
74
- ## 100 * disalloed for gameui
103
+ ## 100 * disallowed for gameui
75
104
  ( p.inner.strike - p.outer.strike - p.outer.begin_price + p.inner.begin_price ) # - 2*0.66
76
105
  end
106
+ def max_gain_short_credit_call_spread p
107
+ p.inner.begin_price - p.outer.begin_price
108
+ end
77
109
  def max_gain_short_debit_put_spread p
78
- ## 100 * disalloed for gameui
110
+ ## 100 * disallowed for gameui
79
111
  ( p.outer.strike - p.inner.strike - p.outer.begin_price + p.inner.begin_price ) # - 2*0.66
80
112
  end
81
113
 
82
- def net_amount_covered_call p
83
- ( p.inner.begin_price - p.inner.end_price )
84
- end
85
- def net_amount_long_debit_call_spread p
86
- outer = p.outer.end_price - p.outer.begin_price
87
- inner = p.inner.begin_price - p.inner.end_price
88
- out = ( outer + inner )
89
- end
90
- alias_method :net_amount_short_debit_put_spread, :net_amount_long_debit_call_spread
91
114
 
92
115
  def max_loss_covered_call p
93
116
  p.inner.begin_price*10 # just suppose 10,000%
@@ -98,22 +121,31 @@ class Iro::Strategy
98
121
  def max_loss_short_debit_put_spread p # different
99
122
  out = p.inner.strike - p.outer.strike
100
123
  end
124
+ def max_loss_short_credit_call_spread p
125
+ out = p.outer.strike - p.inner.strike
126
+ end
101
127
 
102
- def begin_delta_covered_call p
103
- p.inner.begin_delta
128
+
129
+ def net_amount_covered_call p
130
+ ( p.inner.begin_price - p.inner.end_price )
104
131
  end
105
- def begin_delta_long_debit_call_spread p
106
- p.outer.begin_delta - p.inner.begin_delta
132
+ def net_amount_long_debit_call_spread p
133
+ outer = p.outer.end_price - p.outer.begin_price
134
+ inner = p.inner.begin_price - p.inner.end_price
135
+ out = ( outer + inner )
107
136
  end
108
- alias_method :begin_delta_short_debit_put_spread, :begin_delta_long_debit_call_spread
137
+ alias_method :net_amount_short_credit_call_spread , :net_amount_long_debit_call_spread
138
+ alias_method :net_amount_short_debit_put_spread, :net_amount_long_debit_call_spread
109
139
 
110
- def end_delta_covered_call p
111
- p.inner.end_delta
112
- end
113
- def end_delta_long_debit_call_spread p
114
- p.outer.end_delta - p.inner.end_delta
140
+
141
+ ## 2024-05-09 @TODO
142
+ def next_inner_strike_on expires_on
143
+ outs = Tda::Option.get_quotes({
144
+ contractType: put_call,
145
+ expirationDate: expires_on,
146
+ ticker: stock.ticker,
147
+ })
115
148
  end
116
- alias_method :end_delta_short_debit_put_spread, :end_delta_long_debit_call_spread
117
149
 
118
150
 
119
151
 
@@ -196,10 +228,15 @@ class Iro::Strategy
196
228
  end
197
229
 
198
230
 
231
+ ## scopes
232
+
233
+ def self.for_ticker ticker
234
+ where( ticker: ticker )
235
+ end
199
236
 
200
237
 
201
238
  def to_s
202
- "#{stock} #{kind_short} #{slug}"
239
+ slug
203
240
  end
204
241
  def self.list long_or_short = nil
205
242
  these = long_or_short ? where( long_or_short: long_or_short ) : all
@@ -68,7 +68,7 @@ class Tda::Option
68
68
  ## 2023-02-06 _vp_ :: Continue.
69
69
  ##
70
70
  def self.get_quotes params
71
- # puts! params, 'Tda::Option#get_quotes'
71
+ puts! params, 'Tda::Option#get_quotes'
72
72
  opts = {}
73
73
 
74
74
  #
@@ -24,7 +24,7 @@ class Tda::Stock
24
24
  end
25
25
  outs = []
26
26
  inns.each do |symbol, obj|
27
- outs.push ::Iro::PriceItem.create!({
27
+ outs.push ::Iro::Priceitem.create!({
28
28
  putCall: 'STOCK',
29
29
  symbol: symbol,
30
30
  ticker: symbol,
@@ -4,9 +4,9 @@
4
4
 
5
5
  %i.fa.fa-compress.collapse-expand#collapseHeaderTrading
6
6
  Wco Trading
7
- .a
8
- .d-flex
9
- %ul{ style: "margin-top: 2em;" }
7
+ .W
8
+ .d-flex.flex-wrap
9
+ %ul
10
10
  %li
11
11
  = link_to "Stocks (#{Iro::Stock.all.length})", stocks_path
12
12
  = link_to '[sync]', sync_stocks_path
@@ -26,6 +26,7 @@
26
26
  %li
27
27
  = link_to p, purse_path(p)
28
28
  = link_to '[ui]', purse_gameui_path(p)
29
+
29
30
  .a
30
31
  = link_to 'Strategies', strategies_path
31
32
  %ul
@@ -0,0 +1,5 @@
1
+
2
+ json.stocks @stocks do |stock|
3
+ json.status stock.status
4
+ json.ticker stock.ticker
5
+ end
@@ -0,0 +1,11 @@
1
+
2
+ json.ticker @stock.ticker
3
+ json.last @stock.last
4
+
5
+ json.datapoints @datapoints do |p|
6
+ json.quote_at Time.at(p.quote_at).strftime('%Y-%m-%d')
7
+ # json.timestamp p.timestamp
8
+ json.value p.value
9
+ end
10
+
11
+
@@ -0,0 +1,12 @@
1
+
2
+ json.priceitems do
3
+ json.array! @datapoints do |p|
4
+ json.date p[:quote_at].in_time_zone('UTC').to_date
5
+ json.quote_at p[:quote_at]
6
+ json.open p[:open]
7
+ json.high p[:high]
8
+ json.low p[:low]
9
+ json.close p[:value]
10
+ json.volume p[:volume]
11
+ end
12
+ end
@@ -1,5 +1,7 @@
1
1
 
2
- .positions--form{ class: params[:long_or_short] || position.strategy&.long_or_short }
2
+ - long_or_short = position.long_or_short || position.strategy&.long_or_short || params[:long_or_short]
3
+
4
+ .positions--form{ class: params[:long_or_short] || long_or_short }
3
5
  = form_for position do |f|
4
6
  .actions
5
7
  = f.submit
@@ -18,7 +20,7 @@
18
20
 
19
21
  .field
20
22
  %label long or short?
21
- = f.select :long_or_short, options_for_select([nil, Iro::Strategy::LONG, Iro::Strategy::SHORT], selected: position.long_or_short || params[:long_or_short] )
23
+ = f.select :long_or_short, options_for_select([nil, Iro::Strategy::LONG, Iro::Strategy::SHORT], selected: long_or_short )
22
24
 
23
25
  %label Strategy
24
26
  = f.select :strategy_id, options_for_select( @strategies_list, selected: position.strategy_id )
@@ -0,0 +1,38 @@
1
+
2
+ - pos = position
3
+ - stock = pos.stock
4
+ - nearest_strike = stock.last.round
5
+ - u = pos.purse.unit # pixels per dollar
6
+
7
+ .collapse-expand.d-flex{ id: "gameui-pos-#{pos.id}" }
8
+ [<>]
9
+ .maxwidth= render "/iro/positions/header", pos: pos
10
+ .a
11
+ = render "/iro/positions/header_#{pos.strategy.kind}", pos: pos
12
+ .StockCoordinatesW
13
+ .StockCoordinates{ style: "height: #{pos.q() *pos.purse.height}px " }
14
+ .grid= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock, position: pos
15
+
16
+ .Origin{ style: "left: #{ ( nearest_strike - stock.last )* u}px" }
17
+ .label Last: #{pp_amount stock.last}
18
+ .c
19
+
20
+ - left = "#{ ( pos.outer.strike - stock.last ).abs() *-1*u}px"
21
+ - width = "#{ ( pos.inner.strike - pos.outer.strike ).abs() *u}px"
22
+ .PositionW{ class: pos.strategy.kind, style: "left: #{left}; width: #{width}; " }
23
+ .Position
24
+ .MaxGain{ style: "width: #{pos.max_gain * u}px" }
25
+ .RollGuide
26
+
27
+ - if pos.net_amount >= 0
28
+ .Net.NetPositive{ style: "width: #{ (pos.net_amount) * u }px; right: 0" }
29
+ .label
30
+ net
31
+ = pp_amount pos.net_amount
32
+ - else
33
+ .Net.NetNegative{ style: "width: #{ (-1 * pos.net_amount) * u }px; left: 100%" }
34
+ .label
35
+ net
36
+ = pp_amount pos.net_amount
37
+ .c
38
+
@@ -0,0 +1,50 @@
1
+
2
+ -##
3
+ -## Same file for the spreads
4
+ -##
5
+
6
+ - collapse_key ||= pos.id
7
+ %i.fa.fa-expand.collapse-expand.floaty-collapse{ id: "gameui-pos-detail-#{collapse_key}" }
8
+ .maxwidth
9
+
10
+ %table.bordered{ class: pos.long_or_short }
11
+ %tbody.long-or-short-item
12
+ %tr
13
+ %td <b>#{pp_amount pos.outer.strike}</b>
14
+ %td= pp_amount pos.outer.begin_price
15
+ %td= pos.outer.begin_delta
16
+ %td &nbsp;-&nbsp;
17
+ %td= pp_amount pos.outer.end_price
18
+ %td= pp_delta pos.outer.end_delta
19
+ %tr
20
+ %td <b>#{pp_amount pos.inner.strike}</b>
21
+ %td= pp_amount pos.inner.begin_price
22
+ %td= pp_delta pos.inner.begin_delta
23
+ %td &nbsp;-&nbsp;
24
+ %td= pp_amount pos.inner.end_price
25
+ %td= pp_delta pos.inner.end_delta
26
+
27
+ .header.d-flex
28
+ %ul.mb-0
29
+ %li
30
+ -## yes *100
31
+ <b>max gain:</b> #{pp_amount pos.max_gain} :: #{pp_amount pos.max_gain * 100 * pos.q}
32
+ -# %li
33
+ -# <b>end_outer,inner_price:</b> #{pp_amount pos.end_outer_price} -> #{pp_amount pos.end_inner_price}
34
+ -# &nbsp;&nbsp;
35
+ -# -## yes *100
36
+ -# <b>max loss:</b> #{pp_amount pos.max_loss} :: #{pp_amount pos.max_loss * 100 * pos.q}
37
+
38
+ %li
39
+ <b>Exposure:</b> #{pp_amount pos.max_loss() *100*pos.q()}
40
+ %li
41
+ <b>Breakeven:</b> #{pp_amount pos.inner.strike + pos.max_gain()}
42
+ - ## no *100
43
+ %li <b>Net:</b> #{pp_amount pos.net_amount} :: #{pp_amount pos.net_amount() *100*pos.q} &nbsp;&nbsp; <i>#{pp_percent pos.net_percent}</i>
44
+
45
+ - if 'prepare' == pos.status
46
+ %ul.mb-0
47
+ %li
48
+ <b>next_gain_loss_amount:</b> #{pp_amount pos.next_gain_loss_amount}
49
+ \:: #{pp_amount pos.next_gain_loss_amount * 100 * pos.q}
50
+ &nbsp;&nbsp; <i>#{pp_percent pos.next_gain_loss_amount/pos.max_loss*-1}</i>
@@ -0,0 +1,23 @@
1
+
2
+ .d-flex
3
+ .Card
4
+ = form_for Iro::Position.new(strategy: Iro::Strategy.new), url: new_position_path, method: :get do |f|
5
+ = hidden_field_tag 'position[purse_id]', purse.id
6
+
7
+ .formrow-v1
8
+ .label +Position
9
+
10
+ .d-flex.flex-column
11
+ %label Strategy
12
+ = f.select :strategy_id, options_for_select(@strategies_list)
13
+
14
+ .d-flex.flex-column
15
+ %label Expires on
16
+ = f.select :expires_on, options_for_select( Iro::Option.expirations_list )
17
+
18
+ .d-flex.flex-column
19
+ %label Q
20
+ = f.text_field :quantity, class: 'w-3em'
21
+
22
+ = f.submit '>'
23
+
@@ -0,0 +1 @@
1
+ app/views/iro/positions/_prepare_short_debit_put_spread.haml
@@ -1,30 +1,26 @@
1
1
 
2
- .d-flex.flex-wrap
3
- %label unit
4
- = f.number_field :unit
5
- px/usd
6
- &nbsp;&nbsp;
7
- %label height
8
- = f.number_field :height
9
- px/q
10
- &nbsp;&nbsp;
2
+ .purses--form-extra-fields
11
3
 
12
- %label summary_unit
13
- = f.number_field :summary_unit, step: 0.000001, style: "width: 120px"
14
- px/usd
15
- &nbsp;&nbsp;
4
+ .d-flex.flex-wrap
5
+ %label unit
6
+ = f.number_field :unit
7
+ .unit px/usd
16
8
 
9
+ %label height
10
+ = f.number_field :height
11
+ .unit px/q
17
12
 
13
+ %label summary_unit
14
+ = f.number_field :summary_unit, step: 0.000001
15
+ .unit px/usd
18
16
 
19
- %label mark_every_n_usd
20
- = f.number_field :mark_every_n_usd, step: 0.01
21
- &nbsp;&nbsp;
17
+ .d-flex.flex-wrap
18
+ %label mark_every_n_usd
19
+ = f.number_field :mark_every_n_usd, step: 0.01
20
+ .unit
22
21
 
23
- %label n_next_positions
24
- = f.number_field :n_next_positions
25
- &nbsp;&nbsp;
26
-
27
-
28
- &nbsp;&nbsp;
22
+ %label n_next_positions
23
+ = f.number_field :n_next_positions
24
+ .unit
29
25
 
30
26
 
@@ -4,30 +4,21 @@
4
4
  .header
5
5
  %h5.title
6
6
  Purse `#{purse.slug}`
7
+ -# (#{purse.positions.length})
8
+ &nbsp;
7
9
  = link_to '[~]', edit_purse_path(purse)
8
10
  = link_to '[table]', purse_path(purse)
9
11
  = link_to '[gameUI]', purse_gameui_path(purse)
10
- (#{purse.positions.length})
11
12
 
12
- .d-flex
13
+ %ul
14
+ %li <b>Total:</b> #{pp_amount purse.balance}
15
+ %li <b>Available:</b> #{pp_amount purse.available}
13
16
 
14
- .Card.d-flex
15
- = form_for Iro::Position.new(strategy: Iro::Strategy.new), url: new_position_path, method: :get do |f|
16
- .a +Position
17
- = hidden_field_tag 'position[purse_id]', purse.id
18
- .field
19
- = f.select :strategy_id, options_for_select(@strategies_list)
20
- -# .field
21
- -# = f.radio_button :long_or_short, :long
22
- -# %label long
23
- -# = f.radio_button :long_or_short, :short
24
- -# %label short
25
- = f.submit 'Go'
26
- -# = link_to '[+position]', new_position_path({ purse_id: purse.id })
27
- -# = link_to '[+short]', new_position_path({ purse_id: purse.id, long_or_short: Iro::Strategy::SHORT })
28
17
 
18
+ = render '/iro/positions/new', purse: purse
29
19
 
30
- - if true || params[:template] == 'gameui'
20
+
21
+ - if true # params[:template] == 'gameui'
31
22
  .mini-inputs
32
23
  = form_for purse, html: { class: 'd-flex' } do |f|
33
24
  = render '/iro/purses/form_extra_fields', f: f
@@ -1,8 +1,9 @@
1
1
 
2
2
  .purses-show.padded
3
- .row
4
- .col-md-6
3
+ .row.no-gutters
4
+ .col-md-6.pr-3
5
5
  = render '/iro/purses/header', purse: @purse
6
6
  .col-md-6
7
7
  = render '/iro/purses/summary', purse: @purse, collapse_key: 'views-show'
8
+
8
9
  = render '/iro/positions/table', positions: @positions
@@ -7,14 +7,15 @@
7
7
  - if stock.new_record?
8
8
  %label New
9
9
  - else
10
+ %label status
10
11
  = f.select :status, options_for_select([ Iro::Stock::STATUS_ACTIVE, Iro::Stock::STATUS_INACTIVE ], selected: stock.status)
11
12
  .field
12
13
  = f.label :ticker
13
14
  = f.text_field :ticker
14
15
 
15
- .field
16
- %label Last
17
- = f.number_field :last, placeholder: '80.0', step: 0.01
16
+ -# .field
17
+ -# %label Last
18
+ -# = f.number_field :last, placeholder: '80.0', step: 0.01
18
19
 
19
20
  .field
20
21
  %label options price increment
@@ -0,0 +1,4 @@
1
+
2
+ .stocks-edit.maxwidth
3
+
4
+ = render 'form', stock: @stock
@@ -1,10 +1,25 @@
1
1
 
2
- .stocks--index.padded
2
+ .stocks--index.maxwidth
3
3
  .maxwidth
4
4
  %h5 Stocks
5
5
 
6
- %ul
7
- - @stocks.each do |stock|
8
- %li
9
- = render 'iro/stocks/form', stock: stock
10
- %li= render 'iro/stocks/form', stock: Iro::Stock.new
6
+ %table.bordered.padded
7
+ %thead
8
+ %tr
9
+ %td Ticker
10
+ %td last price
11
+ %td n priceitems
12
+ %tbody
13
+ - @stocks.each do |stock|
14
+ %tr
15
+ %td
16
+ = link_to '[~]', edit_stock_path(stock)
17
+ = link_to '[api]', stock_path(stock, format: :json)
18
+ <b>#{stock.ticker}</b>
19
+ %td
20
+ #{pp_amount stock.last}
21
+ %td
22
+ = stock.priceitems.length
23
+
24
+ %hr
25
+ = render 'iro/stocks/form', stock: Iro::Stock.new
@@ -24,14 +24,23 @@
24
24
 
25
25
 
26
26
  .field
27
- = f.label :buffer_above_water
28
- = f.number_field :buffer_above_water, placeholder: "0.49", step: 0.01
27
+ %label Threshold Buffer dollars above water
28
+ = f.number_field :threshold_buffer_above_water, placeholder: "0.49", step: 0.01
29
29
  .field
30
- = f.label :min_dte
31
- = f.number_field :min_dte, placeholder: "0"
30
+ = f.label :threshold_dte
31
+ = f.number_field :threshold_dte, placeholder: "1"
32
32
  -# .field
33
33
  -# = f.label :next_max_outer_delta
34
34
  -# = f.number_field :next_max_outer_delta, placeholder: "0.25", step: 0.01
35
+ .field
36
+ = f.label :threshold_delta
37
+ = f.number_field :threshold_delta, placeholder: "0.14", step: 0.001
38
+ .field
39
+ = f.label :threshold_netp
40
+ = f.number_field :threshold_netp, placeholder: "0.69", step: 0.001
41
+
42
+ %hr
43
+
35
44
  .field
36
45
  = f.label :next_inner_delta
37
46
  = f.number_field :next_inner_delta, placeholder: "0.25", step: 0.001
@@ -42,14 +51,8 @@
42
51
  = f.label :next_spread_amount
43
52
  = f.number_field :next_spread_amount, placeholder: "20", step: 0.1
44
53
  .field
45
- = f.label :next_buffer_above_water
54
+ %label next buffer dollars above water
46
55
  = f.number_field :next_buffer_above_water, placeholder: "80", step: 0.01
47
- .field
48
- = f.label :threshold_delta
49
- = f.number_field :threshold_delta, placeholder: "0.14", step: 0.001
50
- .field
51
- = f.label :threshold_netp
52
- = f.number_field :threshold_netp, placeholder: "0.69", step: 0.001
53
56
 
54
57
  .actions
55
58
  = f.submit
@@ -8,7 +8,7 @@
8
8
  -# %li <b>ticker:</b> #{strategy.ticker}
9
9
  -# %li <b>slug:</b> #{strategy.slug}
10
10
 
11
- %li <b>buffer_above_water:</b> #{strategy.buffer_above_water}
11
+ %li <b>threshold_buffer_above_water:</b> #{strategy.threshold_buffer_above_water}
12
12
  %li <b>threshold_delta:</b> #{strategy.threshold_delta}
13
13
  %li <b>threshold_netp:</b> #{strategy.threshold_netp}
14
14
 
data/config/routes.rb CHANGED
@@ -30,7 +30,8 @@ Iro::Engine.routes.draw do
30
30
  resources :strategies
31
31
 
32
32
  namespace :api do
33
- # resources :stocks
33
+ get 'stocks', to: 'stocks#index'
34
+ get 'stocks/:ticker', to: 'stocks#show'
34
35
  get 'stocks/:ticker/period/:period', to: 'stocks#show'
35
36
  get 'stocks/:ticker/from/:begin_on', to: 'stocks#show'
36
37
  get 'stocks/:ticker/begin_on/:begin_on', to: 'stocks#show'
data/lib/iro/engine.rb CHANGED
@@ -1,5 +1,6 @@
1
1
 
2
2
  module Iro; end
3
+ module Tda; end
3
4
 
4
5
  class Iro::Engine < ::Rails::Engine
5
6
  isolate_namespace Iro
data/lib/iron_warbler.rb CHANGED
@@ -1,8 +1,6 @@
1
1
 
2
2
  require 'business_time'
3
-
4
3
  require 'haml'
5
-
6
4
  require 'mongoid'
7
5
 
8
6
  require "iro/engine"