Nordic Panda Moor

    xapi-node
    TypeScript icon, indicating that this package has built-in type declarations

    2.6.0 • Public • Published

    Logo

    Logo

    xapi-node

    This project makes it 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 and X-Trade Brokers 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

    npm i xapi-node
    

    2. Example usage

    Authentication

    // 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

    // 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]

    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)

    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

    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

    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)

    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)

    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

    import {Logger4V2} from 'logger4'
    
    const x = new XAPI({...loginConfig, logger: new Logger4V2()})
    
    const info = new Writable()
    info._write = ((chunk, encoding, next) => {
      // you can bind 'info' logger
      console.log(chunk.toString())
      next()
    })
    x.logger.onStream('info', info)
    
    const error = new Writable()
    error._write = ((chunk, encoding, next) => {
      // you can bind 'error' logger
      console.error(chunk.toString())
      next()
    })
    x.logger.onStream('error', error)
    
    const debug = new Writable()
    debug._write = ((chunk, encoding, next) => {
      // you can bind 'debug' logger
      console.log(chunk.toString())
      next()
    })
    x.logger.onStream('debug', debug)

    Buy Me A Coffee!

    If you can contribute or you want to, feel free to do it at Buy me a coffee!

    Be careful and donate just if it is within your possibilities, because there is no refund system. And remember that you don't need to donate, it is just a free choice for you. Thank you!

    Install

    npm i xapi-node

    DownloadsWeekly Downloads

    12

    Version

    2.6.0

    License

    BSD 4-Clause

    Unpacked Size

    342 kB

    Total Files

    86

    Last publish

    Collaborators

    • szombatipeter