iron_warbler 2.0.7.25 → 2.0.7.26

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/iron_warbler/Card.scss +6 -0
  3. data/app/assets/stylesheets/iron_warbler/positions.scss +1 -1
  4. data/app/assets/stylesheets/iron_warbler/purses_summary.scss +31 -19
  5. data/app/controllers/iro/application_controller.rb +6 -0
  6. data/app/controllers/iro/positions_controller.rb +183 -200
  7. data/app/controllers/iro/purses_controller.rb +3 -1
  8. data/app/controllers/iro/stocks_controller.rb +2 -2
  9. data/app/models/iro/option.rb +38 -150
  10. data/app/models/iro/option_black_scholes.rb +149 -0
  11. data/app/models/iro/position.rb +154 -209
  12. data/app/models/iro/purse.rb +34 -4
  13. data/app/models/iro/strategy.rb +49 -47
  14. data/app/views/iro/_main_header.haml +4 -2
  15. data/app/views/iro/options/_show_mini.haml +8 -0
  16. data/app/views/iro/positions/_form.haml +8 -3
  17. data/app/views/iro/positions/_formpart_4data.haml +41 -38
  18. data/app/views/iro/positions/_gameui_long_debit_call_spread.haml +4 -4
  19. data/app/views/iro/positions/_gameui_long_debit_call_spread.haml-trash +42 -0
  20. data/app/views/iro/positions/_gameui_short_debit_put_spread.haml +1 -0
  21. data/app/views/iro/positions/_gameui_short_debit_put_spread.haml-trash +40 -0
  22. data/app/views/iro/positions/_header.haml +2 -0
  23. data/app/views/iro/positions/_header_long_debit_call_spread.haml +43 -25
  24. data/app/views/iro/positions/_prepare_long_debit_call_spread.haml +2 -3
  25. data/app/views/iro/positions/_prepare_short_debit_put_spread.haml +2 -1
  26. data/app/views/iro/positions/_table.haml +25 -26
  27. data/app/views/iro/positions/prepare.haml +6 -4
  28. data/app/views/iro/positions/prepare2.haml +15 -4
  29. data/app/views/iro/purses/_form_extra_fields.haml +7 -3
  30. data/app/views/iro/purses/_header.haml +19 -5
  31. data/app/views/iro/purses/_summary.haml +69 -62
  32. data/app/views/iro/purses/show.haml +1 -1
  33. data/app/views/iro/strategies/_form.haml +26 -19
  34. data/app/views/iro/strategies/_show.haml +6 -4
  35. data/config/routes.rb +5 -3
  36. metadata +7 -2
  37. data/app/views/iro/positions/_gameui_short_debit_put_spread.haml +0 -40
@@ -18,6 +18,7 @@ class Iro::Strategy
18
18
  has_many :positions, class_name: 'Iro::Position', inverse_of: :strategy
19
19
 
20
20
  belongs_to :stock, class_name: 'Iro::Stock', inverse_of: :strategies
21
+ has_and_belongs_to_many :purses, class_name: 'Iro::Purse', inverse_of: :strategies
21
22
 
22
23
  KIND_COVERED_CALL = 'covered_call'
23
24
  KIND_LONG_DEBIT_CALL_SPREAD = 'long_debit_call_spread'
@@ -43,74 +44,74 @@ class Iro::Strategy
43
44
  end
44
45
 
45
46
  field :buffer_above_water, type: :float
46
- field :threshold_delta, type: :float
47
- field :threshold_netp, type: :float
48
-
49
- field :next_inner_delta, type: :float
50
- field :next_outer_delta, type: :float
51
- field :next_inner_strike, type: :float
52
- field :next_outer_strike, type: :float
47
+ field :threshold_delta, type: :float
48
+ field :threshold_netp, type: :float
49
+ field :min_dte, type: :integer, default: 0
50
+
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
53
55
  field :next_spread_amount, type: :float # e.g. $20 for a $2000 NVDA spread
54
-
56
+ field :next_buffer_above_water, type: :float
55
57
 
56
58
  def self.for_ticker ticker
57
59
  where( ticker: ticker )
58
60
  end
59
61
 
60
62
  def breakeven_covered_call p
61
- p.inner_strike + p.begin_inner_price
63
+ p.inner.strike + p.inner.begin_price
62
64
  end
63
65
  def breakeven_long_debit_call_spread p
64
- p.inner_strike - p.max_gain # p.begin_outer_price + p.begin_inner_price
66
+ p.inner.strike - p.max_gain
65
67
  end
66
68
  alias_method :breakeven_short_debit_put_spread, :breakeven_long_debit_call_spread
67
69
 
68
70
  def max_gain_covered_call p
69
- # return p.begin_inner_price
70
- p.begin_inner_price * 100 - 0.66 # @TODO: is this *100 really?
71
+ p.inner.begin_price * 100 - 0.66 # @TODO: is this *100 really?
71
72
  end
72
73
  def max_gain_long_debit_call_spread p
73
74
  ## 100 * disalloed for gameui
74
- ( p.inner_strike - p.outer_strike - p.begin_outer_price + p.begin_inner_price ) # - 2*0.66
75
+ ( p.inner.strike - p.outer.strike - p.outer.begin_price + p.inner.begin_price ) # - 2*0.66
75
76
  end
76
77
  def max_gain_short_debit_put_spread p
77
78
  ## 100 * disalloed for gameui
78
- ( p.outer_strike - p.inner_strike - p.begin_outer_price + p.begin_inner_price ) # - 2*0.66
79
+ ( p.outer.strike - p.inner.strike - p.outer.begin_price + p.inner.begin_price ) # - 2*0.66
79
80
  end
80
81
 
81
82
  def net_amount_covered_call p
82
- ( p.begin_inner_price - p.end_inner_price )
83
+ ( p.inner.begin_price - p.inner.end_price )
83
84
  end
84
85
  def net_amount_long_debit_call_spread p
85
- outer = p.end_outer_price - p.begin_outer_price
86
- inner = p.begin_inner_price - p.end_inner_price
86
+ outer = p.outer.end_price - p.outer.begin_price
87
+ inner = p.inner.begin_price - p.inner.end_price
87
88
  out = ( outer + inner )
88
89
  end
89
90
  alias_method :net_amount_short_debit_put_spread, :net_amount_long_debit_call_spread
90
91
 
91
92
  def max_loss_covered_call p
92
- p.begin_inner_price*10 # just suppose 10,000%
93
+ p.inner.begin_price*10 # just suppose 10,000%
93
94
  end
94
95
  def max_loss_long_debit_call_spread p
95
- out = p.outer_strike - p.inner_strike
96
+ out = p.outer.strike - p.inner.strike
96
97
  end
97
98
  def max_loss_short_debit_put_spread p # different
98
- out = p.inner_strike - p.outer_strike
99
+ out = p.inner.strike - p.outer.strike
99
100
  end
100
101
 
101
102
  def begin_delta_covered_call p
102
- p.begin_inner_delta
103
+ p.inner.begin_delta
103
104
  end
104
105
  def begin_delta_long_debit_call_spread p
105
- p.begin_outer_delta - p.begin_inner_delta
106
+ p.outer.begin_delta - p.inner.begin_delta
106
107
  end
107
108
  alias_method :begin_delta_short_debit_put_spread, :begin_delta_long_debit_call_spread
108
109
 
109
110
  def end_delta_covered_call p
110
- p.end_inner_delta
111
+ p.inner.end_delta
111
112
  end
112
113
  def end_delta_long_debit_call_spread p
113
- p.end_outer_delta - p.end_inner_delta
114
+ p.outer.end_delta - p.inner.end_delta
114
115
  end
115
116
  alias_method :end_delta_short_debit_put_spread, :end_delta_long_debit_call_spread
116
117
 
@@ -126,18 +127,18 @@ class Iro::Strategy
126
127
  return [ 0.99, '0 DTE, must exit' ]
127
128
  end
128
129
 
