#include "DataFormats.h" #include "DataFromSpryWare.h" #include "TclCommands.h" SpryWareClientData::SpryWareClientData(Tcl_Interp *interp) : _interp(interp) { _dataFromSpryWare.connect(); Tcl_CreateExitHandler(tclExit, this); Tcl_CreateObjCommand(_interp, "tiHistory::get", command, this, NULL); } SpryWareClientData::~SpryWareClientData() { _dataFromSpryWare.disconnect(); Tcl_DeleteExitHandler(tclExit, this); } void SpryWareClientData::tclExit(ClientData clientData) { SpryWareClientData *obj = (SpryWareClientData *)clientData; delete obj; } int SpryWareClientData::command(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { SpryWareClientData *obj = (SpryWareClientData *)clientData; assert(interp == obj->_interp); if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "sub_command symbol ?arg ...?"); return TCL_ERROR; } static char const *subCommands[] = { "daily", "1_min", "fundamental", "corp_actions", NULL }; enum { sc_daily, sc_1_min, sc_fundamental, sc_corp_actions }; int index; if (Tcl_GetIndexFromObj(interp, objv[1], subCommands, "sub_command", 0, &index) != TCL_OK) return TCL_ERROR; switch (index) { case sc_daily: return obj->getDailyCandlesCmd(objc, objv); case sc_1_min: return obj->get1MinCandlesCmd(objc, objv); case sc_fundamental: return obj->getFundamentalDataCmd(objc, objv); case sc_corp_actions: return obj->getCorporateActionsCmd(objc, objv); } return TCL_OK; } Tcl_Obj *SpryWareClientData::exportBars(BarList const &bars) { Tcl_Obj *result = Tcl_NewObj(); if (!bars.empty()) { Tcl_Obj *items[14]; items[0] = Tcl_NewStringObj("open", -1); items[2] = Tcl_NewStringObj("high", -1); items[4] = Tcl_NewStringObj("low", -1); items[6] = Tcl_NewStringObj("close", -1); items[8] = Tcl_NewStringObj("start_time", -1); items[10] = Tcl_NewStringObj("volume", -1); items[12] = Tcl_NewStringObj("print_count", -1); for (BarList::const_iterator it = bars.begin(); it != bars.end(); it++) { items[1] = Tcl_NewDoubleObj(it->open); items[3] = Tcl_NewDoubleObj(it->high); items[5] = Tcl_NewDoubleObj(it->low); items[7] = Tcl_NewDoubleObj(it->close); items[9] = Tcl_NewLongObj(it->startTime); items[11] = Tcl_NewLongObj(it->volume); items[13] = Tcl_NewLongObj(it->printCount); Tcl_Obj *bar = Tcl_NewListObj(14, items); Tcl_ListObjAppendElement(_interp, result, bar); } } return result; } static Tcl_Obj *stringToObject(std::string const &s) { return Tcl_NewStringObj(s.data(), s.size()); } int SpryWareClientData::getDailyCandlesCmd(int objc, Tcl_Obj *const objv[]) { if (objc != 3) { Tcl_WrongNumArgs(_interp, 2, objv, "symbol"); return TCL_ERROR; } char const *symbol = Tcl_GetString(objv[2]); //TimeVal one(true); BarList data1Day; _dataFromSpryWare.getDailyBars(symbol, data1Day); //TimeVal two(true); Tcl_SetObjResult(_interp, exportBars(data1Day)); //TimeVal three(true); //std::cout<<(two.asMicroseconds() - one.asMicroseconds())<<" " // <<(three.asMicroseconds() - two.asMicroseconds())<<"\n"; return TCL_OK; } int SpryWareClientData::get1MinCandlesCmd(int objc, Tcl_Obj *const objv[]) { if (objc != 3) { Tcl_WrongNumArgs(_interp, 2, objv, "symbol"); return TCL_ERROR; } char const *symbol = Tcl_GetString(objv[2]); //TimeVal one(true); BarList data1Min; _dataFromSpryWare.get1MinBars(symbol, data1Min); //TimeVal two(true); Tcl_SetObjResult(_interp, exportBars(data1Min)); //TimeVal three(true); //std::cout<<(two.asMicroseconds() - one.asMicroseconds())<<" " // <<(three.asMicroseconds() - two.asMicroseconds())<<"\n"; return TCL_OK; } int SpryWareClientData::getFundamentalDataCmd(int objc, Tcl_Obj *const objv[]) { if (objc != 3) { Tcl_WrongNumArgs(_interp, 2, objv, "symbol"); return TCL_ERROR; } char const *symbol = Tcl_GetString(objv[2]); FundamentalData fundamentalData; _dataFromSpryWare.getFundamentalData(symbol, fundamentalData); return TCL_OK; } int SpryWareClientData::getCorporateActionsCmd(int objc, Tcl_Obj *const objv[]) { if (objc != 3) { Tcl_WrongNumArgs(_interp, 2, objv, "symbol"); return TCL_ERROR; } char const *symbol = Tcl_GetString(objv[2]); CorporateActions corporateActions; _dataFromSpryWare.getCorporateActions(symbol, corporateActions); return TCL_OK; }