void market_data::load_from_file() { std::string filename = resolve_path(m_filename); std::ifstream is(filename); if( ! is) throw std::runtime_error("Cannot load filename " + filename); std::string line; int i_line=0; INFO("market_data", "loading histo file " + filename); while(getline(is, line)) { i_line++; line=trim(line); if(line.size() && line[0] == '#') continue; if(line.empty()) continue; s_vs tab = split(line, ';', false); if(tab->size() < 6) { ERR("market_data", "loading file " + filename + ", line " + std::to_string(i_line)); continue; } tp ddate=strtotp(tab->at(1)); if( ! is_business_day(ddate)) continue; double open=strtod(tab->at(2).c_str(), NULL); double high=strtod(tab->at(3).c_str(), NULL); double low=strtod(tab->at(4).c_str(), NULL); double close=strtod(tab->at(5).c_str(), NULL); double volume=strtod(tab->at(6).c_str(), NULL); m_bars.emplace_back(this, ddate, open, high, low, close, volume); } transformer<bar,tp> t = [](const bar & b){return b.start_date();}; comparer<bar> by_start_date = bar::compare_by<tp>(t); tp tp_min = tp::min(); for(auto & b : m_bars) if(tp_min > b.start_date() ) // need sort { std::sort(m_bars.begin(), m_bars.end(), by_start_date); break; }else tp_min = b.start_date(); }
/* * This is the 'is_busday' function exposed for calling * from Python. */ NPY_NO_EXPORT PyObject * array_is_busday(PyObject *NPY_UNUSED(self), PyObject *args, PyObject *kwds) { char *kwlist[] = {"dates", "weekmask", "holidays", "busdaycal", "out", NULL}; PyObject *dates_in = NULL, *out_in = NULL; PyArrayObject *dates = NULL,*out = NULL, *ret; npy_bool weekmask[7] = {2, 1, 1, 1, 1, 0, 0}; NpyBusDayCalendar *busdaycal = NULL; int i, busdays_in_weekmask; npy_holidayslist holidays = {NULL, NULL}; int allocated_holidays = 1; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O&O&O!O:is_busday", kwlist, &dates_in, &PyArray_WeekMaskConverter, &weekmask[0], &PyArray_HolidaysConverter, &holidays, &NpyBusDayCalendar_Type, &busdaycal, &out_in)) { goto fail; } /* Make sure only one of the weekmask/holidays and busdaycal is supplied */ if (busdaycal != NULL) { if (weekmask[0] != 2 || holidays.begin != NULL) { PyErr_SetString(PyExc_ValueError, "Cannot supply both the weekmask/holidays and the " "busdaycal parameters to is_busday()"); goto fail; } /* Indicate that the holidays weren't allocated by us */ allocated_holidays = 0; /* Copy the private normalized weekmask/holidays data */ holidays = busdaycal->holidays; busdays_in_weekmask = busdaycal->busdays_in_weekmask; memcpy(weekmask, busdaycal->weekmask, 7); } else { /* * Fix up the weekmask from the uninitialized * signal value to a proper default. */ if (weekmask[0] == 2) { weekmask[0] = 1; } /* Count the number of business days in a week */ busdays_in_weekmask = 0; for (i = 0; i < 7; ++i) { busdays_in_weekmask += weekmask[i]; } /* The holidays list must be normalized before using it */ normalize_holidays_list(&holidays, weekmask); } /* Make 'dates' into an array */ if (PyArray_Check(dates_in)) { dates = (PyArrayObject *)dates_in; Py_INCREF(dates); } else { PyArray_Descr *datetime_dtype; /* Use the datetime dtype with generic units so it fills it in */ datetime_dtype = PyArray_DescrFromType(NPY_DATETIME); if (datetime_dtype == NULL) { goto fail; } /* This steals the datetime_dtype reference */ dates = (PyArrayObject *)PyArray_FromAny(dates_in, datetime_dtype, 0, 0, 0, dates_in); if (dates == NULL) { goto fail; } } /* Make sure 'out' is an array if it's provided */ if (out_in != NULL) { if (!PyArray_Check(out_in)) { PyErr_SetString(PyExc_ValueError, "busday_offset: must provide a NumPy array for 'out'"); goto fail; } out = (PyArrayObject *)out_in; } ret = is_business_day(dates, out, weekmask, busdays_in_weekmask, holidays.begin, holidays.end); Py_DECREF(dates); if (allocated_holidays && holidays.begin != NULL) { PyArray_free(holidays.begin); } return out == NULL ? PyArray_Return(ret) : (PyObject *)ret; fail: Py_XDECREF(dates); if (allocated_holidays && holidays.begin != NULL) { PyArray_free(holidays.begin); } return NULL; }