diff --git a/examples/iqoption/typescript/getProfile.ts b/examples/iqoption/typescript/getProfile.ts index fe31df0..3e6048f 100644 --- a/examples/iqoption/typescript/getProfile.ts +++ b/examples/iqoption/typescript/getProfile.ts @@ -5,7 +5,9 @@ import { IQOptionProvider, BaseIQOptionProvider } from '@hemes/iqoption' async function run() { try { - const hemes = new Hemes(IQOptionProvider).getProvider() + const hemes = new Hemes( + IQOptionProvider + ).getProvider() const account = await hemes.logIn({ email: String(process.env.TEST_IQOPTION_ACCOUNT_EMAIL), @@ -19,15 +21,20 @@ async function run() { console.log() console.log('👤 Profile:', JSON.stringify(profile)) console.log() - console.log('🏦 Balances:', JSON.stringify(profile.balances.map(balance => ({ - type: balance.type, - currency: balance.currency, - amount: balance.amount, - })))); + console.log( + '🏦 Balances:', + JSON.stringify( + profile.balances.map(balance => ({ + type: balance.type, + currency: balance.currency, + amount: balance.amount, + })) + ) + ) console.log() console.timeEnd('getProfile') console.log() - } catch (error) { + } catch (error) { console.error(error) } } diff --git a/examples/iqoption/typescript/logIn.ts b/examples/iqoption/typescript/logIn.ts index 8f42d94..9c8504d 100644 --- a/examples/iqoption/typescript/logIn.ts +++ b/examples/iqoption/typescript/logIn.ts @@ -5,7 +5,9 @@ import { BaseIQOptionProvider, IQOptionProvider } from '@hemes/iqoption' async function run() { try { - const hemes = new Hemes(IQOptionProvider).getProvider() + const hemes = new Hemes( + IQOptionProvider + ).getProvider() await hemes.logIn({ email: String(process.env.TEST_IQOPTION_ACCOUNT_EMAIL), diff --git a/examples/iqoption/typescript/placeDigitalOption.ts b/examples/iqoption/typescript/placeDigitalOption.ts index a96a505..7b2751b 100644 --- a/examples/iqoption/typescript/placeDigitalOption.ts +++ b/examples/iqoption/typescript/placeDigitalOption.ts @@ -1,7 +1,11 @@ import '../../loadEnv' import { Hemes } from '@hemes/core' -import { IQOptionProvider, BaseIQOptionProvider, ActivePair } from '@hemes/iqoption' +import { + IQOptionProvider, + BaseIQOptionProvider, + ActivePair, +} from '@hemes/iqoption' async function run() { const hemes = new Hemes(IQOptionProvider).getProvider() diff --git a/packages/iqoption/lib/IQOptionAccount.ts b/packages/iqoption/lib/IQOptionAccount.ts index 7b25c09..9cebcba 100644 --- a/packages/iqoption/lib/IQOptionAccount.ts +++ b/packages/iqoption/lib/IQOptionAccount.ts @@ -9,6 +9,7 @@ import { ExpirationPeriod, GetPositionOptions, InstrumentType, + OpenAssets, OpenBinaryOption, PlaceDigitalOption, Profile, @@ -273,6 +274,69 @@ export class IQOptionAccount implements BaseIQOptionAccount { return checkIsEnabled } + /** + export type OpenAssets = { + [type in InstrumentType]: Active[] +} */ + + public async getOpenAssets(): Promise { + const openAssets: OpenAssets = { + 'binary-option': [], + 'turbo-option': [], + 'digital-option': [], + } + + const isActiveOpen = (active: any) => { + return active.enabled && !active.is_suspended + } + + await this.webSocket.send(GetInitializationDataRequest) + + const initializationData = await this.webSocket.waitFor( + GetInitializationDataResponse + ) + + const binaryOptions = initializationData?.msg?.binary?.actives || {} + const turboOptions = initializationData?.msg?.turbo?.actives || {} + + for (const id in binaryOptions) { + if (isActiveOpen(binaryOptions[id])) { + openAssets['binary-option'].push(binaryOptions[id].name as Active) + } + } + + for (const id in turboOptions) { + if (isActiveOpen(turboOptions[id])) { + openAssets['turbo-option'].push(turboOptions[id].name as Active) + } + } + + // Fetch the list of top assets to get other types of assets + await this.webSocket.send(GetUnderlyingListRequest, { + type: 'digital-option', + }) + + const underlyingList = await this.webSocket.waitFor( + GetUnderlyingListResponse + ) + + const digitalOptions = underlyingList?.msg.underlying || [] + + for (const asset of digitalOptions) { + if ( + asset.schedule.some( + item => + getFixedTimestamp(item.open) < Date.now() && + getFixedTimestamp(item.close) > Date.now() + ) + ) { + openAssets['digital-option'].push(asset.name as Active) + } + } + + return openAssets + } + private async subscribePositionState(position: Position) { this.openPositionsIds.push(position.id) diff --git a/packages/iqoption/lib/types.ts b/packages/iqoption/lib/types.ts index 9b54e8d..c924456 100644 --- a/packages/iqoption/lib/types.ts +++ b/packages/iqoption/lib/types.ts @@ -38,6 +38,10 @@ export interface GetPositionOptions { timeout?: number } +export type OpenAssets = { + [type in InstrumentType]: Active[] +} + export interface BaseIQOptionAccount { api: AxiosInstance webSocket: WebSocketClient @@ -54,6 +58,7 @@ export interface BaseIQOptionAccount { instrumentType: Type, ...expirationPeriod: Type extends 'binary-option' ? [ExpirationPeriod] : [] ): Promise + getOpenAssets(): Promise placeDigitalOption(data: PlaceDigitalOption): Promise openBinaryOption(data: OpenBinaryOption): Promise getPosition( @@ -553,7 +558,6 @@ export type Active = | 'TFC' | 'BTC' - export enum ActivePair { ALL = 0, EURRUB = 9, @@ -594,7 +598,6 @@ export enum ActivePair { PAN = 97, - GBPCHF = 103, GBPAUD = 104, @@ -616,7 +619,6 @@ export enum ActivePair { NTDOY = 218, USDTRY = 220, - BTCUSD = 816, XRPUSD = 817, ETHUSD = 818, @@ -642,8 +644,6 @@ export enum ActivePair { TRXUSD_L = 1242, EOSUSD_L = 1244, - - EURUSD = 1, EURGBP = 2, GBPJPY = 3, @@ -906,5 +906,5 @@ export enum ActivePair { WORK = 1343, FDJP = 1350, VIAC = 1352, - TFC = 13 + TFC = 13, } diff --git a/packages/iqoption/lib/utils/getActiveId.ts b/packages/iqoption/lib/utils/getActiveId.ts index 8a112cc..e38cb04 100644 --- a/packages/iqoption/lib/utils/getActiveId.ts +++ b/packages/iqoption/lib/utils/getActiveId.ts @@ -4,7 +4,7 @@ type ActiveIds = { [keyIgnored in Active]: number } -const activeIds: ActiveIds = { +export const activeIds: ActiveIds = { EURUSD: 1, EURGBP: 2, GBPJPY: 3, @@ -377,6 +377,7 @@ const activeIds: ActiveIds = { CAN: 1351, VIAC: 1352, TFC: 1353, + BTC: 1354, } export function getActiveId(active: Active): number { diff --git a/packages/iqoption/lib/utils/getActiveNameById.ts b/packages/iqoption/lib/utils/getActiveNameById.ts new file mode 100644 index 0000000..a96e5c1 --- /dev/null +++ b/packages/iqoption/lib/utils/getActiveNameById.ts @@ -0,0 +1,7 @@ +import { Active } from '../types' + +import { activeIds } from './getActiveId' + +export function getActiveNameById(id: number): Active | undefined { + return Object.keys(activeIds).find(key => activeIds[key] === id) as Active +} diff --git a/packages/iqoption/lib/websocket/WebSocketClient.ts b/packages/iqoption/lib/websocket/WebSocketClient.ts index dd6a012..224eea9 100644 --- a/packages/iqoption/lib/websocket/WebSocketClient.ts +++ b/packages/iqoption/lib/websocket/WebSocketClient.ts @@ -32,7 +32,9 @@ export class WebSocketClient implements BaseWebSocketClient { public async subscribe(): Promise { return new Promise(resolve => { - this.webSocket = new WebSocket('wss://ws.trade.gomerebroker.com/echo/websocket') + this.webSocket = new WebSocket( + 'wss://ws.trade.gomerebroker.com/echo/websocket' + ) this.webSocket.on('open', () => { console.log('WebSocket connected') @@ -48,7 +50,9 @@ export class WebSocketClient implements BaseWebSocketClient { at: Date.now(), }) - if (!['heartbeat', 'timeSync', 'positions-state'].includes(event.name)) { + if ( + !['heartbeat', 'timeSync', 'positions-state'].includes(event.name) + ) { console.log( '⬇', format(Date.now(), 'yyyy-MM-dd HH:mm:ss:SSS'), @@ -81,7 +85,10 @@ export class WebSocketClient implements BaseWebSocketClient { ): Promise> { const request = new Request() - while (this.webSocket.readyState !== WebSocket.OPEN && this.webSocket.readyState !== WebSocket.CONNECTING) { + while ( + this.webSocket.readyState !== WebSocket.OPEN && + this.webSocket.readyState !== WebSocket.CONNECTING + ) { console.log('Waiting socket to connect to send message...') await this.subscribe() diff --git a/packages/iqoption/lib/websocket/events/requests/digital-options/PlaceDigitalOption.ts b/packages/iqoption/lib/websocket/events/requests/digital-options/PlaceDigitalOption.ts index aaf5625..2479ddb 100644 --- a/packages/iqoption/lib/websocket/events/requests/digital-options/PlaceDigitalOption.ts +++ b/packages/iqoption/lib/websocket/events/requests/digital-options/PlaceDigitalOption.ts @@ -75,9 +75,9 @@ function buildDigitalOptionIdentifier( expirationTimeFormatted.substring(8, 12) + // timeFormat '00T' + expirationPeriodTime + - "M" + + 'M' + abbreviatedPositionDirection[direction] + - 'SPT'; + 'SPT' return digitalOptionIdentifier } @@ -111,7 +111,7 @@ export class PlaceDigitalOptionRequest extends Request< instrument_id: digitalOptionIdentifier, amount: String(price), instrument_index: 797064, - asset_id: Number(active) + asset_id: Number(active), }, } }