async def create_order(self, symbol, type, side, amount, price=None, params={}):
    "\n        create a trade order\n        :param str symbol: unified symbol of the market to create an order in\n        :param str type: 'market' or 'limit'\n        :param str side: 'buy' or 'sell'\n        :param float amount: how much of currency you want to trade in units of base currency\n        :param float price: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders\n        :param dict params: extra parameters specific to the bitvavo api endpoint\n        :returns dict: an `order structure <https://docs.ccxt.com/en/latest/manual.html#order-structure>`\n        "
    (await self.load_markets())
    market = self.market(symbol)
    request = {'market': market['id'], 'side': side, 'orderType': type}
    isStopLimit = ((type == 'stopLossLimit') or (type == 'takeProfitLimit'))
    isStopMarket = ((type == 'stopLoss') or (type == 'takeProfit'))
    if (type == 'market'):
        cost = None
        if (price is not None):
            cost = (amount * price)
        else:
            cost = self.safe_number_2(params, 'cost', 'amountQuote')
        if (cost is not None):
            precision = market['precision']['price']
            request['amountQuote'] = self.decimal_to_precision(cost, TRUNCATE, precision, self.precisionMode)
        else:
            request['amount'] = self.amount_to_precision(symbol, amount)
        params = self.omit(params, ['cost', 'amountQuote'])
    elif (type == 'limit'):
        request['price'] = self.price_to_precision(symbol, price)
        request['amount'] = self.amount_to_precision(symbol, amount)
    elif (isStopMarket or isStopLimit):
        stopPrice = self.safe_number_2(params, 'stopPrice', 'triggerAmount')
        if (stopPrice is None):
            if isStopLimit:
                raise ArgumentsRequired((((self.id + ' createOrder() requires a stopPrice parameter for a ') + type) + ' order'))
            elif isStopMarket:
                if (price is None):
                    raise ArgumentsRequired((((self.id + ' createOrder() requires a price argument or a stopPrice parameter for a ') + type) + ' order'))
                else:
                    stopPrice = price
        if isStopLimit:
            request['price'] = self.price_to_precision(symbol, price)
        params = self.omit(params, ['stopPrice', 'triggerAmount'])
        request['triggerAmount'] = self.price_to_precision(symbol, stopPrice)
        request['triggerType'] = 'price'
        request['amount'] = self.amount_to_precision(symbol, amount)
    response = (await self.privatePostOrder(self.extend(request, params)))
    return self.parse_order(response, market)
create a trade order
:param str symbol: unified symbol of the market to create an order in
:param str type: 'market' or 'limit'
:param str side: 'buy' or 'sell'
:param float amount: how much of currency you want to trade in units of base currency
:param float price: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
:param dict params: extra parameters specific to the bitvavo api endpoint
:returns dict: an `order structure <https://docs.ccxt.com/en/latest/manual.html#order-structure>`
async def create_order(self, symbol, type, side, amount, price=None, params={}):
    "\n        create a trade order\n        :param str symbol: unified symbol of the market to create an order in\n        :param str type: 'market' or 'limit'\n        :param str side: 'buy' or 'sell'\n        :param float amount: how much of currency you want to trade in units of base currency\n        :param float price: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders\n        :param dict params: extra parameters specific to the bitvavo api endpoint\n        :returns dict: an `order structure <https://docs.ccxt.com/en/latest/manual.html#order-structure>`\n        "
    (await self.load_markets())
    market = self.market(symbol)
    request = {'market': market['id'], 'side': side, 'orderType': type}
    isStopLimit = ((type == 'stopLossLimit') or (type == 'takeProfitLimit'))
    isStopMarket = ((type == 'stopLoss') or (type == 'takeProfit'))
    if (type == 'market'):
        cost = None
        if (price is not None):
            cost = (amount * price)
        else:
            cost = self.safe_number_2(params, 'cost', 'amountQuote')
        if (cost is not None):
            precision = market['precision']['price']
            request['amountQuote'] = self.decimal_to_precision(cost, TRUNCATE, precision, self.precisionMode)
        else:
            request['amount'] = self.amount_to_precision(symbol, amount)
        params = self.omit(params, ['cost', 'amountQuote'])
    elif (type == 'limit'):
        request['price'] = self.price_to_precision(symbol, price)
        request['amount'] = self.amount_to_precision(symbol, amount)
    elif (isStopMarket or isStopLimit):
        stopPrice = self.safe_number_2(params, 'stopPrice', 'triggerAmount')
        if (stopPrice is None):
            if isStopLimit:
                raise ArgumentsRequired((((self.id + ' createOrder() requires a stopPrice parameter for a ') + type) + ' order'))
            elif isStopMarket:
                if (price is None):
                    raise ArgumentsRequired((((self.id + ' createOrder() requires a price argument or a stopPrice parameter for a ') + type) + ' order'))
                else:
                    stopPrice = price
        if isStopLimit:
            request['price'] = self.price_to_precision(symbol, price)
        params = self.omit(params, ['stopPrice', 'triggerAmount'])
        request['triggerAmount'] = self.price_to_precision(symbol, stopPrice)
        request['triggerType'] = 'price'
        request['amount'] = self.amount_to_precision(symbol, amount)
    response = (await self.privatePostOrder(self.extend(request, params)))
    return self.parse_order(response, market)