iron_warbler 2.0.7.24 → 2.0.7.26

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 (40) 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/positions_gameui.scss +8 -0
  5. data/app/assets/stylesheets/iron_warbler/purses_gameui.scss +2 -4
  6. data/app/assets/stylesheets/iron_warbler/purses_summary.scss +31 -19
  7. data/app/controllers/iro/application_controller.rb +6 -0
  8. data/app/controllers/iro/positions_controller.rb +186 -137
  9. data/app/controllers/iro/purses_controller.rb +3 -1
  10. data/app/controllers/iro/stocks_controller.rb +2 -2
  11. data/app/models/iro/option.rb +41 -148
  12. data/app/models/iro/option_black_scholes.rb +149 -0
  13. data/app/models/iro/position.rb +156 -205
  14. data/app/models/iro/purse.rb +34 -4
  15. data/app/models/iro/strategy.rb +49 -47
  16. data/app/views/iro/_main_header.haml +4 -2
  17. data/app/views/iro/options/_show_mini.haml +8 -0
  18. data/app/views/iro/positions/_form.haml +8 -3
  19. data/app/views/iro/positions/_formpart_4data.haml +41 -38
  20. data/app/views/iro/positions/_gameui_covered_call.haml +1 -1
  21. data/app/views/iro/positions/_gameui_long_debit_call_spread.haml +5 -5
  22. data/app/views/iro/positions/_gameui_long_debit_call_spread.haml-trash +42 -0
  23. data/app/views/iro/positions/_gameui_short_debit_put_spread.haml +1 -0
  24. data/app/views/iro/positions/_gameui_short_debit_put_spread.haml-trash +40 -0
  25. data/app/views/iro/positions/_header.haml +2 -0
  26. data/app/views/iro/positions/_header_long_debit_call_spread.haml +43 -25
  27. data/app/views/iro/positions/_prepare_long_debit_call_spread.haml +6 -5
  28. data/app/views/iro/positions/_prepare_short_debit_put_spread.haml +2 -1
  29. data/app/views/iro/positions/_table.haml +25 -26
  30. data/app/views/iro/positions/prepare.haml +6 -4
  31. data/app/views/iro/positions/prepare2.haml +22 -0
  32. data/app/views/iro/purses/_form_extra_fields.haml +8 -4
  33. data/app/views/iro/purses/_header.haml +19 -5
  34. data/app/views/iro/purses/_summary.haml +69 -62
  35. data/app/views/iro/purses/show.haml +1 -1
  36. data/app/views/iro/strategies/_form.haml +26 -19
  37. data/app/views/iro/strategies/_show.haml +6 -4
  38. data/config/routes.rb +10 -7
  39. metadata +8 -2
  40. 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
@@ -10,7 +10,7 @@
10
10
  .a
11
11
  = render "/iro/positions/header_#{pos.strategy.kind}", pos: pos
12
12
  .StockCoordinatesW
13
- .StockCoordinates{ style: "height: #{pos.q() * u}px " }
13
+ .StockCoordinates{ style: "height: #{pos.q() * pos.purse.height}px " }
14
14
  .grid= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock, position: pos
15
15
 
16
16
  .Origin{ style: "left: #{ ( nearest_strike - stock.last )* u}px" }
@@ -10,27 +10,27 @@
10
10
  .a
11
11
  = render "/iro/positions/header_#{pos.strategy.kind}", pos: pos
12
12
  .StockCoordinatesW
13
- .StockCoordinates{ style: "height: #{pos.q() *u}px " }
13
+ .StockCoordinates{ style: "height: #{pos.q() *pos.purse.height}px " }
14
14
  .grid= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock, position: pos
15
15
 
16
16
  .Origin{ style: "left: #{ ( nearest_strike - stock.last )* u}px" }
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>
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
  .StockCoordinatesW
9
- .StockCoordinates{ style: "height: #{@position.purse.height}px " }
9
+ .StockCoordinates{ style: "height: #{@position.q * @position.purse.height}px " }
10
10
 
11
11
  .grid= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock, position: pos
12
12
 
@@ -14,10 +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}; border-right: #{border};" }
21
- .Position
22
- .MaxGain{ style: "width: #{pos.max_gain * u}px" }
20
+ .PositionW{ class: pos.strategy.kind, style: "width: #{width}; left: #{left}; " }
21
+ .Position{ style: " border-right: #{border}; " }
22
+ .MaxGain{ style: "width: #{pos.max_gain * u}px" }
23
+ .select= button_to 'select', prepare2_position_path(pos.id)
23
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