129
- if ( stock.last - buffer_above_water ) < p.inner_strike
130
+ if ( stock.last - buffer_above_water ) < p.inner.strike
130
131
  return [ 0.98, "Last #{'%.2f' % stock.last} is " +
131
- "#{'%.2f' % [p.inner_strike + buffer_above_water - stock.last]} " +
132
- "below #{'%.2f' % [p.inner_strike + buffer_above_water]} water" ]
132
+ "#{'%.2f' % [p.inner.strike + buffer_above_water - stock.last]} " +
133
+ "below #{'%.2f' % [p.inner.strike + buffer_above_water]} water" ]
133
134
  end
134
135
 
135
- if p.end_inner_delta < threshold_delta
136
- return [ 0.61, "Delta #{p.end_inner_delta} is lower than #{threshold_delta} threshold." ]
136
+ if p.inner.end_delta < threshold_delta
137
+ return [ 0.61, "Delta #{p.inner.end_delta} is lower than #{threshold_delta} threshold." ]
137
138
  end
138
139
 
139
- if 1 - p.end_inner_price/p.begin_inner_price > threshold_netp
140
- return [ 0.51, "made enough #{'%.0f' % [(1 - p.end_inner_price/p.begin_inner_price )*100]}% profit" ]
140
+ if 1 - p.inner.end_price/p.inner.begin_price > threshold_netp
141
+ return [ 0.51, "made enough #{'%.02f' % [(1.0 - p.inner.end_price/p.inner.begin_price )*100]}% profit." ]
141
142
  end
142
143
 
143
144
  return [ 0.33, '-' ]
@@ -153,18 +154,18 @@ class Iro::Strategy
153
154
  return [ 0.99, '1 DTE, must exit' ]
154
155
  end
155
156
 
156
- if ( stock.last - buffer_above_water ) < p.inner_strike
157
+ if ( stock.last - buffer_above_water ) < p.inner.strike
157
158
  return [ 0.95, "Last #{'%.2f' % stock.last} is " +
158
- "#{'%.2f' % [stock.last - p.inner_strike - buffer_above_water]} " +
159
- "below #{'%.2f' % [p.inner_strike + buffer_above_water]} water" ]
159
+ "#{'%.2f' % [stock.last - p.inner.strike - buffer_above_water]} " +
160
+ "below #{'%.2f' % [p.inner.strike + buffer_above_water]} water" ]
160
161
  end
161
162
 
162
- if p.end_inner_delta < threshold_delta
163
- return [ 0.79, "Delta #{p.end_inner_delta} is lower than #{threshold_delta} threshold." ]
163
+ if p.inner.end_delta < threshold_delta
164
+ return [ 0.79, "Delta #{p.inner.end_delta} is lower than #{threshold_delta} threshold." ]
164
165
  end
165
166
 
166
- if 1 - p.end_inner_price/p.begin_inner_price > threshold_netp
167
- return [ 0.51, "made enough #{'%.0f' % [(1 - p.end_inner_price/p.begin_inner_price )*100]}% profit" ]
167
+ if 1 - p.inner.end_price/p.inner.begin_price > threshold_netp
168
+ return [ 0.51, "made enough #{'%.02f' % [(1.0 - p.inner.end_price/p.inner.begin_price )*100]}% profit^" ]
168
169
  end
169
170
 
170
171
  return [ 0.33, '-' ]
@@ -173,22 +174,22 @@ class Iro::Strategy
173
174
  ## @TODO
174
175
  def calc_rollp_short_debit_put_spread p
175
176
 
176
- if ( p.expires_on.to_date - Time.now.to_date ).to_i < 1
177
- return [ 0.99, '0 DTE, must exit' ]
177
+ if ( p.expires_on.to_date - Time.now.to_date ).to_i <= min_dte
178
+ return [ 0.99, "< #{min_dte}DTE, must exit" ]
178
179
  end
179
180
 
180
- if ( stock.last - buffer_above_water ) < p.inner_strike
181
+ if stock.last + buffer_above_water > p.inner.strike
181
182
  return [ 0.98, "Last #{'%.2f' % stock.last} is " +
182
- "#{'%.2f' % [stock.last - p.inner_strike - buffer_above_water]} " +
183
- "above #{'%.2f' % [p.inner_strike + buffer_above_water]} water" ]
183
+ "#{'%.2f' % [stock.last + buffer_above_water - p.inner.strike]} " +
184
+ "above #{'%.2f' % [p.inner.strike - buffer_above_water]} water" ]
184
185
  end
