#include "strat.hpp" #include "bom.hpp" #include "book.hpp" #include "json.hpp" #include "secrets.hpp" #include "protocol.hpp" #include #include namespace strat { std::unordered_map orders; void deleteOrder(json::AddedMessage* m); void freeMessages(std::deque& m); void printFeed(std::deque& m); void dumbHit(std::deque& m); void initialise() { bom::initialise(); protocol::createWebSocket(); } void destroy() { bom::destroy(); for (auto& i : orders) { switch (i.second->type) { case json::FUTURE_TYPE: case json::SPREAD_TYPE: case json::CALL_TYPE: case json::PUT_TYPE: deleteOrder((json::AddedMessage*)i.second); default:; } delete i.second; } } void mainLoop() { auto bs = protocol::recoverBook(); std::cout << "ready" << std::endl; while (true) { auto messages = protocol::catchUp(bs); // bom::updateBom(bs); // printFeed(messages); dumbHit(messages); freeMessages(messages); } } void deleteOrder(json::AddedMessage* m) { json::DeleteMessage a(json::DELETE, m->product, m->id); delete protocol::deleteOrder(a); } void printFeed(std::deque& m) { for (auto& i : m) { switch (i->type) { case json::FUTURE_TYPE: case json::SPREAD_TYPE: case json::CALL_TYPE: case json::PUT_TYPE: std::cout << ((json::AnnounceMessage*)i)->as_string() << std::endl; break; case json::SETTLEMENT: std::cout << ((json::SettleMessage*)i)->as_string() << std::endl; break; case json::ADDED: std::cout << ((json::AddedMessage*)i)->as_string() << std::endl; break; case json::DELETED: std::cout << ((json::DeletedMessage*)i)->as_string() << std::endl; break; case json::TRADE: std::cout << ((json::TradeMessage*)i)->as_string() << std::endl; break; case json::BROKER_REQUEST: std::cout << ((json::BrokerRequest*)i)->as_string() << std::endl; break; case json::BROKER_ACK: std::cout << ((json::BrokerAck*)i)->as_string() << std::endl; break; case json::BROKER_CONFIRM: std::cout << ((json::BrokerConfirm*)i)->as_string() << std::endl; break; default:; } } } void freeMessages(std::deque& m) { for (auto i : m) { delete i; } } void dumbHit(std::deque& m) { for (auto& i : m) { if (i->type == json::ADDED) { json::AddedMessage* j = (json::AddedMessage*)i; if (j->owner == "nseow" || j->owner == "jgrunbau" || j->owner == "zoar" || j->owner == "aobrien") { book::OrderSideEnum s = j->side == book::Buy ? book::Sell : book::Buy; json::AddMessage a(json::ADD, j->product, j->price, s, j->resting); auto b = protocol::addOrder(a); if (b->type == json::ADDED && ((json::AddedMessage*)b)->resting > 0) { json::DeleteMessage d(json::DELETE, j->product, ((json::AddedMessage*)b)->id); delete protocol::deleteOrder(d); } if (b->type == json::ADDED) { std::cout << "Hit " << j->owner << " for " << ((json::AddedMessage*)b)->filled << ", resting " << ((json::AddedMessage*)b)->resting << std::endl; } delete b; } } } } } // namespace strat