我们来梳理一下空单成交条件。
空单成交的第一条件是“低于喂价的实盘BitCNY卖单都已被吃光”。
此时说明市场对BitCNY有很强的需求,因此BitCNY的卖空单可以成交了。
达到第一条件后,首先成交的空单是那些没有设定限价的以及设定的限价低于当前喂价的空单,这些空单全部会以当前喂价挂单并成交。这些空单的成交优先顺序是以设定的利率为依据的,利率高的优先成交,而与设定的成交限价无关。
如果上述的这些空单被吃光,那么高于喂价的BitCNY实盘卖单和卖空单(都是成交限价大于喂价的空单)会陆续成交。对同一价位的卖空单,仍然是利率高的优先成交。
对于成交规则我又看了一遍代码,发现之前我的理解竟然是错的,可能是后面的某次升级修改规则了。
log 的理解好像也不准确,相关代码如下
bool market_engine::get_next_bid()
{ try {
if( _current_bid && _current_bid->get_quantity().amount > 0 )
return _current_bid.valid();
++_orders_filled;
_current_bid.reset();
if( _bid_itr.valid() )
{
auto bid = market_order( bid_order, _bid_itr.key(), _bid_itr.value() );
if( bid.get_price().quote_asset_id == _quote_id &&
bid.get_price().base_asset_id == _base_id )
{
if( _feed_price.valid() && bid.get_price() < *_feed_price && get_next_short() )
return _current_bid.valid();
_current_bid = bid;
--_bid_itr;
return _current_bid.valid();
}
}
如果当前实盘卖1价低于 feed price,short 肯定没机会成交。
如果低于 feed price 的实盘卖单已经没有了,那么就开始检查卖空单,优先级以设定的利率从高到低排序,
相关代码为:
// Always execute shorts at the feed price
mtrx.bid_price = *_feed_price;
// Skip shorts that are over the price limit.
if( _current_bid->state.short_price_limit.valid() )
{
if( *_current_bid->state.short_price_limit < mtrx.ask_price )
{
_current_bid.reset(); continue;
}
mtrx.bid_price = std::min( *_current_bid->state.short_price_limit, mtrx.bid_price );
}
}
具体成交规则如下:
1. 卖空单有设定最低限价,取它和 feed price中较大的一个作为卖空价。
2. 卖空价如果低于买一价则成交,否则取下一个卖空单继续检查。
当所有卖空单都检查完毕之后,才开始检查剩下的实盘卖单是否能成交。对这一点我表示很不理解。