ish_manager 0.1.8.450 → 0.1.8.451
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/javascripts/ish_manager/iro.js +54 -39
- data/app/assets/javascripts/ish_manager/iro0.js +68 -0
- data/app/assets/stylesheets/ish_manager/application.scss +1 -0
- data/app/assets/stylesheets/ish_manager/iro.scss +39 -9
- data/app/assets/stylesheets/ish_manager/iro1.scss +117 -0
- data/app/controllers/ish_manager/iro_option_gets_controller.rb +127 -0
- data/app/controllers/ish_manager/iro_positions_controller.rb +0 -9
- data/app/controllers/ish_manager/iro_purses_controller.rb +46 -4
- data/app/controllers/ish_manager/iro_watches_controller.rb +1 -0
- data/app/views/ish_manager/application/_main_header_admin.haml +2 -2
- data/app/views/ish_manager/email_templates/_acknowledgement_of_document_receipt.html.erb +23 -0
- data/app/views/ish_manager/email_templates/_marketing_ror_3.html.erb +25 -0
- data/app/views/ish_manager/email_templates/_marketing_ror_4.html.erb +25 -0
- data/app/views/ish_manager/email_templates/_marketing_ror_5.html.erb +17 -0
- data/app/views/ish_manager/email_templates/_rec_resume_shared_with_you.html.erb +39 -0
- data/app/views/ish_manager/email_templates/_support_ticket_created.html.erb +26 -0
- data/app/views/ish_manager/iro_option_gets/_form.haml +10 -0
- data/app/views/ish_manager/iro_positions/_form.haml +73 -37
- data/app/views/ish_manager/iro_purses/_form.haml +3 -0
- data/app/views/ish_manager/iro_purses/_header.haml +37 -0
- data/app/views/ish_manager/iro_purses/_show.haml +99 -0
- data/app/views/ish_manager/iro_purses/_show_gameui_0.haml +62 -0
- data/app/views/ish_manager/iro_purses/_show_gameui_1.haml +78 -0
- data/app/views/ish_manager/iro_purses/show.haml +3 -114
- data/app/views/ish_manager/iro_purses/show_gameui.haml +4 -163
- data/app/views/ish_manager/iro_watches/index.haml +10 -1
- data/app/views/ish_manager/iro_watches/max_pain.haml +21 -0
- data/config/routes.rb +8 -3
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba59c20a5d3690b618e806310714a938247c560185b157c23864de32b5fd0d56
|
4
|
+
data.tar.gz: a4b2b75980173a70c910334529756d7d0b665b179ef14331be373305d2007c19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 406373e09e49ebf65537a4e610f28c335e0c382abbed7cb8b258a5de2d2046acfb5c46fd6ceffc0da33c5965cd5de031489c5368c2e8a0fb321c9157ac2611f8
|
7
|
+
data.tar.gz: bfe9e7d67f626cbd26154fdbd1e1080774ff757754d1c84fa9b8d57f09f1a47dfd31f4d8650fa109df16ceda727b8d1370afa4185deb0e28558c1cd7e1503932
|
@@ -1,59 +1,51 @@
|
|
1
1
|
|
2
2
|
$(document).ready(function () {
|
3
3
|
|
4
|
-
const
|
5
|
-
|
4
|
+
const dollarWidth = $('.gameui-positions').data('ccDollarwidth')
|
5
|
+
const origin = $('.gameui-positions').data('ccOrigin')
|
6
|
+
const cUS = $(".gameui-positions").data('ccCus')
|
6
7
|
|
8
|
+
$(".step").css('height', `${dollarWidth * .75}px`)
|
9
|
+
$(".gameui").css('height', `${dollarWidth}px`)
|
10
|
+
$('.windW').css('left', `${dollarWidth * (origin - cUS)}px`)
|
11
|
+
$('.gameuiCUS').css('left', `${dollarWidth * (origin - cUS)}px`)
|
7
12
|
|
8
|
-
|
9
|
-
$(".gameuiW").each( function (idx, w) {
|
13
|
+
$(".elephantW").each( function (idx, w) {
|
10
14
|
// logg($(w).data(), 'data')
|
11
15
|
|
12
|
-
let ans
|
13
|
-
|
14
16
|
let ccStrike = $(w).data('ccStrike')
|
15
17
|
let ccStartPrice = $(w).data('ccStartprice') // e.g. 0.88
|
16
18
|
let ccCurrentPrice = $(w).data('ccCurrentprice')
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
})
|
22
|
-
|
23
|
-
$(
|
24
|
-
|
25
|
-
|
26
|
-
})
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
let currentAmount = ((ccStartPrice - ccCurrentPrice)*100).toPrecision(2)/100
|
36
|
-
let ccCurrentGain = ccStartPrice - ccCurrentPrice
|
37
|
-
$(w).find('.riderCurrent > .amount').html( " $" + currentAmount )
|
38
|
-
ans = `${-1*ccCurrentGain*scale}px`
|
39
|
-
$(w).find('.riderW').css('left', ans)
|
40
|
-
|
41
|
-
if (ccCurrentGain > 0) {
|
42
|
-
$(w).find('.riderCurrent').css('width', scale * ccCurrentGain )
|
19
|
+
|
20
|
+
let loss = ccCurrentPrice - ccStartPrice;
|
21
|
+
|
22
|
+
$(w).css('left', `${dollarWidth * (origin-ccStrike)}px` );
|
23
|
+
// $(w).find('.elephantW').css('width', `${dollarWidth * ccStartPrice}px` );
|
24
|
+
$(w).css('height', `${dollarWidth * ccStartPrice}px` );
|
25
|
+
$(w).find('.elephant ').css('left', `-${dollarWidth * (ccStartPrice)}px` );
|
26
|
+
$(w).find('.elephant ').css('width', `${dollarWidth * (ccStartPrice)}px` );
|
27
|
+
$(w).find('.elephant ').css('height', `${dollarWidth * (ccStartPrice)}px` );
|
28
|
+
$(w).find('.elephant ').css('border-radius', `${dollarWidth * (ccStartPrice)}px ${dollarWidth * (ccStartPrice)}px 0 0` );
|
29
|
+
$(w).find('.elephantC > .amount').html( " $" + ccStartPrice )
|
30
|
+
if (loss > 0) {
|
31
|
+
$(w).find('.elephantC ').css('left', `-${dollarWidth * (ccStartPrice - loss)}px` );
|
32
|
+
$(w).find('.elephantC ').css('width', `${dollarWidth * (ccStartPrice - loss)}px` );
|
33
|
+
$(w).find('.elephantC ').css('height', `${dollarWidth * (ccStartPrice - loss)}px` );
|
34
|
+
$(w).find('.elephantC ').css('border-radius', `${dollarWidth * (ccStartPrice - loss)}px ${dollarWidth * (ccStartPrice - loss)}px 0 0` );
|
35
|
+
$(w).find('.elephant').css('border-color', 'red');
|
36
|
+
$(w).find('.elephantC ').css('border-color', 'red');
|
43
37
|
} else {
|
44
|
-
$(w).find('.
|
45
|
-
$(w).find('.
|
46
|
-
$(w).find('.
|
47
|
-
$(w).find('.
|
38
|
+
$(w).find('.elephantC ').css('left', `-${dollarWidth * (ccCurrentPrice)}px` );
|
39
|
+
$(w).find('.elephantC ').css('width', `${dollarWidth * (ccCurrentPrice)}px` );
|
40
|
+
$(w).find('.elephantC ').css('height', `${dollarWidth * (ccCurrentPrice)}px` );
|
41
|
+
$(w).find('.elephantC ').css('border-radius', `${dollarWidth * (ccCurrentPrice)}px ${dollarWidth * (ccCurrentPrice)}px 0 0` );
|
48
42
|
}
|
49
43
|
})
|
50
44
|
|
51
45
|
|
52
46
|
|
53
47
|
$(".gameuiW.next-position").each( function (idx, w) {
|
54
|
-
logg($(w).data(), 'next-position')
|
55
|
-
|
56
|
-
let ans
|
48
|
+
// logg($(w).data(), 'next-position')
|
57
49
|
|
58
50
|
let gainp = $(w).data('ccGainp')
|
59
51
|
if (gainp > 0) {
|
@@ -65,4 +57,27 @@ $(document).ready(function () {
|
|
65
57
|
}
|
66
58
|
})
|
67
59
|
|
60
|
+
$(".recklessDefenseW").each( function(idx, w) {
|
61
|
+
let longStrike = $(w).data('ccLongstrike')
|
62
|
+
// logg(longStrike, 'longStrike')
|
63
|
+
let shortStrike = $(w).data('ccShortstrike')
|
64
|
+
let shortOpenedPrice = $(w).data('ccShortopenedprice')
|
65
|
+
let shortCurrentPrice = $(w).data('ccShortcurrentprice')
|
66
|
+
let longOpenedPrice = $(w).data('ccLongopenedprice')
|
67
|
+
let longCurrentPrice = $(w).data('ccLongcurrentprice')
|
68
|
+
|
69
|
+
$(w).css('left', `-${dollarWidth * ( origin - longStrike )}px` )
|
70
|
+
$(w).css('width', `${dollarWidth * (shortStrike - longStrike - shortOpenedPrice + longOpenedPrice )}px`)
|
71
|
+
|
72
|
+
let gainLoss = longCurrentPrice - longOpenedPrice + shortOpenedPrice - shortCurrentPrice
|
73
|
+
if (gainLoss > 0) {
|
74
|
+
$(w).find('.recklessDefenseC').css('left', `${dollarWidth * gainLoss}px`)
|
75
|
+
} else {
|
76
|
+
$(w).find('.recklessDefenseC').css('left', `${dollarWidth * gainLoss}px`)
|
77
|
+
$(w).css('border-color', 'red')
|
78
|
+
$(w).find('.recklessDefenseC').css('border-color', 'red')
|
79
|
+
}
|
80
|
+
})
|
81
|
+
|
82
|
+
|
68
83
|
})
|
@@ -0,0 +1,68 @@
|
|
1
|
+
|
2
|
+
$(document).ready(function () {
|
3
|
+
|
4
|
+
const origin = 23
|
5
|
+
scale = 200 // pixels per dollar
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
$(".gameuiW").each( function (idx, w) {
|
10
|
+
// logg($(w).data(), 'data')
|
11
|
+
|
12
|
+
let ans
|
13
|
+
|
14
|
+
let ccStrike = $(w).data('ccStrike')
|
15
|
+
let ccStartPrice = $(w).data('ccStartprice') // e.g. 0.88
|
16
|
+
let ccCurrentPrice = $(w).data('ccCurrentprice')
|
17
|
+
let cUS = $(w).data('ccCus')
|
18
|
+
|
19
|
+
$(".c-u-s").each(function (idx, elem) {
|
20
|
+
$(elem).html(cUS)
|
21
|
+
})
|
22
|
+
|
23
|
+
$(".windW").each(function (idx, elem) {
|
24
|
+
ans = ( origin - cUS ) * scale
|
25
|
+
$(elem).css('left', ans)
|
26
|
+
})
|
27
|
+
|
28
|
+
$($(w).find('.elephantW')).css('left', (origin - ccStrike)* scale )
|
29
|
+
$(w).find('.elephantC > .amount').html( " $" + ccStrike )
|
30
|
+
$(w).find('.riderStart > .amount').html( " $" + ccStartPrice )
|
31
|
+
$(w).find('.riderStart').css('width', scale * ccStartPrice )
|
32
|
+
$(w).find('.riderStart').css('left', -1 * scale * ccStartPrice )
|
33
|
+
$(w).find('.riderStart2').css('width', scale * ccStartPrice )
|
34
|
+
|
35
|
+
let currentAmount = ((ccStartPrice - ccCurrentPrice)*100).toPrecision(2)/100
|
36
|
+
let ccCurrentGain = ccStartPrice - ccCurrentPrice
|
37
|
+
$(w).find('.riderCurrent > .amount').html( " $" + currentAmount )
|
38
|
+
ans = `${-1*ccCurrentGain*scale}px`
|
39
|
+
$(w).find('.riderW').css('left', ans)
|
40
|
+
|
41
|
+
if (ccCurrentGain > 0) {
|
42
|
+
$(w).find('.riderCurrent').css('width', scale * ccCurrentGain )
|
43
|
+
} else {
|
44
|
+
$(w).find('.riderCurrent').css('display', 'none')
|
45
|
+
$(w).find('.riderCurrent2').css('display', 'block')
|
46
|
+
$(w).find('.riderCurrent2').css('width', -1 * scale * ccCurrentGain )
|
47
|
+
$(w).find('.rider').addClass('riderF')
|
48
|
+
}
|
49
|
+
})
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
$(".gameuiW.next-position").each( function (idx, w) {
|
54
|
+
logg($(w).data(), 'next-position')
|
55
|
+
|
56
|
+
let ans
|
57
|
+
|
58
|
+
let gainp = $(w).data('ccGainp')
|
59
|
+
if (gainp > 0) {
|
60
|
+
$(w).find('.elephant').css('border-width', `${gainp*200 + 1}px` )
|
61
|
+
$(w).find('.elephantLoss').css('display', 'none')
|
62
|
+
} else {
|
63
|
+
gainp = -1 * gainp
|
64
|
+
$(w).find('.elephantLoss').css('border-width', `${gainp*200 + 1}px` )
|
65
|
+
}
|
66
|
+
})
|
67
|
+
|
68
|
+
})
|
@@ -1,4 +1,14 @@
|
|
1
1
|
|
2
|
+
.iro-positions--form {
|
3
|
+
border: 1px dashed blue;
|
4
|
+
border-radius: 0.5em;
|
5
|
+
padding: 0.5em;
|
6
|
+
|
7
|
+
.field {
|
8
|
+
display: flex;
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
2
12
|
.iro-purses--form {
|
3
13
|
textarea {
|
4
14
|
min-width: 500px;
|
@@ -8,6 +18,7 @@
|
|
8
18
|
|
9
19
|
.iro-purses-show,
|
10
20
|
.iro-purses-show-gameui,
|
21
|
+
.iro-purses-show-gameui-1,
|
11
22
|
._ {
|
12
23
|
font-size: 14px;
|
13
24
|
|
@@ -31,6 +42,10 @@
|
|
31
42
|
.price {
|
32
43
|
background: cyan;
|
33
44
|
}
|
45
|
+
.to-close {
|
46
|
+
background: #333;
|
47
|
+
color: white;
|
48
|
+
}
|
34
49
|
|
35
50
|
td {
|
36
51
|
// border: 1px solid red;
|
@@ -90,11 +105,10 @@
|
|
90
105
|
font-weight: bold;
|
91
106
|
}
|
92
107
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
108
|
+
}
|
109
|
+
.iro-strategies {
|
110
|
+
display: flex;
|
111
|
+
flex-wrap: wrap;
|
98
112
|
}
|
99
113
|
.iro-strategies-edit,
|
100
114
|
.iro-strategies-new {
|
@@ -114,6 +128,21 @@
|
|
114
128
|
}
|
115
129
|
}
|
116
130
|
|
131
|
+
.iro-position-statuses-selector form {
|
132
|
+
display: flex;
|
133
|
+
margin: 1em 0 0 0;
|
134
|
+
|
135
|
+
.field {
|
136
|
+
border: 1px solid gray;
|
137
|
+
border-radius: .5em;
|
138
|
+
padding: 0 1em;
|
139
|
+
margin-right: 1em;
|
140
|
+
|
141
|
+
display: flex;
|
142
|
+
flex-direction: row-reverse;
|
143
|
+
}
|
144
|
+
}
|
145
|
+
|
117
146
|
|
118
147
|
|
119
148
|
|
@@ -124,7 +153,7 @@
|
|
124
153
|
* GameUI in Purse
|
125
154
|
* 2023-04-06 _vp_ Continue
|
126
155
|
**/
|
127
|
-
.gameuiW {
|
156
|
+
.iro-purses-show-gameui .gameuiW {
|
128
157
|
border: 1px solid #ff9966;
|
129
158
|
border-radius: 1em;
|
130
159
|
|
@@ -216,11 +245,12 @@
|
|
216
245
|
.elephantC {
|
217
246
|
// border: 10px solid black;
|
218
247
|
|
219
|
-
|
248
|
+
|
220
249
|
position: absolute;
|
221
250
|
color: #333;
|
222
251
|
background: #ddd;
|
223
252
|
display: inline-block;
|
253
|
+
z-index: 2;
|
224
254
|
|
225
255
|
.q {
|
226
256
|
border: 2px solid #eee;
|
@@ -404,8 +434,8 @@
|
|
404
434
|
position: relative;
|
405
435
|
z-index: 2;
|
406
436
|
|
407
|
-
background:
|
408
|
-
color: white;
|
437
|
+
background: yellow;
|
438
|
+
// color: white;
|
409
439
|
display: inline-block
|
410
440
|
}
|
411
441
|
|
@@ -0,0 +1,117 @@
|
|
1
|
+
|
2
|
+
.show-gameui-1 {
|
3
|
+
// background: red;
|
4
|
+
position: relative;
|
5
|
+
|
6
|
+
.gameuiCUSW {
|
7
|
+
position: absolute;
|
8
|
+
left: 50%;
|
9
|
+
top: 0;
|
10
|
+
.gameuiCUS {
|
11
|
+
position: absolute;
|
12
|
+
border-left: 2px dashed blue;
|
13
|
+
padding: 0 10px;
|
14
|
+
width: 100px;
|
15
|
+
}
|
16
|
+
}
|
17
|
+
.gameuiW {
|
18
|
+
// border: 1px solid red;
|
19
|
+
|
20
|
+
.gameui {
|
21
|
+
// border: 1px solid black;
|
22
|
+
position: relative;
|
23
|
+
border-bottom: 10px solid gray;
|
24
|
+
|
25
|
+
background: url('https://d15g8hc4183yn4.cloudfront.net/wp-content/uploads/2023/07/13184511/200x200-grid2.png');
|
26
|
+
background-position: 50% center;
|
27
|
+
width: 100%;
|
28
|
+
|
29
|
+
.gameuiC {
|
30
|
+
// border: 1px solid green;
|
31
|
+
border-bottom: 10px solid green;
|
32
|
+
|
33
|
+
width: 50%;
|
34
|
+
height: 100%;
|
35
|
+
|
36
|
+
position: absolute;
|
37
|
+
left: 50%;
|
38
|
+
bottom: -10px;
|
39
|
+
|
40
|
+
.elephantW {
|
41
|
+
border: 0px solid cyan;
|
42
|
+
width: 1px;
|
43
|
+
height: 100%;
|
44
|
+
|
45
|
+
position: absolute;
|
46
|
+
bottom: 0;
|
47
|
+
|
48
|
+
> .amount {
|
49
|
+
// border: 3px solid black;
|
50
|
+
|
51
|
+
position: absolute;
|
52
|
+
left: 0;
|
53
|
+
bottom: 0;
|
54
|
+
}
|
55
|
+
> .strike {
|
56
|
+
position: absolute;
|
57
|
+
height: 1.4 em;
|
58
|
+
bottom: 0;
|
59
|
+
background: yellow;
|
60
|
+
|
61
|
+
right: 0;
|
62
|
+
width: 69px;
|
63
|
+
border-right: 2px solid black;
|
64
|
+
|
65
|
+
padding: 0 5px;
|
66
|
+
}
|
67
|
+
.elephant {
|
68
|
+
border: 2px dashed green;
|
69
|
+
position: absolute;
|
70
|
+
bottom: 0;
|
71
|
+
}
|
72
|
+
|
73
|
+
|
74
|
+
.elephantC {
|
75
|
+
position: absolute;
|
76
|
+
bottom: 0;
|
77
|
+
|
78
|
+
border: 2px dashed green;
|
79
|
+
|
80
|
+
// color: white;
|
81
|
+
display: flex;
|
82
|
+
align-items: center;
|
83
|
+
justify-content: center;
|
84
|
+
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
.windW {
|
89
|
+
border: 2px dashed blue;
|
90
|
+
width: 1px;
|
91
|
+
height: 100%;
|
92
|
+
position: absolute;
|
93
|
+
// left: calc( 200px * ( 23.5 - 23.46 ) );
|
94
|
+
|
95
|
+
}
|
96
|
+
|
97
|
+
.recklessDefenseW {
|
98
|
+
height: 20px;
|
99
|
+
border: 2px dashed green;
|
100
|
+
|
101
|
+
position: absolute;
|
102
|
+
bottom: 5px;
|
103
|
+
|
104
|
+
.recklessDefense {
|
105
|
+
.recklessDefenseC {
|
106
|
+
height: 20px;
|
107
|
+
border-left: 2px dashed green;
|
108
|
+
position: absolute;
|
109
|
+
right: 0;
|
110
|
+
}
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
}
|
115
|
+
}
|
116
|
+
}
|
117
|
+
}
|
@@ -0,0 +1,127 @@
|
|
1
|
+
|
2
|
+
class ::IshManager::IroOptionGetsController < IshManager::ApplicationController
|
3
|
+
|
4
|
+
# before_action :set_lists
|
5
|
+
|
6
|
+
def create
|
7
|
+
@item = Iro::OptionGet.new params[:iro_option_get].permit!
|
8
|
+
@item.kind = Iro::OptionGet::KIND_GET_CHAINS
|
9
|
+
authorize! :create, @item
|
10
|
+
flag = @item.save
|
11
|
+
if flag
|
12
|
+
flash[:notice] = 'Created option_get.'
|
13
|
+
else
|
14
|
+
flash[:alert] = "Cannot create option_get: #{@item.errors.full_messages.join(', ')}."
|
15
|
+
end
|
16
|
+
redirect_to action: 'index', controller: 'ish_manager/iro_watches'
|
17
|
+
end
|
18
|
+
|
19
|
+
def max_pain
|
20
|
+
@ticker = params[:ticker]
|
21
|
+
@date = params[:date].to_time.to_i
|
22
|
+
|
23
|
+
## 1689364800000
|
24
|
+
## Fri, 14 Jul 2023 15:00:00.000000000 CDT -05:00
|
25
|
+
|
26
|
+
authorize! :max_pain, Iro::Iro
|
27
|
+
|
28
|
+
@expirationDate = ( params[:date].to_date + 15.hours ).to_time.to_i * 1000 # '1689364800000'
|
29
|
+
# expirationDate = '1689969600000'
|
30
|
+
# expirationDate = '1690574400000'
|
31
|
+
@all_items = {}
|
32
|
+
|
33
|
+
calls_sql = "select distinct symbol, strikePrice, putCall, openInterest
|
34
|
+
from iro_option_price_items
|
35
|
+
where expirationDate = #{@expirationDate} and putCall = 'CALL' and ticker = '#{@ticker}'
|
36
|
+
group by symbol, strikePrice, putCall
|
37
|
+
order by putCall, strikePrice, created_at desc;"
|
38
|
+
@calls_items = []
|
39
|
+
@calls_array = ActiveRecord::Base.connection.execute(calls_sql)
|
40
|
+
calls_subtotal = 0
|
41
|
+
@calls_array.each do |_item|
|
42
|
+
item = {
|
43
|
+
symbol: _item[0],
|
44
|
+
strikePrice: _item[1],
|
45
|
+
putCall: _item[2],
|
46
|
+
oi: _item[3],
|
47
|
+
}
|
48
|
+
item[:subtotal] = item[:strikePrice] * 100 * item[:oi]
|
49
|
+
calls_subtotal = calls_subtotal + item[:subtotal]
|
50
|
+
item[:total] = calls_subtotal
|
51
|
+
puts! item, 'item'
|
52
|
+
@calls_items.push( item )
|
53
|
+
|
54
|
+
@all_items[item[:strikePrice]] ||= {
|
55
|
+
subtotal: 0,
|
56
|
+
strikePrice: item[:strikePrice],
|
57
|
+
}
|
58
|
+
@all_items[item[:strikePrice]][:calls_subtotal] = calls_subtotal
|
59
|
+
@all_items[item[:strikePrice]][:calls_oi] = item[:oi]
|
60
|
+
@all_items[item[:strikePrice]][:subtotal] = @all_items[item[:strikePrice]][:subtotal] + calls_subtotal
|
61
|
+
end
|
62
|
+
|
63
|
+
puts_sql = "select distinct symbol, strikePrice, putCall, openInterest
|
64
|
+
from iro_option_price_items
|
65
|
+
where expirationDate = #{@expirationDate} and putCall = 'PUT' and ticker = '#{@ticker}'
|
66
|
+
group by symbol, strikePrice, putCall
|
67
|
+
order by putCall, strikePrice, created_at desc;"
|
68
|
+
@puts_items = []
|
69
|
+
@puts_array = ActiveRecord::Base.connection.execute(puts_sql)
|
70
|
+
puts_subtotal = 0
|
71
|
+
@puts_array.each do |_item|
|
72
|
+
item = {
|
73
|
+
symbol: _item[0],
|
74
|
+
strikePrice: _item[1],
|
75
|
+
putCall: _item[2],
|
76
|
+
oi: _item[3],
|
77
|
+
}
|
78
|
+
item[:subtotal] = item[:strikePrice] * 100 * item[:oi]
|
79
|
+
puts_subtotal = puts_subtotal + item[:subtotal]
|
80
|
+
item[:total] = puts_subtotal
|
81
|
+
puts! item, 'item'
|
82
|
+
@puts_items.push( item )
|
83
|
+
|
84
|
+
@all_items[item[:strikePrice]] ||= {
|
85
|
+
subtotal: 0,
|
86
|
+
strikePrice: item[:strikePrice],
|
87
|
+
}
|
88
|
+
@all_items[item[:strikePrice]][:puts_subtotal] = puts_subtotal
|
89
|
+
@all_items[item[:strikePrice]][:puts_oi] = item[:oi]
|
90
|
+
@all_items[item[:strikePrice]][:subtotal] = @all_items[item[:strikePrice]][:subtotal] + puts_subtotal
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
render 'ish_manager/iro_watches/max_pain'
|
95
|
+
end
|
96
|
+
|
97
|
+
# def destroy
|
98
|
+
# @w = Iro::OptionWatch.find params[:id]
|
99
|
+
# authorize! :destroy, @w
|
100
|
+
# flag = @w.destroy
|
101
|
+
# if flag
|
102
|
+
# flash[:notice] = 'Success.'
|
103
|
+
# else
|
104
|
+
# flash[:alert] = @w.errors.full_messages.join(", ")
|
105
|
+
# end
|
106
|
+
# redirect_to action: 'index'
|
107
|
+
# end
|
108
|
+
|
109
|
+
# def index
|
110
|
+
# authorize! :index, Iro::OptionWatch
|
111
|
+
# @watches = Iro::OptionWatch.order_by( ticker: :asc, direction: :asc, price: :desc)
|
112
|
+
# @option_get_chains = Iro::OptionGet.all_get_chains
|
113
|
+
# end
|
114
|
+
|
115
|
+
# def update
|
116
|
+
# @option_watch = Iro::OptionWatch.find params[:id]
|
117
|
+
# authorize! :update, @option_watch
|
118
|
+
# flag = @option_watch.update_attributes params[:iro_watch].permit!
|
119
|
+
# if flag
|
120
|
+
# flash[:notice] = 'Updated option watch.'
|
121
|
+
# else
|
122
|
+
# flash[:alert] = "Cannot update option watch: #{@option_watch.errors.full_messages.join(', ')}."
|
123
|
+
# end
|
124
|
+
# redirect_to action: 'index'
|
125
|
+
# end
|
126
|
+
|
127
|
+
end
|
@@ -28,15 +28,6 @@ class ::IshManager::IroPositionsController < IshManager::ApplicationController
|
|
28
28
|
authorize! :new, @position
|
29
29
|
end
|
30
30
|
|
31
|
-
## prepare to roll
|
32
|
-
def roll
|
33
|
-
@position = Iro::Position.find( params[:id] )
|
34
|
-
# puts! @position, 'zze'
|
35
|
-
|
36
|
-
authorize! :roll, @position
|
37
|
-
@next_positions = Iro::Position.find( 13, 14, 15, 16 )
|
38
|
-
end
|
39
|
-
|
40
31
|
def update
|
41
32
|
@position = Iro::Position.find params[:id]
|
42
33
|
authorize! :update, @position
|
@@ -33,22 +33,64 @@ class ::IshManager::IroPursesController < IshManager::ApplicationController
|
|
33
33
|
authorize! :new, @iro_purse
|
34
34
|
end
|
35
35
|
|
36
|
+
## show_gameui too
|
36
37
|
def show
|
37
38
|
@purse = Iro::Purse.find params[:id]
|
38
39
|
authorize! :my, @purse
|
39
40
|
|
40
41
|
@strategies = Iro::CoveredCallStrategy.all
|
42
|
+
@current_underlying_strike = @strategies[0].current_underlying_strike
|
41
43
|
underlyings = Tda::Stock.get_quotes( @strategies.map(&:ticker).compact.uniq.join(",") )
|
42
|
-
# json_puts! underlyings, 'out'
|
43
44
|
underlyings.each do |ticker, v|
|
44
|
-
# puts! v[:mark], 'ze mark'
|
45
45
|
Iro::CoveredCallStrategy.where( ticker: ticker ).update( current_underlying_strike: v[:mark] )
|
46
46
|
end
|
47
47
|
|
48
|
-
|
48
|
+
if params[:statuses]
|
49
|
+
@positions = @purse.positions.where( :status.in => params[:statuses].split(',') )
|
50
|
+
else
|
51
|
+
@positions = @purse.positions
|
52
|
+
end
|
53
|
+
@positions = @positions.order({ expires_on: :asc, strike: :asc })
|
49
54
|
@positions.map &:refresh
|
50
55
|
|
51
|
-
render
|
56
|
+
render params[:kind] || @purse.parsed_config[:kind] || 'show'
|
57
|
+
end
|
58
|
+
|
59
|
+
def roll_prep
|
60
|
+
@strategies = Iro::CoveredCallStrategy.all
|
61
|
+
@position = Iro::Position.find params[:id]
|
62
|
+
puts! @position, '@position'
|
63
|
+
@positions = [ @position ]
|
64
|
+
@purse = @position.purse
|
65
|
+
@strategy = @position.strategy
|
66
|
+
authorize! :roll_prep, @position
|
67
|
+
|
68
|
+
@next_positions = []
|
69
|
+
next_date = @position.expires_on + 7.days # @TODO: change, watch hout for holidays
|
70
|
+
|
71
|
+
[ -0.5, 0, 0.5, 1, 1.5 ].each do |price_step|
|
72
|
+
next_position = Iro::CoveredCall.new({
|
73
|
+
expires_on: next_date,
|
74
|
+
strike: @position.strike + price_step,
|
75
|
+
ticker: @strategy.ticker,
|
76
|
+
opened_price: @position.current_price, # gain or loss upon roll
|
77
|
+
# current_price: , # the price (size matters)
|
78
|
+
})
|
79
|
+
@next_positions.push( next_position )
|
80
|
+
end
|
81
|
+
@next_positions.map &:refresh
|
82
|
+
@next_positions.map do |p|
|
83
|
+
current_price = p.current_price
|
84
|
+
p.opened_price = p.current_price
|
85
|
+
current_price = current_price - @position.current_price # gain/loss diff
|
86
|
+
p.current_price = p.opened_price - current_price
|
87
|
+
end
|
88
|
+
|
89
|
+
@next_positions.each do |p|
|
90
|
+
puts! p, 'nexxt'
|
91
|
+
end
|
92
|
+
|
93
|
+
render params[:kind] || @purse.parsed_config[:kind] || 'show'
|
52
94
|
end
|
53
95
|
|
54
96
|
def update
|
@@ -30,6 +30,7 @@ class ::IshManager::IroWatchesController < IshManager::ApplicationController
|
|
30
30
|
def index
|
31
31
|
authorize! :index, Iro::OptionWatch
|
32
32
|
@watches = Iro::OptionWatch.order_by( ticker: :asc, direction: :asc, price: :desc)
|
33
|
+
@option_get_chains = Iro::OptionGet.all_get_chains
|
33
34
|
end
|
34
35
|
|
35
36
|
def update
|
@@ -106,8 +106,8 @@
|
|
106
106
|
%li
|
107
107
|
= link_to 'Purses', iro_purses_path
|
108
108
|
- Iro::Purse.all.map do |p|
|
109
|
-
= link_to "[#{p.id}]", iro_purse_path(p)
|
110
|
-
= link_to "[gui]",
|
109
|
+
= link_to "[#{p.id} show]", iro_purse_path(p)
|
110
|
+
= link_to "[#{p.id} gui]", iro_purse_path({ id: p.id, kind: 'show_gameui' })
|
111
111
|
= link_to '[+]', new_iro_purse_path
|
112
112
|
%li
|
113
113
|
= link_to 'Watches', iro_watches_path
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Subject: Acknowledgement of Document Receipt
|
2
|
+
|
3
|
+
Dear [Sender's Name],
|
4
|
+
|
5
|
+
I hope this email finds you well. I am writing to confirm the successful receipt of the document you sent to our company.
|
6
|
+
|
7
|
+
We acknowledge the reception of [Document Name] on [Date Received]. Rest assured, our team is currently reviewing the contents, and we appreciate the promptness of your submission.
|
8
|
+
|
9
|
+
Should any further actions be required or if we have any queries regarding the document, we will reach out to you directly.
|
10
|
+
|
11
|
+
Thank you for your cooperation and for providing us with the necessary information. We value your contribution to our business processes.
|
12
|
+
|
13
|
+
If you have any questions or need any additional assistance, please feel free to get in touch with our team at [Contact Email/Phone].
|
14
|
+
|
15
|
+
Once again, thank you for your cooperation.
|
16
|
+
|
17
|
+
Best regards,
|
18
|
+
|
19
|
+
[Your Name]
|
20
|
+
[Your Title/Position]
|
21
|
+
[Company Name]
|
22
|
+
[Email Address]
|
23
|
+
[Phone Number]
|