185
186
 
186
- if p.end_inner_delta < threshold_delta
187
- return [ 0.79, "Delta #{p.end_inner_delta} is lower than #{threshold_delta} threshold." ]
187
+ if p.inner.end_delta.abs < threshold_delta.abs
188
+ return [ 0.79, "Delta #{p.inner.end_delta} is lower than #{threshold_delta} threshold." ]
188
189
  end
189
190
 
190
- if 1 - p.end_inner_price/p.begin_inner_price > threshold_netp
191
- return [ 0.51, "made enough #{'%.0f' % [(1 - p.end_inner_price/p.begin_inner_price )*100]}% profit" ]
191
+ if p.net_percent > threshold_netp
192
+ return [ 0.51, "made enough #{'%.0f' % [p.net_percent*100]}% > #{"%.2f" % [threshold_netp*100]}% profit," ]
192
193
  end
193
194
 
194
195
  return [ 0.33, '-' ]
@@ -205,3 +206,4 @@ class Iro::Strategy
205
206
  [[nil,nil]] + these.map { |ttt| [ ttt, ttt.id ] }
206
207
  end
207
208
  end
209
+
@@ -9,7 +9,7 @@
9
9
  %ul{ style: "margin-top: 2em;" }
10
10
  %li
11
11
  = link_to "Stocks (#{Iro::Stock.all.length})", stocks_path
12
- = link_to '[re]', refresh_stocks_path
12
+ = link_to '[sync]', sync_stocks_path
13
13
  -# %li= link_to 'Options', options_path
14
14
  -# %li Max Pain
15
15
  %li
@@ -23,7 +23,9 @@
23
23
  = link_to 'Purses', purses_path
24
24
  %ul
25
25
  - @purses.each do |p|
26
- %li= link_to p, purse_path(p)
26
+ %li
27
+ = link_to p, purse_path(p)
28
+ = link_to '[ui]', purse_gameui_path(p)
27
29
  .a
28
30
  = link_to 'Strategies', strategies_path
29
31
  %ul
@@ -0,0 +1,8 @@
1
+
2
+ .options--show-mini
3
+ .Card
4
+ = opt.inspect
5
+ %ul
6
+ %li <b>strike:</b>
7
+ %li <b>begin_price:</b>
8
+ %li <b>begin_delta:</b>
@@ -15,12 +15,17 @@
15
15
  .field
16
16
  %label Stock
17
17
  = f.select :stock_id, options_for_select( @stocks_list, selected: position.stock_id )
18
- %label Strategy
19
- = f.select :strategy_id, options_for_select( @strategies_list, selected: position.strategy_id )
18
+
19
+ .field
20
+ %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] )
22
+
23
+ %label Strategy
24
+ = f.select :strategy_id, options_for_select( @strategies_list, selected: position.strategy_id )
20
25
 
21
26
  .field
22
27
  %label Expires on
23
- = f.text_field :expires_on
28
+ = f.select :expires_on, options_for_select( Iro::Option.expirations_list, selected: position.expires_on )
24
29
  %label Quantity
25
30
  = f.text_field :quantity
26
31
 
@@ -1,46 +1,49 @@
1
1
  .field
2
2
  %label Begin on
3
- = f.text_field :begin_on
3
+ = f.text_field :begin_on, value: position.begin_on || Time.now.to_date.to_s
4
4
 
5
5
  .long-or-short-item
6
- .d-flex
7
- .field
8
- %label Outer Strike
9
- = f.number_field :outer_strike, step: 0.01
10
- .field
11
- %label Begin outer price
12
- = f.text_field :begin_outer_price
13
- .field
14
- %label Begin outer delta
15
- = f.text_field :begin_outer_delta
16
6
 
17
7
  .d-flex
18
- .field
19
- %label Inner Strike
20
- = f.number_field :inner_strike, step: 0.01
21
- .field
22
- %label Begin inner price
23
- = f.text_field :begin_inner_price
24
- .field
25
- %label Begin inner delta
26
- = f.text_field :begin_inner_delta
8
+ = fields_for :outer, position.outer do |f_outer|
9
+ .field
10
+ %label Outer Strike
11
+ = f_outer.number_field :strike, step: 0.01
12
+ .field
13
+ %label Begin outer price
14
+ = f_outer.text_field :begin_price
15
+ .field
16
+ %label Begin outer delta
17
+ = f_outer.text_field :begin_delta
27
18
 
28
- %br
29
- .flex-row
30
- %label End on
31
- = f.text_field :end_on
32
- .long-or-short-item
33
19
  .d-flex
34
- .field
35
- %label End outer price
36
- = f.text_field :end_outer_price
37
- .field
38
- %label End outer delta
39
- = f.text_field :end_outer_delta
40
- .d-flex
41
- .field
42
- %label End inner price
43
- = f.text_field :end_inner_price
44
- .field
45
- %label End inner delta
46
- = f.text_field :end_inner_delta
20
+ = fields_for :inner, position.inner do |f_inner|
21
+ .field
22
+ %label Inner Strike
23
+ = f_inner.number_field :strike, step: 0.01
24
+ .field
25
+ %label Begin inner price
26
+ = f_inner.text_field :begin_price
27
+ .field
28
+ %label Begin inner delta
29
+ = f_inner.text_field :begin_delta
30
+
31
+ -# %br
32
+ -# .flex-row
33
+ -# %label End on
34
+ -# = f.text_field :end_on
35
+ -# .long-or-short-item
36
+ -# .d-flex
37
+ -# .field
38
+ -# %label End outer price
39
+ -# = f.text_field :end_outer_price
40
+ -# .field
41
+ -# %label End outer delta
42
+ -# = f.text_field :end_outer_delta
43
+ -# .d-flex
44
+ -# .field
45
+ -# %label End inner price
46
+ -# = f.text_field :end_inner_price
47
+ -# .field
48
+ -# %label End inner delta
49
+ -# = f.text_field :end_inner_delta
@@ -17,20 +17,20 @@
17
17
  .label Last: #{pp_amount stock.last}
18
18
  .c
19
19
 
20
- - left = "#{ ( pos.outer_strike - stock.last ) * u}px"
21
- - width = "#{ ( pos.inner_strike - pos.outer_strike ) * u}px"
20
+ - left = "#{ ( pos.outer.strike - stock.last ).abs() *-1*u}px"
21
+ - width = "#{ ( pos.inner.strike - pos.outer.strike ).abs() *u}px"
22
22
  .PositionW{ class: pos.strategy.kind, style: "left: #{left}; width: #{width}; " }
23
23
  .Position
24
24
  .MaxGain{ style: "width: #{pos.max_gain * u}px" }
25
25
  .RollGuide
26
26
 
27
27
  - if pos.net_amount >= 0
28
- .Net.NetPositive{ style: "width: #{ (pos.net_amount / 100) * u }px; right: 0" }
28
+ .Net.NetPositive{ style: "width: #{ (pos.net_amount) * u }px; right: 0" }
29
29
  .label
30
30
  net
31
31
  = pp_amount pos.net_amount
32
32
  - else
33
- .Net.NetNegative{ style: "width: #{ (-1 * pos.net_amount / 100) * u }px; left: 100%" }
33
+ .Net.NetNegative{ style: "width: #{ (-1 * pos.net_amount) * u }px; left: 100%" }
34
34
  .label
35
35
  net
36
36
  = pp_amount pos.net_amount
