Example: rest-spot-private-trade.ts

Static snapshot for Binance/Rest/Spot/rest-spot-private-trade.ts.

Example Path

Binance/Rest/Spot/rest-spot-private-trade.ts

Source Link

Repository source: https://github.com/sieblyio/crypto-api-examples/blob/master/examples/Binance/Rest/Spot/rest-spot-private-trade.ts

Code Snapshot

import {
  MainClient,
  NewSpotOrderParams,
  OrderResponseFull,
  SymbolPrice,
} from 'binance';

const key = process.env.API_KEY_COM || 'APIKEY';
const secret = process.env.API_SECRET_COM || 'APISECRET';

const client = new MainClient({
  api_key: key,
  api_secret: secret,
  beautifyResponses: true,
});

const entryAmountPercent = 50; // trigger trade with 50%
const symbol = 'BTCUSDT';
const assetDecimalPlaces = 4; // get this from exchange info, it varies per asset

// method to trim down to decimal.
function trimToDecimalPlaces(number: number, precision: number): number {
  const array: any[] = number.toString().split('.');
  array.push(array.pop().substring(0, precision));
  const trimmedstr = array.join('.');
  return parseFloat(trimmedstr);
}

/**
 * This is a very silly demonstration on placing market orders using various parts of the module.
 * By default it will use 50% of your available USDT balance to buy BTC and sell it again.
 */

(async () => {
  try {
    /**
     * Get available balance
     */
    const balance = await client.getBalances();

    const usdtBal = balance.find((assetBal) => assetBal.coin === 'USDT');
    // console.log('USDT balance object: ', usdtBal);

    const usdtAvailable = usdtBal?.free;

    if (!usdtBal || !usdtAvailable) {
      return console.error('Error: funds to trade from USDT');
    }

    const buyAmountValue = Number(usdtAvailable) * (50 / 100);
    console.log(
      `Executing trade with ${entryAmountPercent}% of ${usdtAvailable} USDT = ${buyAmountValue} USDT value`,
    );

    /**
     * Get last asset price
     */
    const btcTicker = (await client.getSymbolPriceTicker({
      symbol: symbol,
    })) as SymbolPrice;
    const lastPrice = btcTicker?.price;
    if (!lastPrice) {
      return console.error('Error: no price returned');
    }

    /**
     * Calculate and submit buy amount
     */
    const buyAmountBtc = +(buyAmountValue / Number(lastPrice)).toFixed(
      assetDecimalPlaces,
    );
    console.log(
      `Last ${symbol} price: ${lastPrice} => will buy ${buyAmountBtc} ${symbol}`,
    );

    const buyOrderRequest: NewSpotOrderParams = {
      symbol: symbol,
      quantity: buyAmountBtc,
      side: 'BUY',
      type: 'MARKET',
      /**
       * ACK = confirmation of order acceptance (no placement/fill information) -> OrderResponseACK
       * RESULT = fill state -> OrderResponseResult
       * FULL = fill state + detail on fills and other detail -> OrderResponseFull
       */
      newOrderRespType: 'FULL',
    };

    console.log('Submitting buy order: ', buyOrderRequest);
    await client.testNewOrder(buyOrderRequest);
    const buyOrderResult = (await client.submitNewOrder(
      buyOrderRequest,
    )) as OrderResponseFull;
    console.log(
      'Order result: ',
      JSON.stringify(
        { request: buyOrderRequest, response: buyOrderResult },
        null,
        2,
      ),
    );

    /**
     * Process bought fills and submit sell amount
     */
    const assetAmountBought = buyOrderResult.executedQty;
    const assetFillsMinusFees = buyOrderResult.fills.reduce(
      (sum, fill) =>
        sum +
        Number(fill.qty) -
        (fill.commissionAsset !== 'BNB' ? Number(fill.commission) : 0),
      0,
    );
    console.log(
      `Filled buy ${symbol} ${assetAmountBought} : bought minus fees ${assetFillsMinusFees}`,
    );

    const sellOrderRequest: NewSpotOrderParams = {
      symbol: symbol,
      quantity: trimToDecimalPlaces(assetFillsMinusFees, assetDecimalPlaces),
      side: 'SELL',
      type: 'MARKET',
      newOrderRespType: 'FULL',
    };

    console.log('Submitting sell order: ', sellOrderRequest);
    await client.testNewOrder(sellOrderRequest);
    const sellOrderResult = (await client.submitNewOrder(
      sellOrderRequest,
    )) as OrderResponseFull;

    console.log(
      'Order result: ',
      JSON.stringify(
        { request: sellOrderRequest, response: sellOrderResult },
        null,
        2,
      ),
    );

    console.log(`All ${symbol} should have been sold!`);
  } catch (e) {
    console.error('Error: request failed: ', e);
  }

  process.exit(1);
})();

This is a static, crawlable snapshot. The interactive app loads after JavaScript starts and can refresh live data.