arrival shaping up
This commit is contained in:
1 parent
b8851f36bb
commit
c1efbc00a5
11 files changed
+49
-32
No files matched your search
Vendored
+2
-1
@@ -44,7 +44,8 @@
|
||||
"debuggerPath": "/usr/bin/gdb"
|
||||
},
|
||||
"sourceFileMap": {
|
||||
"/home/bts/spark/": "${workspaceRoot}"
|
||||
"/home/bts/spark/": "${workspaceRoot}",
|
||||
"/home/bts/spark_host/": "${workspaceRoot}",
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/orderman/orders/algo/AlgoWrapperOrder.h"
|
||||
|
||||
#include "lib/api/public/ServiceContext.h"
|
||||
#include "lib/orderman/orders/algo/ChildTemplate.h"
|
||||
#include "lib/orderman/actors/order_manager/ChildOrder.h"
|
||||
#include "lib/orderman/actors/order_manager/OrderBuilder.h"
|
||||
#include "lib/orderman/actors/order_manager/OrderServices.h"
|
||||
#include "lib/api/public/ServiceContext.h"
|
||||
#include "lib/orderman/orderman_utils/orderman_utils.h"
|
||||
#include "lib/orderman/orders/PreActivationOrderServices.h"
|
||||
#include "lib/orderman/orders/algo/IAlgoOrder.h"
|
||||
@@ -355,7 +355,7 @@ orderman::OrderOpResult AlgoWrapperOrder::on_cancel() {
|
||||
return {};
|
||||
}
|
||||
|
||||
const bts::api::ServiceContext& AlgoWrapperOrder::get_shared_service_context() const {
|
||||
bts::api::ServiceContext& AlgoWrapperOrder::get_shared_service_context() {
|
||||
static bts::api::ServiceContext context;
|
||||
return context;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ class AlgoWrapperOrder : public Order,
|
||||
void complete() override;
|
||||
void update_fill_state(Quantity total_fills, Price last_price) override;
|
||||
void set_ladder_visibility (bool is_visibile) override;
|
||||
const bts::api::ServiceContext& get_shared_service_context() const override;
|
||||
bts::api::ServiceContext& get_shared_service_context() override;
|
||||
|
||||
// Private
|
||||
struct ReportStateGuard;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#include "lib/orderman/orders/algo/IBeforeLaunchAlgoServices.h"
|
||||
|
||||
namespace bts {
|
||||
namespace api { class ServiceContext; }
|
||||
namespace orderman {
|
||||
|
||||
class IAlgoServices : public IBeforeLaunchAlgoServices {
|
||||
@@ -105,7 +104,6 @@ class IAlgoServices : public IBeforeLaunchAlgoServices {
|
||||
|
||||
// Update this algos's filled quantity and last price
|
||||
virtual void update_fill_state(Quantity total_fills, Price last_price) = 0;
|
||||
virtual const api::ServiceContext& get_shared_service_context() const = 0;
|
||||
};
|
||||
|
||||
} // namespace orderman
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "lib/utils/bts_chrono.h"
|
||||
|
||||
namespace bts {
|
||||
namespace api { class ServiceContext; }
|
||||
namespace orderman {
|
||||
|
||||
class ChildTemplate;
|
||||
@@ -47,6 +48,8 @@ class IBeforeLaunchAlgoServices {
|
||||
|
||||
// Get the current time
|
||||
virtual TimeStamp get_time() const;
|
||||
|
||||
virtual api::ServiceContext& get_shared_service_context() = 0;
|
||||
};
|
||||
|
||||
} // namespace orderman
|
||||
|
||||
@@ -37,16 +37,6 @@ void ArrivalPriceAlgo::on_book(SecurityKey k, const Book& b)
|
||||
ArrivalPriceAlgo::ArrivalPriceAlgo() : me(new PImpl()) {}
|
||||
ArrivalPriceAlgo::~ArrivalPriceAlgo() {}
|
||||
|
||||
void ArrivalPriceAlgo::on_timer()
|
||||
{
|
||||
if(this->trading_distribution)
|
||||
{
|
||||
TimeSlicer::on_timer();
|
||||
}
|
||||
else
|
||||
LOG(OrderMan, Info, "ArrivalPriceAlgo order {} waiting for TradingDistribution: ", algo().order_key().value());
|
||||
}
|
||||
|
||||
OrderOpResult ArrivalPriceAlgo::do_before_launch(IBeforeLaunchAlgoServices &serv)
|
||||
{
|
||||
const auto& def = serv.definition();
|
||||
@@ -71,9 +61,11 @@ OrderOpResult ArrivalPriceAlgo::do_before_launch(IBeforeLaunchAlgoServices &serv
|
||||
google::protobuf::Timestamp begin;
|
||||
begin.set_seconds(end.seconds() - 86400*days);
|
||||
|
||||
google::protobuf::util::TimeUtil::FromString("11/25/2019", &begin);
|
||||
google::protobuf::util::TimeUtil::FromString("11/29/2019", &end);
|
||||
query_trading_distribution(symbol, sectype, desc, begin, end, algo.duration().interval_in_seconds());
|
||||
//TODO
|
||||
bool b = google::protobuf::util::TimeUtil::FromString("2019-11-25T00:00:00.00Z", &begin);
|
||||
b = google::protobuf::util::TimeUtil::FromString("2019-11-29T00:00:00.00Z", &end);
|
||||
b = b && b;
|
||||
query_trading_distribution(serv, symbol, sectype, desc, begin, end, algo.duration().interval_in_seconds());
|
||||
|
||||
if (!serv.is_attaching())
|
||||
{
|
||||
|
||||
@@ -14,7 +14,6 @@ public:
|
||||
OrderOpResult do_before_launch(IBeforeLaunchAlgoServices&) override;
|
||||
void do_update(const api::orderman::Update& update) override;
|
||||
void on_book(SecurityKey, const Book&) override;
|
||||
void on_timer() override;
|
||||
|
||||
protected:
|
||||
void update_params() override;
|
||||
|
||||
@@ -52,13 +52,15 @@ struct Slicer::PImpl
|
||||
|
||||
VolumeEstimator volume_estimator;
|
||||
PriceEstimator price_estimator;
|
||||
|
||||
TradingDistributionStatus trading_distribution_status = TradingDistributionStatus::NotRequired;
|
||||
};
|
||||
|
||||
void Slicer::query_trading_distribution(const std::string& symbol, api::SecurityType sectype, const std::string& secdesc,
|
||||
void Slicer::query_trading_distribution(IBeforeLaunchAlgoServices& serv, const std::string& symbol, api::SecurityType sectype, const std::string& secdesc,
|
||||
const google::protobuf::Timestamp& begin, const google::protobuf::Timestamp& end,
|
||||
uint dt_seconds)
|
||||
{
|
||||
const api::ServiceContext& sc = me->algo->get_shared_service_context();
|
||||
api::ServiceContext sc = serv.get_shared_service_context();
|
||||
static HistoricalDataService hist = sc.locate<HistoricalDataService>();
|
||||
TradingDistributionQuery query;
|
||||
query.set_symbol(symbol);
|
||||
@@ -67,13 +69,35 @@ void Slicer::query_trading_distribution(const std::string& symbol, api::Security
|
||||
query.mutable_begin()->CopyFrom(begin);
|
||||
query.mutable_end()->CopyFrom(end);
|
||||
query.mutable_d_t()->set_seconds(dt_seconds);
|
||||
me->trading_distribution_status = TradingDistributionStatus::Waiting;
|
||||
hist.get_trading_distribution(query, [this, query] (api::Result<TradingDistribution> res)
|
||||
{
|
||||
auto copy = new TradingDistribution(*res.value());
|
||||
this->trading_distribution.reset(copy);
|
||||
if(res.success())
|
||||
{
|
||||
auto* copy = new TradingDistribution(*res.value());
|
||||
this->trading_distribution.reset(copy);
|
||||
me->trading_distribution_status = TradingDistributionStatus::Received;
|
||||
}
|
||||
else
|
||||
me->trading_distribution_status = TradingDistributionStatus::Error;
|
||||
});
|
||||
}
|
||||
|
||||
void Slicer::on_timer()
|
||||
{
|
||||
if(me->trading_distribution_status == TradingDistributionStatus::Error)
|
||||
{
|
||||
algo().terminate_error("Can't get Trading Distribution");
|
||||
}
|
||||
else if(me->trading_distribution_status == TradingDistributionStatus::Received)
|
||||
{
|
||||
volume_estimator().update_distribution(*this->trading_distribution);
|
||||
price_estimator().update_distribution(*this->trading_distribution);
|
||||
update_params();
|
||||
me->trading_distribution_status = TradingDistributionStatus::Initialized;
|
||||
}
|
||||
}
|
||||
|
||||
OrderAggression& Slicer::aggression()
|
||||
{
|
||||
return me->aggression;
|
||||
@@ -311,7 +335,7 @@ OrderKey Slicer::send_child(Price price, Quantity size, Channel chan)
|
||||
OrderKey child_key = null_order_key();
|
||||
if(validate_price_size(price, size))
|
||||
{
|
||||
if(aggression().quantity_variance() > 0)
|
||||
if(aggression().quantity_variance() > 0 && chan != Channel::Market)
|
||||
{
|
||||
//this isn't really variance, but take a look at std::normal_distribution....it's kinda unusable and probably slow
|
||||
uint32_t var = (rand() % 2*aggression().quantity_variance()) - aggression().quantity_variance();
|
||||
@@ -321,7 +345,7 @@ OrderKey Slicer::send_child(Price price, Quantity size, Channel chan)
|
||||
if(!validate_price_size(price, size))
|
||||
return child_key;
|
||||
}
|
||||
if(aggression().max_participation_pct() > 0)
|
||||
if(aggression().max_participation_pct() > 0 && chan != Channel::Market)
|
||||
{
|
||||
auto side = algo().definition().side();
|
||||
auto sz = me->last_book.side( side )[0].size();
|
||||
@@ -417,8 +441,6 @@ void Slicer::on_ticker(SecurityKey k, const TradeVector& vec)
|
||||
LOG(OrderMan, Diag, "Slicer order {} on ticker.", algo().order_key().value());
|
||||
}
|
||||
|
||||
void Slicer::on_timer() {}
|
||||
|
||||
void Slicer::first_generation()
|
||||
{
|
||||
bts_assert_msg(me->generation == 0, "generation 0");
|
||||
|
||||
@@ -33,6 +33,7 @@ public:
|
||||
protected:
|
||||
enum class Status { WAITING_FOR_MD, WAITING_FOR_START, WORKING, DONE };
|
||||
enum class Channel { Tactical, Aggressive, Market };
|
||||
enum class TradingDistributionStatus { NotRequired, Waiting, Error, Received, Initialized};
|
||||
|
||||
IAlgoServices& algo() const;
|
||||
void report_status();
|
||||
@@ -61,7 +62,7 @@ protected:
|
||||
struct PImpl;
|
||||
friend struct OrderDef;
|
||||
std::unique_ptr<PImpl> me;
|
||||
std::unique_ptr<bts::history::TradingDistribution> trading_distribution;
|
||||
std::unique_ptr<bts::history::TradingDistribution> trading_distribution;
|
||||
|
||||
protected:
|
||||
void check_i_would(const Book&);
|
||||
@@ -82,8 +83,9 @@ protected:
|
||||
TradeVector& last_trades();
|
||||
VolumeEstimator& volume_estimator();
|
||||
PriceEstimator& price_estimator();
|
||||
bool trading_distribution_error();
|
||||
|
||||
void query_trading_distribution(const std::string& symbol, api::SecurityType sectype, const std::string& secdesc,
|
||||
void query_trading_distribution(IBeforeLaunchAlgoServices&, const std::string& symbol, api::SecurityType sectype, const std::string& secdesc,
|
||||
const google::protobuf::Timestamp& begin, const google::protobuf::Timestamp& end,
|
||||
uint dt_seconds);
|
||||
|
||||
|
||||
@@ -505,7 +505,7 @@ void AlgoTestDriverBase::complete() {
|
||||
me->state = AlgoState::COMPLETED;
|
||||
}
|
||||
void AlgoTestDriverBase::set_ladder_visibility(bool) { /* whatever, ok */ }
|
||||
const api::ServiceContext& AlgoTestDriverBase::get_shared_service_context() const
|
||||
api::ServiceContext& AlgoTestDriverBase::get_shared_service_context()
|
||||
{
|
||||
bts_assert(false);
|
||||
static api::ServiceContext context;
|
||||
|
||||
@@ -146,7 +146,7 @@ private:
|
||||
void complete() override;
|
||||
void set_ladder_visibility(bool) override;
|
||||
void update_fill_state(Quantity , Price) override;
|
||||
const api::ServiceContext& get_shared_service_context() const override;
|
||||
api::ServiceContext& get_shared_service_context() override;
|
||||
|
||||
};
|
||||
|
||||
|
||||
Reference in new issue
Block a user