@@ -0,0 +1,42 @@
1
+
2
+ -##
3
+ -## same for long and short debit spreads
4
+ -##
5
+
6
+ - pos = position
7
+ - stock = pos.stock
8
+ - nearest_strike = stock.last.round
9
+ - u = pos.purse.unit # pixels per dollar
10
+
11
+ .collapse-expand.d-flex{ id: "gameui-pos-#{pos.id}" }
12
+ [<>]
13
+ .maxwidth= render "/iro/positions/header", pos: pos
14
+ .a
15
+ = render "/iro/positions/header_#{pos.strategy.kind}", pos: pos
16
+ .StockCoordinatesW
17
+ .StockCoordinates{ style: "height: #{pos.q() *pos.purse.height}px " }
18
+ .grid= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock, position: pos
19
+
20
+ .Origin{ style: "left: #{ ( nearest_strike - stock.last )* u}px" }
21
+ .label Last: #{pp_amount stock.last}
22
+ .c
23
+
24
+ - left = "#{ ( pos.outer.strike - stock.last ) * u}px"
25
+ - width = "#{ ( pos.inner.strike - pos.outer.strike ) * u}px"
26
+ .PositionW{ class: pos.strategy.kind, style: "left: #{left}; width: #{width}; " }
27
+ .Position
28
+ .MaxGain{ style: "width: #{pos.max_gain * u}px" }
29
+ .RollGuide
30
+
31
+ - if pos.net_amount >= 0
32
+ .Net.NetPositive{ style: "width: #{ (pos.net_amount / 100) * u }px; right: 0" }
33
+ .label
34
+ net
35
+ = pp_amount pos.net_amount
36
+ - else
37
+ .Net.NetNegative{ style: "width: #{ (-1 * pos.net_amount / 100) * u }px; left: 100%" }
38
+ .label
39
+ net
40
+ = pp_amount pos.net_amount
41
+ .c
42
+
@@ -0,0 +1 @@
1
+ app/views/iro/positions/_gameui_long_debit_call_spread.haml
@@ -0,0 +1,40 @@
1
+
2
+ - pos = position
3
+ - stock = pos.stock
4
+ - nearest_strike = stock.last.round
5
+ - u = pos.purse.unit # pixels per dollar
6
+
7
+
8
+ .collapse-expand.d-flex{ id: "gameui-pos-#{pos.id}" }
9
+ [<>]
10
+ .maxwidth= render "/iro/positions/header", pos: pos
11
+ .a
12
+ = render "/iro/positions/header_#{pos.strategy.kind}", pos: pos
13
+ .StockCoordinatesW
14
+ .StockCoordinates{ style: "height: #{pos.q() *u}px " }
15
+ .grid= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock, position: pos
16
+
17
+ .Origin{ style: "left: #{ ( nearest_strike - stock.last )* u}px" }
18
+ .label Last: #{pp_amount stock.last}
19
+ .c
20
+
21
+ -## these are different
22
+ - left = "#{ ( stock.last - pos.outer.strike ) * u}px"
23
+ - width = "#{ ( pos.outer.strike - pos.inner.strike ) * u}px"
24
+ .PositionW{ class: pos.strategy.kind, style: "left: #{left}; width: #{width}; " }
25
+ .Position
26
+ .MaxGain{ style: "width: #{pos.max_gain * u}px" }
27
+ .RollGuide
28
+
29
+ - if pos.net_amount >= 0
30
+ .Net.NetPositive{ style: "width: #{ (pos.net_amount / 100) * u }px; right: 0" }
31
+ .label
32
+ net
33
+ = pp_amount pos.net_amount
34
+ - else
35
+ .Net.NetNegative{ style: "width: #{ (-1 * pos.net_amount / 100) * u }px; left: 100%" }
36
+ .label
37
+ net
38
+ = pp_amount pos.net_amount
39
+ .c
40
+
@@ -2,5 +2,7 @@
2
2
  .positions--header.maxwidth
3
3
  = pos
4
4
  = link_to '[roll]', prepare_to_roll_position_path(pos) if pos.persisted?
5
+ -# .d-inline-block= button_to 'close', close_position_path(pos), data: { confirm: 'Are you sure?' }
6
+ = link_to '[close]', close_position_path(pos)
5
7
  = link_to '[~]', edit_position_path(pos) if pos.persisted?
6
8
  -# = render "/iro/positions/header_#{pos.strategy.kind}", pos: pos
@@ -1,32 +1,50 @@
1
1
 
2
-
2
+ -##
3
3
  -## Same file for the spreads
4
+ -##
5
+
4
6
  - collapse_key ||= pos.id
5
7
  %i.fa.fa-expand.collapse-expand.floaty-collapse{ id: "gameui-pos-detail-#{collapse_key}" }
6
8
  .maxwidth
7
- %ul.m-0.p-0
8
- - if !pos.persisted?
9
- %li <b>expires_on:</b> #{pos.expires_on}
10
- %li <b>outer,inner_strike:</b> #{pp_amount pos.outer_strike} -> #{pp_amount pos.inner_strike}
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()}
11
40
  %li
