bool getHistoryPrices(IO2GSession *session, const char *sInstrument, const char *sTimeframe, DATE dtFrom, DATE dtTo, ResponseListener *responseListener) { O2G2Ptr<IO2GRequestFactory> factory = session->getRequestFactory(); if (!factory) { std::cout << "Cannot create request factory" << std::endl; return false; } //find timeframe by identifier O2G2Ptr<IO2GTimeframeCollection> timeframeCollection = factory->getTimeFrameCollection(); O2G2Ptr<IO2GTimeframe> timeframe = timeframeCollection->get(sTimeframe); if (!timeframe) { std::cout << "Timeframe '" << sTimeframe << "' is incorrect!" << std::endl; return false; } O2G2Ptr<IO2GRequest> request = factory->createMarketDataSnapshotRequestInstrument(sInstrument, timeframe, timeframe->getQueryDepth()); DATE dtFirst = dtTo; // there is limit for returned candles amount do { factory->fillMarketDataSnapshotRequestTime(request, dtFrom, dtFirst, false); responseListener->setRequestID(request->getRequestID()); session->sendRequest(request); if (!responseListener->waitEvents()) { std::cout << "Response waiting timeout expired" << std::endl; return false; } // shift "to" bound to oldest datetime of returned data O2G2Ptr<IO2GResponse> response = responseListener->getResponse(); if (response && response->getType() == MarketDataSnapshot) { O2G2Ptr<IO2GResponseReaderFactory> readerFactory = session->getResponseReaderFactory(); if (readerFactory) { O2G2Ptr<IO2GMarketDataSnapshotResponseReader> reader = readerFactory->createMarketDataSnapshotReader(response); if (reader->size() > 0) { if (abs(dtFirst - reader->getDate(0)) > 0.0001) dtFirst = reader->getDate(0); // earliest datetime of returned data else break; } else { std::cout << "0 rows received" << std::endl; break; } } printPrices(session, response); } else { break; } } while (dtFirst - dtFrom > 0.0001); return true; }
std::vector<Prices> ForexConnectClient::getHistoricalPrices(const std::string& instrument, const boost::posix_time::ptime& from, const boost::posix_time::ptime& to, const std::string& timeFrame) { std::vector<Prices> prices; O2G2Ptr<IO2GTimeframeCollection> timeframeCollection = mpRequestFactory->getTimeFrameCollection(); O2G2Ptr<IO2GTimeframe> timeframe = timeframeCollection->get(timeFrame.c_str()); if (!timeframe) { BOOST_LOG_TRIVIAL(error) << "Timeframe '" << timeFrame << "' is incorrect!"; return prices; } O2G2Ptr<IO2GRequest> request = mpRequestFactory->createMarketDataSnapshotRequestInstrument(instrument.c_str(), timeframe, timeframe->getQueryDepth()); DATE dtFrom = toOleTime(from); DATE dtTo = toOleTime(to); DATE dtFirst = dtTo; do { mpRequestFactory->fillMarketDataSnapshotRequestTime(request, dtFrom, dtFirst, false); mpResponseListener->setRequestID(request->getRequestID()); mpSession->sendRequest(request); if (!mpResponseListener->waitEvents()) { BOOST_LOG_TRIVIAL(error) << "Response waiting timeout expired"; return prices; } // shift "to" bound to oldest datetime of returned data O2G2Ptr<IO2GResponse> response = mpResponseListener->getResponse(); if (response && response->getType() == MarketDataSnapshot) { O2G2Ptr<IO2GMarketDataSnapshotResponseReader> reader = mpResponseReaderFactory->createMarketDataSnapshotReader(response); if (reader->size() > 0) { if (fabs(dtFirst - reader->getDate(0)) > 0.0001) dtFirst = reader->getDate(0); // earliest datetime of returned data else break; } else { BOOST_LOG_TRIVIAL(warning) << "0 rows received"; break; } std::vector<Prices> prc = getPricesFromResponse(response); prices.insert(prices.end(), prc.begin(), prc.end()); } else { break; } } while (dtFirst - dtFrom > 0.0001); return prices; }
void SessionStatusListener::onSessionStatusChanged(IO2GSessionStatus::O2GSessionStatus status) { BOOST_LOG_TRIVIAL(trace) << __PRETTY_FUNCTION__; switch (status) { case IO2GSessionStatus::Disconnected: BOOST_LOG_TRIVIAL(info) << "status::disconnected"; mConnected = false; mDisconnected = true; SetEvent(mSessionEvent); break; case IO2GSessionStatus::Connecting: BOOST_LOG_TRIVIAL(info) << "status::connecting"; break; case IO2GSessionStatus::TradingSessionRequested: { BOOST_LOG_TRIVIAL(info) << "status::trading session requested"; O2G2Ptr<IO2GSessionDescriptorCollection> descriptors = mSession->getTradingSessionDescriptors(); bool found = false; if (descriptors) { if (mPrintSubsessions) BOOST_LOG_TRIVIAL(info) << "descriptors available:"; for (int i = 0; i < descriptors->size(); ++i) { O2G2Ptr<IO2GSessionDescriptor> descriptor = descriptors->get(i); if (mPrintSubsessions) BOOST_LOG_TRIVIAL(info) << " id:='" << descriptor->getID() << "' name='" << descriptor->getName() << "' description='" << descriptor->getDescription() << "' " << (descriptor->requiresPin() ? "requires pin" : ""); if (mSessionID == descriptor->getID()) { found = true; break; } } } if (!found) { onLoginFailed("The specified sub session identifier is not found"); } else { mSession->setTradingSession(mSessionID.c_str(), mPin.c_str()); } } break; case IO2GSessionStatus::Connected: BOOST_LOG_TRIVIAL(info) << "status::connected"; mConnected = true; mDisconnected = false; SetEvent(mSessionEvent); break; case IO2GSessionStatus::Reconnecting: BOOST_LOG_TRIVIAL(info) << "status::reconnecting"; break; case IO2GSessionStatus::Disconnecting: BOOST_LOG_TRIVIAL(info) << "status::disconnecting"; break; case IO2GSessionStatus::SessionLost: BOOST_LOG_TRIVIAL(info) << "status::session lost"; break; } }