Ответы на вопросы по фондовому рынку и трейдингу
// ..\cl.cmd Rescale.cpp Quote.obj Utils.obj UtilsIO.obj // Умножение тайм-фрейма котировок Qt1 на Fct. Все файлы в формате // <TICKER>,<PER>,<DATE>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL> #include <exception> #include «Quote.h» #include «Utils.h» using namespace std; namespace qt = Quote_RostDK; namespace utIO = UtilsIO_RostDK;void PutBar (FILE* ofs, qt::InputQuote& iq, const string& per ,const qt::Bar& b) { tm dt {0}; errno_t errno = localtime_s (&dt, &b.tb); dt.tm_year += 1900; dt.tm_mon += 1; fprintf_s (ofs, iq.Frm_g().data(), iq.Ticker().data(), per.data() ,dt.tm_year, dt.tm_mon, dt.tm_mday, dt.tm_hour, dt.tm_min, dt.tm_sec ,b.op, b.hi, b.lo, b.cl, b.vo); } // PutBar()int main (int argc, char *argv[]) { Utils_RostDK::SetConsole1251(); if (argc != 4) { puts («Множит тайм-фрейм котировки Qt1 на Fct.\n» «Rescale Qt1File FctNumber ResFile.»); return 1; } char *ipD1 = argv[1]; // Котировки Qt1 double fct = static_cast<float>(atof (argv[2])); char *opRz = argv[3]; // Котировки результата { char drvD1[_MAX_DRIVE], dirD1[_MAX_DIR], fnD1[_MAX_FNAME], extD1[_MAX_EXT]; char drvRz[_MAX_DRIVE], dirRz[_MAX_DIR], fnRz[_MAX_FNAME], extRz[_MAX_EXT]; _splitpath_s (ipD1 ,drvD1, _MAX_DRIVE, dirD1, _MAX_DIR, fnD1, _MAX_FNAME, extD1, _MAX_EXT); _splitpath_s (opRz ,drvRz, _MAX_DRIVE, dirRz, _MAX_DIR, fnRz, _MAX_FNAME, extRz, _MAX_EXT); if (_stricmp (dirRz, dirD1) == 0 && _stricmp (fnRz, fnD1) == 0 && _stricmp (extRz, extD1) == 0) { puts («Неуникальное Qt1 Res»); return 2; } } if (fct <= 0 || fct != floor (fct)) { puts («Неверен Fct»); return 3; } HANDLE ifD1 = utIO::CreateFile (ipD1, 1, FILE_FLAG_OVERLAPPED | FILE_FLAG_SEQUENTIAL_SCAN | FILE_ATTRIBUTE_READONLY); if (ifD1 == INVALID_HANDLE_VALUE) { puts («Сбой открытия Qt1»); return 0; } FILE* ofRz; if (fopen_s (&ofRz, opRz, «wt»)) { puts («Сбой открытия Res»); return 0; } constexpr unsigned BUF_SIZE = 16*1024*1024; utIO::WinApiReader reader (BUF_SIZE, ifD1); utIO::Parser parser (reader); char* record = parser.Parse(); if (NULL == record) { puts («Сбой чтения файла»); return 0; } try { qt::InputQuote iq (string (record), «id1», 1); fprintf (ofRz, "%s\n", iq.Header().data()); fflush (ofRz); int per = 0, perNew = 0; string perStr; qt::Bar srcBar, trgBar; tm fms {0}; char fmt[256]; strcpy_s (fmt, sizeof(fmt), iq.Frm_g().data()); time_t minNxt = 0; clock_t clk = clock() + 2000; while (NULL != (record = parser.Parse())) { if (clock() > clk) { _putc_nolock ('\a', stdout); clk += 2000; } iq.AddBar (string (record), srcBar, fms); if (per == 0) { if (0 == (per = atoi (iq.Period().data()))) { printf («Неверный период %s», iq.Period().data()); return 0; } perNew = static_cast<int> (per * fct); perStr = to_string (perNew); } time_t minCur = __int64 (srcBar.tb / 60 / perNew) * perNew; if (minCur >= minNxt) { if (0 != minNxt) PutBar (ofRz, iq, perStr, trgBar); minNxt = minCur + perNew; trgBar = srcBar; trgBar.tb = minCur * 60; trgBar.vo = 0; } trgBar.lo = min (trgBar.lo, srcBar.lo); trgBar.hi = max (trgBar.hi, srcBar.hi); trgBar.cl = srcBar.cl; trgBar.vo += srcBar.vo; } // while (NULL PutBar (ofRz, iq, perStr, trgBar); } catch (exception& e) { printf («Сбой %s\n», e.what()); } catch (...) { puts («Неизвестный сбой»); } } // main()
// ..\cl.cmd Rescale.cpp Quote.obj Utils.obj UtilsIO.obj // Умножение тайм-фрейма котировок Qt1 на Fct. Все файлы в формате // <TICKER>,<PER>,<DATE>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL> #include <exception> #include «Quote.h» #include «Utils.h» using namespace std; namespace qt = Quote_RostDK; namespace utIO = UtilsIO_RostDK;
void PutBar (FILE* ofs, qt::InputQuote& iq, const string& per ,const qt::Bar& b) { tm dt {0}; errno_t errno = localtime_s (&dt, &b.tb); dt.tm_year += 1900; dt.tm_mon += 1; fprintf_s (ofs, iq.Frm_g().data(), iq.Ticker().data(), per.data() ,dt.tm_year, dt.tm_mon, dt.tm_mday, dt.tm_hour, dt.tm_min, dt.tm_sec ,b.op, b.hi, b.lo, b.cl, b.vo); } // PutBar()
int main (int argc, char *argv[]) { Utils_RostDK::SetConsole1251(); if (argc != 4) { puts («Множит тайм-фрейм котировки Qt1 на Fct.\n» «Rescale Qt1File FctNumber ResFile.»); return 1; } char *ipD1 = argv[1]; // Котировки Qt1 double fct = static_cast<float>(atof (argv[2])); char *opRz = argv[3]; // Котировки результата { char drvD1[_MAX_DRIVE], dirD1[_MAX_DIR], fnD1[_MAX_FNAME], extD1[_MAX_EXT]; char drvRz[_MAX_DRIVE], dirRz[_MAX_DIR], fnRz[_MAX_FNAME], extRz[_MAX_EXT]; _splitpath_s (ipD1 ,drvD1, _MAX_DRIVE, dirD1, _MAX_DIR, fnD1, _MAX_FNAME, extD1, _MAX_EXT); _splitpath_s (opRz ,drvRz, _MAX_DRIVE, dirRz, _MAX_DIR, fnRz, _MAX_FNAME, extRz, _MAX_EXT); if (_stricmp (dirRz, dirD1) == 0 && _stricmp (fnRz, fnD1) == 0 && _stricmp (extRz, extD1) == 0) { puts («Неуникальное Qt1 Res»); return 2; } } if (fct <= 0 || fct != floor (fct)) { puts («Неверен Fct»); return 3; } HANDLE ifD1 = utIO::CreateFile (ipD1, 1, FILE_FLAG_OVERLAPPED | FILE_FLAG_SEQUENTIAL_SCAN | FILE_ATTRIBUTE_READONLY); if (ifD1 == INVALID_HANDLE_VALUE) { puts («Сбой открытия Qt1»); return 0; } FILE* ofRz; if (fopen_s (&ofRz, opRz, «wt»)) { puts («Сбой открытия Res»); return 0; } constexpr unsigned BUF_SIZE = 16*1024*1024; utIO::WinApiReader reader (BUF_SIZE, ifD1); utIO::Parser parser (reader); char* record = parser.Parse(); if (NULL == record) { puts («Сбой чтения файла»); return 0; } try { qt::InputQuote iq (string (record), «id1», 1); fprintf (ofRz, "%s\n", iq.Header().data()); fflush (ofRz); int per = 0, perNew = 0; string perStr; qt::Bar srcBar, trgBar; tm fms {0}; char fmt[256]; strcpy_s (fmt, sizeof(fmt), iq.Frm_g().data()); time_t minNxt = 0; clock_t clk = clock() + 2000; while (NULL != (record = parser.Parse())) { if (clock() > clk) { _putc_nolock ('\a', stdout); clk += 2000; } iq.AddBar (string (record), srcBar, fms); if (per == 0) { if (0 == (per = atoi (iq.Period().data()))) { printf («Неверный период %s», iq.Period().data()); return 0; } perNew = static_cast<int> (per * fct); perStr = to_string (perNew); } time_t minCur = __int64 (srcBar.tb / 60 / perNew) * perNew; if (minCur >= minNxt) { if (0 != minNxt) PutBar (ofRz, iq, perStr, trgBar); minNxt = minCur + perNew; trgBar = srcBar; trgBar.tb = minCur * 60; trgBar.vo = 0; } trgBar.lo = min (trgBar.lo, srcBar.lo); trgBar.hi = max (trgBar.hi, srcBar.hi); trgBar.cl = srcBar.cl; trgBar.vo += srcBar.vo; } // while (NULL PutBar (ofRz, iq, perStr, trgBar); } catch (exception& e) { printf («Сбой %s\n», e.what()); } catch (...) { puts («Неизвестный сбой»); } } // main()
Посмотрю сейчас в закромах, может сплавлю что-нибудь.
Только коммент в коде устарел. Разделителем полей служит не ",", но ";". Это формат csv, читаемый Екселом.
смарт искажает коды, так что здравый смысл нужен ещё при выверке исходника.
Только зарегистрированные и авторизованные пользователи могут оставлять ответы.
Залогиниться
Зарегистрироваться