[![Logo](https://github.com/peterszombati/xapi-node/raw/master/docs/bfb-logo.png)](https://my.bfb.by/#/registration?ref=3030057)

[![Logo](https://github.com/peterszombati/xapi-node/raw/master/docs/xtb-logo.png)](https://www.xtb.com/en)

# xapi-node

This project is made possible to get data from Forex market, execute market or limit order with NodeJS/JS through WebSocket connection

This module may can be used for [BFB Capital](https://my.bfb.by/#/registration?ref=3030057) and [X-Trade Brokers](https://www.xtb.com/en) xStation5 accounts

WebSocket protocol description: https://peterszombati.github.io/xapi-node/

This module is usable on Front-end too.

## Getting started

### 1. Install via [npm](https://www.npmjs.com/package/xapi-node)

```
npm i xapi-node
```

### 2. Example usage
#### Authentication
```ts
// TypeScript
import XAPI from 'xapi-node';

const x = new XAPI({
    accountId: '(xStation5) accountID',
    password: '(xStation5) password',
    type: 'real' // or demo
});

x.connect();

x.onReady(() => {
    console.log('Connection is ready');
    
    // Disconnect
    x.disconnect().then(() => console.log('Disconnected'));
});
x.onReject((e) => {
    console.error(e);
});
```
#### Authentication only for XTB accounts
```ts
// TypeScript
import XAPI from 'xapi-node';

const x = new XAPI({
    accountId: '(xStation5) accountID',
    password: '(xStation5) password',
    host: 'ws.xtb.com', // only for XTB accounts
    type: 'real' // or demo
});

x.connect();

x.onReady(() => {
    console.log('Connection is ready');
    
    // Disconnect
    x.disconnect().then(() => console.log('Disconnected'));
});
x.onReject((e) => {
    console.error(e);
});
```

#### placing buy limit on BITCOIN [CFD]
```ts
x.Socket.send.tradeTransaction({
    cmd: CMD_FIELD.BUY_LIMIT,
    customComment: null,
    expiration: new Date().getTime() + 60000 * 60 * 24 * 365,
    offset: 0,
    order: 0,
    price: 100,
    sl: 0,
    symbol: 'BITCOIN',
    tp: 8000,
    type: TYPE_FIELD.OPEN,
    volume: 10
}).then(({order}) => {
    console.log('Success ' + order);
}).catch(e => {
    console.error('Failed');
    console.error(e);
});
```

#### placing buy limit on US30 (Dow Jones Industrial Average)
```ts
x.Socket.send.tradeTransaction({
    cmd: CMD_FIELD.BUY_LIMIT,
    customComment: null,
    expiration: new Date().getTime() + 60000 * 60 * 24 * 365,
    offset: 0,
    order: 0,
    price: 21900,
    sl: 0,
    symbol: 'US30',
    tp: 26500,
    type: TYPE_FIELD.OPEN,
    volume: 0.2
}).then(({order}) => {
    console.log('Success ' + order);
}).catch(e => {
    console.error('Failed');
    console.error(e);
});
```

#### get live EURUSD price data changing
```ts
x.Stream.listen.getTickPrices((data) => {
    console.log(data.symbol + ': ' + data.ask + ' | ' + data.askVolume + ' volume | ' + data.level + ' level' );
});

x.onReady(() => {
    x.Stream.subscribe.getTickPrices('EURUSD')
        .catch(() => { console.error('subscribe for EURUSD failed')});
});
/* output
EURUSD: 1.10912 | 500000 volume | 0 level
EURUSD: 1.10913 | 1000000 volume | 1 level
EURUSD: 1.10916 | 1000000 volume | 2 level
EURUSD: 1.10922 | 3000000 volume | 3 level
EURUSD: 1.10931 | 3500000 volume | 4 level
...
*/
```
#### get EURUSD M1 price history
```ts
x.onReady(() => {
    x.getPriceHistory({
        symbol:'EURUSD',
        period: PERIOD_FIELD.PERIOD_M1
    }).then(({candles, digits}) => {
        console.log(candles.length);
        console.log(candles[0]);
        console.log('digits = ' + digits);
    })
});
```
#### market buy EURUSD (1.0 lot / 100000 EUR)
```ts
x.onReady(() => {
    x.Socket.send.tradeTransaction({
        cmd: CMD_FIELD.BUY,
        customComment: null,
        expiration: x.serverTime + 5000,
        offset: 0,
        order: 0,
        price: 1,
        symbol: 'EURUSD',
        tp: 0,
        sl: 0,
        type: TYPE_FIELD.OPEN,
        volume: 1
    }).then(({order}) => {
        console.log('Success ' + order);
    }).catch(e => {
        console.error('Failed');
        console.error(e);
    });
});
```
#### modify open position (for example set new stop loss)
```ts
x.onReady(() => {
    x.Socket.send.tradeTransaction({
        order: 1234, // position number you can find it in (x.positions)
        type: TYPE_FIELD.MODIFY,
        sl: 1.05, // new stop loss level
    }).then(({order}) => {
        console.log('Success ' + order);
    }).catch(e => {
        console.error('Failed');
        console.error(e);
    });
});
```
#### How to use other log modules than Logger4
```ts
import Logger4 from 'logger4';

const logger = new Logger4({
    printEnabled: false,
    path: null,
    directorySizeLimitMB: null
});

const x = new XAPI({...loginConfig, logger});

x.logger.on((tag, log, type, params) => {
    // You can bind your log module here
    console.log({
        tag,
        log,
        type,
        params
    });
});
```

## Donation
Now you can donate these projects with Bitcoin, HUF, USD

USD IBAN bank account: HU77 1201 1069 0166 6164 0020 0000 (SWIFT: UBRTHUHB)

HUF IBAN bank account: HU12 1177 3339 0142 1172 0000 0000 (SWIFT: OTPVHUHB)

BTC: 3Kng1TWvE8qzuoqYqeA2KmMcGucPZFJ75F [www.blockchain.com](https://www.blockchain.com/btc/address/3Kng1TWvE8qzuoqYqeA2KmMcGucPZFJ75F)