12
- <b>next_gain_loss_amount:</b> #{pp_amount pos.next_gain_loss_amount}
13
- \:: #{pp_amount pos.next_gain_loss_amount * 100 * pos.q}
14
- &nbsp;&nbsp; <i>#{pp_percent pos.next_gain_loss_amount/pos.max_loss*-1}</i>
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>
15
44
 
16
- %li <b>outer,inner_strike:</b> #{pp_amount pos.outer_strike} -> #{pp_amount pos.inner_strike}
17
- %li
18
- <b>begin_outer,inner_price:</b> #{pp_amount pos.begin_outer_price} -> #{pp_amount pos.begin_inner_price}
19
- &nbsp;&nbsp;
20
- -## yes *100
21
- <b>max gain:</b> #{pp_amount pos.max_gain} :: #{pp_amount pos.max_gain * 100 * pos.q}
22
- %li
23
- <b>end_outer,inner_price:</b> #{pp_amount pos.end_outer_price} -> #{pp_amount pos.end_inner_price}
24
- &nbsp;&nbsp;
25
- -## yes *100
26
- <b>max loss:</b> #{pp_amount pos.max_loss} :: #{pp_amount pos.max_loss * 100 * pos.q}
27
- %li
28
- <b>Exposure:</b> #{pp_amount pos.max_loss() *-1*100*pos.q()}
29
- %li
30
- <b>Breakeven:</b> #{pp_amount pos.max_gain}
31
- - ## no *100
32
- %li <b>Net:</b> #{pp_amount pos.net_amount} :: #{pp_amount pos.net_amount * pos.q} &nbsp;&nbsp; <i>#{pp_percent pos.net_percent}</i>
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>
@@ -14,12 +14,11 @@
14
14
  .label Last: #{pos.stock.last }
15
15
 
16
16
  - amnt = pos.next_gain_loss_amount
17
- - border = amnt >= 0 ? "#{amnt * u}px solid green" : "#{amnt * -1 * u}px solid red"
17
+ - border = amnt >= 0 ? "#{amnt * u}px solid green" : "#{amnt * -1*u}px solid red"
18
18
  - width = "#{ ( pos.inner_strike - pos.outer_strike ) * u}px"
19
19
  - left = "#{ ( pos.outer_strike - pos.stock.last ) * u}px"
20
- .PositionW{ style: "width: #{width}; left: #{left}; " }
20
+ .PositionW{ class: pos.strategy.kind, style: "width: #{width}; left: #{left}; " }
21
21
  .Position{ style: " border-right: #{border}; " }
22
22
  .MaxGain{ style: "width: #{pos.max_gain * u}px" }
23
-
24
23
  .select= button_to 'select', prepare2_position_path(pos.id)
25
24
  .c
@@ -17,7 +17,8 @@
17
17
  - border = amnt >= 0 ? "#{amnt * u}px solid green" : "#{amnt * -1 * u}px solid red"
18
18
  - width = "#{ ( pos.outer_strike - pos.inner_strike ) * u}px"
19
19
  - left = "#{ ( pos.stock.last - pos.outer_strike ) * u}px"
20
- .PositionW{ style: "width: #{width}; left: #{left}; border-right: #{border};" }
20
+ .PositionW{ class: pos.strategy.kind, style: "width: #{width}; left: #{left}; border-right: #{border};" }
21
21
  .Position
22
22
  .MaxGain{ style: "width: #{pos.max_gain * u}px" }
23
+ .select= button_to 'select', prepare2_position_path(pos.id)
23
24
  .c
@@ -17,12 +17,11 @@
17
17
  Strategy
18
18
  %th.q Q
19
19
  %th.strikes
20
- -# .a outer_strike, inner_strike
21
20
  Strike
22
21
  %th.begin_price
23
- .a Begin outer price, delta
22
+ .a Begin price, delta
24
23
  %th.max-loss Max Loss
25
- %th.max-gain Max Gain
24
+ -# %th.max-gain Max Gain
26
25
  %th
27
26
  .end_price End Price, delta
28
27
  %th
