Skip to content

Commit

Permalink
chore: Refactor get candles
Browse files Browse the repository at this point in the history
  • Loading branch information
andredezzy committed Jul 3, 2021
1 parent 8bdff91 commit c3d36a1
Show file tree
Hide file tree
Showing 14 changed files with 125 additions and 102 deletions.
2 changes: 1 addition & 1 deletion .husky/commit-msg
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
. "$(dirname "$0")/_/husky.sh"
. "$(dirname "$0")/common.sh"

yarn commitlint --edit $1
npx --no-install commitlint --edit "$1"
3 changes: 2 additions & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
. "$(dirname "$0")/_/husky.sh"
. "$(dirname "$0")/common.sh"

yarn lint-staged
yarn git-branch-is -r "^((?!main|master).)*$"
npx lint-staged -c .lintstagedrc.json
8 changes: 6 additions & 2 deletions .lintstagedrc.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
{
"packages/**/*.{js,ts}": [
"eslint --ext js,ts --fix"
"*.[tj]s?(x)": [
"eslint --fix",
"git add"
],
"*.(spec|test).[tj]s?(x)": [
"yarn test"
]
}
File renamed without changes.
5 changes: 4 additions & 1 deletion commitlint.config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
module.exports = {
extends: ['@rocketseat/commitlint-config'],
extends: ['@commitlint/config-conventional'],
rules: {
'subject-case': [2, 'always', ['sentence-case']],
},
}
25 changes: 11 additions & 14 deletions examples/iqoption/typescript/getCandles.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
import { Hemes } from '@hemes/core'
import {
BaseIQOptionProvider,
CandleInterval,
IQOptionProvider,
} from '@hemes/iqoption'
import '../../loadEnv'

import { Hemes } from '@hemes/core'
import { IQOptionProvider, BaseIQOptionProvider } from '@hemes/iqoption'

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

Expand All @@ -14,15 +11,15 @@ async function run() {
password: String(process.env.TEST_IQOPTION_ACCOUNT_PASSWORD),
})

const candles = await hemes.getCandles(
6,
CandleInterval['1S'],
10,
Date.now()
)
const candles = await account.getCandles('EURUSD-OTC', 'm15', 2)

const fixedCandlesTime = candles.map(candle => ({
...candle,
open: Number(candle.open.toFixed(5)),
close: Number(candle.close.toFixed(5)),
}))

console.log('Account', !!account)
console.log('\n', 'Candles', candles, '\n')
console.log('\n', 'Candles', fixedCandlesTime, '\n')
}

run()
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"prepublishOnly": "npm run test && npm run build",
"publish:canary": "lerna version prerelease --no-changelog --preid next",
"publish:stable": "lerna version --no-changelog",
"postinstall": "husky install"
"postinstall": "husky install && shx rm -rf .git/hooks && shx ln -s ../.husky .git/hooks"
},
"devDependencies": {
"@babel/core": "7.12.10",
Expand All @@ -51,6 +51,7 @@
"eslint-plugin-node": "11.1.0",
"eslint-plugin-prettier": "3.3.1",
"eslint-plugin-promise": "4.2.1",
"git-branch-is": "^4.0.0",
"husky": "5.0.9",
"jest": "26.6.3",
"jest-dom": "4.0.0",
Expand All @@ -65,6 +66,7 @@
"rollup-plugin-terser": "7.0.2",
"rollup-plugin-typescript2": "0.29.0",
"rollup-plugin-url": "3.0.1",
"shx": "^0.3.3",
"ts-jest": "26.4.4",
"typescript": "4.1.3"
}
Expand Down
5 changes: 5 additions & 0 deletions packages/iqoption/__tests__/IQOptionProvider.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ const mockIqOptionAccount = {
placeDigitalOption: jest.fn(),
openBinaryOption: jest.fn(),
getPosition: jest.fn(),
getCandles: jest.fn(),
}

