29 namespace graphene {
namespace grouped_orders {
57 virtual void object_inserted(
const object& obj )
override;
58 virtual void object_removed(
const object& obj )
override;
59 virtual void about_to_modify(
const object& before )
override;
60 virtual void object_modified(
const object& after )
override;
75 map< limit_order_group_key, limit_order_group_data > _og_data;
84 for( uint16_t group : get_tracked_groups() )
86 auto create_ogo = [&]() {
101 bool capped_max =
false;
102 bool capped_min =
false;
115 bool check_previous =
false;
116 if( itr == idx.end() || itr->first.group != group
120 check_previous =
true;
123 bool update_max =
false;
124 if( capped_price > itr->second.max_price )
129 if( capped_price > max_price )
130 check_previous =
true;
132 if( !check_previous )
134 if( capped_min && o.
sell_price < itr->first.min_price )
143 if( update_max || ( capped_max && o.
sell_price > itr->second.max_price ) )
145 itr->second.total_for_sale += o.
for_sale;
152 if( itr == idx.begin() )
168 if( capped_price < min_price )
170 else if( capped_max && o.
sell_price >= itr->first.min_price )
174 itr->second.total_for_sale += o.
for_sale;
198 remove_order( o,
false );
203 object_inserted( objct );
206 void limit_order_group_index::remove_order(
const limit_order_object& o,
bool remove_empty )
208 auto& idx = _og_data;
210 for( uint16_t group : get_tracked_groups() )
214 if( itr == idx.end() || itr->first.group != group
220 wlog(
"can not find the order group containing order for removing (price dismatch): ${o}", (
"o",o) );
225 if( itr->second.total_for_sale < o.
for_sale )
227 wlog(
"can not find the order group containing order for removing (amount dismatch): ${o}", (
"o",o) );
228 else if( !remove_empty || itr->second.total_for_sale > o.
for_sale )
229 itr->second.total_for_sale -= o.
for_sale;
251 return "grouped_orders";
255 boost::program_options::options_description& cli,
256 boost::program_options::options_description& cfg
260 (
"tracked-groups", boost::program_options::value<string>()->default_value(
"[10,100]"),
261 "Group orders by percentage increase on price. Specify a JSON array of numbers here, each number is a group, number 1 means 0.01%. ")
269 if( options.count(
"tracked-groups" ) > 0 )
271 const std::string& groups = options[
"tracked-groups"].as<
string>();
273 my->_tracked_groups.erase( 0 );
290 return my->_tracked_groups;
298 return logidx.get_order_groups();
virtual void object_removed(const object &obj) override
Wraps a derived index to intercept calls to create, modify, and remove so that callbacks may be fired...
SecondaryIndexType * add_secondary_index(Args... args)
This secondary index is used to track changes on limit order objects.
boost::rational< int32_t > ratio_type
tracks the blockchain state in an extensible manner
const IndexType & get_index_type() const
static price max(asset_id_type base, asset_id_type quote)
grouped_orders_plugin_impl(grouped_orders_plugin &_plugin)
virtual void object_modified(const object &after) override
share_type for_sale
asset id is sell_price.base.asset_id
grouped_orders_plugin & _self
~grouped_orders_plugin() override
static price min(asset_id_type base, asset_id_type quote)
graphene::chain::database & database()
chain::database & database()
The price struct stores asset prices in the BitShares system.
#define GRAPHENE_100_PERCENT
#define FC_CAPTURE_AND_RETHROW(...)
limit_order_group_index(const flat_set< uint16_t > &groups)
T as(uint32_t max_depth) const
virtual void object_inserted(const object &obj) override
void plugin_startup() override
Begin normal runtime operations.
grouped_orders_plugin(graphene::app::application &app)
virtual void about_to_modify(const object &before) override
const map< limit_order_group_key, limit_order_group_data > & get_order_groups() const
static variant from_string(const string &utf8_str, parse_type ptype=legacy_parser, uint32_t max_depth=DEFAULT_MAX_RECURSION_DEPTH)
flat_set< uint16_t > _tracked_groups
const flat_set< uint16_t > & get_tracked_groups() const
const flat_set< uint16_t > & tracked_groups() const
void plugin_initialize(const boost::program_options::variables_map &options) override
Perform early startup routines and register plugin indexes, callbacks, etc.
const map< limit_order_group_key, limit_order_group_data > & limit_order_groups()
void plugin_set_program_options(boost::program_options::options_description &cli, boost::program_options::options_description &cfg) override
Fill in command line parameters used by the plugin.
std::string plugin_name() const override
Get the name of the plugin.
an offer to sell an amount of an asset at a specified exchange rate by a certain timeThe objects are ...