Skip to content
Get Started

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);

};