jest.mock('../lib/websocket/WebSocketClient', () => ({
Expand Down Expand Up @@ -78,6 +79,10 @@ jest.mock('../lib/IQOptionAccount', () => ({
getPosition(...args: any[]) {
return mockIqOptionAccount.getPosition(...args)
}

getCandles(...args: any[]) {
return mockIqOptionAccount.getCandles(...args)
}
},
}))

Expand Down
34 changes: 33 additions & 1 deletion packages/iqoption/lib/IQOptionAccount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
allInstrumentTypes,
BalanceMode,
BaseIQOptionAccount,
Candle,
ExpirationPeriod,
InstrumentType,
OpenBinaryOption,
Expand All @@ -16,6 +17,7 @@ import { getFixedTimestamp } from './utils/getFixedTimestamp'
import { OpenOptionRequest } from './websocket/events/requests/binary-options/OpenOption'
import { PlaceDigitalOptionRequest } from './websocket/events/requests/digital-options/PlaceDigitalOption'
import { GetBalancesRequest } from './websocket/events/requests/GetBalances'
import { GetCandlesRequest } from './websocket/events/requests/GetCandles'
import { GetInitializationDataRequest } from './websocket/events/requests/GetInitializationData'
import { GetProfileRequest } from './websocket/events/requests/GetProfile'
import { GetTopAssetsRequest } from './websocket/events/requests/GetTopAssets'
Expand All @@ -28,6 +30,10 @@ import {
Balance,
GetBalancesResponse,
} from './websocket/events/responses/GetBalances'
import {
CandlesResponse,
GetCandlesResponse,
} from './websocket/events/responses/GetCandles'
import { GetInitializationDataResponse } from './websocket/events/responses/GetInitializationData'
import { GetProfileResponse } from './websocket/events/responses/GetProfile'
import { GetTopAssetsResponse } from './websocket/events/responses/GetTopAssets'
Expand All @@ -37,7 +43,6 @@ import {
PositionChangedResponse,
} from './websocket/events/responses/PositionChanged'
import { WebSocketClient } from './websocket/WebSocketClient'

type BalanceTypeIds = {
[type in BalanceMode]: number
}
Expand Down Expand Up @@ -346,4 +351,31 @@ export class IQOptionAccount implements BaseIQOptionAccount {

return changedPosition.msg
}

public async getCandles(
active: Active,
timePeriod: ExpirationPeriod,
count: number,
toDate?: Date | number
): Promise<Candle[]> {
const getCandlesRequest = await this.webSocket.send(GetCandlesRequest, {
active,
timePeriod,
count,
toDate: toDate || Date.now(),
})

const getCandlesResponse = await this.webSocket.waitFor<CandlesResponse>(
GetCandlesResponse,
{
requestId: getCandlesRequest.request_id,
}
)

if (!getCandlesResponse) {
throw new Error('Candles not found')
}

return getCandlesResponse.msg.candles
}
}
33 changes: 0 additions & 33 deletions packages/iqoption/lib/IQOptionProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,9 @@ import { IQOptionAccount } from './IQOptionAccount'
import {
BaseIQOptionAccount,
BaseIQOptionProvider,
Candle,
LogInCredentials,
} from './types'
import { GetCandlesRequest } from './websocket/events/requests/GetCandles'
import { SsidRequest } from './websocket/events/requests/SSID'
import {
CandleResponseData,
GetCandlesResponse,
} from './websocket/events/responses/GetCandles'
import { WebSocketClient } from './websocket/WebSocketClient'

interface LoginResponse {
Expand Down Expand Up @@ -65,31 +59,4 @@ export class IQOptionProvider implements BaseIQOptionProvider {

return account
}

public async getCandles(
active: number,
interval: string | number,
amount: number,
endtime: number
): Promise<Candle[]> {
const getCandlesRequest = await this.webSocket.send(GetCandlesRequest, {
active_id: active,
interval,
endtime,
amount,
})

const getCandlesResponse = await this.webSocket.waitFor<CandleResponseData>(
GetCandlesResponse,
{
requestId: getCandlesRequest.request_id,
}
)

if (!getCandlesResponse) {
throw new Error('Candles not found')
}

return getCandlesResponse.msg.candles
}
}
35 changes: 6 additions & 29 deletions packages/iqoption/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,6 @@ export interface LogInCredentials {

export interface BaseIQOptionProvider {
logIn(credentials: LogInCredentials): Promise<BaseIQOptionAccount>
getCandles(
active: number,
interval: string | number,
amount: number,
endtime: number
): Promise<Candle[]>
}

export interface PlaceDigitalOption {
Expand Down Expand Up @@ -52,6 +46,12 @@ export interface BaseIQOptionAccount {
placeDigitalOption(data: PlaceDigitalOption): Promise<Position>
openBinaryOption(data: OpenBinaryOption): Promise<Position>
getPosition(positionId: string): Promise<Position>
getCandles(
active: Active,
timePeriod: ExpirationPeriod,
count: number,
toDate?: Date | number
): Promise<Candle[]>
}

export interface WebSocketEvent<Message = any> {
Expand Down Expand Up @@ -292,29 +292,6 @@ export interface Candle {
volume: number
}

export const CandleInterval = {
'1S': 1,
'5S': 5,
'10S': 10,
'15S': 15,
'30S': 30,
'1M': 60,
'2M': 120,
'5M': 300,
'10M': 600,
'15M': 900,
'30M': 1800,
'1H': 3600,
'2H': 7200,
'4H': 14400,
'8H': 28800,
'12H': 43200,
'1D': 86400,
'1W': 604800,
'1MO': 2592000,
ALL: 'all',
}

export type DigitalOptionExpirationPeriod = 'm1' | 'm5' | 'm15'

export type ExpirationPeriod = 'm1' | 'm5' | 'm15' | 'm30' | 'h1'
Expand Down
48 changes: 34 additions & 14 deletions packages/iqoption/lib/websocket/events/requests/GetCandles.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@
import { Active, ExpirationPeriod } from '../../../types'
import { getActiveId } from '../../../utils/getActiveId'
import { getExpirationPeriodTime } from '../../../utils/getExpirationPeriodTime'
import { Request } from '../Request'

interface GetCandlesMessage {
name: 'get-candles'
version: '2.0'
body: {}
body: {
active_id: number
size: number | string
to: number
count: number
}
}

interface GetCandlesRequestArgs {
active_id: number
interval: number | string
endtime: number
amount: number
active: Active
timePeriod: ExpirationPeriod
count: number
toDate: Date | number
}

export class GetCandlesRequest extends Request<
Expand All @@ -22,20 +30,32 @@ export class GetCandlesRequest extends Request<
}

public async build({
active_id,
interval,
endtime,
amount,
active,
timePeriod,
count,
toDate,
}: GetCandlesRequestArgs): Promise<GetCandlesMessage> {
const activeId = getActiveId(active)

const candlesTimePeriod: number = getExpirationPeriodTime(
timePeriod,
'seconds'
)

let candlesUntilDate: number = toDate as number

if (toDate instanceof Date) {
candlesUntilDate = toDate.getTime()
}

return {
name: 'get-candles',
version: '2.0',
body: {
active_id: active_id,
size: interval,
to: endtime,
count: amount,
'': active_id,
active_id: activeId,
size: candlesTimePeriod,
count: count,
to: candlesUntilDate,
},
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import { Candle } from 'packages/iqoption/lib/types'

import { Response } from '../Response'

export interface CandleResponseData {
export interface CandlesResponse {
candles: Candle[]
}

export class GetCandlesResponse extends Response<CandleResponseData> {
export class GetCandlesResponse extends Response<CandlesResponse> {
public get name(): string {
return 'candles'
}
Expand Down
Loading

0 comments on commit c3d36a1

Please sign in to comment.