# pure market making
## Every tick
```
proposal = None
if self._create_timestamp <= self._current_timestamp:
# 1. Create base order proposals
proposal = self.c_create_base_proposal()
# 2. Apply functions that limit numbers of buys and sells proposal
self.c_apply_order_levels_modifiers(proposal)
# 3. Apply functions that modify orders price
self.c_apply_order_price_modifiers(proposal)
# 4. Apply functions that modify orders size
self.c_apply_order_size_modifiers(proposal)
# 5. Apply budget constraint, i.e. can't buy/sell more than what you have.
self.c_apply_budget_constraint(proposal)
if not self._take_if_crossed:
self.c_filter_out_takers(proposal)
self.c_cancel_active_orders_on_max_age_limit()
self.c_cancel_active_orders(proposal)
self.c_cancel_orders_below_min_spread()
if self.c_to_create_orders(proposal):
self.c_execute_orders_proposal(proposal)
```
### c_create_base_proposal
(不考慮 order_override / inventory_cost_price_delegate)
1. 根據 `get_price()` 取出的價格
2. buy_price = buy_reference_price * (Decimal("1") - self._bid_spread - (level * self._order_level_spread))
3. buy_size = self._order_amount + (self._order_level_amount * level)
4. sell 端同理
Note:
* c_quantize_order_amount: 讓 amount fit 交易所的最小單元
* c_quantize_order_price: 讓 price fit 交易所的最小單元
* inventory_cost_price_delegate: 從 db 取得 inventory price
* price = record.quote_volume / record.base_volume
### c_apply_order_levels_modifiers
1. _price_ceiling / _price_floor 調整上下限
2. _ping_pong_enabled -> 刪除已經 filled 的單 i.e 只放沒成交的那邊
### c_apply_order_price_modifiers
#### _order_optimization_enabled -> c_apply_order_optimization
根據目前最好的 bid / ask 調整 price (向前一格)
相關參數
* _bid_order_optimization_depth: 要跨越多少的 volume 後的價格
* ex 1000,代表要跨越累進 1000U 的 order
```
price_above_bid = (ceil(top_bid_price / price_quantum) + 1) * price_quantum
lower_buy_price = min(proposal.buys[0].price, price_above_bid)
for i, proposed in enumerate(proposal.buys):
proposal.buys[i].price = market.c_quantize_order_price(self.trading_pair, lower_buy_price) * (1 - self.order_level_spread * i)
```
#### _add_transaction_costs_to_orders -> c_apply_add_transaction_costs
```
fee = market.c_get_fee(self.base_asset, self.quote_asset,
self._limit_order_type, TradeType.BUY, buy.size, buy.price)
price = buy.price * (Decimal(1) - fee.percent)
```
### c_apply_order_size_modifiers
#### _inventory_skew_enabled -> c_apply_inventory_skew
根據庫存調整 order amount,讓庫存不要太快用完
### c_apply_budget_constraint
根據剩餘 budget 調整 order,當剩餘 budget 不夠的時候要砍掉多餘的單
### !_take_if_crossed -> c_filter_out_takers
!_take_if_crossed,將超過上下限的 order 砍掉
```
c_get_price: :returns: Top bid/ask price for a specific trading pair
proposal.buys = [buy for buy in proposal.buys if buy.price < top_ask]
proposal.sells = [sell for sell in proposal.sells if sell.price > top_bid]
```
### filled_order_delay
Event trigger, if order filled, it will triger `c_did_complete_sell_order`, in which:
```
# delay order creation by filled_order_dalay (in seconds)
self._create_timestamp = self._current_timestamp + self._filled_order_delay
self._cancel_timestamp = min(self._cancel_timestamp, self._create_timestamp)
```
## Market Event Interfaces
The `StrategyBase` class comes with a set of interface functions for handling market events from associated `MarketBase` objects, which may be overridded by child classes to receive and process market events.
## The event interface functions are as follows:
- `cdef c_did_create_buy_order(self, object order_created_event)`
A buy order has been created. Argument is a [`BuyOrderCreatedEvent`](https://github.com/CoinAlpha/hummingbot/blob/master/hummingbot/core/event/events.py) object.
- `cdef c_did_create_sell_order(self, object order_created_event)`
A sell order has been created. Argument is a [`SellOrderCreatedEvent`](https://github.com/CoinAlpha/hummingbot/blob/master/hummingbot/core/event/events.py) object.
- `cdef c_did_fill_order(self, object order_filled_event)`
An order has been filled in the market. Argument is a [`OrderFilledEvent`](https://github.com/CoinAlpha/hummingbot/blob/master/hummingbot/core/event/events.py) object.
- `cdef c_did_fail_order(self, object order_failed_event)`
An order has failed in the market. Argument is a [`MarketOrderFailureEvent`](https://github.com/CoinAlpha/hummingbot/blob/master/hummingbot/core/event/events.py) object.
- `cdef c_did_cancel_order(self, object cancelled_event)`
An order has been cancelled. Argument is a [`OrderCancelledEvent`](https://github.com/CoinAlpha/hummingbot/blob/master/hummingbot/core/event/events.py) object.
- `cdef c_did_expire_order(self, object expired_event)`
An order has expired. Argument is a [`OrderExpiredEvent`](https://github.com/CoinAlpha/hummingbot/blob/master/hummingbot/core/event/events.py) object.
- `cdef c_did_complete_buy_order(self, object order_completed_event)`
A buy order has been completely filled. Argument is a [`BuyOrderCompletedEvent`](https://github.com/CoinAlpha/hummingbot/blob/master/hummingbot/core/event/events.py) object.
- `cdef c_did_complete_sell_order(self, object order_completed_event)`
A sell order has been completely filled. Argument is a [`SellOrderCompletedEvent`](https://github.com/CoinAlpha/hummingbot/blob/master/hummingbot/core/event/events.py) object.