@@ -252,6 +252,14 @@ Response<std::vector<Bar>> AlpacaMarketData::downloadBars(
252252 return false ;
253253 }
254254
255+ // change time to bar close time
256+ bar.time += nTickMinutes * 60 ;
257+ if (static_cast <__time32_t >(bar.time ) > e) {
258+ // end time cannot exceeds tEnd
259+ LOG_DIAG_EXT (LogType::LT_HISTORY, " Drop bar at %s\n " , bar.time_string .c_str ());
260+ continue ;
261+ }
262+
255263 if (n == 1 ) {
256264 bars.emplace_back (std::move (bar));
257265 --limit;
@@ -262,27 +270,27 @@ Response<std::vector<Bar>> AlpacaMarketData::downloadBars(
262270 auto duration = nTickMinutes * 60 ;
263271 if (((int )(e - bar.time ) < duration) && ((e % duration) > (int )(bar.time % duration))) {
264272 // drop incompleted bar data
265- LOG_DIAG ( " Drop bar at %s\n " , bar.time_string .c_str ());
273+ LOG_DIAG_EXT (LogType::LT_HISTORY, " Drop bar at %s\n " , bar.time_string .c_str ());
266274 continue ;
267275 }
268276 bFirstBar = false ;
269277 }
270278 rtBar = bar;
271279 bar_end_time = rtBar.time ;
272- LOG_DIAG ( " Bar end at %s\n " , rtBar.time_string .c_str ());
280+ LOG_DIAG_EXT (LogType::LT_HISTORY, " Bar end at %s\n " , rtBar.time_string .c_str ());
273281 }
274282 else {
275283 if ((int )(bar_end_time - bar.time ) > ((nTickMinutes - 1 ) * 60 )) {
276- LOG_WARNING ( " Some data is missing, the data at %s belongs to different bar.\n " , bar.time_string .c_str ());
277- LOG_DIAG ( " Bar end at %s\n " , bar.time_string .c_str ());
284+ LOG_WARNING_EXT (LogType::LT_HISTORY, " Some data is missing, the data at %s belongs to different bar.\n " , bar.time_string .c_str ());
285+ LOG_DIAG_EXT (LogType::LT_HISTORY, " Bar end at %s\n " , bar.time_string .c_str ());
278286 bars.emplace_back (std::move (rtBar));
279287 rtBar = bar;
280288 bar_end_time = bar.time ;
281289 i = 0 ;
282290 --limit;
283291 }
284292 else {
285- LOG_DIAG ( " Bar at %s\n " , bar.time_string .c_str ());
293+ LOG_DIAG_EXT (LogType::LT_HISTORY, " Bar at %s\n " , bar.time_string .c_str ());
286294 rtBar.high_price = std::max<double >(rtBar.high_price , bar.high_price );
287295 rtBar.low_price = std::min<double >(rtBar.low_price , bar.low_price );
288296 rtBar.open_price = bar.open_price ;
@@ -313,9 +321,14 @@ Response<std::vector<Bar>> AlpacaMarketData::downloadBars(
313321 std::string sEnd = timeToString (e);
314322 std::stringstream url;
315323 url << baseUrl_ << " /v2/stocks/" << symbol << " /bars?start=" << sStart
316- << " &end=" << sEnd << " &limit=" << 10000 << " &timeframe=" << timeframe
324+ << " &end=" << sEnd << " &limit=10000&timeframe=" << timeframe
317325 << " &sort=desc&adjustment=" << to_string (Config::get ().adjustment );
318326
327+ if (!Config::get ().alpacaPaidPlan )
328+ {
329+ url << " &feed=iex" ;
330+ }
331+
319332 if (!page_token.empty ()) {
320333 url << " &page_token=" << page_token;
321334 }
@@ -339,10 +352,10 @@ Response<std::vector<Bar>> AlpacaMarketData::downloadBars(
339352
340353 auto & retrvievedBars = retrieved.content ().bars ;
341354 if (!retrvievedBars.empty ()) {
342- LOG_TRACE ( " %d bars downloaded. %s-%s\n " , retrvievedBars.size (), retrvievedBars.front ().time_string .c_str (), retrvievedBars.back ().time_string .c_str ());
355+ LOG_TRACE_EXT (LogType::LT_HISTORY, " %d bars downloaded. %s-%s\n " , retrvievedBars.size (), retrvievedBars.front ().time_string .c_str (), retrvievedBars.back ().time_string .c_str ());
343356
344- if (!retrieved.content ().next_page_token .empty ()) {
345- LOG_DIAG ( " data pagenated\n " );
357+ if (!retrieved.content ().next_page_token .empty () && retrvievedBars. size () != 10000 ) {
358+ LOG_DIAG_EXT (LogType::LT_HISTORY, " data pagenated\n " );
346359 // need to get more data entil reach the end;
347360 page_token = retrieved.content ().next_page_token ;
348361 }
@@ -356,18 +369,18 @@ Response<std::vector<Bar>> AlpacaMarketData::downloadBars(
356369 break ;
357370 }
358371 } else {
359- LOG_TRACE ( " 0 bars downloaded.\n " );
372+ LOG_TRACE_EXT (LogType::LT_HISTORY, " 0 bars downloaded.\n " );
360373 break ;
361374 }
362375 } while (limit || !page_token.empty ());
363- LOG_DIAG ( " limit: %d\n " , limit);
376+ LOG_DIAG_EXT (LogType::LT_HISTORY, " limit: %d, bar size=%d \n " , limit, bars. size () );
364377 return response;
365378}
366379
367380void AlpacaMarketData::getFromDownloadedBars (std::vector<Bar>& bars, __time32_t & end, uint32_t & limit) const {
368381 if (!downloaded_bars_.empty ()) {
369382 // found in bars we already downloaded
370- LOG_DIAG ( " check dowloaded bars. returned_index_=%d, bar=%s\n " , returned_index_, timeToString (downloaded_bars_[returned_index_].time ).c_str ());
383+ LOG_DIAG_EXT (LogType::LT_HISTORY, " check dowloaded bars. returned_index_=%d, bar=%s\n " , returned_index_, timeToString (downloaded_bars_[returned_index_].time ).c_str ());
371384
372385 for (returned_index_; returned_index_ >= 0 && returned_index_ < downloaded_bars_.size ();) {
373386 auto & bar = downloaded_bars_[returned_index_];
@@ -383,7 +396,7 @@ void AlpacaMarketData::getFromDownloadedBars(std::vector<Bar>& bars, __time32_t&
383396 auto upperbound = returned_index_;
384397 returned_index_ = std::max<int >(returned_index_ - limit + 1 , 0 );
385398 if (returned_index_ > 0 || ((upperbound - returned_index_ + 1 ) == limit)) {
386- LOG_DIAG ( " have enough data in downloaded. returned_index_=%d, upperbound=%d, first bar=%s, last bar=%s\n " , returned_index_, upperbound, timeToString (downloaded_bars_[returned_index_].time ).c_str (), timeToString (downloaded_bars_[upperbound].time ).c_str ());
399+ LOG_DIAG_EXT (LogType::LT_HISTORY, " have enough data in downloaded. returned_index_=%d, upperbound=%d, first bar=%s, last bar=%s\n " , returned_index_, upperbound, timeToString (downloaded_bars_[returned_index_].time ).c_str (), timeToString (downloaded_bars_[upperbound].time ).c_str ());
387400 // dwonloaded bars contains enough bars
388401 for (auto i = returned_index_; i <= upperbound; ++i, --limit) {
389402 bars.emplace_back (std::move (downloaded_bars_[i]));
@@ -404,7 +417,7 @@ void AlpacaMarketData::getFromDownloadedBars(std::vector<Bar>& bars, __time32_t&
404417 }
405418
406419 if (!leftover_bars_.empty ()) {
407- LOG_DIAG ( " %d bars already downloaded, first bar %s, last bar %s\n " , leftover_bars_.size (), timeToString (leftover_bars_[0 ].time ).c_str (), timeToString (leftover_bars_.back ().time ).c_str ());
420+ LOG_DIAG_EXT (LogType::LT_HISTORY, " %d bars already downloaded, first bar %s, last bar %s\n " , leftover_bars_.size (), timeToString (leftover_bars_[0 ].time ).c_str (), timeToString (leftover_bars_.back ().time ).c_str ());
408421 end = leftover_bars_[0 ].time ;
409422 }
410423 }
0 commit comments