Skip to content

Commit

Permalink
chore(iqoption): Add getActiveNameById utility function
Browse files Browse the repository at this point in the history
  • Loading branch information
andredezzy committed Aug 7, 2024
1 parent 9f95391 commit a669cd2
Show file tree
Hide file tree
Showing 9 changed files with 114 additions and 22 deletions.
21 changes: 14 additions & 7 deletions examples/iqoption/typescript/getProfile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import { IQOptionProvider, BaseIQOptionProvider } from '@hemes/iqoption'

async function run() {
try {
const hemes = new Hemes(IQOptionProvider).getProvider<BaseIQOptionProvider>()
const hemes = new Hemes(
IQOptionProvider
).getProvider<BaseIQOptionProvider>()

const account = await hemes.logIn({
email: String(process.env.TEST_IQOPTION_ACCOUNT_EMAIL),
Expand All @@ -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)
}
}
Expand Down
4 changes: 3 additions & 1 deletion examples/iqoption/typescript/logIn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import { BaseIQOptionProvider, IQOptionProvider } from '@hemes/iqoption'

async function run() {
try {
const hemes = new Hemes(IQOptionProvider).getProvider<BaseIQOptionProvider>()
const hemes = new Hemes(
IQOptionProvider
).getProvider<BaseIQOptionProvider>()

await hemes.logIn({
email: String(process.env.TEST_IQOPTION_ACCOUNT_EMAIL),
Expand Down
6 changes: 5 additions & 1 deletion examples/iqoption/typescript/placeDigitalOption.ts
Original file line number Diff line number Diff line change
@@ -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<BaseIQOptionProvider>()
Expand Down
64 changes: 64 additions & 0 deletions packages/iqoption/lib/IQOptionAccount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
ExpirationPeriod,
GetPositionOptions,
InstrumentType,
OpenAssets,
OpenBinaryOption,
PlaceDigitalOption,
Profile,
Expand Down Expand Up @@ -273,6 +274,69 @@ export class IQOptionAccount implements BaseIQOptionAccount {
return checkIsEnabled
}

/**
export type OpenAssets = {
[type in InstrumentType]: Active[]
} */

public async getOpenAssets(): Promise<OpenAssets> {
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)

Expand Down
12 changes: 6 additions & 6 deletions packages/iqoption/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ export interface GetPositionOptions {
timeout?: number
}

export type OpenAssets = {
[type in InstrumentType]: Active[]
}

export interface BaseIQOptionAccount {
api: AxiosInstance
webSocket: WebSocketClient
Expand All @@ -54,6 +58,7 @@ export interface BaseIQOptionAccount {
instrumentType: Type,
...expirationPeriod: Type extends 'binary-option' ? [ExpirationPeriod] : []
): Promise<boolean>
getOpenAssets(): Promise<OpenAssets>
placeDigitalOption(data: PlaceDigitalOption): Promise<Position>
openBinaryOption(data: OpenBinaryOption): Promise<Position>
getPosition(
Expand Down Expand Up @@ -553,7 +558,6 @@ export type Active =
| 'TFC'
| 'BTC'


export enum ActivePair {
ALL = 0,
EURRUB = 9,
Expand Down Expand Up @@ -594,7 +598,6 @@ export enum ActivePair {

PAN = 97,


GBPCHF = 103,
GBPAUD = 104,

Expand All @@ -616,7 +619,6 @@ export enum ActivePair {
NTDOY = 218,
USDTRY = 220,


BTCUSD = 816,
XRPUSD = 817,
ETHUSD = 818,
Expand All @@ -642,8 +644,6 @@ export enum ActivePair {
TRXUSD_L = 1242,
EOSUSD_L = 1244,



EURUSD = 1,
EURGBP = 2,
GBPJPY = 3,
Expand Down Expand Up @@ -906,5 +906,5 @@ export enum ActivePair {
WORK = 1343,
FDJP = 1350,
VIAC = 1352,
TFC = 13
TFC = 13,
}
3 changes: 2 additions & 1 deletion packages/iqoption/lib/utils/getActiveId.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ type ActiveIds = {
[keyIgnored in Active]: number
}

const activeIds: ActiveIds = {
export const activeIds: ActiveIds = {
EURUSD: 1,
EURGBP: 2,
GBPJPY: 3,
Expand Down Expand Up @@ -377,6 +377,7 @@ const activeIds: ActiveIds = {
CAN: 1351,
VIAC: 1352,
TFC: 1353,
BTC: 1354,
}

export function getActiveId(active: Active): number {
Expand Down
7 changes: 7 additions & 0 deletions packages/iqoption/lib/utils/getActiveNameById.ts
Original file line number Diff line number Diff line change
@@ -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
}
13 changes: 10 additions & 3 deletions packages/iqoption/lib/websocket/WebSocketClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ export class WebSocketClient implements BaseWebSocketClient {

public async subscribe(): Promise<void> {
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')
Expand All @@ -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'),
Expand Down Expand Up @@ -81,7 +85,10 @@ export class WebSocketClient implements BaseWebSocketClient {
): Promise<WebSocketEvent<Message>> {
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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,9 @@ function buildDigitalOptionIdentifier(
expirationTimeFormatted.substring(8, 12) + // timeFormat
'00T' +
expirationPeriodTime +
"M" +
'M' +
abbreviatedPositionDirection[direction] +
'SPT';
'SPT'

return digitalOptionIdentifier
}
Expand Down Expand Up @@ -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),
},
}
}
Expand Down

0 comments on commit a669cd2

Please sign in to comment.