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.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/iron_warbler/purses.scss +31 -0
- data/app/assets/stylesheets/iron_warbler/utils.scss +28 -3
- data/app/controllers/iro/api/stocks_controller.rb +7 -4
- data/app/controllers/iro/positions_controller.rb +27 -21
- data/app/controllers/iro/stocks_controller.rb +19 -0
- data/app/models/iro/datapoint.rb +1 -1
- data/app/models/iro/option.rb +23 -11
- data/app/models/iro/position.rb +51 -53
- data/app/models/iro/{price_item.rb → priceitem.rb} +5 -1
- data/app/models/iro/purse.rb +9 -2
- data/app/models/iro/stock.rb +2 -0
- data/app/models/iro/strategy.rb +87 -50
- data/app/models/tda/option.rb +1 -1
- data/app/models/tda/stock.rb +1 -1
- data/app/views/iro/_main_header.haml +4 -3
- data/app/views/iro/api/stocks/index.json.jbuilder +5 -0
- data/app/views/iro/api/stocks/show.json.jbuilder +11 -0
- data/app/views/iro/api/stocks/show.json.jbuilder-bk +12 -0
- data/app/views/iro/positions/_form.haml +4 -2
- data/app/views/iro/positions/_gameui_short_credit_call_spread.haml +38 -0
- data/app/views/iro/positions/_header_short_credit_call_spread.haml +50 -0
- data/app/views/iro/positions/_new.haml +23 -0
- data/app/views/iro/positions/_prepare_short_credit_call_spread.haml +1 -0
- data/app/views/iro/purses/_form_extra_fields.haml +18 -22
- data/app/views/iro/purses/_header.haml +8 -17
- data/app/views/iro/purses/show.haml +3 -2
- data/app/views/iro/stocks/_form.haml +4 -3
- data/app/views/iro/stocks/edit.haml +4 -0
- data/app/views/iro/stocks/index.haml +21 -6
- data/app/views/iro/strategies/_form.haml +14 -11
- data/app/views/iro/strategies/_show.haml +1 -1
- data/config/routes.rb +2 -1
- data/lib/iro/engine.rb +1 -0
- data/lib/iron_warbler.rb +0 -2
- data/lib/tasks/iro_tasks.rake +2 -2
- metadata +12 -4
- data/app/views/iro/api/stocks/show.jbuilder +0 -11
data/app/models/iro/strategy.rb
CHANGED
@@ -8,56 +8,74 @@ class Iro::Strategy
|
|
8
8
|
field :slug
|
9
9
|
validates :slug, presence: true, uniqueness: true
|
10
10
|
|
11
|
-
|
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
|
24
|
-
|
25
|
-
|
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
|
40
|
+
def put_call
|
34
41
|
case kind
|
35
|
-
when
|
36
|
-
'
|
37
|
-
when
|
38
|
-
'
|
39
|
-
when KIND_SHORT_DEBIT_PUT_SPREAD
|
40
|
-
'
|
41
|
-
|
42
|
-
'
|
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 :
|
47
|
-
field :threshold_delta,
|
48
|
-
field :threshold_netp,
|
49
|
-
field :
|
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,
|
52
|
-
field :
|
53
|
-
field :
|
54
|
-
field :next_outer_strike,
|
55
|
-
field :next_spread_amount,
|
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
|
-
|
59
|
-
|
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 *
|
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 *
|
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
|
-
|
103
|
-
|
128
|
+
|
129
|
+
def net_amount_covered_call p
|
130
|
+
( p.inner.begin_price - p.inner.end_price )
|
104
131
|
end
|
105
|
-
def
|
106
|
-
p.outer.
|
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 :
|
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
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
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
|
-
|
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
|
data/app/models/tda/option.rb
CHANGED
data/app/models/tda/stock.rb
CHANGED
@@ -4,9 +4,9 @@
|
|
4
4
|
|
5
5
|
%i.fa.fa-compress.collapse-expand#collapseHeaderTrading
|
6
6
|
Wco Trading
|
7
|
-
.
|
8
|
-
.d-flex
|
9
|
-
%ul
|
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,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
|
-
|
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:
|
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 -
|
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 -
|
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
|
+
-#
|
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} <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
|
+
<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
|
-
.
|
3
|
-
%label unit
|
4
|
-
= f.number_field :unit
|
5
|
-
px/usd
|
6
|
-
|
7
|
-
%label height
|
8
|
-
= f.number_field :height
|
9
|
-
px/q
|
10
|
-
|
2
|
+
.purses--form-extra-fields
|
11
3
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
+
|
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
|
-
|
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
|
-
|
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
|
-
|
17
|
-
|
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
|
@@ -1,10 +1,25 @@
|
|
1
1
|
|
2
|
-
.stocks--index.
|
2
|
+
.stocks--index.maxwidth
|
3
3
|
.maxwidth
|
4
4
|
%h5 Stocks
|
5
5
|
|
6
|
-
%
|
7
|
-
|
8
|
-
%
|
9
|
-
|
10
|
-
|
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
|
-
|
28
|
-
= f.number_field :
|
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 :
|
31
|
-
= f.number_field :
|
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
|
-
|
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>
|
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
|
-
|
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