Подскажите формулу для перевода дневных (или любых иных) котировок в недельные, месячные или любой другой период.

ВНИМАНИЕ! КОММЕНТАРИИ ПЕРВОГО УРОВНЯ В ВОПРОСАХ УПОРЯДОЧИВАЮТСЯ ПО ЧИСЛУ ПЛЮСИКОВ, А НЕ ПО ВРЕМЕНИ ПУБЛИКАЦИИ.
Это формула здравого смысла, реализуемая в программный код.
Посмотрю сейчас в закромах, может сплавлю что-нибудь.
avatar
Rostislav Kudryashov, Благодарю.
avatar
Axiris, 10:48  без моих библиотек программу не построить. Могу сбросить екзешник на почту.
Только коммент в коде устарел. Разделителем полей служит не ",", но ";". Это формат csv, читаемый Екселом.
avatar
Rostislav Kudryashov, расширенный ответ https://smart-lab.ru/blog/687764.php
avatar
Rostislav Kudryashov, 12:33 и дополнен https://smart-lab.ru/blog/687797.php
avatar
Rostislav Kudryashov, 10:43 нашёл исходник только в C++


// ..\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()


смарт искажает коды, так что здравый смысл нужен ещё при выверке исходника.
avatar

Только зарегистрированные и авторизованные пользователи могут оставлять ответы.

Залогиниться

Зарегистрироваться

теги блога PitsExchange

....все тэги



UPDONW
Новый дизайн