Skip to content

Commit

Permalink
feat(models): add master pair
Browse files Browse the repository at this point in the history
  • Loading branch information
zlq4863947 committed Mar 1, 2019
1 parent 80d871b commit 1112cec
Show file tree
Hide file tree
Showing 12 changed files with 538 additions and 25 deletions.
4 changes: 2 additions & 2 deletions .npmignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
.history

# source
projects
modules
/projects
/modules
index.ts

# configuration
Expand Down
49 changes: 39 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,51 @@ npm install dripjs-bitmex

## 使用

- import

```typescript
import { IntelFactory, BitmexSpy } from 'dripjs';
import { IntelligenceFactory, BitmexSpy } from 'dripjs';

// 生成指定交易所的数据接口
const bitmexSpy = IntelligenceFactory.create(BitmexSpy, {
apiKey: `你的bitmex交易所apiKey`,
apiSecret: `你的bitmex交易所apiSecret`,
testnet: true,
});
const pair = 'XBTUSD';
const bitmex = IntelFactory.create(BitmexSpy, {
apiKey: `xx`,
apiSecret: `zz`,
testnet: false,
// 订阅逐笔数据
bitmexSpy.getTicker$(pair).subscribe((res) => {
console.log(res);
});
bitmex.getTransaction$(pair).subscribe((transaction) => {
console.log(transaction);
setTimeout(() => {
console.log('do stop ticker subscription');
// 不用时,别忘记退订
bitmexSpy.stopTicker(pair);
}, 5000);
```

- require

```typescript
const dripjs = require('dripjs');

// 生成指定交易所的数据接口
const bitmexSpy = dripjs.IntelligenceFactory.create(dripjs.BitmexSpy, {
apiKey: `你的bitmex交易所apiKey`,
apiSecret: `你的bitmex交易所apiSecret`,
testnet: true,
});
const pair = 'XBTUSD';
// 订阅逐笔数据
bitmexSpy.getTicker$(pair).subscribe((res) => {
console.log(res);
});

setTimeout(() => {
bitmex.stopTransaction(pair);
bitmex.destory();
}, 2000);
console.log('do stop ticker subscription');
// 不用时,别忘记退订
bitmexSpy.stopTicker(pair);
}, 5000);
```

## 模块列表
Expand Down
1 change: 1 addition & 0 deletions modules/models/common/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './transformers';
81 changes: 81 additions & 0 deletions modules/models/common/transformers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
type StringTransformerFunction = (value?: string | null | undefined) => string | null | undefined;

interface StringTransformer {
from: StringTransformerFunction;
to: StringTransformerFunction;
}

export function getFloorByDigitsTransformer(digit: number): StringTransformer {
return {
from: (value?: string | null | undefined) => value,
to: (value?: string | null | undefined) => {
if (value === undefined || value === null) {
return value;
}

const [integer, fraction] = value.split('.');
if (fraction === undefined) {
return value;
}

const fractionReduced = fraction.substr(0, digit);

return `${integer}.${fractionReduced}`;
},
};
}

export const nullableDateTransformer = {
from: (value?: Date | null | undefined | number) => {
if (value === undefined || value === null) {
return value;
}

if (value instanceof Date) {
return value.getTime();
}

return value;
},
to: (value?: number | null | undefined) => {
if (value === undefined || value === null) {
return value;
}

return new Date(value);
},
};

/**
* Use this transformer for the following case.
* - we want to use a value as `boolean` in application, but store it as `tinyint` into DB.
*/
export const booleanTinyintTransformer = {
from: (val: 0 | 1): boolean => !!val,
to: (val: boolean) => {
if (val === undefined || val === null) {
return val;
}
const n = Number(val);
if (Number.isNaN(n)) {
throw new Error(`Invalid boolean value ${val}`);
}

return n as 0 | 1;
},
};

/**
* Use this when tinyint has a default value i.e. '0' or '1'.
* @see MasterPairEntity
*/
export const nullableBooleanTinyintTransformer = {
from: (val: 0 | 1): boolean => !!val,
to: (val: boolean | null | undefined) => {
if (val === undefined || val === null) {
return val;
}

return Number(val) as 0 | 1;
},
};
1 change: 1 addition & 0 deletions modules/models/entity/master-pair/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './master-pair.entity';
136 changes: 136 additions & 0 deletions modules/models/entity/master-pair/master-pair.entity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import { Pair, Timestamp } from '@dripjs/types';
import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm';

import { getFloorByDigitsTransformer, nullableBooleanTinyintTransformer, nullableDateTransformer } from '../../common';

@Entity({
name: 'master_pair',
})
@Index('unique_base_asset_quote_asset', ['baseAsset', 'quoteAsset'], { unique: true })
export class MasterPairEntity {
@PrimaryGeneratedColumn({
type: 'bigint',
name: 'id',
unsigned: true,
comment: 'primary auto generated id',
})
readonly id!: string;

@Column({
type: 'varchar',
name: 'name',
length: 10,
comment: 'special pair name',
})
readonly name!: Pair['name'];

@Column({
type: 'varchar',
name: 'exchange',
length: 10,
comment: 'exchange of special pair name',
})
readonly exchange!: Pair['exchange'];

@Column({
type: 'varchar',
name: 'base_asset',
length: 10,
comment: 'base asset name',
})
readonly baseAsset!: Pair['baseAsset'];

@Column({
type: 'varchar',
name: 'quote_asset',
length: 10,
comment: 'quote asset name',
})
readonly quoteAsset!: Pair['quoteAsset'];

@Column({
type: 'int',
name: 'price_precision',
unsigned: true,
comment: 'pair price precision',
})
readonly pricePrecision!: Pair['pricePrecision'];

@Column({
type: 'int',
name: 'amount_precision',
unsigned: true,
comment: 'pair amount precision',
})
readonly amountPrecision!: Pair['amountPrecision'];

@Column({
type: 'decimal',
name: 'min_order_amount',
precision: 9,
scale: 9,
unsigned: true,
comment: 'min Order amount',
default: () => '0.0',
transformer: getFloorByDigitsTransformer(9),
})
readonly minOrderAmount!: Pair['minOrderAmount'];

@Column({
type: 'int',
name: 'max_order_amount',
unsigned: true,
comment: 'max Order amount',
})
readonly maxOrderAmount!: Pair['maxOrderAmount'];

@Column({
type: 'decimal',
name: 'min_order_price',
precision: 9,
scale: 9,
unsigned: true,
comment: 'min Order price',
default: () => '0.0',
transformer: getFloorByDigitsTransformer(9),
})
readonly minOrderPrice!: Pair['minOrderAmount'];

@Column({
type: 'int',
name: 'max_order_price',
unsigned: true,
comment: 'max Order price',
})
readonly maxOrderPrice!: Pair['maxOrderAmount'];

@Column({
type: 'tinyint',
name: 'is_enabled',
unsigned: true,
width: 1,
comment: 'whether pair is enable status',
default: '0',
transformer: nullableBooleanTinyintTransformer,
})
readonly isEnabled!: Pair['isEnabled'];

@Column({
type: 'datetime',
name: 'created_at',
precision: 3,
default: () => 'NOW(3)',
transformer: nullableDateTransformer,
})
readonly createdAt!: Timestamp;

@Column({
type: 'datetime',
name: 'updated_at',
precision: 3,
default: () => 'NOW(3)',
onUpdate: 'NOW(3)',
transformer: nullableDateTransformer,
})
readonly updatedAt!: Timestamp;
}
6 changes: 6 additions & 0 deletions modules/types/exchange.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,16 @@ export interface Market {

export interface Pair {
name: string;
exchange: string;
baseAsset: string;
quoteAsset: string;
amountPrecision: number;
pricePrecision: number;
minOrderAmount: number;
maxOrderAmount: number;
minOrderPrice: number;
maxOrderPrice: number;
isEnabled: boolean;
}

export interface Stock {
Expand Down
11 changes: 11 additions & 0 deletions modules/types/order.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,14 @@ export enum OrderSide {
Buy = 'buy',
Sell = 'sell',
}

export type Nominal<T, Name extends string> = T & {
[Symbol.species]: Name;
};

/**
* timestamp
* eg: 1535600337261
*/
export type Timestamp = Nominal<number, 'Timestamp'>;
export type BigNumberString = Nominal<string, 'BigNumberString'>;
2 changes: 1 addition & 1 deletion modules/types/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "dripjs-types",
"version": "0.1.1",
"version": "0.1.2",
"description": "dripjs types",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
Expand Down
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@
},
"homepage": "https://github.com/zlq4863947/dripjs#readme",
"devDependencies": {
"@nestjs/typeorm": "5.3.0",
"@types/jest": "24.0.9",
"@types/qs": "6.5.1",
"@types/ws": "6.0.1",
Expand Down Expand Up @@ -133,10 +134,11 @@
"bignumber.js": "^8.1.0",
"dotenv": "^6.2.0",
"dripjs-common": "^0.1.0",
"dripjs-types": "^0.1.1",
"dripjs-types": "^0.1.2",
"moment": "^2.24.0",
"qs": "^6.6.0",
"rxjs": "^6.4.0",
"typeorm": "^0.2.14",
"ws": "^6.1.4"
}
}
2 changes: 1 addition & 1 deletion projects/intelligence/intel-factory.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Bitmex } from '@dripjs/exchanges';
import { realConfig } from '@dripjs/testing';

import { IntelFactory, Spy, BitmexSpy } from '.';
import { BitmexSpy, IntelFactory, Spy } from '.';

describe('Intel factory', () => {
describe('Spy bitmex', () => {
Expand Down
Loading

0 comments on commit 1112cec

Please sign in to comment.