Nanoconda API - Code Reference C++ Program
nanoconda.h cointains all necessary and available methods and classes to use Nanoconda API for coding.
nanoconda API
namespace nanoconda
{
enum reasoncode : unsigned short
{
SUCCESS = 0,
ERROR = 10,
SYSTEM_ERROR = 12,
API_VERSION_ERROR = 15,
ENTITLEMENT_EMPTY = 1002,
MARKET_NOT_FOUND = 1004,
USER_NOT_ENTITLED = 1006,
SYMBOL_EMPTY = 1010,
SYMBOL_NOT_FOUND = 1012,
SYMBOL_NOT_SUBSCRIBED = 1013,
ORDER_TYPE_NOT_SET = 1022,
ORDER_SIDE_EMPTY = 1032,
CPU_OUT_OF_BOUNDS = 1111,
QUANTITY_EMPTY = 1020,
PRICE_BAND_BREACHED = 1025,
TICK_SIZE_ERROR = 1028,
ORDER_IS_NULL=1015,
ORDERID_EMPTY = 1030,
ORDER_NOT_FOUND = 1035,
ORDER_NOT_LIVE = 1036,
ORDER_IN_FLIGHT = 1044,
ORDER_QTY_LOW = 1047,
ORDER_WRONG_SIDE = 1048,
ACCOUNTNAME_EMPTY = 1052,
DUPLICATE_REQUEST_SESSION = 1055,
USERNAME_EMPTY = 1060,
PASSWORD_EMPTY = 1070,
LISTENER_NOT_PROVIDED = 1090,
RISK_LIMIT_EXCEEDED = 1220,
RISK_CLIP_SIZE_EXCEEDED = 1230,
RISK_MAX_LOSS_EXCEEDED = 1250,
RISK_DAILY_LOTS_EXCEEDED = 1270,
RISK_CAPITAL_USE_EXCEEDED = 1275,
FLATTEN_INCOMPLETE_RETRY = 1280,
PERMISSION_ERROR = 2070,
SESSION_IN_USE = 2075,
ALGO_BLOCKED = 2080,
SESSION_DOWN = 2099,
SESSION_UP = 4000,
SECURITY_DELETED = 9012,
RISK_NOT_SET = 9212,
REQUEST_LIMIT = 9370,
};
enum orderType : char
{
EMPTY = '0',
MKT = 'M',
LMT = 'L',
STP = 'S',
SLMT = 'T',
FAK = 'K',
WARM = 'W',
};
enum orderStatus : unsigned short
{
INVALID = 0,
Q_NEW = 10,
Q_CANCEL = 20,
Q_MODIFY = 30,
Q_CANCEL_ALL = 90,
Q_FLATTEN= 99,
PENDING_ACK = 15,
PENDING_CANCEL_ACK = 25,
PENDING_MODIFY_ACK = 35,
R_ACK = 110,
R_CANCEL_ACK = 120,
R_MODIFY = 130,
R_ORDER_REJECT = 210,
R_CANCEL_REJECT = 220,
R_MODIFY_REJECT = 230,
R_EXECUTED = 300,
R_EXECUTED_SPREAD = 302,
R_EXECUTED_SPREAD_LEG = 304,
R_EXECUTED_PARTIAL = 315,
R_EXECUTED_PARTIAL_SPREAD = 317,
R_EXECUTED_PARTIAL_SPREAD_LEG = 319,
R_EXECUTION_CORRECTED = 330,
R_EXECUTION_CORRECTED_SPREAD = 332,
R_EXECUTION_CORRECTED_SPREAD_LEG = 334,
R_EXECUTION_CANCELED = 390,
R_EXECUTION_CANCELED_SPREAD = 392,
R_EXECUTION_CANCELED_SPREAD_LEG = 394,
R_OUT = 510
};
enum securityStatus : unsigned short
{
HALT = 0,
CLOSE = 200,
POST_CLOSE = 220,
PRE_OPEN = 120,
OPEN = 100
};
enum securityType : unsigned char
{
TP_INVALID=0,
TP_FUTURE=1,
TP_OPTION=2,
TP_SPREAD=3
};
struct leginfo
{
unsigned long long symbolId;
unsigned char ratio;
char side;
unsigned short reservedUS;
unsigned int multiplier;
};
struct securitylegs
{
enum : unsigned short { MAX_SPREAD_LEGS = 48 };
unsigned int legCount;
unsigned int reserved;
leginfo legs[MAX_SPREAD_LEGS];
};
struct security
{
char symbol[24];
char reservedC1[8];
unsigned long long symbolId;
unsigned long long exchangeSecurityId;
unsigned long long tickSize;
unsigned long long multiplier;
unsigned long long underlyingId;
long long lowLimitBand;
long long highLimitBand;
securityStatus status;
char entCode[6];
char highPrecisionPrice;
unsigned char segmentId;
securityType type;
unsigned char legs;
char reserved[4];
long long settlementPrice;
int openInterest;
int clearedVolume;
long long reservedL2;
static inline unsigned short size()
{
return 128;
}
};
struct pricelevel
{
long long price;
unsigned int qty;
unsigned int orders;
static inline unsigned short size()
{
return 16;
}
};
struct book
{
unsigned long long symbolId;
unsigned long long exchangetime;
unsigned long long receivetime;
unsigned long long symbolseqno;
unsigned long long writetime;
unsigned long long writeseqno;
unsigned long long transactiontime;
unsigned char lastEvent;
char reserved[7];
pricelevel buys[10];
pricelevel sells[10];
pricelevel buysImplied[2];
pricelevel sellsImplied[2];
unsigned long long reservedLL1;
unsigned long long reservedLL2;
static inline unsigned short size()
{
return 416;
}
};
struct error
{
unsigned long long timestamp;
reasoncode internalCode;
unsigned short quantity;
orderStatus requestType;
char side;
char reservedC;
unsigned long long exchangeCode;
unsigned long long symbolId;
unsigned long long price;
unsigned short quantityInFlight;
unsigned short quantityLive;
unsigned short reservedUS1;
unsigned short reservedUs2;
unsigned long long orderId;
unsigned long long reserved7;
char message[128];
static int size()
{
return 192;
}
};
struct trade
{
unsigned long long symbolId;
unsigned long long exchangetime;
unsigned long long receivetime;
unsigned long long symbolseqno;
unsigned long long writetime;
unsigned long long transactiontime;
char aggressor;
unsigned char lastEvent;
char reserved[2];
unsigned int numOrders;
long long low;
long long high;
pricelevel bestbid;
pricelevel bestask;
long long lastPrice;
long long vwap;
unsigned int lastSize;
unsigned int totalVol;
long long open;
unsigned long long reservedLL1;
unsigned long long reservedLL2;
static inline unsigned short size()
{
return 152;
}
};
struct order
{
unsigned long long symbolId;
unsigned long long transactiontime;
unsigned long long orderId;
unsigned long long exchangetime;
unsigned long long receivetime;
unsigned long long exchangeOrderId;
unsigned long long execId;
unsigned long long customId;
long long price;
long long triggerPrice;
long long priceLast;
long long balance;
unsigned int quantity;
unsigned int quantityDisplay;
unsigned int quantityLast;
unsigned int quantityFilled;
unsigned int quantityMinimum;
reasoncode code;
unsigned short orderRequestId;
orderStatus status;
unsigned short exchangeReason;
orderType type;
char side;
unsigned char userId;
unsigned char sessionIndex;
unsigned long long writetime;
unsigned long long reservedLL2;
unsigned long long reservedLL3;
unsigned long long reservedLL4;
order()
{
reset();
}
void reset();
void setSymbol(const char* str);
const char* getSymbol();
long long priceAverage();
bool isManual() const;
static inline unsigned short size()
{
return 160;
}
};
enum orderupdatetype : unsigned char
{
OU_UNKNOWN=0,
OU_ADD=1,
OU_DEL=2,
OU_UPD=3,
OU_FILL=4,
OU_ADD_SNAPSHOT=5
};
struct bookorder
{
unsigned long long symbolId;
unsigned long long orderId;
unsigned long long transactiontime;
unsigned long long exchangetime;
long long price;
unsigned int quantity;
orderupdatetype updatetype;
char side;
unsigned char lastEvent;
unsigned char aggressing;
unsigned long long receivetime;
unsigned long long writetime;
unsigned long long reservedLL1;
unsigned long long reservedLL2;
bookorder()
{
reset();
}
void reset();
static inline unsigned short size()
{
return 80;
}
};
struct securitystats
{
unsigned long long symbolId;
long long realizedPnl;
long long currentAvgPrice;
unsigned int livelotslong;
unsigned int liveorderslong;
unsigned int livelotsshort;
unsigned int liveordersshort;
int netopenpositions;
int reserved1;
unsigned int fillslong;
unsigned int fillsshort;
long long reserved2;
};
struct securityrisk
{
char symbol[12];
unsigned int maxdailylots;
long long capitalreq;
long long capitaluse;
int maxpositions;
int clipsize;
int livelots;
int liveorders;
int netopenpositions;
int fee;
int fillslong;
int fillsshort;
};
struct risk
{
enum : unsigned short { MAX_RISK_SYMBOLS = 64 };
unsigned short symbolcount;
unsigned short reserved1;
unsigned short reserved2;
unsigned short reserved3;
securityrisk risklimits[MAX_RISK_SYMBOLS];
static inline unsigned short structSize()
{
return 4104;
}
unsigned short size()
{
if(symbolcount > MAX_RISK_SYMBOLS) return structSize();
return 8 + sizeof(securityrisk)*symbolcount;
}
};
enum fieldType : unsigned char
{
NC_BLANK=0,
NC_C=1,
NC_UC=2,
NC_S=3,
NC_US=4,
NC_I=5,
NC_UI=6,
NC_P=7,
NC_STR=9,
NC_LL=10,
NC_ULL=11,
NC_F=12
};
struct customField
{
fieldType _type();
char _c();
unsigned char _uc();
short _s();
unsigned short _us();
int _i();
unsigned int _ui();
long long _p();
void _str(char* buffer);
long long _ll();
unsigned long long _ull();
float _f();
void _type(fieldType value);
void _c(char value);
void _uc(unsigned char value);
void _s(short value);
void _us(unsigned short value);
void _i(int value);
void _ui(unsigned int value);
void _p (long long value);
void _str(const char* value, int len); //max 7 bytes
void _ll(long long value);
void _ull(unsigned long long value);
void _f(float value);
char data[8];
};
enum hidemask : unsigned char
{
NC_HIDE_FROM_NONE = 0b0000,
NC_HIDE_FROM_VIEW1 = 0b0001,
NC_HIDE_FROM_VIEW2 = 0b0010,
NC_HIDE_FROM_VIEW3 = 0b0100,
NC_HIDE_FROM_VIEW4 = 0b1000,
NC_HIDE_FROM_ALL = NC_HIDE_FROM_VIEW1 | NC_HIDE_FROM_VIEW2 | NC_HIDE_FROM_VIEW3 | NC_HIDE_FROM_VIEW4,
NC_SHOW_ONLY_VIEW1 = NC_HIDE_FROM_VIEW2 | NC_HIDE_FROM_VIEW3 | NC_HIDE_FROM_VIEW4,
NC_SHOW_ONLY_VIEW2 = NC_HIDE_FROM_VIEW1 | NC_HIDE_FROM_VIEW3 | NC_HIDE_FROM_VIEW4,
NC_SHOW_ONLY_VIEW3 = NC_HIDE_FROM_VIEW1 | NC_HIDE_FROM_VIEW2 | NC_HIDE_FROM_VIEW4,
NC_SHOW_ONLY_VIEW4 = NC_HIDE_FROM_VIEW1 | NC_HIDE_FROM_VIEW2 | NC_HIDE_FROM_VIEW3
};
struct fieldDesc
{
char name[24];
char reserved[7];
hidemask hideFrom;
customField deflt;
customField min;
customField max;
customField step;
void setType(fieldType type)
{
deflt._type(type);
min._type(type);
max._type(type);
step._type(type);
}
void setHideMask(hidemask hideMask)
{
hideFrom=hideMask;
}
template <typename T> void setField(const char* name, fieldType type, T deflt, T min, T max, T step );
void setField(const char* name, fieldType type);
};
struct dataheader
{
unsigned long long algoId;
unsigned char algoIndex;
hidemask hideFrom;
unsigned char reserved2[6];
unsigned long long symbolId;
unsigned long long reserved4;
void setHideMask(hidemask hideMask)
{
hideFrom=hideMask;
}
};
struct datainput : dataheader
{
enum : unsigned short { MAX_DATA_INPUT_FIELDS = 50 };
customField fields[MAX_DATA_INPUT_FIELDS];
};
struct datarecord : dataheader
{
enum : unsigned short { MAX_DATA_RECORD_FIELDS = 20 };
customField fields[MAX_DATA_RECORD_FIELDS];
};
struct datareport
{
enum : unsigned short { MAX_RECORDS = 40 };
enum : unsigned short { MAX_HEADER_FIELDS = 20 };
unsigned short recordCount;
unsigned short reserved1;
unsigned short reserved2;
unsigned short reserved3;
customField headerFields[MAX_HEADER_FIELDS];
datarecord records[MAX_RECORDS];
};
struct algoreport : datareport { };
enum uicolor : unsigned char
{
NC_BC_HIDDEN=0,
NC_BC_BLUE=1,
NC_BC_GREEN=2,
NC_BC_CYAN=3,
NC_BC_RED=4,
NC_BC_MAGENTA=5,
NC_BC_BROWN=6,
NC_BC_GREY=7,
NC_BC_YELLOW=8,
NC_BC_ORANGE=9
};
struct actionbutton
{
char name[14];
uicolor color;
hidemask hideFrom;
void setButton(const char* name, uicolor usercolor, hidemask mask = NC_HIDE_FROM_NONE);
};
struct interfaceschema
{
enum : unsigned short { MAX_HEADER_BUTTONS = 20 };
enum : unsigned short { MAX_RECORD_BUTTONS = 20 };
unsigned char reserved[8];
actionbutton headerButtons[MAX_HEADER_BUTTONS];
actionbutton recordButtons[MAX_RECORD_BUTTONS];
fieldDesc headerFields[datareport::MAX_HEADER_FIELDS];
fieldDesc inputFields[datainput::MAX_DATA_INPUT_FIELDS];
fieldDesc recordFields[datarecord::MAX_DATA_RECORD_FIELDS];
};
//=============== API ============
struct listener
{
//Market Data Callbacks
virtual void onsecurity(const security* s)=0;
virtual void ongap(const security* s) { };
virtual void onsnapshotstart(const security* s) { };
virtual void onsnapshotend(const security* s) { };
virtual void onlive(const security* s) { };
virtual void onbook(const book* b)=0;
virtual void ontrade(const trade* b)=0;
virtual void onbookorder(const bookorder* o) { };
virtual void ontradebust(const trade* t) { };
virtual void ontradestatistics(const trade* t) { };
//Order Entry Callbacks
virtual void onorderack(const order* order)=0;
virtual void oncancelack(const order* order)=0;
virtual void onmodifyack(const order* order)=0;
virtual void onorderreject(const order* order)=0;
virtual void onmodifyreject(const order* order)=0;
virtual void oncancelreject(const order* order)=0;
virtual void onfill(const order* order)=0;
virtual void onout(const order* order)=0;
virtual void onorderstatus(const order* order)=0;
virtual void onneworder(const order* order) { };
virtual void onmodifyorder(const order* order) { };
virtual void oncancelorder(const order* order) { };
virtual void oncancelall() { };
virtual void ontracecomplete() { };
virtual void onriskerror(const error* error) { };
virtual void onsessiondown(const char* accountName) { };
virtual void onsessionup(const char* accountName) { };
virtual void onerror(const error* error) { };
virtual void onfillcorrect(const order* order) { };
virtual void onfillcancel(const order* order) { };
virtual void onlegfill(const order* order) { };
//Remote API and GUI Controls
virtual void onschemarequest(interfaceschema* schema) { };
virtual void oncontrolaction(datainput* input, int buttonId, int viewId) { };
virtual void onrecordaction(datarecord* record, int buttonId, int viewId) { };
virtual unsigned short oncustomrequest(const char* data, unsigned short size, char* responsebuffer, unsigned short responsemaxsize) { return 0; };
};
struct dmasession //used for low latency shared memory access to tradng
{
unsigned long long sessionID();
static dmasession* init(const char* accountName, reasoncode& reason, short cpu = -1);
reasoncode sessionStatus();
reasoncode newOrder(order* o);
reasoncode cancelOrder(order* o);
reasoncode modifyOrder(order* o);
reasoncode cancelAllOrders(unsigned long long symbolId = 0);
reasoncode cancelAllOrders(unsigned long long symbolId, unsigned char userId);
reasoncode flatten(unsigned long long symbolId = 0);
reasoncode flatten(unsigned long long symbolId, unsigned char userId);
enum : unsigned short { MAX_CUSTOM_REPORT_BYTES = 16376 };
reasoncode setcustomreport(void* src, unsigned short len) const;
reasoncode setdatareport(datareport* report) const;
risk* getRiskLimits();
reasoncode getRiskLimits(risk* riskreport);
long long sessionPnl();
long long accountBalance();
long long maxDrawdown();
reasoncode getSecurityStats(unsigned long long symbolId, securitystats* stats );
private:
dmasession();
void* implementation;
};
reasoncode registerApplication(const char* username, const char* password, listener* l);
reasoncode listSymbols(const char* entitlement);
reasoncode subscribe(const char* symbol, const char* entitlement, short cpu = -1);
reasoncode subscribeUnderlying(const char* symbol, const char* entitlement, short cpu = -1);
void start(const char* tracefile = "", bool traceMarketData = false, int traceCpu = - 1);
void stop();
void replayTrace(const char* tracefile = "");
double nacoPx(long long px, bool highprecision = false);
const char* getSymbolName(unsigned long long symbolId);
unsigned long long getSymbolId(const char* symbol);
security* getSecurity(unsigned long long symbolId);
reasoncode getSecurityLegs(unsigned long long symbolId, securitylegs* securitylegsstorage);
unsigned long long getEpoch_ns();
struct logger
{
enum loglevel : unsigned short
{
LV_CRITICAL=0,
LV_ERROR=1,
LV_WARN=2,
LV_INFO=3,
LV_DEBUG=4,
LV_TRACE=5
};
logger(const char* filename, int cpu = -1);
~logger();
//void logM(const char* format, ...);
void setLevelL(logger::loglevel level, const char* file, int line);
void logMessage(const char* file, int line, const char* format, ...);
void logMessageL(loglevel level, const char* file, int line, const char* msg, ...);
};
struct remotelistener //used for remote control of the algo, connects over network
{
virtual void onconnect() { };
virtual void ondisconnect(const char* reason) { };
virtual void onconnectionerror(int code, const char* reason) { };
virtual void onlogin() { };
virtual void onlogout() { } ;
virtual void onnewtrades(unsigned int oldTradeCount, unsigned int newTradeCount) { };
virtual void onschemaupdate(interfaceschema* schema) { };
virtual void ondatareport(nanoconda::datareport* datareport) { };
virtual void oncustomreport(char* data, unsigned short len) { };
virtual void oncustomresponse(char* data, unsigned short len) { };
};
struct remotesession
{
static remotesession* init(reasoncode& reason);
reasoncode start(const char* username, const char* password, const char* host, unsigned short port, short cpu = -1);
reasoncode stop();
const char* getAccountName();
long long sessionPnl();
long long maxDrawdown();
long long capitalUse();
long long accountBalance();
reasoncode sessionStatus();
unsigned int getSecurityList(security* usersecuritystorage);
reasoncode getSecurity(unsigned long long symbolId, security* usersecurity);
const char* getSymbolName(unsigned long long symbolId);
reasoncode getRiskLimits(risk* riskreport);
unsigned int getSecurityStats(nanoconda::securitystats* securitystatstorage);
unsigned int tradesMade();
reasoncode getLastBook(unsigned long long symbolId, nanoconda::book* b);
reasoncode getLastBook(const char* symbol, nanoconda::book* b);
reasoncode getTradeLog(nanoconda::order* tradelog,unsigned int countLimit = 0, unsigned int startFrom = 0);
reasoncode setRiskLimits(const char* underlyingSymbol, int maxpositions, int clipsize, int maxdailylots = 0, int capitalreq = 0);
reasoncode disableTrading();
reasoncode enableTrading();
reasoncode blockProgram();
reasoncode allowProgram();
reasoncode cancelAllOrders();
reasoncode flatten();
reasoncode registerListener(remotelistener* rl);
reasoncode subscribeInstrument(unsigned long long symbolId, bool L1only = true);
reasoncode subscribeInstrument(const char* symbol, bool L1only = true);
reasoncode unsubscribeInstrument(unsigned long long symbolId);
reasoncode unsubscribeInstrument(const char* symbol);
reasoncode sendcontrolaction(datainput* input, int buttonId, int viewId);
reasoncode sendrecordaction(datarecord* record, int buttonId, int viewId);
enum : unsigned short { MAX_CUSTOM_REQUEST_BYTES = 504 };
reasoncode sendcustomrequest(const char* data, unsigned short len);
unsigned short apiVersion();
private:
remotesession();
void* implementation;
};
//=============== UTILITY FUNCTIONS ============
static inline const char* reasonToStr(reasoncode reason)
{
...
}
static inline const char* toStr(reasoncode reason)
{
return reasonToStr(reason);
}
static inline const char* toStr(orderType ot)
{
...
}
static inline const char* toStr(orderStatus s)
{
...
}
static inline const char* toStr(securityStatus s)
{
...
}
static inline const char* toStr(securityType t)
{
...
}
static inline const char* toStr(orderupdatetype t)
{
...
}
static inline const char* toStr(fieldType t)
{
...
}
const char* cmeReasonToStr(unsigned short exchangeReason);
};