{"version":3,"sources":["webpack:///./src/views/Home/News.vue?c5f8","webpack:///./src/views/Home/News.vue","webpack:///./src/views/Home/News.vue?6ebf","webpack:///./src/views/Home/News.vue?4f5a","webpack:///./src/services/socket.ts","webpack:///./src/services/data.ts","webpack:///./src/components/SymbolName.vue?ff53","webpack:///./src/components/SymbolName.vue","webpack:///./src/components/SymbolName.vue?7cd3","webpack:///./src/components/SymbolName.vue?6647","webpack:///./node_modules/core-js/modules/es.array.find.js","webpack:///./src/services/symbolService.ts","webpack:///./src/views/Home/RssFeedForm.vue?248f","webpack:///./src/views/Home/RssFeedForm.vue","webpack:///./src/views/Home/RssFeedForm.vue?0575","webpack:///./src/views/Home/RssFeedForm.vue?30b1","webpack:///./src/services/func.ts"],"names":["render","_vm","this","_h","$createElement","_c","_self","staticClass","attrs","symbolPrice","Symbol","_v","_s","CompanyName","Price","getLast","toLocaleString","maximumFractionDigits","minimumFractionDigits","style","getChange","getChangeRate","toFixed","_e","_l","item","index","key","staticStyle","Icon","Link","Title","PublishDate","staticRenderFns","isLoading","feeds","showAddFeedDialog","editingFeed","SymbolId","FeedName","selectedRssFeed","news","symbolId","parseInt","$route","query","InitAll","msgCallBack","SendAll","page","symbols","symbolService","getSymbolPriceAsync","res","console","log","Result","loadNews","RemoveAll","getRssNewsAsync","utility","freezeArrayAndItems","msg","Action","MsgId","content","Content","components","RssFeedForm","SymbolName","component","ClientSocket","dataSource","DataSource","TryTimes","Messages","OnMessage","OnOpen","OnError","isConnecting","timeoutInterval","autoConnect","context","state","user","jwt","ws","location","protocol","url","uid","window","host","startsWith","WebSocket","Socket","readyState","getWsUrl","onopen","sendMessages","onerror","err","reconnect","onmessage","message","JSON","parse","data","sendDirectMsg","length","i","onclose","e","clearInterval","setTimeout","init","action","send","stringify","shift","callback","push","removeArrayItem","source","close","server","local","Server","Local","GetSocketServer","localStorage","getItem","addMessageCallBack","sendContext","removeMessageCallBack","SymbolType","PortfolioGroupCls","group","IsExpanded","Items","ComboType","PreMarketStart","PreMarketEnd","PriceCls","price","Open","Close","Last","Bid","BidYtm","DailyBid","DailyBidYtm","Volume","AvgVolume","LastUpdated","NextEarnDate","LastClosed","Status","last","getClose","change","closed","getPreAfterChange","Currency","SecType","class","SymbolClass","padStart","PrimaryExch","name","$","$find","find","addToUnscopables","arrayMethodUsesToLength","FIND","SKIPS_HOLES","USES_TO_LENGTH","Array","target","proto","forced","callbackfn","arguments","undefined","tryPostResult","addOrUpdateBatchAlertPrice","models","tryPostBooleanResult","addOrUpdateAlertPriceAsync","alertInfo","model","AlertInfo","PriceAlerts","getAlertPricesAsync","getAllAlertPricesAsync","removePriceAlertsAsync","PriceAlertId","updateFromYahooAsync","searchSymbolsAsync","input","type","searchOptionsAsync","expiration","getOptionDefInfo","getWatchedOptions","generateOptions","Expiration","ref","rules","value","$$v","$set","expression","on","$event","submit","$t","requiredRule","v","$refs","modelForm","validate","valid","$emit","setPriceValues","priceItem","Value","Name","LastTime","calcStrikePro","row","percent","OptionData","Right","Strike","StockPrice","StrikeProx"],"mappings":"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","file":"js/chunk-a07f0106.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"m-auto\"},[_c('div',{staticClass:\"text-left\"},[(_vm.symbolPrice)?_c('div',{staticClass:\"bg-light p-3 font-weight-bold color-black\"},[_c('div',{staticClass:\"f-24\"},[_c('SymbolName',{attrs:{\"Symbol\":_vm.symbolPrice.Symbol}}),_vm._v(\" - \"+_vm._s(_vm.symbolPrice.Symbol.CompanyName)+\" \")],1),_c('div',{staticClass:\"f-30 mt-2\"},[_vm._v(_vm._s(_vm.symbolPrice.Price.getLast().toLocaleString('en-US', { maximumFractionDigits: 2, minimumFractionDigits : 2 }))+\" \"),_c('div',{staticClass:\"d-inline-block f-16\",style:('color:' + (_vm.symbolPrice.Price.getChange()<0 ? 'red' : 'darkgreen'))},[_c('span',[_vm._v(_vm._s(_vm.symbolPrice.Price.getChange().toLocaleString('en-US', { maximumFractionDigits: 2, minimumFractionDigits : 2 })))]),( _vm.symbolPrice.Price.getChange()>0 )?_c('span',{staticClass:\"ups\"}):_c('span',{staticClass:\"downs\"})]),_c('div',{staticClass:\"d-inline-block f-16\",style:('color:' + (_vm.symbolPrice.Price.getChange()<0 ? 'red' : 'darkgreen'))},[_vm._v(\" (\"+_vm._s(_vm.symbolPrice.Price.getChangeRate().toFixed(2))+\"% \"),( _vm.symbolPrice.Price.getChange()>0 )?_c('span',{staticClass:\"ups\"}):_c('span',{staticClass:\"downs\"}),_vm._v(\") \")])])]):_vm._e(),_c('div',{staticClass:\"border-left ml-5 pl-3 mt-5 pb-5\"},[_c('div',{staticClass:\"color-666 f-24 font-weight-bold\"},[_vm._v(\"News\")]),_c('div',{staticClass:\"p-3\"},[(false)?_c('el-select',{staticClass:\"form-input\",attrs:{\"placeholder\":\"Select\"},on:{\"change\":_vm.rssFeedChanged},model:{value:(_vm.selectedRssFeed),callback:function ($$v) {_vm.selectedRssFeed=$$v},expression:\"selectedRssFeed\"}},[_c('el-option',{attrs:{\"label\":\"All types\",\"value\":\"\"}}),_vm._l((_vm.feeds),function(item,index){return _c('el-option',{key:index,attrs:{\"label\":item.FeedName,\"value\":item.Link}})})],2):_vm._e()],1),_vm._l((_vm.news),function(item,index){return _c('div',{key:index,staticClass:\"border-bottom pb-3 pt-3\",staticStyle:{\"clear\":\"both\"}},[_c('img',{staticClass:\"mr-2\",staticStyle:{\"float\":\"left\",\"max-width\":\"40px\"},attrs:{\"src\":item.Icon}}),_c('a',{staticClass:\"color-black f-18 text-decoration-none\",attrs:{\"href\":item.Link,\"target\":\"_blank\"}},[_vm._v(_vm._s(item.Title))]),_c('div',{staticClass:\"color-666 f-12\"},[_vm._v(_vm._s(item.PublishDate))])])})],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\nimport { Component, Vue } from 'vue-property-decorator'\r\nimport symbolService, { RssFeeds, RssNews } from '@/services/symbolService'\r\nimport { PriceMsgContent, StockPrice } from '@/services/data'\r\nimport { setPriceValues } from '@/services/func'\r\nimport ws, { SocketMsg } from '@/services/socket'\r\nimport RssFeedForm from '@/views/Home/RssFeedForm.vue'\r\nimport utility from '@/common/utility'\r\nimport SymbolName from '@/components/SymbolName.vue'\r\n\r\n@Component({\r\n components: {\r\n RssFeedForm,\r\n SymbolName\r\n }\r\n})\r\nexport default class Account extends Vue {\r\n isLoading = false\r\n symbolId: number\r\n symbolPrice: StockPrice = null\r\n feeds: RssFeeds[] = []\r\n showAddFeedDialog = false\r\n editingFeed: RssFeeds = {\r\n SymbolId: null,\r\n FeedName: '',\r\n Link: ''\r\n }\r\n\r\n selectedRssFeed: string = null\r\n news: RssNews[] = []\r\n\r\n async mounted () {\r\n const symbolId: number = parseInt(this.$route.query.symbolId as string)\r\n ws.InitAll(this.msgCallBack)\r\n\r\n this.symbolId = symbolId\r\n ws.SendAll({ page: 'News', symbols: [this.symbolId] })\r\n const res = await symbolService.getSymbolPriceAsync(symbolId)\r\n console.log(res)\r\n if (res.Result) {\r\n this.symbolPrice = res.Result\r\n }\r\n await this.loadNews()\r\n }\r\n\r\n destroyed (): void {\r\n ws.RemoveAll(this.msgCallBack)\r\n }\r\n\r\n async rssFeedChanged () {\r\n await this.loadNews()\r\n }\r\n\r\n async loadNews () {\r\n const res = await symbolService.getRssNewsAsync(this.symbolId)\r\n if (res.Result) {\r\n this.news = utility.freezeArrayAndItems(res.Result)\r\n }\r\n }\r\n\r\n async msgCallBack (msg: SocketMsg) {\r\n if (msg.Action === 'resStk' && msg.MsgId === this.symbolId) {\r\n const content = msg.Content as PriceMsgContent\r\n setPriceValues(content, this.symbolPrice.Price)\r\n }\r\n }\r\n}\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./News.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./News.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./News.vue?vue&type=template&id=9ec06fe6&\"\nimport script from \"./News.vue?vue&type=script&lang=ts&\"\nexport * from \"./News.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import store from '../store'\r\nimport utility from '@/common/utility'\r\n\r\nexport interface SocketMsg {\r\n MsgId: number;\r\n Action: string;\r\n Content?: any;\r\n}\r\n\r\nexport class ClientSocket {\r\n Socket: WebSocket\r\n DataSource = 'Server'\r\n TryTimes = 0\r\n Messages: Array = []\r\n OnMessage: Array<(msg: SocketMsg) => void> = []\r\n OnOpen: () => void = null\r\n OnError: (err: Event) => void = null\r\n isConnecting = false\r\n timeoutInterval = 0\r\n autoConnect = true\r\n context: object = null\r\n\r\n constructor (dataSource: string) {\r\n this.DataSource = dataSource\r\n }\r\n\r\n private getWsUrl () {\r\n if (store.state.user == null) {\r\n return null\r\n }\r\n const jwt = store.state.user.jwt\r\n const ws = location.protocol === 'https:' ? 'wss' : 'ws'\r\n let url: string = null\r\n if (this.DataSource === 'Local') {\r\n url = `ws://localhost:12479/ws?jwt=${jwt}&uid=${store.state.user.uid}`\r\n } else {\r\n url = `${ws}://${window.location.host}/api/ws?jwt=${jwt}&uid=${store.state.user.uid}`\r\n if (window.location.host.startsWith('localhost') || window.location.host.startsWith('192.168')) {\r\n url = `${ws}://localhost:5000/api/ws?jwt=${jwt}&uid=${store.state.user.uid}`\r\n }\r\n }\r\n return url\r\n }\r\n\r\n public init () {\r\n this.autoConnect = true\r\n if (typeof (WebSocket) !== 'undefined') {\r\n if (this.Socket && this.Socket.readyState < 2) {\r\n return\r\n }\r\n const url = this.getWsUrl()\r\n if (!url) {\r\n return\r\n }\r\n try {\r\n // console.log('Connecting to: ' + url)\r\n this.Socket = new WebSocket(url)\r\n // 监听socket连接\r\n this.Socket.onopen = () => {\r\n // the connection maybe connecting,but not connected here.\r\n this.sendMessages()\r\n if (this.OnOpen) {\r\n this.OnOpen()\r\n }\r\n }\r\n // 监听socket错误信息\r\n this.Socket.onerror = err => {\r\n // the connection maybe connecting,but not connected here.\r\n if (this.OnError) {\r\n this.OnError(err)\r\n }\r\n this.reconnect()\r\n }\r\n // 监听socket消息\r\n this.Socket.onmessage = msg => {\r\n const message = JSON.parse(msg.data) as SocketMsg\r\n if (message.Action === 'resAcc') this.sendDirectMsg('sendContext', this.context)\r\n if (this.OnMessage.length > 0) {\r\n for (let i = 0; i < this.OnMessage.length; i++) {\r\n this.OnMessage[i](message)\r\n }\r\n }\r\n }\r\n // on Close\r\n this.Socket.onclose = () => {\r\n this.reconnect()\r\n }\r\n } catch (e) {\r\n // console.log(e)\r\n }\r\n }\r\n }\r\n\r\n public sendContext (context: object) {\r\n this.context = context\r\n // console.log('sending', this.DataSource, context)\r\n this.sendDirectMsg('sendContext', context)\r\n }\r\n\r\n private reconnect () {\r\n if (!this.autoConnect) return\r\n if (this.isConnecting) {\r\n return\r\n }\r\n if (this.timeoutInterval) {\r\n clearInterval(this.timeoutInterval)\r\n }\r\n this.isConnecting = true\r\n this.timeoutInterval = setTimeout(() => {\r\n this.init()\r\n this.isConnecting = false\r\n }, 4000)\r\n }\r\n\r\n stopAutoConnect () {\r\n this.autoConnect = false\r\n }\r\n\r\n public sendDirectMsg (action: string, content: any) {\r\n if (this.Socket != null && this.Socket.readyState === 1) {\r\n try {\r\n // console.log('sendDirectMsg', this.DataSource, content)\r\n this.Socket.send(JSON.stringify({ MsgId: 0, Action: action, Content: content }))\r\n } catch (e) {\r\n }\r\n }\r\n }\r\n\r\n private sendMessages () {\r\n if (this.TryTimes > 3) {\r\n this.TryTimes = 0\r\n return\r\n }\r\n if (this.Socket != null && this.Socket.readyState === 1) {\r\n this.sendDirectMsg('sendContext', this.context)\r\n while (this.Messages.length > 0) {\r\n const msg = this.Messages.shift()\r\n console.log('sent delay message', this.DataSource, msg)\r\n try {\r\n this.Socket.send(JSON.stringify(msg))\r\n } catch (e) {\r\n console.log(e)\r\n }\r\n }\r\n this.TryTimes = 0\r\n } else {\r\n this.TryTimes++\r\n setTimeout(() => {\r\n this.sendMessages()\r\n }, 200)\r\n }\r\n }\r\n\r\n public addMessageCallBack (callback: (msg: SocketMsg) => void) {\r\n this.OnMessage.push(callback)\r\n }\r\n\r\n public removeMessageCallBack (callback: (msg: SocketMsg) => void) {\r\n utility.removeArrayItem(this.OnMessage, callback)\r\n }\r\n\r\n public sendMsg (msg: SocketMsg) {\r\n if (this.Socket == null || this.Socket.readyState !== 1) {\r\n if (msg.Action !== 'sendContext') { this.Messages.push(msg) }\r\n return\r\n }\r\n console.log('send msg', this.DataSource, msg)\r\n try {\r\n this.Socket.send(JSON.stringify(msg))\r\n } catch (e) {\r\n }\r\n }\r\n\r\n changeSource (source: string) {\r\n if (this.DataSource !== source) {\r\n this.DataSource = source\r\n this.close()\r\n }\r\n }\r\n\r\n close () {\r\n this.autoConnect = false\r\n if (this.Socket) {\r\n this.Socket.close()\r\n this.Socket = null\r\n }\r\n }\r\n}\r\n\r\nconst server = new ClientSocket('Server')\r\nconst local = new ClientSocket('Local')\r\n\r\nexport default {\r\n Server: server,\r\n Local: local,\r\n GetSocketServer (): ClientSocket {\r\n const dataSource = localStorage.getItem('StockDataSource')\r\n if (dataSource === 'Local') return local\r\n return server\r\n },\r\n InitAll (callback: (msg: SocketMsg) => void) {\r\n server.init()\r\n server.addMessageCallBack(callback)\r\n local.init()\r\n local.addMessageCallBack(callback)\r\n },\r\n SendAll (context: Record) {\r\n if (localStorage.getItem('StockDataSource') === 'Local') {\r\n server.sendContext(null)\r\n local.sendContext(context)\r\n } else {\r\n server.sendContext(context)\r\n local.sendContext(null)\r\n }\r\n },\r\n RemoveAll (callback: (msg: SocketMsg) => void) {\r\n server.removeMessageCallBack(callback)\r\n local.removeMessageCallBack(callback)\r\n }\r\n}\r\n","export interface ApiResult {\r\n Error: string;\r\n Result: T;\r\n}\r\n\r\nexport interface ApiBooleanResult {\r\n Error: string;\r\n Result: boolean;\r\n}\r\n\r\nexport interface JwtResult {\r\n jwt: string;\r\n chromeToken: string;\r\n}\r\n\r\nexport interface User {\r\n email: string;\r\n name: string;\r\n accNo: string;\r\n jwt: string;\r\n uid?: string;\r\n agentId?: string;\r\n}\r\n\r\nexport interface MessageText {\r\n success?: string;\r\n error?: string;\r\n}\r\n\r\nexport interface Sort {\r\n key: string;\r\n direction: string;\r\n}\r\n\r\nexport interface SocketResponse {\r\n Action: string;\r\n Content: T;\r\n}\r\n\r\nexport interface ContractSymbol {\r\n SymbolUId: number;\r\n SymbolId: number;\r\n Symbol: string;\r\n SecType: string;\r\n Currency: string;\r\n PrimaryExch: string;\r\n CompanyName: string;\r\n CondId?: number;\r\n Description?: string;\r\n Detail?: any;\r\n IssuerId?: string;\r\n}\r\n\r\nexport interface BasePortfolio {\r\n Position: number;\r\n MarketValue: number;\r\n AverageCost: number;\r\n DailyPL?: number;\r\n}\r\n\r\nexport interface Option {\r\n Right: string;\r\n Multiplier: number;\r\n Expiration: string;\r\n Strike: number;\r\n Code: string;\r\n}\r\n\r\nexport interface OptionRow {\r\n OptionId: number;\r\n OptionUId: number;\r\n LocalSymbol: string;\r\n Right: string;\r\n Multiplier: number;\r\n ExpirationDate: string;\r\n Strike: number;\r\n ComboType?: string;\r\n}\r\n\r\nexport interface OptionSymbol extends OptionRow, ContractSymbol {\r\n Expiration: string;\r\n}\r\n\r\nexport interface WatchOption {\r\n Option: OptionSymbol;\r\n Price: Price;\r\n}\r\n\r\nexport interface CryptoSymbol\r\n{\r\n CryptoId: number;\r\n Code: string;\r\n Name: string;\r\n}\r\n\r\nexport enum SymbolType\r\n{\r\n Stock = 1,\r\n Option = 2,\r\n Crypto = 3,\r\n Bond = 4\r\n}\r\n\r\nexport interface OtmRange {\r\n SymbolId: number;\r\n Low: number;\r\n High: number;\r\n Run?: boolean;\r\n RangeType?: 'Download' | 'Freebie';\r\n}\r\n\r\nexport interface OptionPrice {\r\n Option: OptionRow;\r\n Price: BasePrice;\r\n}\r\n\r\nexport interface PortfolioMessage extends BasePortfolio {\r\n PortfolioId: number;\r\n SecType: string;\r\n ConId: number;\r\n AccountName: string;\r\n StockPrice?: Price;\r\n OptionData?: OptionRow;\r\n MarketPrice: number;\r\n UnrealizedPL: number;\r\n Change: number;\r\n ChangeRate: number;\r\n Return: number;\r\n Alert?: boolean;\r\n ExRate: number;\r\n Exposure?: number;\r\n StrikeProx?: string;\r\n}\r\n\r\nexport interface PortfolioGroup {\r\n Symbol: ContractSymbol;\r\n Items: PortfolioMessage[];\r\n ComboType: number;\r\n IsExpanded?: boolean;\r\n}\r\n\r\nexport class PortfolioGroupCls implements PortfolioGroup {\r\n constructor (group: PortfolioGroup) {\r\n this.Symbol = group.Symbol\r\n this.Items = group.Items\r\n this.ComboType = group.ComboType\r\n }\r\n\r\n Symbol: ContractSymbol\r\n Items: PortfolioMessage[]\r\n ComboType: number;\r\n IsExpanded? = true\r\n}\r\n\r\nexport interface GroupedData {\r\n SecType: string;\r\n Items: T[];\r\n Keys: string[];\r\n Sort: Sort;\r\n}\r\n\r\nexport interface WatchListName {\r\n WatchListId: number;\r\n Name: string;\r\n Keys: string[];\r\n OptKeys: string[];\r\n CryptoKeys: string[];\r\n BondKeys: string[];\r\n IsSystem: boolean;\r\n IsReadOnly: boolean;\r\n FromUserId: number;\r\n Rank: number;\r\n}\r\n\r\nexport interface WatchGroup {\r\n WatchName: WatchListName;\r\n Symbols: WatchSymbol[];\r\n Options: WatchOption[];\r\n Cryptos: WatchCrypto[];\r\n Rank?: number;\r\n LastUpdated?: string;\r\n}\r\n\r\nexport interface BasePrice {\r\n Last: number;\r\n Bid?: number;\r\n Ask?: number;\r\n Open: number;\r\n Close: number;\r\n}\r\n\r\nexport interface Price extends BasePrice {\r\n Volume?: number;\r\n AvgVolume?: number;\r\n LastUpdated?: string;\r\n NextEarnDate?: string;\r\n LastClosed?: number;\r\n Status?: number;\r\n BidYtm?: number;\r\n Bid?: number;\r\n DailyBid?: number;\r\n DailyBidYtm?: number;\r\n\r\n getLast? (): number;\r\n\r\n getClose? (): number;\r\n\r\n getChange? (): number;\r\n\r\n getChangeRate? (): number;\r\n\r\n getPreAfterChange? (): number;\r\n\r\n getPreAfterChangeRate? (): number;\r\n}\r\n\r\nconst PreMarketStart = 4\r\nconst PreMarketEnd = 16\r\nconst InTrading = 8\r\nconst Closed = 64\r\n\r\nexport class PriceCls implements Price {\r\n Open: number\r\n Close: number\r\n Last: number\r\n Bid: number\r\n BidYtm?: number\r\n DailyBid?: number\r\n DailyBidYtm?: number\r\n Volume?: number\r\n AvgVolume?: number\r\n LastUpdated?: string\r\n NextEarnDate?: string\r\n LastClosed?: number\r\n Status?: number\r\n\r\n constructor (price: Price) {\r\n if (price != null) {\r\n this.Open = price.Open\r\n this.Close = price.Close\r\n this.Last = price.Last\r\n this.Bid = price.Bid\r\n this.BidYtm = price.BidYtm\r\n this.DailyBid = price.DailyBid\r\n this.DailyBidYtm = price.DailyBidYtm\r\n this.Volume = price.Volume\r\n this.AvgVolume = price.AvgVolume\r\n this.LastUpdated = price.LastUpdated\r\n this.NextEarnDate = price.NextEarnDate\r\n this.LastClosed = price.LastClosed\r\n this.Status = price.Status\r\n }\r\n }\r\n\r\n getLast (): number {\r\n if (this.Status === PreMarketStart || this.Status === PreMarketEnd) { // support pre after price for some us stocks\r\n return this.LastClosed\r\n } else {\r\n return this.Last\r\n }\r\n }\r\n\r\n getClose (): number {\r\n return this.Close\r\n }\r\n\r\n getChange (): number {\r\n const last = this.getLast()\r\n const close = this.getClose()\r\n if (close && last) {\r\n return last - close\r\n }\r\n return 0\r\n }\r\n\r\n getChangeRate (): number {\r\n const change = this.getChange()\r\n const closed = this.getClose()\r\n if (change) {\r\n return (change / closed) * 100\r\n }\r\n return 0\r\n }\r\n\r\n getPreAfterChange (): number {\r\n if (this.Status === PreMarketStart || this.Status === PreMarketEnd) {\r\n if (this.Last && this.LastClosed) {\r\n return (this.Last - this.LastClosed)\r\n }\r\n }\r\n return null\r\n }\r\n\r\n getPreAfterChangeRate (): number {\r\n const change = this.getPreAfterChange()\r\n if (change) {\r\n return (change / this.LastClosed) * 100\r\n }\r\n return null\r\n }\r\n}\r\n\r\nexport interface StockPrice {\r\n Symbol: ContractSymbol;\r\n Price: Price;\r\n ExRate?: number;\r\n}\r\n\r\nexport interface WatchSymbol extends StockPrice {\r\n WatchListId: number;\r\n NextEarnDate: string;\r\n Alert: boolean;\r\n Rank?: number;\r\n Target?: number;\r\n IsDownload?: boolean;\r\n IsDownloading?: boolean;\r\n Portfolio?: BasePortfolio;\r\n}\r\n\r\nexport interface WatchCrypto {\r\n WatchListId: number;\r\n Alert: boolean;\r\n Rank?: number;\r\n Target?: number;\r\n Symbol: CryptoSymbol;\r\n}\r\n\r\nexport interface AlertTypeInfo{\r\n type: 'Stock' | 'Option' | 'Bond';\r\n symbolId?: number;\r\n optionId?: number;\r\n}\r\n\r\nexport interface PriceAlert {\r\n PriceAlertId: number;\r\n AlertPrice: number;\r\n Type: string;\r\n TriggerToDo: boolean;\r\n Created?: string;\r\n CreatedStr?: string;\r\n IsDeleting?: boolean;\r\n SymbolId?: number;\r\n OptionId?: number;\r\n}\r\n\r\nexport interface PriceMsgContent {\r\n Name: string;\r\n Value: number;\r\n LastTime?: string;\r\n Status: number;\r\n}\r\n\r\nexport interface OptionMsgContent extends PriceMsgContent {\r\n ConId?: number;\r\n Otm: number;\r\n StockPrice: number;\r\n Target: number;\r\n}\r\n\r\nexport interface TransactionItem {\r\n SymbolTransId?: number;\r\n SymbolId: number;\r\n Quantity: number;\r\n CostPerShare: number;\r\n TransDate: string;\r\n Commission: number;\r\n Type: string;\r\n}\r\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.Symbol)?_c('div',{staticClass:\"d-inline-block\"},[( _vm.Symbol.Currency === 'HKD' && _vm.Symbol.SecType === 'STK' )?_c('span',{class:_vm.SymbolClass},[_vm._v(\" HKG:\"),_c('label',{class:_vm.SymbolClass},[_vm._v(_vm._s(_vm.Symbol.Symbol.padStart(4,'0')))])]):( _vm.Symbol.PrimaryExch == 'SEHKSZSE' )?_c('span',{class:_vm.SymbolClass},[_vm._v(\"SHE:\"),_c('span',{class:_vm.SymbolClass},[_vm._v(_vm._s(_vm.Symbol.Symbol.padStart(4,'0')))])]):( _vm.Symbol.SecType == 'BOND' )?_c('span',{class:_vm.SymbolClass},[_vm._v(\" \"+_vm._s(_vm.Symbol.Symbol)+\" \")]):_c('span',{class:_vm.SymbolClass},[_vm._v(_vm._s(_vm.Symbol.Symbol))])]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\r\nimport { ContractSymbol } from '@/services/data'\r\nimport { Component, Vue, Prop } from 'vue-property-decorator'\r\n\r\n@Component\r\nexport default class SymbolName extends Vue {\r\n name = 'SymbolName'\r\n @Prop() Symbol: ContractSymbol\r\n @Prop() SymbolClass: string\r\n}\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SymbolName.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SymbolName.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./SymbolName.vue?vue&type=template&id=171114f6&\"\nimport script from \"./SymbolName.vue?vue&type=script&lang=ts&\"\nexport * from \"./SymbolName.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.es/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","import {\r\n ContractSymbol, PriceAlert, PriceCls, StockPrice, OptionPrice, AlertTypeInfo, OptionSymbol, SymbolType\r\n} from '@/services/data'\r\nimport ServiceBase from '@/services/serviceBase'\r\n\r\nexport interface SymbolPriceAlert {\r\n Symbol: { Symbol: ContractSymbol; Alerts: PriceAlert[] }[];\r\n Name: string;\r\n Option: { Option: OptionSymbol; Alerts: PriceAlert[] }[];\r\n}\r\n\r\nexport interface RssFeeds {\r\n SymbolId: number;\r\n FeedIcon?: string;\r\n Link: string;\r\n FeedName: string;\r\n}\r\n\r\nexport interface RssNews {\r\n Title: string;\r\n Author: string;\r\n Link: string;\r\n Icon: string;\r\n PublishDate: string;\r\n}\r\n\r\nexport interface OptionScanRes {\r\n Symbol: ContractSymbol;\r\n Expirations: string[];\r\n Strikes: number[];\r\n Multiplier: number;\r\n}\r\n\r\nexport interface OptionWatchData extends OptionPrice {\r\n IsWatched: boolean;\r\n}\r\n\r\nexport default {\r\n async getSymbolPriceAsync (SymbolId: number) {\r\n const res = await ServiceBase.tryPostResult('/symbol/getSymbolWithPrice', { SymbolId })\r\n if (res.Result) {\r\n res.Result.Price = new PriceCls(res.Result.Price)\r\n }\r\n return res\r\n },\r\n async getRssNewsAsync (SymbolId: number) {\r\n return await ServiceBase.tryPostResult('/symbol/getRssNews', { SymbolId })\r\n },\r\n async addOrUpdateBatchAlertPrice (models: { AlertInfo: AlertTypeInfo; PriceAlerts: PriceAlert[] }[]) {\r\n return await ServiceBase.tryPostBooleanResult('/symbol/addOrUpdateBatchAlertPrice', models)\r\n },\r\n async addOrUpdateAlertPriceAsync (alertInfo: AlertTypeInfo, model: PriceAlert[]) {\r\n return await ServiceBase.tryPostBooleanResult('/symbol/addOrUpdateAlertPrice', {\r\n AlertInfo: alertInfo,\r\n PriceAlerts: model\r\n })\r\n },\r\n async getAlertPricesAsync (alertInfo: AlertTypeInfo) {\r\n return await ServiceBase.tryPostResult('/symbol/getAlertPrices', alertInfo)\r\n },\r\n async getAllAlertPricesAsync () {\r\n return await ServiceBase.tryPostResult('/symbol/getAllAlertPrices')\r\n },\r\n async removePriceAlertsAsync (PriceAlertId: number) {\r\n return await ServiceBase.tryPostBooleanResult('/symbol/removePriceAlerts', { PriceAlertId })\r\n },\r\n async updateFromYahooAsync () {\r\n return await ServiceBase.tryPostBooleanResult('/symbol/updateFromYahoo')\r\n },\r\n async searchSymbolsAsync (input: string, type: SymbolType) {\r\n return await ServiceBase.tryPostResult('/symbol/searchSymbols', { input, type })\r\n },\r\n async searchOptionsAsync (input: string, expiration: string) {\r\n return await ServiceBase.tryPostResult('/symbol/searchOptions', { input, expiration })\r\n },\r\n async getOptionDefInfo (symbolId: number) {\r\n return await ServiceBase.tryPostResult('/symbol/getOptionDefInfo', { symbolId })\r\n },\r\n async getWatchedOptions (SymbolId: number) {\r\n return await ServiceBase.tryPostResult('/symbol/getWatchedOptions', { SymbolId })\r\n },\r\n async generateOptions (SymbolId: number, Expiration: string) {\r\n return await ServiceBase.tryPostResult<{ Data: OptionWatchData[]; MarketState: number }>('/symbol/generateOptions', { SymbolId, Expiration })\r\n }\r\n}\r\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-form',{ref:\"modelForm\",attrs:{\"model\":_vm.model,\"status-icon\":\"\",\"rules\":_vm.rules,\"label-width\":\"100px\"}},[_c('el-form-item',{attrs:{\"label\":\"Name\",\"prop\":\"FeedName\"}},[_c('el-input',{attrs:{\"type\":\"text\",\"autocomplete\":\"off\"},model:{value:(_vm.model.FeedName),callback:function ($$v) {_vm.$set(_vm.model, \"FeedName\", $$v)},expression:\"model.FeedName\"}})],1),_c('el-form-item',{attrs:{\"label\":\"Url\",\"prop\":\"Link\"}},[_c('el-input',{model:{value:(_vm.model.Link),callback:function ($$v) {_vm.$set(_vm.model, \"Link\", $$v)},expression:\"model.Link\"}})],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){return _vm.submit()}}},[_vm._v(_vm._s(_vm.$t('save')))])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\r\nimport { Component, Vue, Prop, Watch } from 'vue-property-decorator'\r\nimport { ElForm } from 'element-ui/types/form'\r\nimport validation from '@/common/element-val'\r\nimport { RssFeeds } from '@/services/symbolService'\r\n\r\n@Component\r\nexport default class RssFeedForm extends Vue {\r\n $refs: {\r\n modelForm: ElForm;\r\n }\r\n\r\n @Prop() FeedName: string\r\n @Prop() Link: string\r\n\r\n model: RssFeeds = {\r\n SymbolId: null,\r\n FeedName: '',\r\n Link: ''\r\n }\r\n\r\n rules = {\r\n FeedName: validation.requiredRule(),\r\n Link: validation.requiredRule()\r\n }\r\n\r\n mounted () {\r\n this.model.FeedName = this.FeedName\r\n this.model.Link = this.Link\r\n }\r\n\r\n @Watch('FeedName')\r\n onTitleChanged (v: string) {\r\n this.model.FeedName = v\r\n }\r\n\r\n @Watch('Link')\r\n onUrlChanged (v: string) {\r\n this.model.Link = v\r\n }\r\n\r\n // if use @Emit,do not use this.$emit again, @Emit will return the function value to parent\r\n submit () {\r\n this.$refs.modelForm.validate((valid: boolean) => {\r\n if (valid) {\r\n this.$emit('submit', this.model)\r\n }\r\n })\r\n }\r\n}\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RssFeedForm.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RssFeedForm.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./RssFeedForm.vue?vue&type=template&id=671a7a9a&\"\nimport script from \"./RssFeedForm.vue?vue&type=script&lang=ts&\"\nexport * from \"./RssFeedForm.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import { PortfolioMessage, Price, PriceMsgContent } from '@/services/data'\r\n\r\nexport function setPriceValues (content: PriceMsgContent, priceItem: Price) {\r\n if (content.Value != null && priceItem) {\r\n if (content.Name === 'Last') {\r\n priceItem.LastUpdated = content.LastTime\r\n priceItem.Last = content.Value\r\n } else if (content.Name === 'Open') {\r\n priceItem.Open = content.Value\r\n } else if (content.Name === 'Close') {\r\n priceItem.Close = content.Value\r\n } else if (content.Name === 'Volume') {\r\n priceItem.Volume = content.Value\r\n } else if (content.Name === 'AvgVolume') {\r\n priceItem.AvgVolume = content.Value\r\n } else if (content.Name === 'Bid') {\r\n priceItem.Bid = content.Value\r\n }\r\n }\r\n}\r\n\r\nexport interface Group {\r\n Key: any;\r\n Entries: T[];\r\n}\r\n\r\nexport function groupBy (arr: Array, keySelector: (entry: T) => any): Group[] {\r\n const groups: Group[] = []\r\n for (const row of arr) {\r\n const key = keySelector(row)\r\n const find = groups.find(p => p.Key === key)\r\n if (find) {\r\n find.Entries.push(row)\r\n } else {\r\n groups.push({ Key: key, Entries: [row] })\r\n }\r\n }\r\n return groups\r\n}\r\n\r\nexport function calcStrikePro (row: PortfolioMessage, percent: number) {\r\n if (percent && row.SecType === 'OPT') {\r\n if (row.OptionData.Right === 'C') {\r\n const target = (100 - percent) / 100.0 * row.OptionData.Strike\r\n if (row.StockPrice.Last >= target && row.StockPrice.Last < row.OptionData.Strike) {\r\n row.StrikeProx = 'NTM'\r\n } else if (row.StockPrice.Last >= row.OptionData.Strike) {\r\n row.StrikeProx = 'ITM'\r\n } else if (row.StockPrice.Last < target) {\r\n row.StrikeProx = 'OOM'\r\n }\r\n }\r\n if (row.OptionData.Right === 'P') {\r\n const target = (100 + percent) / 100.0 * row.OptionData.Strike\r\n if (row.StockPrice.Last <= target && row.StockPrice.Last > row.OptionData.Strike) {\r\n row.StrikeProx = 'NTM'\r\n } else if (row.StockPrice.Last <= row.OptionData.Strike) {\r\n row.StrikeProx = 'ITM'\r\n } else if (row.StockPrice.Last > target) {\r\n row.StrikeProx = 'OOM'\r\n }\r\n }\r\n }\r\n}\r\n"],"sourceRoot":""}