diff --git a/src/GenTradeAgent/src/renderer/src/components/TradingDashboard.vue b/src/GenTradeAgent/src/renderer/src/components/TradingDashboard.vue index 48ad9cd..c91433a 100644 --- a/src/GenTradeAgent/src/renderer/src/components/TradingDashboard.vue +++ b/src/GenTradeAgent/src/renderer/src/components/TradingDashboard.vue @@ -70,7 +70,6 @@ store.watch( (state) => state.currentOhlcv, (value) => { console.log('change ohlcv') - console.log(value) candlestickSeries.setData(value) } ) diff --git a/src/GenTradeAgent/src/renderer/src/components/TradingMain.vue b/src/GenTradeAgent/src/renderer/src/components/TradingMain.vue index 9cf3b55..6c0cbcb 100644 --- a/src/GenTradeAgent/src/renderer/src/components/TradingMain.vue +++ b/src/GenTradeAgent/src/renderer/src/components/TradingMain.vue @@ -5,6 +5,17 @@
+ ([]) +const lastSelectedMarketId = localStorage.getItem('lastSelectedMarketId') +if (lastSelectedMarketId) { + store.state.currentMarket = lastSelectedMarketId +} + +const lastSelectedAsset = localStorage.getItem('lastSelectedAsset') +if (lastSelectedAsset) { + store.state.currentAsset = lastSelectedAsset +} + +const lastSelectedInterval = localStorage.getItem('lastSelectedInterval') +if (lastSelectedInterval) { + store.state.currentInterval = lastSelectedInterval +} + +const currentMarket = ref(store.state.currentMarket) const currentAsset = ref(store.state.currentAsset) -const currentInterval = ref('1h') +const currentInterval = ref('1d') + +const optionsMarket = ref([]) +const optionsAsset = ref([]) const optionsInterval = ref([ { label: '1m', @@ -88,31 +119,32 @@ const optionsInterval = ref([ } ]) -store.watch( - (state) => state.ohlcvDB, - (value) => { - Object.keys(value).forEach((item) => { - optionsAsset.value.push({ - label: getMarket(store.state, item) + ': ' + item, - value: item - }) +const updateAssetOptions = (market_id) => { + const assertNames = Object.keys(agentServer.markets[market_id].assets) + optionsAsset.value.length = 0 + assertNames.forEach((item) => { + optionsAsset.value.push({ + label: item, + value: item }) - } -) + }) + currentAsset.value = store.state.currentAsset +} -const handlerRefresh = () => { - store.commit('updateCurrentAsset', currentAsset.value) - setTimeout(handlerRefresh, 30000) +const handleUpdateCurrentMarket = (value: string) => { + store.commit('updateCurrentMarket', value) + localStorage.setItem('lastSelectedMarketId', value) + updateAssetOptions(value) } -handlerRefresh() const handleUpdateCurrentAsset = (value: string) => { - console.log('handleUpdateCurrentAsset:' + value) store.commit('updateCurrentAsset', value) + localStorage.setItem('lastSelectedAsset', value) } const handleUpdateCurrentInterval = (value: string) => { store.commit('updateCurrentInterval', value) + localStorage.setItem('lastSelectedInterval', value) } const callbackPing = (latency: number) => { @@ -121,21 +153,10 @@ const callbackPing = (latency: number) => { const handlerPingServer = () => { agentServer.ping(callbackPing) - setTimeout(handlerPingServer, agentServer.pingInterval) + //setTimeout(handlerPingServer, agentServer.pingInterval) } handlerPingServer() -let isConnect = false -const onAssetFromServer = (retval) => { - optionsAsset.value.length = 0 - Object.keys(retval).forEach((item) => { - optionsAsset.value.push({ - label: item, - value: item - }) - }) -} - store.watch( (state) => state.serverLatency, (value) => { @@ -145,7 +166,27 @@ store.watch( if (!isConnect && value != -1) { isConnect = true - agentServer.get_assets(onAssetFromServer) + store.commit('updateNotification', 'Reloading market data...') + agentServer.refreshAssets().then(() => { + setTimeout(() => { + store.commit('updateNotification', 'Reloading market data...Done') + // refresh market select UI + optionsMarket.value.length = 0 + Object.keys(agentServer.markets).forEach((index) => { + optionsMarket.value.push({ label: agentServer.markets[index].name, value: index }) + }) + + let lastSelectedMarketId = localStorage.getItem('lastSelectedMarketId') + if (lastSelectedMarketId == null || !(lastSelectedMarketId in agentServer.markets)) { + lastSelectedMarketId = MARKET_CRYPTO + } + currentMarket.value = agentServer.markets[lastSelectedMarketId].name + localStorage.setItem('lastSelectedMarketId', lastSelectedMarketId) + + store.commit('updateCurrentMarket', lastSelectedMarketId) + updateAssetOptions(lastSelectedMarketId) + }, 500) + }) } } ) diff --git a/src/GenTradeAgent/src/renderer/src/main.ts b/src/GenTradeAgent/src/renderer/src/main.ts index eded400..46ef5e8 100644 --- a/src/GenTradeAgent/src/renderer/src/main.ts +++ b/src/GenTradeAgent/src/renderer/src/main.ts @@ -9,12 +9,12 @@ const app = createApp(App) app.use(store, keyStore) app.mount('#app') -window.electron.ipcRenderer.invoke('getCryptoAssetDB').then((response) => { - store.commit('updateCryptoAssetDB', response) -}) -window.electron.ipcRenderer.invoke('getStockUSAssetDB').then((response) => { - store.commit('updateStockUSAssetDB', response) -}) -window.electron.ipcRenderer.invoke('getOhlcvDB').then((response) => { - store.commit('updateOhlcvDB', response) -}) +// window.electron.ipcRenderer.invoke('getCryptoAssetDB').then((response) => { +// store.commit('updateCryptoAssetDB', response) +// }) +// window.electron.ipcRenderer.invoke('getStockUSAssetDB').then((response) => { +// store.commit('updateStockUSAssetDB', response) +// }) +// window.electron.ipcRenderer.invoke('getOhlcvDB').then((response) => { +// store.commit('updateOhlcvDB', response) +// }) diff --git a/src/GenTradeAgent/src/renderer/src/server.ts b/src/GenTradeAgent/src/renderer/src/server.ts index ed1f651..38aaba0 100644 --- a/src/GenTradeAgent/src/renderer/src/server.ts +++ b/src/GenTradeAgent/src/renderer/src/server.ts @@ -1,11 +1,30 @@ import axios, { AxiosError } from 'axios' +type Asset = { + name: string + quote: string + type: string + cik: number + base: string + symbol: string +} + +interface IMarket { + name: string + type: string + assets: { [name: string]: Asset } +} + +export const MARKET_CRYPTO = 'b13a4902-ad9d-11ef-a239-00155d3ba217' +export const MARKET_STOCK_US = '5784f1f5-d8f6-401d-8d24-f685a3812f2d' + class AgentServer { static DEFAULT_SERVER_ADDRESS = 'http://47.100.216.225:8000/api/v1' apiKey: string = 'e54d4431-5dab-474e-b71a-0db1fcb9e659' tzName: string = '' tzOffset: number = 0 pingInterval: number = 10000 + markets: { [market_id: string]: IMarket } = {} get serverAddress() { const retval = localStorage.getItem('serverAddress') @@ -39,10 +58,10 @@ class AgentServer { ask_question(prompt: string, callback: (answer: string) => void) { const address = this.serverAddress + '/agent/' - axios.interceptors.request.use((request) => { - console.log('Starting Request', JSON.stringify(request, null, 2)) - return request - }) + // axios.interceptors.request.use((request) => { + // console.log('Starting Request', JSON.stringify(request, null, 2)) + // return request + // }) axios.defaults.headers['X-API-KEY'] = 'e54d4431-5dab-474e-b71a-0db1fcb9e659' axios @@ -60,17 +79,21 @@ class AgentServer { }) } - get_assets(callback: (retval) => void) { - const address = this.serverAddress + '/public/assets/' - axios - .get(address) - .then((response) => { - console.log(response) - callback(response.data) - }) - .catch((err: AxiosError) => { - console.log(err) - }) + async get_assets(market_id: string, start: number = 0, limit: number = 0) { + const address = this.serverAddress + '/public/markets/' + market_id + '/assets' + const resp = await axios.get(address, { + params: { + start: start, + limit: limit + } + }) + return resp.data + } + + async get_markets() { + const address = this.serverAddress + '/public/markets/' + const resp = await axios.get(address) + return resp.data } get_ohlcv(assetName: string, interval: string, callback: (data) => void) { @@ -89,13 +112,37 @@ class AgentServer { } }) .then((response) => { - console.log(response) callback(response.data) }) .catch((err: AxiosError) => { console.log(err) }) } + + async refreshAssets() { + this.markets = await this.get_markets() + await Object.keys(this.markets).forEach(async (market_id) => { + this.markets[market_id].assets = {} + let start = 0 + let isEnd = false + while (!isEnd) { + const assets = await this.get_assets(market_id, start, 1000) + if (assets.length < 1000) { + isEnd = true + break + } + start += 1000 + assets.forEach(async (item) => { + if (market_id == MARKET_CRYPTO && item.quote == 'usdt' && item.type == 'spot') { + this.markets[market_id].assets[item.name] = item + } + if (market_id == MARKET_STOCK_US && item.type == 'stock') { + this.markets[market_id].assets[item.name] = item + } + }) + } + }) + } } export const agentServer = new AgentServer() diff --git a/src/GenTradeAgent/src/renderer/src/store.ts b/src/GenTradeAgent/src/renderer/src/store.ts index 5f06b8a..4fac0a2 100644 --- a/src/GenTradeAgent/src/renderer/src/store.ts +++ b/src/GenTradeAgent/src/renderer/src/store.ts @@ -1,6 +1,6 @@ import { InjectionKey } from 'vue' import { createStore, Store, useStore as baseUseStore } from 'vuex' -import { agentServer } from './server' +import { agentServer, MARKET_CRYPTO, MARKET_STOCK_US } from './server' export interface ohlcvData { time: number @@ -11,23 +11,8 @@ export interface ohlcvData { vol: number } -interface ICryptoAsset { - base: string - quote: string - symbol: string - type: string -} - -interface IStockUSAsset { - cik_str: number - ticker: string - title: string -} - export interface IState { - cryptoAssets: { [assertType: string]: { [asset: string]: ICryptoAsset } } - stockUSAssets: { [asset: string]: IStockUSAsset } - ohlcvDB: { [asset: string]: { [interval: string]: ohlcvData[] } } + currentMarket: string currentAsset: string currentOhlcv: ohlcvData[] currentInterval: string @@ -39,55 +24,43 @@ export const keyStore: InjectionKey> = Symbol() export const store = createStore({ state: () => ({ - cryptoAssets: {}, - stockUSAssets: {}, - ohlcvDB: { btc: { '1h': [] } }, - currentAsset: 'btc', + currentMarket: '', + currentAsset: '', currentOhlcv: [], - currentInterval: '1h', + currentInterval: '1d', notifyMessage: 'Last message', serverLatency: -1 }), mutations: { - updateCryptoAssetDB(state, newCryptoAssetDB) { - console.log('updateCryptoAssetDB') - state.cryptoAssets = newCryptoAssetDB - }, - updateStockUSAssetDB(state, newStockUSDB) { - console.log('updateStockUSAssetDB') - state.stockUSAssets = newStockUSDB - }, - updateOhlcvDB(state, newOhlcvDB) { - console.log('updateOhlcvDB') - console.log(newOhlcvDB) - state.ohlcvDB = newOhlcvDB - state.currentAsset = Object.keys(newOhlcvDB)[0] - state.currentOhlcv = state.ohlcvDB[state.currentAsset][state.currentInterval] + updateCurrentMarket(state, newId) { + console.log('updateMarket: ' + newId) + state.currentMarket = newId + const marketInst = agentServer.markets[newId] + const assetNames = Object.keys(marketInst.assets) + if (!(state.currentAsset in assetNames)) { + if (newId == MARKET_CRYPTO) { + state.currentAsset = 'btc_usdt' + } else if (newId == MARKET_STOCK_US) { + state.currentAsset = 'ibit' + } + const callback = ((data) => { + state.currentOhlcv = data + }) + agentServer.get_ohlcv(state.currentAsset, state.currentInterval, callback) + } }, updateCurrentAsset(state, newAsset: string) { console.log('updateCurrentAsset') state.currentAsset = newAsset - if (state.currentAsset in state.ohlcvDB) { - state.currentOhlcv = state.ohlcvDB[state.currentAsset][state.currentInterval] - } - //console.log(state.c) const callback = ((data) => { - console.log(data) state.currentOhlcv = data - console.log(state.currentOhlcv) }) agentServer.get_ohlcv(newAsset, state.currentInterval, callback) }, updateCurrentInterval(state, newInterval: string) { console.log('updateCurrentInterval') state.currentInterval = newInterval - if (state.currentAsset in state.ohlcvDB) { - state.currentOhlcv = state.ohlcvDB[state.currentAsset][state.currentInterval] - console.log(state.currentOhlcv) - console.log("222") - } const callback = ((data) => { - console.log(data) state.currentOhlcv = data }) agentServer.get_ohlcv(state.currentAsset, state.currentInterval, callback) @@ -105,16 +78,3 @@ export const store = createStore({ export function useStore() { return baseUseStore(keyStore) } - -export function getMarket(state: IState, asset: string): string | null { - if (state.cryptoAssets['spot'] != null) { - if (asset in state.cryptoAssets['spot']) { - return 'Crypto[Spot]' - } - } - if (asset in state.stockUSAssets) { - return 'Stock[US]' - } - - return null -}