@@ -64,9 +63,8 @@
64
63
  = link_to '[~]', edit_position_path(position)
65
64
  = link_to '[dup]', duplicate_position_path(position)
66
65
  .d-flex
67
- = link_to '[re]', refresh_position_path(pos)
68
- - if true # position.next_reasons.present? && position.rollp > 0.5
69
- = link_to '[roll]', prepare_to_roll_position_path(pos)
66
+ = link_to '[sync]', sync_position_path(pos)
67
+ = link_to '[roll]', prepare_to_roll_position_path(pos)
70
68
 
71
69
  %td.ticker
72
70
  = position.stock.ticker
@@ -88,32 +86,32 @@
88
86
  <b>#{position.quantity}</b>
89
87
  %td.strikes
90
88
  .long-or-short-item
91
- .outer-strike= pp_amount position.outer_strike
92
- .inner-strike= pp_amount position.inner_strike
89
+ .outer-strike= pp_amount position.outer.strike
90
+ .inner-strike= pp_amount position.inner.strike
93
91
 
94
92
  %td.begin_price
95
93
  .long-or-short-item
96
94
  .begin-outer-price
97
- = pp_amount position.begin_outer_price
98
- <b>D</b> #{pp_delta position.begin_outer_delta}
95
+ = pp_amount position.outer.begin_price
96
+ &nbsp;<b>D</b>&nbsp; #{pp_delta position.outer.begin_delta}
99
97
  .begin-inner-price
100
- = pp_amount position.begin_inner_price
101
- <b>D</b> #{pp_delta position.begin_inner_delta}
98
+ = pp_amount position.inner.begin_price
99
+ &nbsp;<b>D</b>&nbsp; #{pp_delta position.inner.begin_delta}
102
100
  %td
103
101
  .max-loss= pp_amount position.max_loss * pos.q * 100, precision: 0
104
- %td
105
- .max-gain= pp_amount position.max_gain * pos.q * 100, precision: 0
106
- .max-gainp
107
- -# = pp_percent( -1 * position.max_gain / position.max_loss ) rescue '-' # undef. for covered calls
102
+ -# %td
103
+ -# .max-gain= pp_amount position.max_gain * pos.q * 100, precision: 0
104
+ -# .max-gainp
105
+ -# -# = pp_percent( -1 * position.max_gain / position.max_loss ) rescue '-' # undef. for covered calls
108
106
 
109
- %td.end_price
107
+ %td.end
110
108
  .long-or-short-item
111
109
  .end-outer-price
112
- = pp_amount position.end_outer_price
113
- <b>D</b> #{pp_delta position.end_outer_delta}
110
+ = pp_amount position.outer.end_price
111
+ &nbsp;<b>D</b>&nbsp; #{pp_delta position.outer.end_delta}
114
112
  .end-inner-price
115
- = pp_amount position.end_inner_price
116
- <b>D</b> #{pp_delta position.end_inner_delta}
113
+ = pp_amount position.inner.end_price
114
+ &nbsp;<b>D</b>&nbsp; #{pp_delta position.inner.end_delta}
117
115
  %td.net
118
116
  .a= pp_amount position.net_amount * pos.q * 100, precision: 0 rescue '@TODO'
119
117
  .a <i>#{pp_percent position.net_amount / position.max_gain rescue '@TODO'}</i>
@@ -128,12 +126,13 @@
128
126
  - if position.next_reasons.present?
129
127
  %i.fa.fa-expand.collapse-expand{ id: "pos-reasons-#{position.id}" } reasons
130
128
  = render '/iro/positions/reasons', reasons: position.next_reasons
131
- .a= position.next_symbol
132
- .a= position.next_delta
129
+ .a= position.autonxt
133
130
  .a
134
- = pp_amount position.next_mark
135
- \=>
136
- = pp_amount position.next_outcome * 100 * position.quantity rescue nil
131
+ - if pos.autonxt
132
+ = link_to '[autonxt]', prepare2_position_path(pos.autonxt)
133
+ = pp_amount pos.autonxt.prev_gain_loss_amount
134
+ -# \=>
135
+ -# = pp_amount position.next_outcome * 100 * position.quantity rescue nil
137
136
 
138
137
 
139
138