Skip to main content
Market orders execute immediately at the best available price.

Complete Example

market-order.ts
import {
  DriftClient,
  getMarketOrderParams,
  PositionDirection,
  BASE_PRECISION,
  convertToNumber,
  PRICE_PRECISION,
  BN,
  calculateBidAskPrice,
} from '@drift-labs/sdk';

async function placeMarketOrder(driftClient: DriftClient) {
  // Get current price
  const marketIndex = 0; // SOL-PERP
  const perpMarket = driftClient.getPerpMarketAccount(marketIndex);
  const oracleData = driftClient.getOracleDataForPerpMarket(marketIndex);

  const [bidPrice, askPrice] = calculateBidAskPrice(
    perpMarket.amm,
    oracleData
  );

  console.log('Current SOL price:');
  console.log('  Bid:', convertToNumber(bidPrice, PRICE_PRECISION));
  console.log('  Ask:', convertToNumber(askPrice, PRICE_PRECISION));

  // Place market order to buy 1 SOL-PERP
  const baseAssetAmount = new BN(1).mul(BASE_PRECISION);

  const orderParams = getMarketOrderParams({
    marketIndex,
    direction: PositionDirection.LONG,
    baseAssetAmount,
  });

  console.log('\nPlacing market order...');
  const txSig = await driftClient.placePerpOrder(orderParams);
  console.log('Order placed:', txSig);

  // Wait for confirmation
  await driftClient.connection.confirmTransaction(txSig, 'confirmed');
  console.log('Order confirmed!');

  // Check position
  const user = driftClient.getUser();
  await user.fetchAccounts();
  
  const position = user.getPerpPosition(marketIndex);
  if (position) {
    console.log('\nPosition:');
    console.log('  Size:', convertToNumber(position.baseAssetAmount, BASE_PRECISION));
    console.log('  Entry:', convertToNumber(
      position.quoteAssetAmount.abs().mul(PRICE_PRECISION).div(position.baseAssetAmount.abs()),
      PRICE_PRECISION
    ));
  }
}

export { placeMarketOrder };

With Price Protection

Set a maximum price to prevent excessive slippage:
const currentAsk = askPrice;
const maxPrice = currentAsk.mul(new BN(105)).div(new BN(100)); // +5%

const orderParams = getMarketOrderParams({
  marketIndex: 0,
  direction: PositionDirection.LONG,
  baseAssetAmount: new BN(1).mul(BASE_PRECISION),
  price: maxPrice, // Will reject if price above this
});

await driftClient.placePerpOrder(orderParams);

Key Points

Market orders fill against the best available liquidity in the DLOB or AMM.
Always set a maximum acceptable price to protect against slippage.
After placing, query your position to verify the fill.

Next Steps

Limit Orders

Place limit orders

Modify Orders

Modify existing orders

Build docs developers (and LLMs) love