From ca15b907029906431f7db6ff987548ff4e3b97c7 Mon Sep 17 00:00:00 2001 From: uhliksk Date: Sat, 14 Jan 2023 06:16:09 +0100 Subject: [PATCH 1/2] refactor: deterministic queue execution --- app/__tests__/server-binance.test.js | 53 ++---- app/binance/__tests__/candles.test.js | 3 +- app/binance/__tests__/tickers.test.js | 9 +- app/binance/__tests__/user.test.js | 6 +- app/binance/candles.js | 4 +- app/binance/tickers.js | 4 +- app/binance/user.js | 7 +- app/cronjob/__tests__/trailingTrade.test.js | 30 +--- .../__tests__/trailingTradeIndicator.test.js | 163 ++++++------------ app/cronjob/trailingTrade.js | 9 +- .../step/__tests__/cancel-order.test.js | 33 ---- .../step/__tests__/determine-action.test.js | 16 -- .../__tests__/get-override-action.test.js | 54 ------ .../step/__tests__/handle-open-orders.test.js | 118 ------------- .../step/__tests__/place-buy-order.test.js | 38 ---- .../step/__tests__/place-manual-trade.test.js | 62 ------- .../step/__tests__/place-sell-order.test.js | 94 ---------- .../place-sell-stop-loss-order.test.js | 91 ---------- .../__tests__/remove-last-buy-price.test.js | 81 --------- .../trailingTrade/step/cancel-order.js | 7 +- .../trailingTrade/step/determine-action.js | 9 - .../trailingTrade/step/get-override-action.js | 9 - .../trailingTrade/step/handle-open-orders.js | 9 - .../trailingTrade/step/place-buy-order.js | 9 - .../trailingTrade/step/place-manual-trade.js | 7 +- .../trailingTrade/step/place-sell-order.js | 9 - .../step/place-sell-stop-loss-order.js | 9 - .../step/remove-last-buy-price.js | 9 - .../__tests__/common.test.js | 124 ------------- .../__tests__/queue.test.js | 131 ++++++-------- app/cronjob/trailingTradeHelper/common.js | 47 ----- app/cronjob/trailingTradeHelper/queue.js | 51 ++---- app/cronjob/trailingTradeIndicator.js | 109 ++++++------ .../handlers/__tests__/cancel-order.test.js | 3 +- .../manual-trade-all-symbols.test.js | 6 +- .../handlers/__tests__/manual-trade.test.js | 3 +- .../__tests__/symbol-enable-action.test.js | 3 +- .../symbol-grid-trade-delete.test.js | 12 +- .../__tests__/symbol-setting-delete.test.js | 3 +- .../__tests__/symbol-setting-update.test.js | 3 +- .../__tests__/symbol-trigger-buy.test.js | 3 +- .../__tests__/symbol-trigger-sell.test.js | 3 +- .../symbol-update-last-buy-price.test.js | 3 + .../websocket/handlers/cancel-order.js | 4 +- .../handlers/manual-trade-all-symbols.js | 7 +- .../websocket/handlers/manual-trade.js | 4 +- .../handlers/symbol-enable-action.js | 4 +- .../handlers/symbol-grid-trade-delete.js | 4 +- .../handlers/symbol-setting-delete.js | 4 +- .../handlers/symbol-setting-update.js | 4 +- .../websocket/handlers/symbol-trigger-buy.js | 4 +- .../websocket/handlers/symbol-trigger-sell.js | 4 +- .../handlers/symbol-update-last-buy-price.js | 3 + app/server-binance.js | 17 +- 54 files changed, 281 insertions(+), 1234 deletions(-) diff --git a/app/__tests__/server-binance.test.js b/app/__tests__/server-binance.test.js index a0c73aa4..fdc89fb9 100644 --- a/app/__tests__/server-binance.test.js +++ b/app/__tests__/server-binance.test.js @@ -11,8 +11,6 @@ describe('server-binance', () => { let mockGetGlobalConfiguration; let mockGetAccountInfoFromAPI; - let mockLockSymbol; - let mockUnlockSymbol; let mockCacheExchangeSymbols; let mockSetupUserWebsocket; @@ -57,8 +55,9 @@ describe('server-binance', () => { deleteAll: jest.fn().mockResolvedValue(true) }; mockQueue = { - init: jest.fn().mockResolvedValue(true), - execute: jest.fn().mockResolvedValue(true) + prepareJob: jest.fn().mockResolvedValue(true), + execute: jest.fn().mockResolvedValue(true), + completeJob: jest.fn().mockResolvedValue(true) }; mockSlack = { sendMessage: jest.fn().mockResolvedValue(true) @@ -97,9 +96,6 @@ describe('server-binance', () => { } }); - mockLockSymbol = jest.fn().mockResolvedValue(true); - mockUnlockSymbol = jest.fn().mockResolvedValue(true); - mockSetupUserWebsocket = jest.fn().mockResolvedValue(true); mockSyncCandles = jest.fn().mockResolvedValue(true); @@ -133,8 +129,6 @@ describe('server-binance', () => { jest.mock('../cronjob/trailingTradeHelper/common', () => ({ getAccountInfoFromAPI: mockGetAccountInfoFromAPI, - lockSymbol: mockLockSymbol, - unlockSymbol: mockUnlockSymbol, cacheExchangeSymbols: mockCacheExchangeSymbols })); @@ -237,8 +231,12 @@ describe('server-binance', () => { ); }); - it('triggers queue.init', () => { - expect(mockQueue.init).toHaveBeenCalled(); + it('triggers queue.prepareJob', () => { + expect(mockQueue.prepareJob).toHaveBeenCalled(); + }); + + it('triggers queue.completeJob', () => { + expect(mockQueue.completeJob).toHaveBeenCalled(); }); }); @@ -253,9 +251,6 @@ describe('server-binance', () => { } }); - mockLockSymbol = jest.fn().mockResolvedValue(true); - mockUnlockSymbol = jest.fn().mockResolvedValue(true); - mockSetupUserWebsocket = jest.fn().mockResolvedValue(true); mockSyncCandles = jest.fn().mockResolvedValue(true); @@ -297,8 +292,6 @@ describe('server-binance', () => { jest.mock('../cronjob/trailingTradeHelper/common', () => ({ getAccountInfoFromAPI: mockGetAccountInfoFromAPI, - lockSymbol: mockLockSymbol, - unlockSymbol: mockUnlockSymbol, cacheExchangeSymbols: mockCacheExchangeSymbols })); @@ -370,9 +363,6 @@ describe('server-binance', () => { } }); - mockLockSymbol = jest.fn().mockResolvedValue(true); - mockUnlockSymbol = jest.fn().mockResolvedValue(true); - mockSetupUserWebsocket = jest.fn().mockResolvedValue(true); mockSyncCandles = jest.fn().mockResolvedValue(true); @@ -414,8 +404,6 @@ describe('server-binance', () => { jest.mock('../cronjob/trailingTradeHelper/common', () => ({ getAccountInfoFromAPI: mockGetAccountInfoFromAPI, - lockSymbol: mockLockSymbol, - unlockSymbol: mockUnlockSymbol, cacheExchangeSymbols: mockCacheExchangeSymbols })); @@ -482,11 +470,15 @@ describe('server-binance', () => { }); it('triggers queue.execute for BTCUSDT', () => { - expect(mockQueue.execute).toHaveBeenCalledWith(logger, 'BTCUSDT'); + expect(mockQueue.execute).toHaveBeenCalledWith(logger, 'BTCUSDT', { + processFn: expect.any(Function) + }); }); it('triggers queue.execute for LTCUSDT', () => { - expect(mockQueue.execute).toHaveBeenCalledWith(logger, 'LTCUSDT'); + expect(mockQueue.execute).toHaveBeenCalledWith(logger, 'LTCUSDT', { + processFn: expect.any(Function) + }); }); }); }); @@ -502,9 +494,6 @@ describe('server-binance', () => { } }); - mockLockSymbol = jest.fn().mockResolvedValue(true); - mockUnlockSymbol = jest.fn().mockResolvedValue(true); - mockSetupUserWebsocket = jest.fn().mockResolvedValue(true); mockSyncCandles = jest.fn().mockResolvedValue(true); @@ -546,8 +535,6 @@ describe('server-binance', () => { jest.mock('../cronjob/trailingTradeHelper/common', () => ({ getAccountInfoFromAPI: mockGetAccountInfoFromAPI, - lockSymbol: mockLockSymbol, - unlockSymbol: mockUnlockSymbol, cacheExchangeSymbols: mockCacheExchangeSymbols })); @@ -607,9 +594,6 @@ describe('server-binance', () => { } }); - mockLockSymbol = jest.fn().mockResolvedValue(true); - mockUnlockSymbol = jest.fn().mockResolvedValue(true); - mockSetupUserWebsocket = jest.fn().mockResolvedValue(true); mockSyncCandles = jest.fn().mockResolvedValue(true); @@ -643,8 +627,6 @@ describe('server-binance', () => { jest.mock('../cronjob/trailingTradeHelper/common', () => ({ getAccountInfoFromAPI: mockGetAccountInfoFromAPI, - lockSymbol: mockLockSymbol, - unlockSymbol: mockUnlockSymbol, cacheExchangeSymbols: mockCacheExchangeSymbols })); @@ -770,9 +752,6 @@ describe('server-binance', () => { } }); - mockLockSymbol = jest.fn().mockResolvedValue(true); - mockUnlockSymbol = jest.fn().mockResolvedValue(true); - mockSetupUserWebsocket = jest.fn().mockResolvedValue(true); mockSyncCandles = jest.fn().mockResolvedValue(true); @@ -806,8 +785,6 @@ describe('server-binance', () => { jest.mock('../cronjob/trailingTradeHelper/common', () => ({ getAccountInfoFromAPI: mockGetAccountInfoFromAPI, - lockSymbol: mockLockSymbol, - unlockSymbol: mockUnlockSymbol, cacheExchangeSymbols: mockCacheExchangeSymbols })); diff --git a/app/binance/__tests__/candles.test.js b/app/binance/__tests__/candles.test.js index e138614f..468377e2 100644 --- a/app/binance/__tests__/candles.test.js +++ b/app/binance/__tests__/candles.test.js @@ -241,7 +241,8 @@ describe('candles.js', () => { it('triggers queue.execute for ETHBTC', () => { expect(mockExecute).toHaveBeenCalledWith(loggerMock, 'ETHBTC', { correlationId: expect.any(String), - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); }); diff --git a/app/binance/__tests__/tickers.test.js b/app/binance/__tests__/tickers.test.js index 8f616942..65166f2f 100644 --- a/app/binance/__tests__/tickers.test.js +++ b/app/binance/__tests__/tickers.test.js @@ -115,14 +115,16 @@ describe('tickers.js', () => { it('triggers queue.execute for BTCUSDT', () => { expect(mockExecute).toHaveBeenCalledWith(loggerMock, 'BTCUSDT', { correlationId: expect.any(String), - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); it('triggers queue.execute for BNBUSDT', () => { expect(mockExecute).toHaveBeenCalledWith(loggerMock, 'BNBUSDT', { correlationId: expect.any(String), - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); @@ -152,7 +154,8 @@ describe('tickers.js', () => { it('triggers queue.execute for BTCUSDT', () => { expect(mockExecute).toHaveBeenCalledWith(loggerMock, 'BTCUSDT', { correlationId: expect.any(String), - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); diff --git a/app/binance/__tests__/user.test.js b/app/binance/__tests__/user.test.js index 74402af3..20e3f2d1 100644 --- a/app/binance/__tests__/user.test.js +++ b/app/binance/__tests__/user.test.js @@ -362,7 +362,8 @@ describe('user.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(loggerMock, 'ETHUSDT', { correlationId: expect.any(String), - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); @@ -680,7 +681,8 @@ describe('user.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(loggerMock, 'ETHUSDT', { correlationId: expect.any(String), - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); diff --git a/app/binance/candles.js b/app/binance/candles.js index 27a91c60..e33f6ce4 100644 --- a/app/binance/candles.js +++ b/app/binance/candles.js @@ -1,6 +1,7 @@ const { v4: uuidv4 } = require('uuid'); const _ = require('lodash'); const queue = require('../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../cronjob/index'); const { binance, mongo } = require('../helpers'); const { getConfiguration @@ -116,7 +117,8 @@ const syncCandles = async (logger, symbols) => { queue.execute(logger, symbol, { correlationId: uuidv4(), - preprocessFn: getCandles + preprocessFn: getCandles, + processFn: executeTrailingTrade }); }) ); diff --git a/app/binance/tickers.js b/app/binance/tickers.js index 4d297f7b..ec68a158 100644 --- a/app/binance/tickers.js +++ b/app/binance/tickers.js @@ -2,6 +2,7 @@ const { v4: uuidv4 } = require('uuid'); const _ = require('lodash'); const { binance, cache } = require('../helpers'); const queue = require('../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../cronjob/index'); const { getAccountInfo, @@ -78,7 +79,8 @@ const setupTickersWebsocket = async (logger, symbols) => { if (canExecuteTrailingTrade) { queue.execute(symbolLogger, monitoringSymbol, { correlationId, - preprocessFn: saveCandle + preprocessFn: saveCandle, + processFn: executeTrailingTrade }); } else { saveCandle(); diff --git a/app/binance/user.js b/app/binance/user.js index 457f4744..fce40ab9 100644 --- a/app/binance/user.js +++ b/app/binance/user.js @@ -2,6 +2,7 @@ const { v4: uuidv4 } = require('uuid'); const _ = require('lodash'); const { binance } = require('../helpers'); const queue = require('../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../cronjob/index'); const { updateAccountInfo, @@ -121,7 +122,8 @@ const setupUserWebsocket = async logger => { queue.execute(symbolLogger, symbol, { correlationId, - preprocessFn: checkLastOrder + preprocessFn: checkLastOrder, + processFn: executeTrailingTrade }); const checkManualOrder = async () => { @@ -155,7 +157,8 @@ const setupUserWebsocket = async logger => { queue.execute(symbolLogger, symbol, { correlationId, - preprocessFn: checkManualOrder + preprocessFn: checkManualOrder, + processFn: executeTrailingTrade }); } }); diff --git a/app/cronjob/__tests__/trailingTrade.test.js b/app/cronjob/__tests__/trailingTrade.test.js index d50d5d57..fed12c96 100644 --- a/app/cronjob/__tests__/trailingTrade.test.js +++ b/app/cronjob/__tests__/trailingTrade.test.js @@ -12,9 +12,6 @@ describe('trailingTrade', () => { let mockConfigGet; let mockGetAccountInfo; - let mockLockSymbol; - let mockIsSymbolLocked; - let mockUnlockSymbol; let mockGetSymbolConfiguration; let mockGetSymbolInfo; @@ -40,9 +37,6 @@ describe('trailingTrade', () => { beforeEach(() => { jest.clearAllMocks().resetModules(); - mockLockSymbol = jest.fn().mockResolvedValue(true); - mockUnlockSymbol = jest.fn().mockResolvedValue(true); - mockLoggerInfo = jest.fn(); mockSlackSendMessage = jest.fn().mockResolvedValue(true); @@ -89,8 +83,6 @@ describe('trailingTrade', () => { get: mockConfigGet })); - mockIsSymbolLocked = jest.fn().mockResolvedValue(false); - mockGetAccountInfo = jest.fn().mockResolvedValue({ account: 'info' }); @@ -268,10 +260,7 @@ describe('trailingTrade', () => { })); jest.mock('../trailingTradeHelper/common', () => ({ - getAccountInfo: mockGetAccountInfo, - lockSymbol: mockLockSymbol, - isSymbolLocked: mockIsSymbolLocked, - unlockSymbol: mockUnlockSymbol + getAccountInfo: mockGetAccountInfo })); jest.mock('../trailingTrade/steps', () => ({ @@ -301,16 +290,11 @@ describe('trailingTrade', () => { await trailingTradeExecute(logger, 'BTCUSDT'); }); - it(`triggers isSymbolLocked - BTCUSDT`, () => { - expect(mockIsSymbolLocked).toHaveBeenCalledWith(logger, 'BTCUSDT'); - }); - - it('returns expected result for BTCUSDT', () => { + it('returns expected result for BTCUSDT finish', () => { expect(mockLoggerInfo).toHaveBeenCalledWith( { data: { symbol: 'BTCUSDT', - isLocked: false, featureToggle: { feature1Enabled: true }, lastCandle: { got: 'lowest value' }, accountInfo: { account: 'info' }, @@ -348,16 +332,11 @@ describe('trailingTrade', () => { await trailingTradeExecute(logger, 'ETHUSDT'); }); - it(`triggers isSymbolLocked - ETHUSDT`, () => { - expect(mockIsSymbolLocked).toHaveBeenCalledWith(logger, 'ETHUSDT'); - }); - it('returns expected result for ETHUSDT', () => { expect(mockLoggerInfo).toHaveBeenCalledWith( { data: { symbol: 'ETHUSDT', - isLocked: false, featureToggle: { feature1Enabled: true }, lastCandle: { got: 'lowest value' }, accountInfo: { account: 'info' }, @@ -395,16 +374,11 @@ describe('trailingTrade', () => { await trailingTradeExecute(logger, 'LTCUSDT'); }); - it(`triggers isSymbolLocked - LTCUSDT`, () => { - expect(mockIsSymbolLocked).toHaveBeenCalledWith(logger, 'LTCUSDT'); - }); - it('returns expected result for LTCUSDT', async () => { expect(mockLoggerInfo).toHaveBeenCalledWith( { data: { symbol: 'LTCUSDT', - isLocked: false, featureToggle: { feature1Enabled: true }, lastCandle: { got: 'lowest value' }, accountInfo: { account: 'info' }, diff --git a/app/cronjob/__tests__/trailingTradeIndicator.test.js b/app/cronjob/__tests__/trailingTradeIndicator.test.js index b26e357e..b0fafe1e 100644 --- a/app/cronjob/__tests__/trailingTradeIndicator.test.js +++ b/app/cronjob/__tests__/trailingTradeIndicator.test.js @@ -18,9 +18,7 @@ describe('trailingTradeIndicator', () => { let mockGetTradingView; let mockSaveDataToCache; - let mockLockSymbol; - let mockIsSymbolLocked; - let mockUnlockSymbol; + let mockExecute; let mockGetAPILimit; let mockErrorHandlerWrapper; @@ -55,6 +53,11 @@ describe('trailingTradeIndicator', () => { jest.mock('../../error-handler', () => ({ errorHandlerWrapper: mockErrorHandlerWrapper })); + + mockExecute = jest.fn((funcLogger, symbol, jobPayload) => { + if (!funcLogger || !symbol || !jobPayload) return false; + return jobPayload.processFn(); + }); }); const mockSteps = () => { @@ -157,120 +160,58 @@ describe('trailingTradeIndicator', () => { })); }; - describe('without any error', () => { - beforeEach(async () => { - config.get = jest.fn(key => { - switch (key) { - case 'featureToggle': - return { - notifyOrderConfirm: true, - notifyDebug: false - }; - default: - return `value-${key}`; - } - }); - - mockLockSymbol = jest.fn().mockResolvedValue(true); - mockIsSymbolLocked = jest.fn().mockResolvedValue(false); - mockUnlockSymbol = jest.fn().mockResolvedValue(true); - - jest.mock('../trailingTradeHelper/common', () => ({ - lockSymbol: mockLockSymbol, - isSymbolLocked: mockIsSymbolLocked, - unlockSymbol: mockUnlockSymbol, - getAPILimit: mockGetAPILimit - })); - - mockSteps(); - - const { - execute: trailingTradeIndicatorExecute - } = require('../trailingTradeIndicator'); - - await trailingTradeIndicatorExecute(logger); + beforeEach(async () => { + config.get = jest.fn(key => { + switch (key) { + case 'featureToggle': + return { + notifyOrderConfirm: true, + notifyDebug: false + }; + default: + return `value-${key}`; + } }); - it('triggers isSymbolLocked', () => { - expect(mockIsSymbolLocked).toHaveBeenCalledWith(logger, 'BTCUSDT'); - }); + jest.mock('../trailingTradeHelper/common', () => ({ + getAPILimit: mockGetAPILimit + })); - it('triggers lockSymbol', () => { - expect(mockLockSymbol).toHaveBeenCalledWith(logger, 'BTCUSDT'); - }); + jest.mock('../trailingTradeHelper/queue', () => ({ + execute: mockExecute, + getAPILimit: mockGetAPILimit + })); + mockSteps(); - it('triggers unlockSymbol', () => { - expect(mockUnlockSymbol).toHaveBeenCalledWith(logger, 'BTCUSDT'); - }); + const { + execute: trailingTradeIndicatorExecute + } = require('../trailingTradeIndicator'); - it('returns expected result', () => { - expect(mockLoggerInfo).toHaveBeenCalledWith( - { - symbol: 'BTCUSDT', - data: { - action: 'override-action', - featureToggle: { notifyOrderConfirm: true, notifyDebug: false }, - globalConfiguration: { global: 'configuration data' }, - symbol: 'BTCUSDT', - symbolConfiguration: { symbol: 'configuration data' }, - symbolInfo: { some: 'info' }, - overrideParams: { param: 'overrided' }, - quoteAssetStats: {}, - apiLimit: { start: 10, end: 10 }, - dustTransfer: 'dust-transfer', - getClosedTrades: 'executed', - getOrderStats: 'retrieved', - tradingView: 'retrieved', - saved: 'data-to-cache' - } - }, - 'TrailingTradeIndicator: Finish process...' - ); - }); + await trailingTradeIndicatorExecute(logger); }); - describe('when symbol is locked', () => { - beforeEach(async () => { - mockLockSymbol = jest.fn().mockResolvedValue(true); - mockIsSymbolLocked = jest.fn().mockResolvedValue(true); - mockUnlockSymbol = jest.fn().mockResolvedValue(true); - - jest.mock('../trailingTradeHelper/common', () => ({ - lockSymbol: mockLockSymbol, - isSymbolLocked: mockIsSymbolLocked, - unlockSymbol: mockUnlockSymbol, - getAPILimit: mockGetAPILimit - })); - - mockSteps(); - - const { - execute: trailingTradeIndicatorExecute - } = require('../trailingTradeIndicator'); - - await trailingTradeIndicatorExecute(logger); - }); - - it('triggers isSymbolLocked', () => { - expect(mockIsSymbolLocked).toHaveBeenCalledWith(logger, 'BTCUSDT'); - }); - - it('does not trigger lockSymbol', () => { - expect(mockLockSymbol).not.toHaveBeenCalled(); - }); - - it('does not trigger unlockSymbol', () => { - expect(mockUnlockSymbol).not.toHaveBeenCalled(); - }); - - it('returns expected result', () => { - expect(mockLoggerInfo).toHaveBeenCalledWith( - { - debug: true, - symbol: 'BTCUSDT' - }, - '⏯ TrailingTradeIndicator: Skip process as the symbol is currently locked.' - ); - }); + it('returns expected result', () => { + expect(mockLoggerInfo).toHaveBeenCalledWith( + { + symbol: 'BTCUSDT', + data: { + action: 'override-action', + featureToggle: { notifyOrderConfirm: true, notifyDebug: false }, + globalConfiguration: { global: 'configuration data' }, + symbol: 'BTCUSDT', + symbolConfiguration: { symbol: 'configuration data' }, + symbolInfo: { some: 'info' }, + overrideParams: { param: 'overrided' }, + quoteAssetStats: {}, + apiLimit: { start: 10, end: 10 }, + dustTransfer: 'dust-transfer', + getClosedTrades: 'executed', + getOrderStats: 'retrieved', + tradingView: 'retrieved', + saved: 'data-to-cache' + } + }, + 'TrailingTradeIndicator: Finish process...' + ); }); }); diff --git a/app/cronjob/trailingTrade.js b/app/cronjob/trailingTrade.js index 647f8996..d21e6817 100644 --- a/app/cronjob/trailingTrade.js +++ b/app/cronjob/trailingTrade.js @@ -1,10 +1,7 @@ const { v4: uuidv4 } = require('uuid'); const config = require('config'); -const { - getAccountInfo, - isSymbolLocked -} = require('./trailingTradeHelper/common'); +const { getAccountInfo } = require('./trailingTradeHelper/common'); const { getSymbolConfiguration, @@ -35,9 +32,6 @@ const execute = async (rawLogger, symbol, correlationId = uuidv4()) => { }); await errorHandlerWrapper(logger, 'Trailing Trade', async () => { - // Check if the symbol is locked, if it is locked, it means the symbol is updating in the indicator. - const isLocked = await isSymbolLocked(logger, symbol); - logger.info({ debug: true }, '▶ TrailingTrade: Start process...'); // Retrieve account info from cache @@ -49,7 +43,6 @@ const execute = async (rawLogger, symbol, correlationId = uuidv4()) => { // Define skeleton of data structure let data = { symbol, - isLocked, featureToggle, lastCandle: {}, accountInfo, diff --git a/app/cronjob/trailingTrade/step/__tests__/cancel-order.test.js b/app/cronjob/trailingTrade/step/__tests__/cancel-order.test.js index 40d837f1..59007e1c 100644 --- a/app/cronjob/trailingTrade/step/__tests__/cancel-order.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/cancel-order.test.js @@ -41,34 +41,6 @@ describe('cancel-order.js', () => { })); }); - describe('when symbol is locked', () => { - beforeEach(async () => { - jest.mock('../../../trailingTradeHelper/common', () => ({ - getAPILimit: mockGetAPILimit, - getAndCacheOpenOrdersForSymbol: mockGetAndCacheOpenOrdersForSymbol, - getAccountInfoFromAPI: mockGetAccountInfoFromAPI - })); - - const step = require('../cancel-order'); - rawData = { - symbol: 'BTCUSDT', - isLocked: true, - action: 'cancel-order', - order: {} - }; - - result = await step.execute(loggerMock, rawData); - }); - - it('does not trigger binance.client.cancelOrder', () => { - expect(binanceMock.client.cancelOrder).not.toHaveBeenCalled(); - }); - - it('returns expected value', () => { - expect(result).toStrictEqual(rawData); - }); - }); - describe('when action is not cancel-order', () => { beforeEach(async () => { jest.mock('../../../trailingTradeHelper/common', () => ({ @@ -80,7 +52,6 @@ describe('cancel-order.js', () => { const step = require('../cancel-order'); rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'buy-order-wait', order: {} }; @@ -120,7 +91,6 @@ describe('cancel-order.js', () => { const step = require('../cancel-order'); rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'cancel-order', accountInfo: { existing: 'data' @@ -178,7 +148,6 @@ describe('cancel-order.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, action: 'cancel-order', accountInfo: { account: 'info' @@ -232,7 +201,6 @@ describe('cancel-order.js', () => { const step = require('../cancel-order'); rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'cancel-order', accountInfo: { existing: 'data' @@ -290,7 +258,6 @@ describe('cancel-order.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, action: 'cancel-order', accountInfo: { account: 'info' diff --git a/app/cronjob/trailingTrade/step/__tests__/determine-action.test.js b/app/cronjob/trailingTrade/step/__tests__/determine-action.test.js index 1063a409..39b93db5 100644 --- a/app/cronjob/trailingTrade/step/__tests__/determine-action.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/determine-action.test.js @@ -39,7 +39,6 @@ describe('determine-action.js', () => { orgRawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolInfo: { baseAsset: 'BTC', filterLotSize: { stepSize: '0.00000100' }, @@ -110,21 +109,6 @@ describe('determine-action.js', () => { }; }); - describe('when symbol is locked', () => { - beforeEach(async () => { - rawData = _.cloneDeep(orgRawData); - rawData.isLocked = true; - - step = require('../determine-action'); - - result = await step.execute(loggerMock, rawData); - }); - - it('returns same data', () => { - expect(result).toStrictEqual(rawData); - }); - }); - describe('when action is buy-order-wait', () => { beforeEach(async () => { rawData = _.cloneDeep(orgRawData); diff --git a/app/cronjob/trailingTrade/step/__tests__/get-override-action.test.js b/app/cronjob/trailingTrade/step/__tests__/get-override-action.test.js index e9edfdce..b51b4abd 100644 --- a/app/cronjob/trailingTrade/step/__tests__/get-override-action.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/get-override-action.test.js @@ -33,43 +33,11 @@ describe('get-override-action.js', () => { })); }); - describe('when symbol is locked', () => { - beforeEach(async () => { - rawData = { - action: 'not-determined', - symbol: 'BTCUSDT', - isLocked: true, - symbolConfiguration: { - botOptions: { - autoTriggerBuy: { triggerAfter: 20 } - } - } - }; - - const step = require('../get-override-action'); - result = await step.execute(loggerMock, rawData); - }); - - it('retruns expected result', () => { - expect(result).toStrictEqual({ - action: 'not-determined', - symbol: 'BTCUSDT', - isLocked: true, - symbolConfiguration: { - botOptions: { - autoTriggerBuy: { triggerAfter: 20 } - } - } - }); - }); - }); - describe('when action is not "not-determined"', () => { beforeEach(async () => { rawData = { action: 'buy-order-wait', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: 20 } @@ -85,7 +53,6 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'buy-order-wait', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: 20 } @@ -109,7 +76,6 @@ describe('get-override-action.js', () => { rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: 20 } @@ -136,7 +102,6 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: 20 } @@ -165,7 +130,6 @@ describe('get-override-action.js', () => { rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: 20 } @@ -195,7 +159,6 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'manual-trade', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: 20 } @@ -232,7 +195,6 @@ describe('get-override-action.js', () => { rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: 20 } @@ -262,7 +224,6 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'cancel-order', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: 20 } @@ -297,7 +258,6 @@ describe('get-override-action.js', () => { rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: 20 } @@ -327,7 +287,6 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'buy', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: 20 } @@ -366,7 +325,6 @@ describe('get-override-action.js', () => { rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { buy: { athRestriction: { @@ -432,7 +390,6 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { buy: { athRestriction: { @@ -473,7 +430,6 @@ describe('get-override-action.js', () => { rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { buy: { athRestriction: { @@ -526,7 +482,6 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'buy', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { buy: { athRestriction: { @@ -571,7 +526,6 @@ describe('get-override-action.js', () => { rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { buy: { athRestriction: { @@ -624,7 +578,6 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'buy', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { buy: { athRestriction: { @@ -688,7 +641,6 @@ describe('get-override-action.js', () => { rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { buy: { athRestriction: { @@ -752,7 +704,6 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { buy: { athRestriction: { @@ -793,7 +744,6 @@ describe('get-override-action.js', () => { rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { buy: { athRestriction: { @@ -846,7 +796,6 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'buy', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { buy: { athRestriction: { @@ -891,7 +840,6 @@ describe('get-override-action.js', () => { rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { buy: { athRestriction: { @@ -1198,7 +1146,6 @@ describe('get-override-action.js', () => { rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: 20 } @@ -1225,7 +1172,6 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: 20 } diff --git a/app/cronjob/trailingTrade/step/__tests__/handle-open-orders.test.js b/app/cronjob/trailingTrade/step/__tests__/handle-open-orders.test.js index 294a9959..7263dc59 100644 --- a/app/cronjob/trailingTrade/step/__tests__/handle-open-orders.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/handle-open-orders.test.js @@ -39,96 +39,6 @@ describe('handle-open-orders.js', () => { mockIsExceedingMaxOpenTrades = jest.fn().mockResolvedValue(false); }); - describe('when symbol is locked', () => { - beforeEach(async () => { - jest.mock('../../../trailingTradeHelper/common', () => ({ - getAccountInfoFromAPI: mockGetAccountInfoFromAPI, - isExceedingMaxOpenTrades: mockIsExceedingMaxOpenTrades, - cancelOrder: mockCancelOrder, - refreshOpenOrdersAndAccountInfo: mockRefreshOpenOrdersAndAccountInfo - })); - - step = require('../handle-open-orders'); - - rawData = { - symbol: 'BTCUSDT', - isLocked: true, - action: 'not-determined', - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46838, - price: '1799.58000000', - type: 'LIMIT', - side: 'BUY' - } - ], - buy: { - limitPrice: 1800, - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46838, - price: '1799.58000000', - type: 'LIMIT', - side: 'BUY' - } - ] - }, - sell: { - limitPrice: 1800, - openOrders: [] - }, - symbolInfo: { - quoteAsset: 'USDT' - } - }; - - result = await step.execute(loggerMock, rawData); - }); - - it('does not trigger cancelOrder', () => { - expect(mockCancelOrder).not.toHaveBeenCalled(); - }); - - it('does not trigger refreshOpenOrdersAndAccountInfo', () => { - expect(mockRefreshOpenOrdersAndAccountInfo).not.toHaveBeenCalled(); - }); - - it('returns expected value', () => { - expect(result).toStrictEqual({ - symbol: 'BTCUSDT', - isLocked: true, - action: 'not-determined', - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46838, - price: '1799.58000000', - type: 'LIMIT', - side: 'BUY' - } - ], - buy: { - limitPrice: 1800, - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46838, - price: '1799.58000000', - type: 'LIMIT', - side: 'BUY' - } - ] - }, - sell: { limitPrice: 1800, openOrders: [] }, - symbolInfo: { - quoteAsset: 'USDT' - } - }); - }); - }); - describe('when action is not not-determined', () => { beforeEach(async () => { jest.mock('../../../trailingTradeHelper/common', () => ({ @@ -142,7 +52,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'buy-wait', openOrders: [ { @@ -188,7 +97,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, action: 'buy-wait', openOrders: [ { @@ -232,7 +140,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'not-determined', openOrders: [ { @@ -278,7 +185,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, action: 'not-determined', openOrders: [ { @@ -328,7 +234,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'not-determined', openOrders: [ { @@ -379,7 +284,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, action: 'buy-order-checking', openOrders: [ { @@ -420,7 +324,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'not-determined', openOrders: [ { @@ -478,7 +381,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, action: 'buy-order-cancelled', openOrders: [ { @@ -530,7 +432,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, featureToggle: { notifyDebug: false }, @@ -603,7 +504,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, featureToggle: { notifyDebug: false }, @@ -646,7 +546,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'not-determined', openOrders: [ { @@ -716,7 +615,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, action: 'buy', openOrders: [ { @@ -765,7 +663,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, featureToggle: { notifyDebug: false }, @@ -838,7 +735,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, featureToggle: { notifyDebug: false }, @@ -881,7 +777,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'not-determined', openOrders: [ { @@ -951,7 +846,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, action: 'buy', openOrders: [ { @@ -996,7 +890,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'not-determined', openOrders: [ { @@ -1044,7 +937,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, action: 'buy-order-wait', openOrders: [ { @@ -1097,7 +989,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, featureToggle: { notifyDebug: false }, @@ -1166,7 +1057,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, featureToggle: { notifyDebug: false }, @@ -1209,7 +1099,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'not-determined', openOrders: [ { @@ -1280,7 +1169,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, action: 'sell', openOrders: [ { @@ -1329,7 +1217,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, featureToggle: { notifyDebug: false }, @@ -1398,7 +1285,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, featureToggle: { notifyDebug: false }, @@ -1441,7 +1327,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'not-determined', openOrders: [ { @@ -1512,7 +1397,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, action: 'sell', openOrders: [ { @@ -1555,7 +1439,6 @@ describe('handle-open-orders.js', () => { rawData = { symbol: 'BTCUSDT', - isLocked: false, action: 'not-determined', openOrders: [ { @@ -1603,7 +1486,6 @@ describe('handle-open-orders.js', () => { it('returns expected value', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', - isLocked: false, action: 'sell-order-wait', openOrders: [ { diff --git a/app/cronjob/trailingTrade/step/__tests__/place-buy-order.test.js b/app/cronjob/trailingTrade/step/__tests__/place-buy-order.test.js index cbe4ca98..0506a28c 100644 --- a/app/cronjob/trailingTrade/step/__tests__/place-buy-order.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/place-buy-order.test.js @@ -63,7 +63,6 @@ describe('place-buy-order.js', () => { orgRawData = { symbol: 'BTCUPUSDT', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -133,24 +132,6 @@ describe('place-buy-order.js', () => { }); }; - describe('when symbol is locked', () => { - beforeEach(async () => { - const step = require('../place-buy-order'); - - // Set isLocked true - rawData = _.cloneDeep(orgRawData); - rawData.isLocked = true; - - result = await step.execute(loggerMock, rawData); - }); - - doNotProcessTests(); - - it('retruns expected value', () => { - expect(result).toStrictEqual(rawData); - }); - }); - describe('when action is not buy', () => { beforeEach(async () => { const step = require('../place-buy-order'); @@ -1016,7 +997,6 @@ describe('place-buy-order.js', () => { symbol: 'BTCUPUSDT', rawData: { symbol: 'BTCUPUSDT', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -1076,7 +1056,6 @@ describe('place-buy-order.js', () => { symbol: 'ETHBTC', rawData: { symbol: 'ETHBTC', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -1136,7 +1115,6 @@ describe('place-buy-order.js', () => { symbol: 'ALPHABTC', rawData: { symbol: 'ALPHABTC', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -1196,7 +1174,6 @@ describe('place-buy-order.js', () => { symbol: 'BTCBRL', rawData: { symbol: 'BTCBRL', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -1277,7 +1254,6 @@ describe('place-buy-order.js', () => { symbol: '', rawData: { symbol: 'BTCUPUSDT', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -1339,7 +1315,6 @@ describe('place-buy-order.js', () => { symbol: 'ETHBTC', rawData: { symbol: 'ETHBTC', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -1401,7 +1376,6 @@ describe('place-buy-order.js', () => { symbol: 'ALPHABTC', rawData: { symbol: 'ALPHABTC', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -1463,7 +1437,6 @@ describe('place-buy-order.js', () => { symbol: 'BTCBRL', rawData: { symbol: 'BTCBRL', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -1658,7 +1631,6 @@ describe('place-buy-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -1757,7 +1729,6 @@ describe('place-buy-order.js', () => { }, rawData: { symbol: 'BTCUPUSDT', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -1884,7 +1855,6 @@ describe('place-buy-order.js', () => { }, rawData: { symbol: 'ETHBTC', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -2013,7 +1983,6 @@ describe('place-buy-order.js', () => { }, rawData: { symbol: 'ALPHABTC', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -2142,7 +2111,6 @@ describe('place-buy-order.js', () => { }, rawData: { symbol: 'BTCBRL', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -2275,7 +2243,6 @@ describe('place-buy-order.js', () => { }, rawData: { symbol: 'BNBUSDT', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -2474,7 +2441,6 @@ describe('place-buy-order.js', () => { }, rawData: { symbol: 'BTCUPUSDT', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -2607,7 +2573,6 @@ describe('place-buy-order.js', () => { }, rawData: { symbol: 'ETHBTC', - isLocked: false, featureToggle: { notifyDebug: true }, @@ -2740,7 +2705,6 @@ describe('place-buy-order.js', () => { }, rawData: { symbol: 'ALPHABTC', - isLocked: false, featureToggle: { notifyDebug: false }, @@ -2873,7 +2837,6 @@ describe('place-buy-order.js', () => { }, rawData: { symbol: 'BTCBRL', - isLocked: false, featureToggle: { notifyDebug: false }, @@ -3077,7 +3040,6 @@ describe('place-buy-order.js', () => { rawData = _.cloneDeep({ symbol: 'BTCUPUSDT', - isLocked: false, featureToggle: { notifyDebug: true, notifyOrderConfirm: false diff --git a/app/cronjob/trailingTrade/step/__tests__/place-manual-trade.test.js b/app/cronjob/trailingTrade/step/__tests__/place-manual-trade.test.js index 361bc1cf..1b0e701c 100644 --- a/app/cronjob/trailingTrade/step/__tests__/place-manual-trade.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/place-manual-trade.test.js @@ -42,58 +42,6 @@ describe('place-manual-trade.js', () => { mockSaveManualOrder = jest.fn().mockResolvedValue(true); }); - describe('when symbol is locked', () => { - beforeEach(async () => { - jest.mock('../../../trailingTradeHelper/common', () => ({ - getAccountInfoFromAPI: mockGetAccountInfoFromAPI, - getAPILimit: mockGetAPILimit, - getAndCacheOpenOrdersForSymbol: mockGetAndCacheOpenOrdersForSymbol - })); - - jest.mock('../../../trailingTradeHelper/order', () => ({ - saveManualOrder: mockSaveManualOrder - })); - - const step = require('../place-manual-trade'); - - rawData = { - symbol: 'BTCUSDT', - action: 'manual-trade', - isLocked: true, - symbolConfiguration: { - system: { - checkManualOrderPeriod: 10 - } - }, - order: {} - }; - - result = await step.execute(loggerMock, rawData); - }); - - it('does not trigger getAndCacheOpenOrdersForSymbol', () => { - expect(mockGetAndCacheOpenOrdersForSymbol).not.toHaveBeenCalled(); - }); - - it('does not trigger saveManualOrder', () => { - expect(mockSaveManualOrder).not.toHaveBeenCalled(); - }); - - it('returns expected result', () => { - expect(result).toStrictEqual({ - symbol: 'BTCUSDT', - action: 'manual-trade', - isLocked: true, - symbolConfiguration: { - system: { - checkManualOrderPeriod: 10 - } - }, - order: {} - }); - }); - }); - describe('when action is not manual-trade', () => { beforeEach(async () => { jest.mock('../../../trailingTradeHelper/common', () => ({ @@ -111,7 +59,6 @@ describe('place-manual-trade.js', () => { rawData = { symbol: 'BTCUSDT', action: 'buy-order-wait', - isLocked: false, symbolConfiguration: { system: { checkManualOrderPeriod: 10 @@ -135,7 +82,6 @@ describe('place-manual-trade.js', () => { expect(result).toStrictEqual({ symbol: 'BTCUSDT', action: 'buy-order-wait', - isLocked: false, symbolConfiguration: { system: { checkManualOrderPeriod: 10 @@ -220,7 +166,6 @@ describe('place-manual-trade.js', () => { expectedData: { symbol: 'BTCUSDT', action: 'manual-trade', - isLocked: false, symbolConfiguration: { system: { checkManualOrderPeriod: 10 } }, buy: { openOrders: [ @@ -356,7 +301,6 @@ describe('place-manual-trade.js', () => { expectedData: { symbol: 'BTCUSDT', action: 'manual-trade', - isLocked: false, symbolConfiguration: { system: { checkManualOrderPeriod: 10 } }, buy: { openOrders: [], @@ -450,7 +394,6 @@ describe('place-manual-trade.js', () => { expectedData: { symbol: 'BTCUSDT', action: 'manual-trade', - isLocked: false, symbolConfiguration: { system: { checkManualOrderPeriod: 10 } }, buy: { openOrders: [], @@ -537,7 +480,6 @@ describe('place-manual-trade.js', () => { expectedData: { symbol: 'BTCUSDT', action: 'manual-trade', - isLocked: false, symbolConfiguration: { system: { checkManualOrderPeriod: 10 } }, buy: { openOrders: [], @@ -631,7 +573,6 @@ describe('place-manual-trade.js', () => { expectedData: { symbol: 'BTCUSDT', action: 'manual-trade', - isLocked: false, symbolConfiguration: { system: { checkManualOrderPeriod: 10 } }, buy: { openOrders: [], @@ -725,7 +666,6 @@ describe('place-manual-trade.js', () => { expectedData: { symbol: 'BTCUSDT', action: 'manual-trade', - isLocked: false, symbolConfiguration: { system: { checkManualOrderPeriod: 10 } }, buy: { openOrders: [], @@ -788,7 +728,6 @@ describe('place-manual-trade.js', () => { rawData = { symbol: 'BTCUSDT', action: 'manual-trade', - isLocked: false, symbolConfiguration: { system: { checkManualOrderPeriod: 10 @@ -848,7 +787,6 @@ describe('place-manual-trade.js', () => { rawData = { symbol: 'BTCUSDT', action: 'manual-trade', - isLocked: false, symbolConfiguration: { system: { checkManualOrderPeriod: 10 diff --git a/app/cronjob/trailingTrade/step/__tests__/place-sell-order.test.js b/app/cronjob/trailingTrade/step/__tests__/place-sell-order.test.js index 07af624b..b662fcdb 100644 --- a/app/cronjob/trailingTrade/step/__tests__/place-sell-order.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/place-sell-order.test.js @@ -38,79 +38,6 @@ describe('place-sell-order.js', () => { mockGetAndCacheOpenOrdersForSymbol = jest.fn().mockResolvedValue([]); }); - describe('when symbol is locked', () => { - beforeEach(async () => { - mockGetAccountInfoFromAPI = jest.fn().mockResolvedValue({ - account: 'info' - }); - - jest.mock('../../../trailingTradeHelper/common', () => ({ - getAccountInfoFromAPI: mockGetAccountInfoFromAPI, - isExceedAPILimit: mockIsExceedAPILimit, - getAPILimit: mockGetAPILimit, - getAndCacheOpenOrdersForSymbol: mockGetAndCacheOpenOrdersForSymbol - })); - - jest.mock('../../../trailingTradeHelper/order', () => ({ - saveGridTradeOrder: mockSaveGridTradeOrder - })); - - const step = require('../place-sell-order'); - - rawData = { - symbol: 'BTCUPUSDT', - isLocked: true, - symbolInfo: { - filterLotSize: { - stepSize: '0.01000000', - minQty: '0.01000000', - maxQty: '100.0000000' - }, - filterPrice: { tickSize: '0.00100000' }, - filterMinNotional: { minNotional: '10.00000000' } - }, - symbolConfiguration: { - sell: { - enabled: true, - currentGridTradeIndex: 0, - currentGridTrade: { - triggerPercentage: 1.03, - stopPercentage: 0.99, - limitPercentage: 0.989, - quantityPercentage: 0.8, - executed: false, - executedOrder: null - } - }, - system: { - checkOrderExecutePeriod: 10 - } - }, - action: 'not-determined', - baseAssetBalance: { free: 0.5 }, - sell: { currentPrice: 200, openOrders: [] } - }; - - result = await step.execute(loggerMock, rawData); - }); - - it('does not trigger binance.client.order', () => { - expect(binanceMock.client.order).not.toHaveBeenCalled(); - }); - - it('does not trigger getAndCacheOpenOrdersForSymbol', () => { - expect(mockGetAndCacheOpenOrdersForSymbol).not.toHaveBeenCalled(); - }); - - it('does not trigger getAccountInfoFromAPI', () => { - expect(mockGetAccountInfoFromAPI).not.toHaveBeenCalled(); - }); - - it('retruns expected value', () => { - expect(result).toStrictEqual(rawData); - }); - }); - describe('when action is not sell', () => { beforeEach(async () => { mockGetAccountInfoFromAPI = jest.fn().mockResolvedValue({ @@ -132,7 +59,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -205,7 +131,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -310,7 +235,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -391,7 +315,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -483,7 +406,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'ALPHABTC', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '1.00000000', @@ -575,7 +497,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCBRL', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '0.00000100', @@ -669,7 +590,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -761,7 +681,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'ALPHABTC', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '1.00000000', @@ -853,7 +772,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCBRL', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '0.00000100', @@ -946,7 +864,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -1039,7 +956,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -1152,7 +1068,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -1308,7 +1223,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'ALPHABTC', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '1.00000000', @@ -1464,7 +1378,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCBRL', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '0.00000100', @@ -1624,7 +1537,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -1781,7 +1693,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'ALPHABTC', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '1.00000000', @@ -1938,7 +1849,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCBRL', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '0.00000100', @@ -2097,7 +2007,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -2254,7 +2163,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'ALPHABTC', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '1.00000000', @@ -2411,7 +2319,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'BTCBRL', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '0.00000100', @@ -2568,7 +2475,6 @@ describe('place-sell-order.js', () => { rawData = { symbol: 'ONGUSDT', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '1.00000000', diff --git a/app/cronjob/trailingTrade/step/__tests__/place-sell-stop-loss-order.test.js b/app/cronjob/trailingTrade/step/__tests__/place-sell-stop-loss-order.test.js index 110c376e..5c1723c5 100644 --- a/app/cronjob/trailingTrade/step/__tests__/place-sell-stop-loss-order.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/place-sell-stop-loss-order.test.js @@ -39,80 +39,6 @@ describe('place-sell-stop-loss-order.js', () => { mockGetAndCacheOpenOrdersForSymbol = jest.fn().mockResolvedValue([]); }); - describe('when symbol is locked', () => { - beforeEach(async () => { - mockGetAndCacheOpenOrdersForSymbol = jest.fn().mockResolvedValue([]); - mockGetAccountInfoFromAPI = jest.fn().mockResolvedValue({ - account: 'info' - }); - - jest.mock('../../../trailingTradeHelper/common', () => ({ - getAccountInfoFromAPI: mockGetAccountInfoFromAPI, - isExceedAPILimit: mockIsExceedAPILimit, - disableAction: mockDisableAction, - getAPILimit: mockGetAPILimit, - getAndCacheOpenOrdersForSymbol: mockGetAndCacheOpenOrdersForSymbol - })); - - jest.mock('../../../trailingTradeHelper/configuration', () => ({ - saveSymbolGridTrade: mockSaveSymbolGridTrade - })); - - const step = require('../place-sell-stop-loss-order'); - - rawData = { - symbol: 'BTCUPUSDT', - isLocked: true, - symbolInfo: { - filterLotSize: { - stepSize: '0.01000000', - minQty: '0.01000000', - maxQty: '100.0000000' - }, - filterPrice: { tickSize: '0.00100000' }, - filterMinNotional: { minNotional: '10.00000000' } - }, - symbolConfiguration: { - buy: { gridTrade: [] }, - sell: { - enabled: true, - gridTrade: [], - stopLoss: { - orderType: 'market', - disableBuyMinutes: 60 - } - } - }, - action: 'not-determined', - baseAssetBalance: { free: 0.5 }, - sell: { currentPrice: 200, openOrders: [] }, - canDisable: true - }; - - result = await step.execute(loggerMock, rawData); - }); - - it('does not trigger binance.client.order', () => { - expect(binanceMock.client.order).not.toHaveBeenCalled(); - }); - - it('does not trigger getAndCacheOpenOrdersForSymbol', () => { - expect(mockGetAndCacheOpenOrdersForSymbol).not.toHaveBeenCalled(); - }); - - it('does not trigger getAccountInfoFromAPI', () => { - expect(mockGetAccountInfoFromAPI).not.toHaveBeenCalled(); - }); - - it('does not trigger saveSymbolGridTrade', () => { - expect(mockSaveSymbolGridTrade).not.toHaveBeenCalled(); - }); - - it('retruns expected value', () => { - expect(result).toStrictEqual(rawData); - }); - }); - describe('when action is not sell-stop-loss', () => { beforeEach(async () => { mockGetAndCacheOpenOrdersForSymbol = jest.fn().mockResolvedValue([]); @@ -136,7 +62,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -210,7 +135,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -317,7 +241,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -406,7 +329,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'ALPHABTC', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '1.00000000', @@ -495,7 +417,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCBRL', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '0.00000100', @@ -586,7 +507,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -674,7 +594,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'ALPHABTC', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '1.00000000', @@ -762,7 +681,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCBRL', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '0.00000100', @@ -851,7 +769,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -941,7 +858,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -1029,7 +945,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -1135,7 +1050,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -1327,7 +1241,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'ALPHABTC', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '1.00000000', @@ -1533,7 +1446,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCBRL', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '0.00000100', @@ -1741,7 +1653,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCUPUSDT', - isLocked: false, symbolInfo: { filterLotSize: { stepSize: '0.01000000', @@ -1937,7 +1848,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'ALPHABTC', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '1.00000000', @@ -2133,7 +2043,6 @@ describe('place-sell-stop-loss-order.js', () => { rawData = { symbol: 'BTCBRL', - isLocked: false, symbolInfo: { filterLotSize: { minQty: '0.00000100', diff --git a/app/cronjob/trailingTrade/step/__tests__/remove-last-buy-price.test.js b/app/cronjob/trailingTrade/step/__tests__/remove-last-buy-price.test.js index 41519bc0..5506b5c9 100644 --- a/app/cronjob/trailingTrade/step/__tests__/remove-last-buy-price.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/remove-last-buy-price.test.js @@ -61,77 +61,6 @@ describe('remove-last-buy-price.js', () => { mockGetGridTradeOrder = jest.fn().mockResolvedValue({}); }); - describe('when symbol is locked', () => { - beforeEach(async () => { - jest.mock('../../../trailingTradeHelper/common', () => ({ - isActionDisabled: mockIsActionDisabled, - getAPILimit: mockGetAPILimit, - removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats, - saveOverrideAction: mockSaveOverrideAction, - getAndCacheOpenOrdersForSymbol: mockGetAndCacheOpenOrdersForSymbol - })); - - jest.mock('../../../trailingTradeHelper/configuration', () => ({ - archiveSymbolGridTrade: mockArchiveSymbolGridTrade, - deleteSymbolGridTrade: mockDeleteSymbolGridTrade, - getSymbolGridTrade: mockGetSymbolGridTrade - })); - - jest.mock('../../../trailingTradeHelper/order', () => ({ - getGridTradeOrder: mockGetGridTradeOrder - })); - - const step = require('../remove-last-buy-price'); - - rawData = { - action: 'not-determined', - isLocked: true, - symbol: 'BTCUPUSDT', - symbolConfiguration: { - symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], - buy: { lastBuyPriceRemoveThreshold: 10 } - }, - symbolInfo: { - filterLotSize: { - stepSize: '0.01000000', - minQty: '0.01000000' - }, - filterMinNotional: { - minNotional: '10.00000000' - } - }, - openOrders: [], - baseAssetBalance: { - free: 0, - locked: 0 - }, - sell: { - currentPrice: 200, - lastBuyPrice: null - } - }; - - result = await step.execute(loggerMock, rawData); - }); - - it('does not trigger archiveSymbolGridTrade', () => { - expect(mockArchiveSymbolGridTrade).not.toHaveBeenCalled(); - }); - - it('does not trigger deleteSymbolGridTrade', () => { - expect(mockDeleteSymbolGridTrade).not.toHaveBeenCalled(); - }); - - it('does not trigger saveOrderStats', () => { - expect(mockSaveOrderStats).not.toHaveBeenCalled(); - }); - - it('returns expected data', () => { - expect(result).toStrictEqual(rawData); - }); - }); - describe('when action is not `not-determined`', () => { beforeEach(async () => { jest.mock('../../../trailingTradeHelper/common', () => ({ @@ -157,7 +86,6 @@ describe('remove-last-buy-price.js', () => { rawData = { action: 'buy', - isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], @@ -230,7 +158,6 @@ describe('remove-last-buy-price.js', () => { rawData = { action: 'not-determined', - isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], @@ -308,7 +235,6 @@ describe('remove-last-buy-price.js', () => { rawData = { action: 'not-determined', - isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], @@ -386,7 +312,6 @@ describe('remove-last-buy-price.js', () => { rawData = { action: 'not-determined', - isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], @@ -464,7 +389,6 @@ describe('remove-last-buy-price.js', () => { rawData = { action: 'not-determined', - isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { symbols: ['BTCUSDT', 'BNBUSDT', 'BTCUPUSDT'], @@ -863,7 +787,6 @@ describe('remove-last-buy-price.js', () => { }, rawData: { action: 'not-determined', - isLocked: false, symbol: 'ALPHABTC', symbolConfiguration: { symbols: ['BTCUSDT', 'BNBUSDT', 'ALPHABTC'], @@ -900,7 +823,6 @@ describe('remove-last-buy-price.js', () => { archivedSymbolGridTradeResult: {}, rawData: { action: 'not-determined', - isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { symbols: ['BTCUSDT', 'BNBUSDT', 'BTCUPUSDT'], @@ -1050,7 +972,6 @@ describe('remove-last-buy-price.js', () => { rawData = { action: 'not-determined', - isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { symbols: ['BTCUSDT', 'BNBUSDT', 'BTCUPUSDT'], @@ -1179,7 +1100,6 @@ describe('remove-last-buy-price.js', () => { rawData = { action: 'not-determined', - isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { symbols: ['BTCUSDT', 'BNBUSDT', 'BTCUPUSDT'], @@ -1266,7 +1186,6 @@ describe('remove-last-buy-price.js', () => { rawData = { action: 'not-determined', - isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { symbols: ['BTCUSDT', 'BNBUSDT', 'BTCUPUSDT'], diff --git a/app/cronjob/trailingTrade/step/cancel-order.js b/app/cronjob/trailingTrade/step/cancel-order.js index 541046d7..a7f31f79 100644 --- a/app/cronjob/trailingTrade/step/cancel-order.js +++ b/app/cronjob/trailingTrade/step/cancel-order.js @@ -15,12 +15,7 @@ const { deleteManualOrder } = require('../../trailingTradeHelper/order'); */ const execute = async (logger, rawData) => { const data = rawData; - const { symbol, isLocked, action, order } = data; - - if (isLocked) { - logger.info({ isLocked }, 'Symbol is locked, do not process cancel-order'); - return data; - } + const { symbol, action, order } = data; if (action !== 'cancel-order') { logger.info( diff --git a/app/cronjob/trailingTrade/step/determine-action.js b/app/cronjob/trailingTrade/step/determine-action.js index 51659478..63ef9b8c 100644 --- a/app/cronjob/trailingTrade/step/determine-action.js +++ b/app/cronjob/trailingTrade/step/determine-action.js @@ -416,7 +416,6 @@ const execute = async (logger, rawData) => { const { action, symbol, - isLocked, symbolInfo: { baseAsset }, symbolConfiguration: { buy: { currentGridTradeIndex: currentBuyGridTradeIndex }, @@ -427,14 +426,6 @@ const execute = async (logger, rawData) => { const humanisedBuyGridTradeIndex = currentBuyGridTradeIndex + 1; const humanisedSellGridTradeIndex = currentSellGridTradeIndex + 1; - if (isLocked) { - logger.info( - { isLocked }, - 'Symbol is locked, do not process determine-action' - ); - return data; - } - if (action !== 'not-determined') { logger.info( { action }, diff --git a/app/cronjob/trailingTrade/step/get-override-action.js b/app/cronjob/trailingTrade/step/get-override-action.js index c6ffce2d..8e3d6990 100644 --- a/app/cronjob/trailingTrade/step/get-override-action.js +++ b/app/cronjob/trailingTrade/step/get-override-action.js @@ -129,7 +129,6 @@ const execute = async (logger, rawData) => { const { action, symbol, - isLocked, symbolConfiguration: { botOptions: { autoTriggerBuy: { triggerAfter: autoTriggerBuyTriggerAfter } @@ -137,14 +136,6 @@ const execute = async (logger, rawData) => { } } = data; - if (isLocked) { - logger.info( - { isLocked }, - 'Symbol is locked, do not process override-action' - ); - return data; - } - if (action !== 'not-determined') { logger.info( { action }, diff --git a/app/cronjob/trailingTrade/step/handle-open-orders.js b/app/cronjob/trailingTrade/step/handle-open-orders.js index b103c96a..5a9f20cd 100644 --- a/app/cronjob/trailingTrade/step/handle-open-orders.js +++ b/app/cronjob/trailingTrade/step/handle-open-orders.js @@ -19,20 +19,11 @@ const execute = async (logger, rawData) => { const { symbol, action, - isLocked, openOrders, buy: { limitPrice: buyLimitPrice, currentPrice: buyCurrentPrice }, sell: { limitPrice: sellLimitPrice, currentPrice: sellCurrentPrice } } = data; - if (isLocked) { - logger.info( - { isLocked }, - 'Symbol is locked, do not process handle-open-orders' - ); - return data; - } - if (action !== 'not-determined') { logger.info( { action }, diff --git a/app/cronjob/trailingTrade/step/place-buy-order.js b/app/cronjob/trailingTrade/step/place-buy-order.js index 890ca5ac..05dad190 100644 --- a/app/cronjob/trailingTrade/step/place-buy-order.js +++ b/app/cronjob/trailingTrade/step/place-buy-order.js @@ -158,7 +158,6 @@ const execute = async (logger, rawData) => { const { symbol, - isLocked, featureToggle: { notifyDebug, notifyOrderConfirm }, symbolInfo: { baseAsset, @@ -180,14 +179,6 @@ const execute = async (logger, rawData) => { const humanisedGridTradeIndex = currentGridTradeIndex + 1; - if (isLocked) { - logger.info( - { isLocked }, - 'Symbol is locked, do not process place-buy-order' - ); - return data; - } - if (action !== 'buy') { logger.info(`Do not process a buy order because action is not 'buy'.`); return data; diff --git a/app/cronjob/trailingTrade/step/place-manual-trade.js b/app/cronjob/trailingTrade/step/place-manual-trade.js index eee38024..a4a02415 100644 --- a/app/cronjob/trailingTrade/step/place-manual-trade.js +++ b/app/cronjob/trailingTrade/step/place-manual-trade.js @@ -236,12 +236,7 @@ const recordOrder = async (logger, orderResult) => { */ const execute = async (logger, rawData) => { const data = rawData; - const { symbol, isLocked, action, baseAssetBalance, order } = data; - - if (isLocked) { - logger.info({ isLocked }, 'Symbol is locked, do not process manual-trade'); - return data; - } + const { symbol, action, baseAssetBalance, order } = data; if (action !== 'manual-trade') { logger.info( diff --git a/app/cronjob/trailingTrade/step/place-sell-order.js b/app/cronjob/trailingTrade/step/place-sell-order.js index 58b39095..d4f1e430 100644 --- a/app/cronjob/trailingTrade/step/place-sell-order.js +++ b/app/cronjob/trailingTrade/step/place-sell-order.js @@ -38,7 +38,6 @@ const execute = async (logger, rawData) => { const { symbol, - isLocked, symbolInfo: { filterLotSize: { stepSize, minQty, maxQty }, filterPrice: { tickSize }, @@ -54,14 +53,6 @@ const execute = async (logger, rawData) => { const humanisedGridTradeIndex = currentGridTradeIndex + 1; - if (isLocked) { - logger.info( - { isLocked }, - 'Symbol is locked, do not process place-sell-order' - ); - return data; - } - if (action !== 'sell') { logger.info(`Do not process a sell order because action is not 'sell'.`); return data; diff --git a/app/cronjob/trailingTrade/step/place-sell-stop-loss-order.js b/app/cronjob/trailingTrade/step/place-sell-stop-loss-order.js index 4afeef32..e93b8cb0 100644 --- a/app/cronjob/trailingTrade/step/place-sell-stop-loss-order.js +++ b/app/cronjob/trailingTrade/step/place-sell-stop-loss-order.js @@ -40,7 +40,6 @@ const execute = async (logger, rawData) => { const { symbol, - isLocked, symbolInfo: { filterLotSize: { stepSize, minQty, maxQty }, filterMinNotional: { minNotional } @@ -62,14 +61,6 @@ const execute = async (logger, rawData) => { canDisable } = data; - if (isLocked) { - logger.info( - { isLocked }, - 'Symbol is locked, do not process place-sell-stop-loss-order' - ); - return data; - } - if (action !== 'sell-stop-loss') { logger.info( `Do not process a sell order because action is not 'sell-stop-loss'.` diff --git a/app/cronjob/trailingTrade/step/remove-last-buy-price.js b/app/cronjob/trailingTrade/step/remove-last-buy-price.js index 177002ff..d1b883a5 100644 --- a/app/cronjob/trailingTrade/step/remove-last-buy-price.js +++ b/app/cronjob/trailingTrade/step/remove-last-buy-price.js @@ -257,7 +257,6 @@ const execute = async (logger, rawData) => { const data = rawData; const { - isLocked, action, symbol, symbolConfiguration: { @@ -275,14 +274,6 @@ const execute = async (logger, rawData) => { sell: { currentPrice, lastBuyPrice } } = data; - if (isLocked) { - logger.info( - { isLocked }, - 'Symbol is locked, do not process remove-last-buy-price' - ); - return data; - } - if (['not-determined', 'buy-order-wait'].includes(action) === false) { logger.info( `Do not process to remove last buy price due to the ${action} action.` diff --git a/app/cronjob/trailingTradeHelper/__tests__/common.test.js b/app/cronjob/trailingTradeHelper/__tests__/common.test.js index 66f0d9e9..3cde539d 100644 --- a/app/cronjob/trailingTradeHelper/__tests__/common.test.js +++ b/app/cronjob/trailingTradeHelper/__tests__/common.test.js @@ -915,130 +915,6 @@ describe('common.js', () => { }); }); - describe('lockSymbol', () => { - describe('without ttl', () => { - beforeEach(async () => { - const { cache, logger } = require('../../../helpers'); - - cacheMock = cache; - loggerMock = logger; - - cacheMock.hset = jest.fn().mockResolvedValue(true); - - commonHelper = require('../common'); - result = await commonHelper.lockSymbol(loggerMock, 'BTCUSDT'); - }); - - it('triggers cache.hset', () => { - expect(cacheMock.hset).toHaveBeenCalledWith( - 'bot-lock', - 'BTCUSDT', - true, - 5 - ); - }); - - it('returns expected value', () => { - expect(result).toBeTruthy(); - }); - }); - - describe('with ttl', () => { - beforeEach(async () => { - const { cache, logger } = require('../../../helpers'); - - cacheMock = cache; - loggerMock = logger; - - cacheMock.hset = jest.fn().mockResolvedValue(true); - - commonHelper = require('../common'); - result = await commonHelper.lockSymbol(loggerMock, 'BTCUSDT', 10); - }); - - it('triggers cache.hset', () => { - expect(cacheMock.hset).toHaveBeenCalledWith( - 'bot-lock', - 'BTCUSDT', - true, - 10 - ); - }); - - it('returns expected value', () => { - expect(result).toBeTruthy(); - }); - }); - }); - - describe('isSymbolLocked', () => { - describe('cache exists', () => { - beforeEach(async () => { - const { cache, logger } = require('../../../helpers'); - - cacheMock = cache; - loggerMock = logger; - - cacheMock.hget = jest.fn().mockResolvedValue('true'); - - commonHelper = require('../common'); - result = await commonHelper.isSymbolLocked(loggerMock, 'BTCUSDT'); - }); - - it('triggers cache.hget', () => { - expect(cacheMock.hget).toHaveBeenCalledWith('bot-lock', 'BTCUSDT'); - }); - - it('returns expected value', () => { - expect(result).toBeTruthy(); - }); - }); - - describe('cache does not exist', () => { - beforeEach(async () => { - const { cache, logger } = require('../../../helpers'); - - cacheMock = cache; - loggerMock = logger; - - cacheMock.hget = jest.fn().mockResolvedValue(null); - - commonHelper = require('../common'); - result = await commonHelper.isSymbolLocked(loggerMock, 'BTCUSDT'); - }); - - it('triggers cache.hget', () => { - expect(cacheMock.hget).toHaveBeenCalledWith('bot-lock', 'BTCUSDT'); - }); - - it('returns expected value', () => { - expect(result).toBeFalsy(); - }); - }); - }); - - describe('unlockSymbol', () => { - beforeEach(async () => { - const { cache, logger } = require('../../../helpers'); - - cacheMock = cache; - loggerMock = logger; - - cacheMock.hdel = jest.fn().mockResolvedValue(true); - - commonHelper = require('../common'); - result = await commonHelper.unlockSymbol(loggerMock, 'BTCUSDT'); - }); - - it('triggers cache.hdel', () => { - expect(cacheMock.hdel).toHaveBeenCalledWith('bot-lock', 'BTCUSDT'); - }); - - it('returns expected value', () => { - expect(result).toBeTruthy(); - }); - }); - describe('disableAction', () => { beforeEach(async () => { const { cache } = require('../../../helpers'); diff --git a/app/cronjob/trailingTradeHelper/__tests__/queue.test.js b/app/cronjob/trailingTradeHelper/__tests__/queue.test.js index e8fe8d65..dc0ff718 100644 --- a/app/cronjob/trailingTradeHelper/__tests__/queue.test.js +++ b/app/cronjob/trailingTradeHelper/__tests__/queue.test.js @@ -6,86 +6,49 @@ describe('queue', () => { let loggerMock; - let mockExecuteTrailingTrade; - beforeEach(() => { jest.clearAllMocks().resetModules(); - mockExecuteTrailingTrade = jest.fn().mockResolvedValue(true); - - jest.mock('../../../cronjob', () => ({ - executeTrailingTrade: mockExecuteTrailingTrade - })); - loggerMock = logger; }); - describe('init', () => { - describe('called one time', () => { - beforeEach(async () => { - queue = require('../queue'); - - await queue.init(logger, ['BTCUSDT', 'ETHUSDT', 'BNBUSDT']); - }); - - it('triggers logger.info', () => { - expect(loggerMock.info).toHaveBeenCalledWith( - { symbols: ['BTCUSDT', 'ETHUSDT', 'BNBUSDT'] }, - 'Queue initialized' - ); - }); - }); - - describe('called two times', () => { - beforeEach(async () => { - queue = require('../queue'); - - await queue.init(logger, ['BTCUSDT', 'ETHUSDT', 'BNBUSDT']); - await queue.init(logger, ['BTCUSDT', 'ETHUSDT', 'BNBUSDT']); - }); - - it('triggers logger.info 2 times', () => { - expect(loggerMock.info).toHaveBeenCalledTimes(2); - }); - }); - }); - describe('execute', () => { describe('when symbol does not exist in the queue', () => { beforeEach(async () => { queue = require('../queue'); - await queue.init(logger, ['BTCUSDT']); await queue.execute(logger, 'ETHUSDT'); }); - it('triggers logger.error', () => { - expect(loggerMock.error).toHaveBeenCalledWith( + it('triggers logger.info', () => { + expect(loggerMock.info).toHaveBeenCalledWith( { symbol: 'ETHUSDT' }, - 'No queue created for ETHUSDT' + 'Queue ETHUSDT initialized' ); }); - - it('does not trigger executeTrailingTrade for ETHUSDT', () => { - expect(mockExecuteTrailingTrade).not.toHaveBeenCalled(); - }); }); describe('when the symbol exists in the queue', () => { + let mockPreprocessFn; + let mockProcessFn; + let mockPostprocessFn; describe('when executed once', () => { beforeEach(async () => { queue = require('../queue'); - await queue.init(logger, ['BTCUSDT']); - await queue.execute(logger, 'BTCUSDT'); + mockProcessFn = jest.fn().mockResolvedValue(true); + + await queue.prepareJob(logger, 'BTCUSDT'); + await queue.completeJob(logger, 'BTCUSDT'); + await queue.execute(logger, 'BTCUSDT', { processFn: mockProcessFn }); }); - it('triggers executeTrailingTrade', () => { - expect(mockExecuteTrailingTrade).toHaveBeenCalledTimes(1); + it('triggers process', () => { + expect(mockProcessFn).toHaveBeenCalledTimes(1); }); - it('triggers executeTrailingTrade for BTCUSDT', () => { - expect(mockExecuteTrailingTrade).toHaveBeenCalledWith( + it('triggers process for BTCUSDT', () => { + expect(mockProcessFn).toHaveBeenCalledWith( loggerMock, 'BTCUSDT', undefined @@ -97,17 +60,18 @@ describe('queue', () => { beforeEach(async () => { queue = require('../queue'); - await queue.init(logger, ['BTCUSDT']); - queue.execute(logger, 'BTCUSDT'); - await queue.execute(logger, 'BTCUSDT'); + await queue.prepareJob(logger, 'BTCUSDT'); + await queue.completeJob(logger, 'BTCUSDT'); + queue.execute(logger, 'BTCUSDT', { processFn: mockProcessFn }); + await queue.execute(logger, 'BTCUSDT', { processFn: mockProcessFn }); }); - it('triggers executeTrailingTrade 2 times', () => { - expect(mockExecuteTrailingTrade).toHaveBeenCalledTimes(2); + it('triggers process 2 times', () => { + expect(mockProcessFn).toHaveBeenCalledTimes(2); }); - it('triggers executeTrailingTrade for BTCUSDT', () => { - expect(mockExecuteTrailingTrade).toHaveBeenCalledWith( + it('triggers process for BTCUSDT', () => { + expect(mockProcessFn).toHaveBeenCalledWith( loggerMock, 'BTCUSDT', undefined @@ -116,16 +80,15 @@ describe('queue', () => { }); describe('when executed with truthy preprocessing', () => { - let mockPreprocessFn; - let mockPostprocessFn; beforeEach(async () => { queue = require('../queue'); mockPreprocessFn = jest.fn().mockResolvedValue(true); + mockProcessFn = jest.fn().mockResolvedValue(true); mockPostprocessFn = jest.fn().mockResolvedValue(true); - await queue.init(logger, ['BTCUSDT']); await queue.execute(logger, 'BTCUSDT', { preprocessFn: mockPreprocessFn, + processFn: mockProcessFn, postprocessFn: mockPostprocessFn }); }); @@ -134,12 +97,12 @@ describe('queue', () => { expect(mockPreprocessFn).toHaveBeenCalledTimes(1); }); - it('triggers executeTrailingTrade', () => { - expect(mockExecuteTrailingTrade).toHaveBeenCalledTimes(1); + it('triggers process', () => { + expect(mockProcessFn).toHaveBeenCalledTimes(1); }); - it('triggers executeTrailingTrade for BTCUSDT', () => { - expect(mockExecuteTrailingTrade).toHaveBeenCalledWith( + it('triggers process for BTCUSDT', () => { + expect(mockProcessFn).toHaveBeenCalledWith( loggerMock, 'BTCUSDT', undefined @@ -151,16 +114,15 @@ describe('queue', () => { }); describe('when executed with falsy preprocessing', () => { - let mockPreprocessFn; - let mockPostprocessFn; beforeEach(async () => { queue = require('../queue'); mockPreprocessFn = jest.fn().mockResolvedValue(false); + mockProcessFn = jest.fn().mockResolvedValue(true); mockPostprocessFn = jest.fn().mockResolvedValue(true); - await queue.init(logger, ['BTCUSDT']); await queue.execute(logger, 'BTCUSDT', { preprocessFn: mockPreprocessFn, + processFn: mockProcessFn, postprocessFn: mockPostprocessFn }); }); @@ -169,8 +131,8 @@ describe('queue', () => { expect(mockPreprocessFn).toHaveBeenCalledTimes(1); }); - it('does not trigger executeTrailingTrade for BTCUSDT', () => { - expect(mockExecuteTrailingTrade).not.toHaveBeenCalled(); + it('does not trigger process for BTCUSDT', () => { + expect(mockProcessFn).not.toHaveBeenCalled(); }); it('does not trigger postprocessFn for BTCUSDT', () => { @@ -178,29 +140,38 @@ describe('queue', () => { }); }); - describe('when executed with postprocessing only', () => { - let mockPostprocessFn; + describe('when executed with processing only', () => { beforeEach(async () => { queue = require('../queue'); - mockPostprocessFn = jest.fn().mockResolvedValue(true); - await queue.init(logger, ['BTCUSDT']); + mockProcessFn = jest.fn().mockResolvedValue(true); await queue.execute(logger, 'BTCUSDT', { - postprocessFn: mockPostprocessFn + processFn: mockProcessFn }); }); - it('triggers executeTrailingTrade', () => { - expect(mockExecuteTrailingTrade).toHaveBeenCalledTimes(1); + it('triggers process', () => { + expect(mockProcessFn).toHaveBeenCalledTimes(1); }); - it('triggers executeTrailingTrade for BTCUSDT', () => { - expect(mockExecuteTrailingTrade).toHaveBeenCalledWith( + it('triggers process for BTCUSDT', () => { + expect(mockProcessFn).toHaveBeenCalledWith( loggerMock, 'BTCUSDT', undefined ); }); + }); + + describe('when executed with postprocessing only', () => { + beforeEach(async () => { + queue = require('../queue'); + + mockPostprocessFn = jest.fn().mockResolvedValue(true); + await queue.execute(logger, 'BTCUSDT', { + postprocessFn: mockPostprocessFn + }); + }); it('triggers postprocessFn for BTCUSDT', () => { expect(mockPostprocessFn).toHaveBeenCalledTimes(1); diff --git a/app/cronjob/trailingTradeHelper/common.js b/app/cronjob/trailingTradeHelper/common.js index 224cf461..57c71a79 100644 --- a/app/cronjob/trailingTradeHelper/common.js +++ b/app/cronjob/trailingTradeHelper/common.js @@ -320,50 +320,6 @@ const removeLastBuyPrice = async (logger, symbol) => { return result; }; -/** - * Lock symbol - * - * @param {*} logger - * @param {*} symbol - * @param {*} ttl - * - * @returns - */ -const lockSymbol = async (logger, symbol, ttl = 5) => { - logger.info({ symbol }, `Lock ${symbol} for ${ttl} seconds`); - return cache.hset('bot-lock', symbol, true, ttl); -}; - -/** - * Check if symbol is locked - * - * @param {*} logger - * @param {*} symbol - * @returns - */ -const isSymbolLocked = async (logger, symbol) => { - const isLocked = (await cache.hget('bot-lock', symbol)) === 'true'; - - if (isLocked === true) { - logger.info({ symbol, isLocked }, `🔒 Symbol is locked - ${symbol}`); - } else { - logger.info({ symbol, isLocked }, `🔓 Symbol is not locked - ${symbol} `); - } - return isLocked; -}; - -/** - * Unlock symbol - * - * @param {*} logger - * @param {*} symbol - * @returns - */ -const unlockSymbol = async (logger, symbol) => { - logger.info({ symbol }, `Unlock ${symbol}`); - return cache.hdel('bot-lock', symbol); -}; - /** * Disable action * @@ -1179,9 +1135,6 @@ module.exports = { getLastBuyPrice, saveLastBuyPrice, removeLastBuyPrice, - lockSymbol, - isSymbolLocked, - unlockSymbol, disableAction, isActionDisabled, deleteDisableAction, diff --git a/app/cronjob/trailingTradeHelper/queue.js b/app/cronjob/trailingTradeHelper/queue.js index 579db652..47a564c7 100644 --- a/app/cronjob/trailingTradeHelper/queue.js +++ b/app/cronjob/trailingTradeHelper/queue.js @@ -1,30 +1,8 @@ const _ = require('lodash'); -const { executeTrailingTrade } = require('../index'); const startedJobs = {}; const finishedJobs = {}; -/** - * Initialize queue counters for symbols - * - * @param {*} funcLogger - * @param {*} symbol - */ -const init = async (funcLogger, symbols) => { - const logger = funcLogger.child({ helper: 'queue' }); - - await Promise.all( - _.map(symbols, async symbol => { - if (startedJobs[symbol] === undefined) { - startedJobs[symbol] = 0; - finishedJobs[symbol] = 0; - } - }) - ); - - logger.info({ symbols }, `Queue initialized`); -}; - /** * Prepare the job in queue * @@ -35,11 +13,12 @@ const init = async (funcLogger, symbols) => { const prepareJob = async (funcLogger, symbol, _jobPayload) => { const logger = funcLogger.child({ helper: 'queue', func: 'prepareJob' }); - // Queue structures existence check - if (!(symbol in startedJobs)) { - // Can't queue a job without queue initialized - logger.error({ symbol }, `No queue created for ${symbol}`); - return true; // completed + // Initialize queue for symbol if not yet initialized + if (startedJobs[symbol] === undefined) { + startedJobs[symbol] = 0; + finishedJobs[symbol] = 0; + + logger.info({ symbol }, `Queue ${symbol} initialized`); } // Start a new job - wait if previous job is still running @@ -75,7 +54,7 @@ const executeJob = async (funcLogger, symbol, jobPayload) => { const result = await jobPayload.preprocessFn(); if (result === false) { - logger.info({ symbol }, `Queue ${symbol} job not preprocessed`); + logger.info({ symbol }, `Queue ${symbol} job done`); return false; // continue } @@ -83,11 +62,14 @@ const executeJob = async (funcLogger, symbol, jobPayload) => { } // Execute the job - await executeTrailingTrade( - funcLogger, - symbol, - _.get(jobPayload, 'correlationId') - ); + if (jobPayload.processFn) { + // processFn + await jobPayload.processFn( + funcLogger, + symbol, + _.get(jobPayload, 'correlationId') + ); + } // Postprocess after executeTrailingTrade if (jobPayload.postprocessFn) { @@ -147,6 +129,7 @@ const execute = async (funcLogger, symbol, jobPayload = {}) => { }; module.exports = { - init, + prepareJob, + completeJob, execute }; diff --git a/app/cronjob/trailingTradeIndicator.js b/app/cronjob/trailingTradeIndicator.js index 3bf9e8f0..8717314f 100644 --- a/app/cronjob/trailingTradeIndicator.js +++ b/app/cronjob/trailingTradeIndicator.js @@ -1,11 +1,7 @@ const config = require('config'); +const queue = require('./trailingTradeHelper/queue'); -const { - lockSymbol, - isSymbolLocked, - unlockSymbol, - getAPILimit -} = require('./trailingTradeHelper/common'); +const { getAPILimit } = require('./trailingTradeHelper/common'); const { getGlobalConfiguration, @@ -49,63 +45,56 @@ const execute = async logger => { '▶ TrailingTradeIndicator: Start process...' ); - // Check if the symbol is locked, if it is locked, it means the symbol is still trading. - if ((await isSymbolLocked(logger, symbol)) === true) { - logger.info( - { debug: true, symbol }, - '⏯ TrailingTradeIndicator: Skip process as the symbol is currently locked.' - ); - return; - } - // Lock symbol for processing - await lockSymbol(logger, symbol); - - // eslint-disable-next-line no-restricted-syntax - for (const { stepName, stepFunc } of [ - { - stepName: 'get-symbol-configuration', - stepFunc: getSymbolConfiguration - }, - { - stepName: 'get-override-action', - stepFunc: getOverrideAction - }, - { - stepName: 'execute-dust-transfer', - stepFunc: executeDustTransfer - }, - { - stepName: 'get-symbol-info', - stepFunc: getSymbolInfo - }, - { - stepName: 'get-closed-trades', - stepFunc: getClosedTrades - }, - { - stepName: 'get-order-stats', - stepFunc: getOrderStats - }, - { - stepName: 'get-tradingview', - stepFunc: getTradingView - }, - { - stepName: 'save-data-to-cache', - stepFunc: saveDataToCache - } - ]) { - const stepLogger = logger.child({ stepName, symbol: data.symbol }); + const executeTrailingTradeIndicatorFn = async () => { + // eslint-disable-next-line no-restricted-syntax + for (const { stepName, stepFunc } of [ + { + stepName: 'get-symbol-configuration', + stepFunc: getSymbolConfiguration + }, + { + stepName: 'get-override-action', + stepFunc: getOverrideAction + }, + { + stepName: 'execute-dust-transfer', + stepFunc: executeDustTransfer + }, + { + stepName: 'get-symbol-info', + stepFunc: getSymbolInfo + }, + { + stepName: 'get-closed-trades', + stepFunc: getClosedTrades + }, + { + stepName: 'get-order-stats', + stepFunc: getOrderStats + }, + { + stepName: 'get-tradingview', + stepFunc: getTradingView + }, + { + stepName: 'save-data-to-cache', + stepFunc: saveDataToCache + } + ]) { + const stepLogger = logger.child({ stepName, symbol: data.symbol }); - stepLogger.info({ data }, `Start step - ${stepName}`); + stepLogger.info({ data }, `Start step - ${stepName}`); - // eslint-disable-next-line no-await-in-loop - data = await stepFunc(stepLogger, data); - stepLogger.info({ data }, `Finish step - ${stepName}`); - } + // eslint-disable-next-line no-await-in-loop + data = await stepFunc(stepLogger, data); + stepLogger.info({ data }, `Finish step - ${stepName}`); + } + }; - // Unlock symbol for processing - await unlockSymbol(logger, symbol); + // Prepare job for processing + await queue.execute(logger, symbol, { + processFn: executeTrailingTradeIndicatorFn + }); data.apiLimit.end = getAPILimit(logger); diff --git a/app/frontend/websocket/handlers/__tests__/cancel-order.test.js b/app/frontend/websocket/handlers/__tests__/cancel-order.test.js index bdeefdbd..56241cf0 100644 --- a/app/frontend/websocket/handlers/__tests__/cancel-order.test.js +++ b/app/frontend/websocket/handlers/__tests__/cancel-order.test.js @@ -69,7 +69,8 @@ describe('cancel-order.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(loggerMock, 'BTCUSDT', { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); diff --git a/app/frontend/websocket/handlers/__tests__/manual-trade-all-symbols.test.js b/app/frontend/websocket/handlers/__tests__/manual-trade-all-symbols.test.js index 4a8d9d16..1c6783f3 100644 --- a/app/frontend/websocket/handlers/__tests__/manual-trade-all-symbols.test.js +++ b/app/frontend/websocket/handlers/__tests__/manual-trade-all-symbols.test.js @@ -317,7 +317,8 @@ describe('manual-trade-all-symbols.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(loggerMock, symbol, { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); } else { @@ -420,7 +421,8 @@ describe('manual-trade-all-symbols.js', () => { 'BTCUSDT', { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) } ); }); diff --git a/app/frontend/websocket/handlers/__tests__/manual-trade.test.js b/app/frontend/websocket/handlers/__tests__/manual-trade.test.js index 239e260a..f59fa752 100644 --- a/app/frontend/websocket/handlers/__tests__/manual-trade.test.js +++ b/app/frontend/websocket/handlers/__tests__/manual-trade.test.js @@ -69,7 +69,8 @@ describe('manual-trade.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(loggerMock, 'BTCUSDT', { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); diff --git a/app/frontend/websocket/handlers/__tests__/symbol-enable-action.test.js b/app/frontend/websocket/handlers/__tests__/symbol-enable-action.test.js index 94351de9..1c62c25e 100644 --- a/app/frontend/websocket/handlers/__tests__/symbol-enable-action.test.js +++ b/app/frontend/websocket/handlers/__tests__/symbol-enable-action.test.js @@ -59,7 +59,8 @@ describe('symbol-enable-action.test.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(mockLogger, 'BTCUSDT', { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); diff --git a/app/frontend/websocket/handlers/__tests__/symbol-grid-trade-delete.test.js b/app/frontend/websocket/handlers/__tests__/symbol-grid-trade-delete.test.js index d1ef45d5..3d76ccb8 100644 --- a/app/frontend/websocket/handlers/__tests__/symbol-grid-trade-delete.test.js +++ b/app/frontend/websocket/handlers/__tests__/symbol-grid-trade-delete.test.js @@ -109,7 +109,8 @@ describe('symbol-grid-trade-delete.test.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(mockLogger, 'BTCUSDT', { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); @@ -186,7 +187,8 @@ describe('symbol-grid-trade-delete.test.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(mockLogger, 'BTCUSDT', { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); @@ -252,7 +254,8 @@ describe('symbol-grid-trade-delete.test.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(mockLogger, 'BTCUSDT', { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); @@ -315,7 +318,8 @@ describe('symbol-grid-trade-delete.test.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(mockLogger, 'BTCUSDT', { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); diff --git a/app/frontend/websocket/handlers/__tests__/symbol-setting-delete.test.js b/app/frontend/websocket/handlers/__tests__/symbol-setting-delete.test.js index 41f7b8da..ab653343 100644 --- a/app/frontend/websocket/handlers/__tests__/symbol-setting-delete.test.js +++ b/app/frontend/websocket/handlers/__tests__/symbol-setting-delete.test.js @@ -62,7 +62,8 @@ describe('symbol-setting-delete.test.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(mockLogger, 'BTCUSDT', { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); diff --git a/app/frontend/websocket/handlers/__tests__/symbol-setting-update.test.js b/app/frontend/websocket/handlers/__tests__/symbol-setting-update.test.js index 4130f624..3d3714b5 100644 --- a/app/frontend/websocket/handlers/__tests__/symbol-setting-update.test.js +++ b/app/frontend/websocket/handlers/__tests__/symbol-setting-update.test.js @@ -273,7 +273,8 @@ describe('symbol-setting-update.test.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(mockLogger, 'BTCUSDT', { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); diff --git a/app/frontend/websocket/handlers/__tests__/symbol-trigger-buy.test.js b/app/frontend/websocket/handlers/__tests__/symbol-trigger-buy.test.js index f39a4c4f..41fc8fcc 100644 --- a/app/frontend/websocket/handlers/__tests__/symbol-trigger-buy.test.js +++ b/app/frontend/websocket/handlers/__tests__/symbol-trigger-buy.test.js @@ -67,7 +67,8 @@ describe('symbol-trigger-buy.test.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(mockLogger, 'BTCUSDT', { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); diff --git a/app/frontend/websocket/handlers/__tests__/symbol-trigger-sell.test.js b/app/frontend/websocket/handlers/__tests__/symbol-trigger-sell.test.js index 717fb6ac..9e2a456f 100644 --- a/app/frontend/websocket/handlers/__tests__/symbol-trigger-sell.test.js +++ b/app/frontend/websocket/handlers/__tests__/symbol-trigger-sell.test.js @@ -65,7 +65,8 @@ describe('symbol-trigger-sell.test.js', () => { it('triggers queue.execute', () => { expect(mockExecute).toHaveBeenCalledWith(mockLogger, 'BTCUSDT', { correlationId: 'correlationId', - preprocessFn: expect.any(Function) + preprocessFn: expect.any(Function), + processFn: expect.any(Function) }); }); diff --git a/app/frontend/websocket/handlers/__tests__/symbol-update-last-buy-price.test.js b/app/frontend/websocket/handlers/__tests__/symbol-update-last-buy-price.test.js index 0cbf17d0..556511e4 100644 --- a/app/frontend/websocket/handlers/__tests__/symbol-update-last-buy-price.test.js +++ b/app/frontend/websocket/handlers/__tests__/symbol-update-last-buy-price.test.js @@ -69,6 +69,7 @@ describe('symbol-update-last-buy-price.test.js', () => { expect(mockExecute).toHaveBeenCalledWith(loggerMock, 'BTCUSDT', { correlationId: 'correlationId', preprocessFn: expect.any(Function), + processFn: expect.any(Function), postprocessFn: expect.any(Function) }); }); @@ -224,6 +225,7 @@ describe('symbol-update-last-buy-price.test.js', () => { expect(mockExecute).toHaveBeenCalledWith(loggerMock, 'BTCUSDT', { correlationId: 'correlationId', preprocessFn: expect.any(Function), + processFn: expect.any(Function), postprocessFn: expect.any(Function) }); }); @@ -320,6 +322,7 @@ describe('symbol-update-last-buy-price.test.js', () => { expect(mockExecute).toHaveBeenCalledWith(loggerMock, 'BTCUSDT', { correlationId: 'correlationId', preprocessFn: expect.any(Function), + processFn: expect.any(Function), postprocessFn: expect.any(Function) }); }); diff --git a/app/frontend/websocket/handlers/cancel-order.js b/app/frontend/websocket/handlers/cancel-order.js index f87212bd..49671731 100644 --- a/app/frontend/websocket/handlers/cancel-order.js +++ b/app/frontend/websocket/handlers/cancel-order.js @@ -4,6 +4,7 @@ const { saveOverrideAction } = require('../../../cronjob/trailingTradeHelper/common'); const queue = require('../../../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../../../cronjob/index'); const handleCancelOrder = async (logger, ws, payload) => { logger.info({ payload }, 'Start cancel order'); @@ -30,7 +31,8 @@ const handleCancelOrder = async (logger, ws, payload) => { queue.execute(logger, symbol, { correlationId: _.get(logger, 'fields.correlationId', ''), - preprocessFn: saveOverrideActionFn + preprocessFn: saveOverrideActionFn, + processFn: executeTrailingTrade }); ws.send( diff --git a/app/frontend/websocket/handlers/manual-trade-all-symbols.js b/app/frontend/websocket/handlers/manual-trade-all-symbols.js index d264ef61..bfcc0b2c 100644 --- a/app/frontend/websocket/handlers/manual-trade-all-symbols.js +++ b/app/frontend/websocket/handlers/manual-trade-all-symbols.js @@ -8,6 +8,7 @@ const { saveOverrideAction } = require('../../../cronjob/trailingTradeHelper/common'); const queue = require('../../../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../../../cronjob/index'); const handleManualTradeAllSymbols = async (logger, ws, payload) => { logger.info({ payload }, 'Start manual trade all symbols'); @@ -66,7 +67,8 @@ const handleManualTradeAllSymbols = async (logger, ws, payload) => { queue.execute(logger, symbol, { correlationId: _.get(logger, 'fields.correlationId', ''), - preprocessFn: saveOverrideActionFn + preprocessFn: saveOverrideActionFn, + processFn: executeTrailingTrade }); currentTime = moment(currentTime).add( @@ -112,7 +114,8 @@ const handleManualTradeAllSymbols = async (logger, ws, payload) => { queue.execute(logger, symbol, { correlationId: _.get(logger, 'fields.correlationId', ''), - preprocessFn: saveOverrideActionFn + preprocessFn: saveOverrideActionFn, + processFn: executeTrailingTrade }); currentTime = moment(currentTime).add( diff --git a/app/frontend/websocket/handlers/manual-trade.js b/app/frontend/websocket/handlers/manual-trade.js index 241abe62..ce185ddc 100644 --- a/app/frontend/websocket/handlers/manual-trade.js +++ b/app/frontend/websocket/handlers/manual-trade.js @@ -4,6 +4,7 @@ const { saveOverrideAction } = require('../../../cronjob/trailingTradeHelper/common'); const queue = require('../../../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../../../cronjob/index'); const handleManualTrade = async (logger, ws, payload) => { logger.info({ payload }, 'Start manual trade'); @@ -28,7 +29,8 @@ const handleManualTrade = async (logger, ws, payload) => { queue.execute(logger, symbol, { correlationId: _.get(logger, 'fields.correlationId', ''), - preprocessFn: saveOverrideActionFn + preprocessFn: saveOverrideActionFn, + processFn: executeTrailingTrade }); ws.send( diff --git a/app/frontend/websocket/handlers/symbol-enable-action.js b/app/frontend/websocket/handlers/symbol-enable-action.js index 2bc3e7cb..cfe7e179 100644 --- a/app/frontend/websocket/handlers/symbol-enable-action.js +++ b/app/frontend/websocket/handlers/symbol-enable-action.js @@ -3,6 +3,7 @@ const { deleteDisableAction } = require('../../../cronjob/trailingTradeHelper/common'); const queue = require('../../../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../../../cronjob/index'); const handleSymbolEnableAction = async (logger, ws, payload) => { logger.info({ payload }, 'Start symbol enable action'); @@ -17,7 +18,8 @@ const handleSymbolEnableAction = async (logger, ws, payload) => { queue.execute(logger, symbol, { correlationId: _.get(logger, 'fields.correlationId', ''), - preprocessFn: deleteDisableActionFn + preprocessFn: deleteDisableActionFn, + processFn: executeTrailingTrade }); ws.send( diff --git a/app/frontend/websocket/handlers/symbol-grid-trade-delete.js b/app/frontend/websocket/handlers/symbol-grid-trade-delete.js index 627acde2..b30d1c77 100644 --- a/app/frontend/websocket/handlers/symbol-grid-trade-delete.js +++ b/app/frontend/websocket/handlers/symbol-grid-trade-delete.js @@ -9,6 +9,7 @@ const { } = require('../../../cronjob/trailingTradeHelper/configuration'); const queue = require('../../../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../../../cronjob/index'); const handleSymbolGridTradeDelete = async (logger, ws, payload) => { logger.info({ payload }, 'Start grid trade delete'); @@ -43,7 +44,8 @@ const handleSymbolGridTradeDelete = async (logger, ws, payload) => { queue.execute(logger, symbol, { correlationId: _.get(logger, 'fields.correlationId', ''), - preprocessFn: deleteSymbolGridTradeFn + preprocessFn: deleteSymbolGridTradeFn, + processFn: executeTrailingTrade }); ws.send( diff --git a/app/frontend/websocket/handlers/symbol-setting-delete.js b/app/frontend/websocket/handlers/symbol-setting-delete.js index 61b7814f..eaf5bf86 100644 --- a/app/frontend/websocket/handlers/symbol-setting-delete.js +++ b/app/frontend/websocket/handlers/symbol-setting-delete.js @@ -3,6 +3,7 @@ const { deleteSymbolConfiguration } = require('../../../cronjob/trailingTradeHelper/configuration'); const queue = require('../../../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../../../cronjob/index'); const handleSymbolSettingDelete = async (logger, ws, payload) => { logger.info({ payload }, 'Start symbol setting delete'); @@ -17,7 +18,8 @@ const handleSymbolSettingDelete = async (logger, ws, payload) => { queue.execute(logger, symbol, { correlationId: _.get(logger, 'fields.correlationId', ''), - preprocessFn: deleteSymbolConfigurationFn + preprocessFn: deleteSymbolConfigurationFn, + processFn: executeTrailingTrade }); ws.send( diff --git a/app/frontend/websocket/handlers/symbol-setting-update.js b/app/frontend/websocket/handlers/symbol-setting-update.js index aa4d54d6..ed7612d6 100644 --- a/app/frontend/websocket/handlers/symbol-setting-update.js +++ b/app/frontend/websocket/handlers/symbol-setting-update.js @@ -4,6 +4,7 @@ const { saveSymbolConfiguration } = require('../../../cronjob/trailingTradeHelper/configuration'); const queue = require('../../../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../../../cronjob/index'); const handleSymbolSettingUpdate = async (logger, ws, payload) => { logger.info({ payload }, 'Start symbol setting update'); @@ -48,7 +49,8 @@ const handleSymbolSettingUpdate = async (logger, ws, payload) => { queue.execute(logger, symbol, { correlationId: _.get(logger, 'fields.correlationId', ''), - preprocessFn: symbolConfigurationFn + preprocessFn: symbolConfigurationFn, + processFn: executeTrailingTrade }); ws.send( diff --git a/app/frontend/websocket/handlers/symbol-trigger-buy.js b/app/frontend/websocket/handlers/symbol-trigger-buy.js index 08aa35cc..2a94db9c 100644 --- a/app/frontend/websocket/handlers/symbol-trigger-buy.js +++ b/app/frontend/websocket/handlers/symbol-trigger-buy.js @@ -4,6 +4,7 @@ const { saveOverrideAction } = require('../../../cronjob/trailingTradeHelper/common'); const queue = require('../../../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../../../cronjob/index'); const handleSymbolTriggerBuy = async (logger, ws, payload) => { logger.info({ payload }, 'Start symbol trigger buy'); @@ -30,7 +31,8 @@ const handleSymbolTriggerBuy = async (logger, ws, payload) => { queue.execute(logger, symbol, { correlationId: _.get(logger, 'fields.correlationId', ''), - preprocessFn: saveOverrideActionFn + preprocessFn: saveOverrideActionFn, + processFn: executeTrailingTrade }); ws.send(JSON.stringify({ result: true, type: 'symbol-trigger-buy-result' })); diff --git a/app/frontend/websocket/handlers/symbol-trigger-sell.js b/app/frontend/websocket/handlers/symbol-trigger-sell.js index 25e5293c..f3cded9a 100644 --- a/app/frontend/websocket/handlers/symbol-trigger-sell.js +++ b/app/frontend/websocket/handlers/symbol-trigger-sell.js @@ -4,6 +4,7 @@ const { saveOverrideAction } = require('../../../cronjob/trailingTradeHelper/common'); const queue = require('../../../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../../../cronjob/index'); const handleSymbolTriggerSell = async (logger, ws, payload) => { logger.info({ payload }, 'Start symbol trigger sell'); @@ -27,7 +28,8 @@ const handleSymbolTriggerSell = async (logger, ws, payload) => { queue.execute(logger, symbol, { correlationId: _.get(logger, 'fields.correlationId', ''), - preprocessFn: saveOverrideActionFn + preprocessFn: saveOverrideActionFn, + processFn: executeTrailingTrade }); ws.send(JSON.stringify({ result: true, type: 'symbol-trigger-sell-result' })); diff --git a/app/frontend/websocket/handlers/symbol-update-last-buy-price.js b/app/frontend/websocket/handlers/symbol-update-last-buy-price.js index 6f868505..51c081c3 100644 --- a/app/frontend/websocket/handlers/symbol-update-last-buy-price.js +++ b/app/frontend/websocket/handlers/symbol-update-last-buy-price.js @@ -5,6 +5,7 @@ const { saveLastBuyPrice } = require('../../../cronjob/trailingTradeHelper/common'); const queue = require('../../../cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('../../../cronjob/index'); /** * Delete last buy price @@ -31,6 +32,7 @@ const deleteLastBuyPrice = async (logger, ws, symbol) => { queue.execute(logger, symbol, { correlationId: _.get(logger, 'fields.correlationId', ''), preprocessFn: deleteOneFn, + processFn: executeTrailingTrade, postprocessFn: PubSubFn }); @@ -119,6 +121,7 @@ const updateLastBuyPrice = async (logger, ws, symbol, lastBuyPrice) => { queue.execute(logger, symbol, { correlationId: _.get(logger, 'fields.correlationId', ''), preprocessFn: updateLastBuyPriceFn, + processFn: executeTrailingTrade, postprocessFn: PubSubFn }); diff --git a/app/server-binance.js b/app/server-binance.js index 0e32c1d7..08e1ff28 100644 --- a/app/server-binance.js +++ b/app/server-binance.js @@ -2,14 +2,13 @@ const _ = require('lodash'); const config = require('config'); const { PubSub, cache, mongo } = require('./helpers'); const queue = require('./cronjob/trailingTradeHelper/queue'); +const { executeTrailingTrade } = require('./cronjob/index'); const { maskConfig } = require('./cronjob/trailingTradeHelper/util'); const { getGlobalConfiguration } = require('./cronjob/trailingTradeHelper/configuration'); const { - lockSymbol, - unlockSymbol, getAccountInfoFromAPI, cacheExchangeSymbols } = require('./cronjob/trailingTradeHelper/common'); @@ -106,10 +105,8 @@ const syncAll = async logger => { logger.info({ symbols }, 'Retrieved symbols'); - await queue.init(logger, symbols); - - // Lock all symbols for 5 minutes to ensure nothing will be executed unless all data retrieved - await Promise.all(symbols.map(symbol => lockSymbol(logger, symbol, 300))); + // Start job for all symbols to ensure nothing will be executed unless all data retrieved + await Promise.all(symbols.map(symbol => queue.prepareJob(logger, symbol))); await setupExchangeSymbols(logger); await setupWebsockets(logger, symbols); @@ -119,8 +116,8 @@ const syncAll = async logger => { await syncOpenOrders(logger, symbols); await syncDatabaseOrders(logger); - // Unlock all symbols when all data has been retrieved - await Promise.all(symbols.map(symbol => unlockSymbol(logger, symbol))); + // Complete job for all symbols when all data has been retrieved + await Promise.all(symbols.map(symbol => queue.completeJob(logger, symbol))); }; /** @@ -177,7 +174,9 @@ const setupBinance = async logger => { const symbols = _.keys(cachedOpenOrders); await Promise.all( - symbols.map(async symbol => queue.execute(logger, symbol)) + symbols.map(async symbol => + queue.execute(logger, symbol, { processFn: executeTrailingTrade }) + ) ); }); From 1431191f447006358b71de922b1adee094415487 Mon Sep 17 00:00:00 2001 From: Chris Lee Date: Sun, 15 Jan 2023 00:14:13 +1100 Subject: [PATCH 2/2] docs: updated CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f172092..982addbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ All notable changes to this project will be documented in this file. - Fixed the issue that cannot export huge logs - [#561](https://github.com/chrisleekr/binance-trading-bot/pull/561), [#567](https://github.com/chrisleekr/binance-trading-bot/pull/567) - Fixed the balance calculation to include dust balances by [@uhliksk](https://github.com/uhliksk) - [#571](https://github.com/chrisleekr/binance-trading-bot/pull/571) - Fixed the open orders to be cancelled when the current price is higher/lower than the order price by [@uhliksk](https://github.com/uhliksk) - [#569](https://github.com/chrisleekr/binance-trading-bot/pull/569) -- Improved queue processing by replacing Bull queue to customised queue system by [@uhliksk](https://github.com/uhliksk) - [#562](https://github.com/chrisleekr/binance-trading-bot/pull/562), [#581](https://github.com/chrisleekr/binance-trading-bot/pull/581) +- Improved queue processing by replacing Bull queue to customised queue system by [@uhliksk](https://github.com/uhliksk) - [#562](https://github.com/chrisleekr/binance-trading-bot/pull/562), [#581](https://github.com/chrisleekr/binance-trading-bot/pull/581), [#588](https://github.com/chrisleekr/binance-trading-bot/pull/588) - Added conservative sell strategy, which can reduce the sell trigger price as the grid gets deeper by [@rando128](https://github.com/rando128) - [#585](https://github.com/chrisleekr/binance-trading-bot/pull/585) Thanks [@uhliksk](https://github.com/uhliksk) and [@rando128](https://github.com/rando128) for your great contributions. 💯 :heart: