PitsExchange
PitsExchange Ответы на вопросы
03 апреля 2021, 09:16

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

Подскажите формулу для перевода дневных (или любых иных) котировок в недельные, месячные или любой другой период.
7 Комментариев
  • Rostislav Kudryashov
    03 апреля 2021, 10:43
    Это формула здравого смысла, реализуемая в программный код.
    Посмотрю сейчас в закромах, может сплавлю что-нибудь.
      • Rostislav Kudryashov
        03 апреля 2021, 10:53
        Axiris, 10:48  без моих библиотек программу не построить. Могу сбросить екзешник на почту.
        Только коммент в коде устарел. Разделителем полей служит не ",", но ";". Это формат csv, читаемый Екселом.
        • Rostislav Kudryashov
          03 апреля 2021, 12:33
          Rostislav Kudryashov, расширенный ответ https://smart-lab.ru/blog/687764.php
          • Rostislav Kudryashov
            03 апреля 2021, 19:35
            Rostislav Kudryashov, 12:33 и дополнен https://smart-lab.ru/blog/687797.php
    • Rostislav Kudryashov
      03 апреля 2021, 10:50
      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()


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

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн