iron_warbler 2.0.7.21 → 2.0.7.23
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/iron_warbler/application.css +12 -0
- data/app/assets/stylesheets/iron_warbler/positions.scss +2 -0
- data/app/assets/stylesheets/iron_warbler/positions_gameui.scss +11 -0
- data/app/assets/stylesheets/iron_warbler/purses_gameui.scss +6 -2
- data/app/assets/stylesheets/iron_warbler/purses_summary.scss +98 -0
- data/app/assets/stylesheets/iron_warbler/utils.scss +4 -0
- data/app/controllers/iro/alerts_controller.rb +2 -0
- data/app/controllers/iro/application_controller.rb +13 -0
- data/app/controllers/iro/positions_controller.rb +197 -23
- data/app/controllers/iro/purses_controller.rb +60 -6
- data/app/controllers/iro/stocks_controller.rb +30 -18
- data/app/controllers/iro/strategies_controller.rb +12 -1
- data/app/models/iro/alert.rb +1 -0
- data/app/models/iro/option.rb +1 -0
- data/app/models/iro/position.rb +124 -56
- data/app/models/iro/purse.rb +15 -4
- data/app/models/iro/stock.rb +3 -0
- data/app/models/iro/strategy.rb +122 -27
- data/app/models/tda/option.rb +3 -3
- data/app/views/iro/_main_header.haml +28 -17
- data/app/views/iro/application/home.haml +6 -1
- data/app/views/iro/positions/_form.haml +1 -2
- data/app/views/iro/positions/_gameui_covered_call.haml +10 -13
- data/app/views/iro/positions/_gameui_covered_call.haml-bk +8 -0
- data/app/views/iro/positions/_gameui_long_debit_call_spread.haml +5 -4
- data/app/views/iro/positions/_gameui_short_debit_put_spread.haml +5 -4
- data/app/views/iro/positions/_header.haml +2 -2
- data/app/views/iro/positions/_header_covered_call.haml +7 -1
- data/app/views/iro/positions/_header_long_debit_call_spread.haml +19 -1
- data/app/views/iro/positions/_prepare_covered_call.haml +25 -0
- data/app/views/iro/positions/_prepare_long_debit_call_spread.haml +23 -0
- data/app/views/iro/positions/_prepare_short_debit_put_spread.haml +23 -0
- data/app/views/iro/positions/_table.haml +33 -24
- data/app/views/iro/positions/prepare.haml +24 -0
- data/app/views/iro/positions/roll-cc.haml-bk +40 -0
- data/app/views/iro/positions/roll.haml-trash +42 -0
- data/app/views/iro/purses/_form.haml +9 -0
- data/app/views/iro/purses/_form_extra_fields.haml +25 -13
- data/app/views/iro/purses/_header.haml +15 -16
- data/app/views/iro/purses/_summary.haml +69 -0
- data/app/views/iro/purses/gameui.haml +12 -7
- data/app/views/iro/purses/index.haml +3 -1
- data/app/views/iro/purses/show.haml +5 -1
- data/app/views/iro/stocks/_form.haml +5 -0
- data/app/views/iro/stocks/_grid_is_long.haml +2 -2
- data/app/views/iro/stocks/_grid_is_short.haml +2 -2
- data/app/views/iro/stocks/index.haml +3 -2
- data/app/views/iro/strategies/_form.haml +12 -6
- data/app/views/iro/strategies/_show.haml +3 -3
- data/app/views/iro/strategies/_table.haml +15 -6
- data/app/views/iro/strategies/show.haml +14 -0
- data/app/views/layouts/iro/application.haml +4 -0
- data/config/routes.rb +6 -2
- metadata +13 -5
- data/app/views/iro/positions/roll.haml +0 -83
- data/app/views/iro/positions/trash/_header_short_debit_put_spread.haml +0 -9
- /data/app/jobs/{tda_job.rb → tda_job.rb-bk} +0 -0
@@ -2,7 +2,7 @@
|
|
2
2
|
- pos = position
|
3
3
|
- stock = pos.stock
|
4
4
|
- nearest_strike = stock.last.round
|
5
|
-
- u =
|
5
|
+
- u = pos.purse.unit # pixels per dollar
|
6
6
|
|
7
7
|
.collapse-expand.d-flex{ id: "gameui-pos-#{pos.id}" }
|
8
8
|
[<>]
|
@@ -10,8 +10,8 @@
|
|
10
10
|
.a
|
11
11
|
= render "/iro/positions/header_#{pos.strategy.kind}", pos: pos
|
12
12
|
.StockCoordinatesW
|
13
|
-
.StockCoordinates{ style: "height: #{pos.
|
14
|
-
= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock
|
13
|
+
.StockCoordinates{ style: "height: #{pos.q() *u}px " }
|
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}
|
@@ -19,9 +19,10 @@
|
|
19
19
|
|
20
20
|
- left = "#{ ( pos.outer_strike - stock.last ) * u}px"
|
21
21
|
- width = "#{ ( pos.inner_strike - pos.outer_strike ) * u}px"
|
22
|
-
.PositionW{ style: "left: #{left}; width: #{width}; " }
|
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
|
+
.RollGuide
|
25
26
|
|
26
27
|
- if pos.net_amount >= 0
|
27
28
|
.Net.NetPositive{ style: "width: #{ (pos.net_amount / 100) * u }px; right: 0" }
|
@@ -2,7 +2,7 @@
|
|
2
2
|
- pos = position
|
3
3
|
- stock = pos.stock
|
4
4
|
- nearest_strike = stock.last.round
|
5
|
-
- u =
|
5
|
+
- u = pos.purse.unit # pixels per dollar
|
6
6
|
|
7
7
|
|
8
8
|
.collapse-expand.d-flex{ id: "gameui-pos-#{pos.id}" }
|
@@ -11,8 +11,8 @@
|
|
11
11
|
.a
|
12
12
|
= render "/iro/positions/header_#{pos.strategy.kind}", pos: pos
|
13
13
|
.StockCoordinatesW
|
14
|
-
.StockCoordinates{ style: "height: #{pos.
|
15
|
-
= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock
|
14
|
+
.StockCoordinates{ style: "height: #{pos.q() *u}px " }
|
15
|
+
.grid= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock, position: pos
|
16
16
|
|
17
17
|
.Origin{ style: "left: #{ ( nearest_strike - stock.last )* u}px" }
|
18
18
|
.label Last: #{pp_amount stock.last}
|
@@ -21,9 +21,10 @@
|
|
21
21
|
-## these are different
|
22
22
|
- left = "#{ ( stock.last - pos.outer_strike ) * u}px"
|
23
23
|
- width = "#{ ( pos.outer_strike - pos.inner_strike ) * u}px"
|
24
|
-
.PositionW{ style: "left: #{left}; width: #{width}; " }
|
24
|
+
.PositionW{ class: pos.strategy.kind, style: "left: #{left}; width: #{width}; " }
|
25
25
|
.Position
|
26
26
|
.MaxGain{ style: "width: #{pos.max_gain * u}px" }
|
27
|
+
.RollGuide
|
27
28
|
|
28
29
|
- if pos.net_amount >= 0
|
29
30
|
.Net.NetPositive{ style: "width: #{ (pos.net_amount / 100) * u }px; right: 0" }
|
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
.positions--header.maxwidth
|
3
3
|
= pos
|
4
|
-
= link_to '[roll]',
|
5
|
-
= link_to '[~]', edit_position_path(pos)
|
4
|
+
= link_to '[roll]', prepare_to_roll_position_path(pos) if pos.persisted?
|
5
|
+
= link_to '[~]', edit_position_path(pos) if pos.persisted?
|
6
6
|
-# = render "/iro/positions/header_#{pos.strategy.kind}", pos: pos
|
@@ -1,6 +1,12 @@
|
|
1
1
|
|
2
|
-
|
2
|
+
- collapse_key ||= pos.id
|
3
|
+
%i.fa.fa-expand.collapse-expand.floaty-collapse{ id: "gameui-pos-detail-#{collapse_key}" }
|
3
4
|
.maxwidth
|
4
5
|
%ul.m-0.p-0
|
6
|
+
- if !pos.persisted?
|
7
|
+
%li <b>expires_on:</b> #{pos.expires_on}
|
8
|
+
%li <b>inner_strike:</b> #{pp_amount pos.inner_strike}
|
9
|
+
%li <b>next_gain_loss_amount:</b> #{pp_amount pos.next_gain_loss_amount}
|
10
|
+
|
5
11
|
%li <b>begin_inner_price:</b> #{pp_amount pos.begin_inner_price}
|
6
12
|
%li <b>Net:</b> #{pp_amount pos.net_amount} <i>#{pp_percent pos.net_percent}</i>
|
@@ -1,14 +1,32 @@
|
|
1
1
|
|
2
2
|
|
3
3
|
-## Same file for the spreads
|
4
|
-
|
4
|
+
- collapse_key ||= pos.id
|
5
|
+
%i.fa.fa-expand.collapse-expand.floaty-collapse{ id: "gameui-pos-detail-#{collapse_key}" }
|
5
6
|
.maxwidth
|
6
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}
|
11
|
+
%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
|
+
<i>#{pp_percent pos.next_gain_loss_amount/pos.max_loss*-1}</i>
|
15
|
+
|
7
16
|
%li <b>outer,inner_strike:</b> #{pp_amount pos.outer_strike} -> #{pp_amount pos.inner_strike}
|
8
17
|
%li
|
9
18
|
<b>begin_outer,inner_price:</b> #{pp_amount pos.begin_outer_price} -> #{pp_amount pos.begin_inner_price}
|
10
19
|
|
11
20
|
-## yes *100
|
12
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
|
+
|
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}
|
13
31
|
- ## no *100
|
14
32
|
%li <b>Net:</b> #{pp_amount pos.net_amount} :: #{pp_amount pos.net_amount * pos.q} <i>#{pp_percent pos.net_percent}</i>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
- u = pos.purse.unit # 50 ## pixels per dollar
|
4
|
+
- strategy = pos.strategy
|
5
|
+
- nearest_strike = pos.stock.last.round
|
6
|
+
- stock = pos.stock
|
7
|
+
|
8
|
+
|
9
|
+
.StockCoordinatesW
|
10
|
+
.StockCoordinates{ style: "height: #{@position.purse.height}px " }
|
11
|
+
|
12
|
+
.grid= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock, position: pos
|
13
|
+
|
14
|
+
.Origin{ style: "left: #{ ( nearest_strike - pos.stock.last )* u}px" }
|
15
|
+
.label
|
16
|
+
Last:
|
17
|
+
= pos.stock.last
|
18
|
+
- amnt = pos.next_gain_loss_amount
|
19
|
+
-# - byebug
|
20
|
+
- border = amnt >= 0 ? "#{amnt * u}px solid green" : "#{amnt * -1 * u}px solid red"
|
21
|
+
- width = "#{ pos.begin_inner_price * u}px"
|
22
|
+
- left = "#{ (pos.stock.last - pos.inner_strike - pos.begin_inner_price) * u}px"
|
23
|
+
.PositionW{ style: "width: #{width}; left: #{left}; border-right: #{border};" }
|
24
|
+
.Position
|
25
|
+
.c
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
- u = pos.purse.unit # 50 ## pixels per dollar
|
3
|
+
- strategy = pos.strategy
|
4
|
+
- nearest_strike = pos.stock.last.round
|
5
|
+
- stock = pos.stock
|
6
|
+
|
7
|
+
|
8
|
+
.StockCoordinatesW
|
9
|
+
.StockCoordinates{ style: "height: #{@position.purse.height}px " }
|
10
|
+
|
11
|
+
.grid= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock, position: pos
|
12
|
+
|
13
|
+
.Origin{ style: "left: #{ ( nearest_strike - pos.stock.last )* u}px" }
|
14
|
+
.label Last: #{pos.stock.last }
|
15
|
+
|
16
|
+
- amnt = pos.next_gain_loss_amount
|
17
|
+
- border = amnt >= 0 ? "#{amnt * u}px solid green" : "#{amnt * -1 * u}px solid red"
|
18
|
+
- width = "#{ ( pos.inner_strike - pos.outer_strike ) * u}px"
|
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" }
|
23
|
+
.c
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
- u = pos.purse.unit # 50 ## pixels per dollar
|
3
|
+
- strategy = pos.strategy
|
4
|
+
- nearest_strike = pos.stock.last.round
|
5
|
+
- stock = pos.stock
|
6
|
+
|
7
|
+
|
8
|
+
.StockCoordinatesW
|
9
|
+
.StockCoordinates{ style: "height: #{@position.purse.height}px " }
|
10
|
+
|
11
|
+
.grid= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock, position: pos
|
12
|
+
|
13
|
+
.Origin{ style: "left: #{ ( nearest_strike - pos.stock.last )* u}px" }
|
14
|
+
.label Last: #{pos.stock.last }
|
15
|
+
|
16
|
+
- amnt = pos.next_gain_loss_amount
|
17
|
+
- border = amnt >= 0 ? "#{amnt * u}px solid green" : "#{amnt * -1 * u}px solid red"
|
18
|
+
- width = "#{ ( pos.outer_strike - pos.inner_strike ) * u}px"
|
19
|
+
- left = "#{ ( pos.stock.last - pos.outer_strike ) * u}px"
|
20
|
+
.PositionW{ style: "width: #{width}; left: #{left}; border-right: #{border};" }
|
21
|
+
.Position
|
22
|
+
.MaxGain{ style: "width: #{pos.max_gain * u}px" }
|
23
|
+
.c
|
@@ -6,6 +6,8 @@
|
|
6
6
|
%thead
|
7
7
|
%tr
|
8
8
|
%th
|
9
|
+
%th.ticker
|
10
|
+
.a Stock
|
9
11
|
%th
|
10
12
|
.status
|
11
13
|
Status
|
@@ -13,10 +15,10 @@
|
|
13
15
|
Expires on
|
14
16
|
%br
|
15
17
|
Strategy
|
16
|
-
%th.
|
17
|
-
.a Stock
|
18
|
+
%th.q Q
|
18
19
|
%th.strikes
|
19
|
-
.a outer_strike, inner_strike
|
20
|
+
-# .a outer_strike, inner_strike
|
21
|
+
Strike
|
20
22
|
%th.begin_price
|
21
23
|
.a Begin outer price, delta
|
22
24
|
%th.max-loss Max Loss
|
@@ -52,34 +54,38 @@
|
|
52
54
|
-# %hr
|
53
55
|
.h-50px
|
54
56
|
|
57
|
+
-## tr
|
55
58
|
%tr{ class: [ position.strategy.kind, position.strategy.long_or_short ] }
|
59
|
+
|
56
60
|
%td.actions
|
57
|
-
.
|
61
|
+
= position.status
|
62
|
+
.d-flex
|
58
63
|
= button_to 'x', position_path(position), method: :delete, data: { confirm: 'Are you sure?' }
|
59
64
|
= link_to '[~]', edit_position_path(position)
|
60
|
-
= link_to '[
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
= render '/iro/positions/reasons', reasons: position.next_reasons
|
65
|
+
= link_to '[dup]', duplicate_position_path(position)
|
66
|
+
.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
70
|
|
71
|
+
%td.ticker
|
72
|
+
= position.stock.ticker
|
67
73
|
|
68
|
-
%td.status.strategy.w-200px
|
69
|
-
= position.status
|
70
74
|
%br
|
71
|
-
= position.
|
72
|
-
|
75
|
+
= pp_amount position.stock.last
|
76
|
+
|
77
|
+
%td.status.strategy.w-200px
|
78
|
+
|
79
|
+
%b
|
80
|
+
= position.expires_on.to_datetime.strftime("%b %d")
|
81
|
+
[#{ ( position.expires_on.to_date - Time.now.to_date ).to_i } DTE]
|
73
82
|
%br
|
74
83
|
%i.fa.fa-compress.collapse-expand{ id: "ce-pos-reasons-#{position.id}" }
|
75
84
|
#{position.strategy}
|
76
85
|
= render '/iro/strategies/show', strategy: position.strategy
|
77
86
|
|
78
|
-
%td.
|
79
|
-
|
80
|
-
<b>(#{position.quantity})</b>
|
81
|
-
%br
|
82
|
-
= pp_amount position.stock.last
|
87
|
+
%td.q
|
88
|
+
<b>#{position.quantity}</b>
|
83
89
|
%td.strikes
|
84
90
|
.long-or-short-item
|
85
91
|
.outer-strike= pp_amount position.outer_strike
|
@@ -94,9 +100,9 @@
|
|
94
100
|
= pp_amount position.begin_inner_price
|
95
101
|
<b>D</b> #{pp_delta position.begin_inner_delta}
|
96
102
|
%td
|
97
|
-
.max-loss= pp_amount position.max_loss * pos.q, precision: 0
|
103
|
+
.max-loss= pp_amount position.max_loss * pos.q * 100, precision: 0
|
98
104
|
%td
|
99
|
-
.max-gain= pp_amount position.max_gain * pos.q, precision: 0
|
105
|
+
.max-gain= pp_amount position.max_gain * pos.q * 100, precision: 0
|
100
106
|
.max-gainp
|
101
107
|
-# = pp_percent( -1 * position.max_gain / position.max_loss ) rescue '-' # undef. for covered calls
|
102
108
|
|
@@ -109,7 +115,7 @@
|
|
109
115
|
= pp_amount position.end_inner_price
|
110
116
|
<b>D</b> #{pp_delta position.end_inner_delta}
|
111
117
|
%td.net
|
112
|
-
.a= pp_amount position.net_amount * pos.q, precision: 0 rescue '@TODO'
|
118
|
+
.a= pp_amount position.net_amount * pos.q * 100, precision: 0 rescue '@TODO'
|
113
119
|
.a <i>#{pp_percent position.net_amount / position.max_gain rescue '@TODO'}</i>
|
114
120
|
%td.breakeven
|
115
121
|
= pp_amount pos.breakeven rescue '@TODO'
|
@@ -117,8 +123,11 @@
|
|
117
123
|
|
118
124
|
|
119
125
|
%td.should_rollp
|
120
|
-
<i> #{pp_percent position.
|
121
|
-
%td.next_position
|
126
|
+
<i> #{pp_percent position.rollp, precision: 0}</i>
|
127
|
+
%td.next_position
|
128
|
+
- if position.next_reasons.present?
|
129
|
+
%i.fa.fa-expand.collapse-expand{ id: "pos-reasons-#{position.id}" } reasons
|
130
|
+
= render '/iro/positions/reasons', reasons: position.next_reasons
|
122
131
|
.a= position.next_symbol
|
123
132
|
.a= position.next_delta
|
124
133
|
.a
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
- u = @position.purse.unit # 50 ## pixels per dollar
|
3
|
+
- strategy = @position.strategy
|
4
|
+
- pos = @position
|
5
|
+
- nearest_strike = pos.stock.last.round
|
6
|
+
- stock = pos.stock
|
7
|
+
|
8
|
+
.positions--prepare
|
9
|
+
= render '/iro/purses/header', purse: pos.purse
|
10
|
+
|
11
|
+
.purses-gameuiW{ data: { margin: { left: u*@n_dollars } } }
|
12
|
+
.purses-gameui
|
13
|
+
.purses-gameuiC{ style: "margin-left: #{u*@n_dollars}px; width: 100% " }
|
14
|
+
|
15
|
+
= render "/iro/positions/gameui_#{pos.strategy.kind}", position: pos
|
16
|
+
|
17
|
+
- @positions.each_with_index do |pos, idx|
|
18
|
+
.reviewing
|
19
|
+
= render "/iro/positions/header_#{pos.strategy.kind}", pos: pos, collapse_key: 'roll'
|
20
|
+
= render "/iro/positions/prepare_#{pos.strategy.kind}", pos: pos
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
- u = @position.purse.unit # 50 ## pixels per dollar
|
3
|
+
- strategy = @position.strategy
|
4
|
+
- pos = @position
|
5
|
+
- nearest_strike = pos.stock.last.round
|
6
|
+
- stock = pos.stock
|
7
|
+
|
8
|
+
= render '/iro/purses/header', purse: pos.purse
|
9
|
+
|
10
|
+
.purses-gameuiW{ data: { margin: { left: u*@n_dollars } } }
|
11
|
+
.purses-gameui
|
12
|
+
.purses-gameuiC{ style: "margin-left: #{u*@n_dollars}px; width: 100% " }
|
13
|
+
|
14
|
+
= render "/iro/positions/gameui_#{pos.strategy.kind}", position: pos
|
15
|
+
|
16
|
+
- @positions.each_with_index do |pos, idx|
|
17
|
+
- stock = pos.stock
|
18
|
+
- nearest_strike = pos.stock.last.round
|
19
|
+
|
20
|
+
.reviewing
|
21
|
+
= render "/iro/positions/header_#{pos.strategy.kind}", pos: pos, collapse_key: 'roll'
|
22
|
+
.StockCoordinatesW
|
23
|
+
.StockCoordinates{ style: "height: #{@position.purse.height}px " }
|
24
|
+
|
25
|
+
= render "/iro/stocks/grid_#{pos.strategy.long_or_short}", stock: stock, position: pos
|
26
|
+
|
27
|
+
.Origin{ style: "left: #{ ( nearest_strike - pos.stock.last )* u}px" }
|
28
|
+
.label
|
29
|
+
Last:
|
30
|
+
= pos.stock.last
|
31
|
+
- amnt = pos.gain_loss_amount
|
32
|
+
- border = amnt >= 0 ? "#{amnt * u}px solid green" : "#{amnt * -1 * u}px solid red"
|
33
|
+
- width = "#{ pos.begin_inner_price * u}px"
|
34
|
+
- left = "#{ (pos.stock.last - pos.inner_strike - pos.begin_inner_price) * u}px"
|
35
|
+
.PositionW{ style: "width: #{width}; left: #{left}; border-right: #{border};" }
|
36
|
+
.Position
|
37
|
+
.c
|
38
|
+
|
39
|
+
|
40
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
-# .StockCoordinatesW
|
4
|
+
-# .StockCoordinates{ style: "height: #{pos.purse.height}px " }
|
5
|
+
|
6
|
+
-# .grid-mark.mark0
|
7
|
+
-# .label= nearest_strike
|
8
|
+
-# - (1...@n_dollars).each_with_index do |idx|
|
9
|
+
-# .grid-mark{ class: "mark#{idx}", style: "left: -#{idx * u}px" }
|
10
|
+
-# .label
|
11
|
+
-# = nearest_strike + idx
|
12
|
+
-# .grid-mark{ class: "mark-#{idx}", style: "left: #{idx * u}px" }
|
13
|
+
-# .label
|
14
|
+
-# = nearest_strike - idx
|
15
|
+
|
16
|
+
-# .Origin{ style: "left: #{ ( nearest_strike - stock.last )* u}px" }
|
17
|
+
-# .label Last: #{pp_amount stock.last}
|
18
|
+
-# .c
|
19
|
+
|
20
|
+
-# - left = "#{ (stock.last - pos.inner_strike) * u}px"
|
21
|
+
-# - width = "0px"
|
22
|
+
-# .PositionW{ style: "left: #{left} ; width: #{width} " }
|
23
|
+
-# .Position
|
24
|
+
-# .PositionC
|
25
|
+
|
26
|
+
-# - if pos.net_amount >= 0
|
27
|
+
-# .Net.NetPositive{ style: "width: #{ (pos.net_amount / 100) * u }px; right: 0" }
|
28
|
+
-# .label
|
29
|
+
-# net
|
30
|
+
-# = pp_amount pos.net_amount
|
31
|
+
-# - else
|
32
|
+
-# .Net.NetNegative{ style: "width: #{ (-1 * pos.net_amount / 100) * u }px; left: 100%" }
|
33
|
+
-# .label
|
34
|
+
-# net
|
35
|
+
-# = pp_amount pos.net_amount
|
36
|
+
|
37
|
+
-# .Breakeven{ style: "width: #{ pos.begin_inner_price * u }px" }
|
38
|
+
-# .label
|
39
|
+
-# Breakeven:
|
40
|
+
-# = pos.begin_inner_price
|
41
|
+
-# .c
|
42
|
+
|
@@ -2,9 +2,18 @@
|
|
2
2
|
.iro-purses--form
|
3
3
|
= form_for purse do |f|
|
4
4
|
.flex-row
|
5
|
+
.field
|
6
|
+
%label stock
|
7
|
+
= f.select :stock_id, options_for_select( @stocks_list, selected: purse.stock_id )
|
8
|
+
|
5
9
|
.field
|
6
10
|
%label Slug
|
7
11
|
= f.text_field :slug
|
12
|
+
|
13
|
+
.field
|
14
|
+
%label available amount
|
15
|
+
= f.number_field :available_amount
|
16
|
+
|
8
17
|
= render '/iro/purses/form_extra_fields', f: f
|
9
18
|
.actions
|
10
19
|
= f.submit
|
@@ -1,14 +1,26 @@
|
|
1
1
|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
2
|
+
.d-flex.flex-wrap
|
3
|
+
%label unit
|
4
|
+
= f.number_field :unit
|
5
|
+
px/usd
|
6
|
+
|
7
|
+
|
8
|
+
-# %label height
|
9
|
+
-# = f.number_field :height
|
10
|
+
-# px
|
11
|
+
-#
|
12
|
+
|
13
|
+
%label mark_every_n_usd
|
14
|
+
= f.number_field :mark_every_n_usd, step: 0.01
|
15
|
+
|
16
|
+
|
17
|
+
%label n_next_positions
|
18
|
+
= f.number_field :n_next_positions
|
19
|
+
|
20
|
+
|
21
|
+
%label summary_scale
|
22
|
+
= f.number_field :summary_scale, step: 0.0001, style: "width: 120px"
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
@@ -1,22 +1,21 @@
|
|
1
1
|
|
2
2
|
- purse ||= @purse
|
3
|
-
.maxwidth
|
4
|
-
.header
|
5
|
-
%h5.title
|
6
|
-
Purse `#{purse.slug}`
|
7
|
-
= link_to '[~]', edit_purse_path(purse)
|
8
|
-
= link_to '[view GameUI]', gameui_purse_path(purse)
|
9
|
-
= link_to '[view]', purse_path(purse)
|
10
|
-
(#{purse.positions.length})
|
11
3
|
|
12
|
-
|
13
|
-
|
14
|
-
|
4
|
+
.header
|
5
|
+
%h5.title
|
6
|
+
Purse `#{purse.slug}`
|
7
|
+
= link_to '[~]', edit_purse_path(purse)
|
8
|
+
= link_to '[view]', purse_path(purse)
|
9
|
+
= link_to '[gameUI]', gameui_purse_path(purse)
|
10
|
+
(#{purse.positions.length})
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
= render '/iro/purses/form_extra_fields', f: f
|
20
|
-
= f.submit '>'
|
12
|
+
= link_to '[+position]', new_position_path({ purse_id: purse.id })
|
13
|
+
-# = link_to '[+long]', new_position_path({ purse_id: purse.id, long_or_short: Iro::Strategy::LONG })
|
14
|
+
= link_to '[+short]', new_position_path({ purse_id: purse.id, long_or_short: Iro::Strategy::SHORT })
|
21
15
|
|
16
|
+
- if true || params[:template] == 'gameui'
|
17
|
+
.mini-inputs
|
18
|
+
= form_for purse, html: { class: 'd-flex' } do |f|
|
19
|
+
= render '/iro/purses/form_extra_fields', f: f
|
20
|
+
= f.submit '>'
|
22
21
|
%br
|
@@ -0,0 +1,69 @@
|
|
1
|
+
|
2
|
+
- u = @purse.unit
|
3
|
+
- s_mult = @purse.summary_scale
|
4
|
+
- collapse_key ||= nil
|
5
|
+
|
6
|
+
%i.fa.fa-expand.collapse-expand{ id: "pursesSummary_#{collapse_key}", style: "margin-left: -1em;" } Summary
|
7
|
+
.PurseSummaryW
|
8
|
+
|
9
|
+
.PurseSummary
|
10
|
+
-## loss
|
11
|
+
.summary-amount
|
12
|
+
.max-gl.long.loss{ style: "height: #{@max_loss_long *-1*s_mult*u}px" }
|
13
|
+
.max-gl.short.loss{ style: "height: #{@max_loss_short *-1*s_mult*u}px" }
|
14
|
+
- if @loss_long
|
15
|
+
.net-gl.loss.long.loss-long{ style: "height: #{@loss_long *-1*s_mult*u}px" }
|
16
|
+
- if @loss_short
|
17
|
+
.net-gl.loss.short.loss-short{ style: "height: #{@loss_short *-1*s_mult*u}px" }
|
18
|
+
|
19
|
+
.summary-delta
|
20
|
+
.begin.long{ style: "height: #{@begin_delta_long *s_mult*10000*u}px" }
|
21
|
+
.begin.short{ style: "height: #{@begin_delta_short *s_mult*10000*u}px" }
|
22
|
+
.end.long{ style: "height: #{@end_delta_long *s_mult*10000*u}px" }
|
23
|
+
.end.short{ style: "height: #{@end_delta_short *s_mult*10000*u}px" }
|
24
|
+
|
25
|
+
-## gain
|
26
|
+
.summary-amount
|
27
|
+
.max-gl.long.gain{ style: "height: #{@max_gain_long *s_mult*u}px" }
|
28
|
+
.max-gl.short.gain{ style: "height: #{@max_gain_short *s_mult*u}px" }
|
29
|
+
- if @gain_long
|
30
|
+
.net-gl.gain.long.gain-long{ style: "height: #{@gain_long *s_mult*u}px" }
|
31
|
+
- if @gain_short
|
32
|
+
.net-gl.gain.short.gain-short{ style: "height: #{@gain_short *s_mult*u}px" }
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
.legendW
|
40
|
+
.legend
|
41
|
+
%ul
|
42
|
+
%li
|
43
|
+
<b>exposure long:</b> #{pp_amount @max_loss_long *-1}
|
44
|
+
<b>short:</b> #{pp_amount @max_loss_short *-1}
|
45
|
+
%li
|
46
|
+
<b>max loss long:</b> #{pp_amount [ @max_loss_long + @max_gain_short, 0].min }
|
47
|
+
<b>short:</b> #{pp_amount [ @max_loss_short + @max_gain_long, 0].min }
|
48
|
+
%li.gray
|
49
|
+
<b>max gain long:</b> #{pp_amount @max_gain_long}
|
50
|
+
<b>short:</b> #{pp_amount @max_gain_short}
|
51
|
+
|
52
|
+
%li
|
53
|
+
%hr
|
54
|
+
<b>gain long:</b> #{pp_amount @gain_long}
|
55
|
+
<b>short:</b> #{pp_amount @gain_short}
|
56
|
+
%li
|
57
|
+
<b>loss long:</b> #{pp_amount @loss_long}
|
58
|
+
<b>short:</b> #{pp_amount @loss_short}
|
59
|
+
|
60
|
+
%li
|
61
|
+
%hr
|
62
|
+
<b>begin D long:</b> #{pp_delta @begin_delta_long}
|
63
|
+
<b>short:</b> #{pp_delta @begin_delta_short}
|
64
|
+
<b>net:</b> #{pp_delta @begin_delta_long - @begin_delta_short}
|
65
|
+
%li
|
66
|
+
<b>end D long:</b> #{pp_delta @end_delta_long}
|
67
|
+
<b>short:</b> #{pp_delta @end_delta_short}
|
68
|
+
<b>net:</b> #{pp_delta @end_delta_long - @end_delta_short}
|
69
|
+
|
@@ -1,12 +1,17 @@
|
|
1
1
|
|
2
|
-
= render '/iro/purses/header', purse: @purse
|
3
|
-
|
4
2
|
- u = @purse.unit
|
5
|
-
.purses-gameuiW{ data: { margin: { left: u*@n_dollars } } }
|
6
|
-
.purses-gameui
|
7
|
-
.a
|
8
3
|
|
9
|
-
|
4
|
+
.purses--gameui
|
5
|
+
.row
|
6
|
+
.col-md-6
|
7
|
+
= render '/iro/purses/header', purse: @purse
|
8
|
+
.col-md-6
|
9
|
+
= render '/iro/purses/summary', purse: @purse, collapse_key: 'views-gameui'
|
10
|
+
|
11
|
+
.purses-gameuiW{ data: { margin: { left: u*@n_dollars } } }
|
12
|
+
.purses-gameui
|
13
|
+
.purses-gameuiC{ style: "margin-left: #{u*@n_dollars}px; width: 100% " }
|
14
|
+
|
10
15
|
- @positions.each_with_index do |pos, idx|
|
11
16
|
- if idx == 0
|
12
17
|
%h4.maxwidth= pos.stock
|
@@ -15,5 +20,5 @@
|
|
15
20
|
- if pos.stock != prev_.stock
|
16
21
|
%hr
|
17
22
|
%h4.maxwidth= pos.stock
|
18
|
-
|
23
|
+
|
19
24
|
= render "/iro/positions/gameui_#{pos.strategy.kind}", position: pos
|
@@ -5,7 +5,9 @@
|
|
5
5
|
%ul
|
6
6
|
- @purses.each do |purse|
|
7
7
|
%li
|
8
|
+
.d-inline-block= button_to 'x', purse_path(purse), method: :delete, data: { confirm: 'Are you sure?' }
|
8
9
|
= link_to '[~]', edit_purse_path(purse)
|
9
10
|
= link_to purse.slug, purse_path(purse)
|
10
11
|
|
11
|
-
|
12
|
+
%hr
|
13
|
+
= render 'iro/purses/form', purse: Iro::Purse.new
|
@@ -1,4 +1,8 @@
|
|
1
1
|
|
2
2
|
.purses-show.padded
|
3
|
-
|
3
|
+
.row
|
4
|
+
.col-md-6
|
5
|
+
= render '/iro/purses/header', purse: @purse
|
6
|
+
.col-md-6
|
7
|
+
= render '/iro/purses/summary', purse: @purse, collapse_key: 'views-show'
|
4
8
|
= render '/iro/positions/table', positions: @purse.positions
|