From 40b81064a9b114d5e6a98defa2960229effc8b61 Mon Sep 17 00:00:00 2001 From: bangae1 Date: Tue, 26 Aug 2025 00:35:00 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=B8=ED=84=B0=EB=B2=8C=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 87 ++++++++++++++++++++++++++++++++---------------- src/utils/sig.ts | 36 +++++++++++++++----- 2 files changed, 87 insertions(+), 36 deletions(-) diff --git a/src/App.vue b/src/App.vue index 0f3a341..0cd676a 100644 --- a/src/App.vue +++ b/src/App.vue @@ -30,9 +30,9 @@ const scrollContainer2 = ref() const signal1 = ref([]) const signal2 = ref([]) -const contract = ref('BTC_USDT') +const contract = ref('ETH_USDT') /* Interval : "10s", "1m", "5m", "15m", "30m", "1h", "4h", "8h", "1d", "7d"*/ -const time = ref('1h') +const time = ref('5m') const chartOptions = ref({ layout: { textColor: 'black', @@ -165,11 +165,10 @@ const init = (cont, ti) => { // console.table(entrySignals(data)) candleTick.value = data }) - candleSocket(cont, ti) } -const distroy = (cont) => { +const distroy = () => { candleTick.value = [] socket.close() } @@ -187,42 +186,74 @@ const lazyLoad = async (ti) => { }) } +let loopIdx = 0 const candleSocket = (cont, ti) => { socket.addEventListener('open', (event) => { // socket.send(JSON.stringify({"type":"subscribe", "channel": cont, "time": ti})) - console.log(cont, ti) socket.send(JSON.stringify({"time" : curToUnix(), "channel" : "futures.candlesticks","event": "subscribe", "payload" : [ti, cont]})) + socket.send(JSON.stringify({"time" : curToUnix(), "channel" : "futures.trades","event": "subscribe", "payload" : [cont]})) }) socket.addEventListener('message', (message) => { const msg = JSON.parse(message.data) - if(msg.event === 'update') { - const item = msg.result[0] + if(msg.channel === 'futures.candlesticks') { + if(msg.event === 'update') { + const item = msg.result[0] + + const ticks = candleTick.value + if(item.t === ticks[ticks.length - 1].t) { + ticks[ticks.length - 1] = item + candleTick.value = [...ticks] + } else { + ticks.push(item) + candleTick.value = [...ticks] + } - const ticks = candleTick.value - if(item.t === ticks[ticks.length - 1].t) { - ticks[ticks.length - 1] = item - candleTick.value = [...ticks] - } else { - ticks.push(item) - candleTick.value = [...ticks] } + } else { + if(msg.event === 'update') { + const item = msg.result[0] + // console.log(item) + const ticks = candleTick.value + try { + let diff = 0 + if(time.value === '10s') diff = 10 + else if(time.value === '1m') diff = 60 + else if(time.value === '5m') diff = (60 * 5) + else if(time.value === '15m') diff = (60 * 15) + else if(time.value === '30m') diff = (60 * 30) + else if(time.value === '1h') diff = (60 * 60) + else if(time.value === '4h') diff = (60 * 60 * 4) + else if(time.value === '8h') diff = (60 * 60 * 8) + else if(time.value === '1d') diff = (60 * 60 * 24) + else if(time.value === '7d') diff = (60 * 60 * 24 * 7) + if(item.create_time >= ticks[ticks.length - 1].t && item.create_time <= (ticks[ticks.length - 1].t + diff)) { + ticks[ticks.length - 1].c = item.price + if(ticks[ticks.length - 1].h < item.price) ticks[ticks.length - 1].h = item.price + if(ticks[ticks.length - 1].l > item.price) ticks[ticks.length - 1].l = item.price + candleTick.value = [...ticks] + ema.value = calculateEMA(ticks, 20) + macd.value = calculateMACD(ticks) + bb.value = calculateBollingerBands(ticks) + rsi.value = calculateRSI(ticks) + // console.table(entrySignals(ticks)) + const dd = entrySignals(ticks) + if(dd.length) signal2.value = [...signal2.value, entrySignals(ticks)] + const tt = swingSignal(ticks) + console.log(tt) + if(tt[0] !== 'HOLD') signal1.value = [...signal1.value, swingSignal(ticks)] + } + } catch(error) {} - ema.value = calculateEMA(ticks, 20) - macd.value = calculateMACD(ticks) - bb.value = calculateBollingerBands(ticks) - rsi.value = calculateRSI(ticks) - // console.table(entrySignals(ticks)) - const dd = entrySignals(ticks) - if(dd.length) signal2.value = [...signal2.value, entrySignals(ticks)] - - const tt = swingSignal(ticks) - console.log(tt) - if(tt[0] !== 'HOLD') signal1.value = [...signal1.value, swingSignal(ticks)] - lazyLock.value = false + loopIdx++; + if(loopIdx > 1000) { + console.clear(); + loopIdx = 0; + } + // console.log('trade', socketLock) + } } - - + lazyLock.value = false }) } diff --git a/src/utils/sig.ts b/src/utils/sig.ts index 35378ff..2026b69 100644 --- a/src/utils/sig.ts +++ b/src/utils/sig.ts @@ -128,18 +128,38 @@ const swingSignal = (data: any) => { const bbl = bbands.lower[latest - offsetBb]; const bbu = bbands.upper[latest - offsetBb]; - // 4) 최종 조건 - if (volatilityBreak && - prev < 0 && hist >= 0 && + // 시나리오1 + // if (volatilityBreak && + // prev < 0 && hist >= 0 && + // rsiVal <= 35 && close <= bbl) + // return ['LONG',volatilityBreak, prev, hist, rsiVal, close, bbl] + // + // if (volatilityBreak && + // prev > 0 && hist <= 0 && + // rsiVal >= 65 && close >= bbu) + // return ['SHORT',volatilityBreak, prev, hist, rsiVal, close, bbl] + + // 시나리오2 + // if (volatilityBreak && + // prev < hist && + // rsiVal <= 35 && close <= bbl) + // return ['LONG',volatilityBreak, prev, hist, rsiVal, close, bbl] + // + // if (volatilityBreak && + // prev > hist && + // rsiVal >= 65 && close >= bbu) + // return ['SHORT',volatilityBreak, prev, hist, rsiVal, close, bbl] + + // 시나리오3 + if (prev < hist && rsiVal <= 35 && close <= bbl) - return ['LONG',volatilityBreak, prev, hist, rsiVal, close, bbl] + return ['LONG', prev, hist, rsiVal, close, bbl] - if (volatilityBreak && - prev > 0 && hist <= 0 && + if (prev > hist && rsiVal >= 65 && close >= bbu) - return ['SHORT',volatilityBreak, prev, hist, rsiVal, close, bbl] + return ['SHORT', prev, hist, rsiVal, close, bbl] - return ['HOLD',volatilityBreak, prev, hist, rsiVal, close, bbl]; + return ['HOLD', prev, hist, rsiVal, close, bbl]; }; export {swingSignal} \ No newline at end of file