|
| 1 | +// Backtesting Engine in C++ |
| 2 | +// |
| 3 | +// (c) 2026 Ryan McCaffery | https://mccaffers.com |
| 4 | +// This code is licensed under MIT license (see LICENSE.txt for details) |
| 5 | +// --------------------------------------- |
| 6 | + |
| 7 | +#include "operations.hpp" |
| 8 | +// std headers |
| 9 | +#include <iostream> |
| 10 | +#include <vector> |
| 11 | +#include <memory> |
| 12 | +#include <string> |
| 13 | +#include <iomanip> |
| 14 | +#include "tradeManager.hpp" |
| 15 | + |
| 16 | +void Operations::run(const std::vector<PriceData>& ticks) { |
| 17 | + |
| 18 | + // Loop aroudn every tick |
| 19 | + // Example output: |
| 20 | + // symbol=AUSIDXAUD, ask=8602.4000, bid=8599.4000 timestamp=2026-03-12 18:39:01.076 |
| 21 | + // symbol=AUSIDXAUD, ask=8602.9000, bid=8599.9000 timestamp=2026-03-12 18:39:01.584 |
| 22 | + // symbol=EURUSD, ask=1.1513, bid=1.1512 timestamp=2026-03-12 18:39:01.644 |
| 23 | + // symbol=AUSIDXAUD, ask=8602.4000, bid=8599.4000 timestamp=2026-03-12 18:39:01.770 |
| 24 | + // symbol=AUSIDXAUD, ask=8601.9000, bid=8598.9000 timestamp=2026-03-12 18:39:01.982 |
| 25 | + |
| 26 | + for (const auto& tick : ticks) { |
| 27 | + // (void)tick; |
| 28 | + |
| 29 | + // print first tick |
| 30 | + auto time_t = std::chrono::system_clock::to_time_t(tick.timestamp); |
| 31 | + struct tm tm = {}; |
| 32 | + if (localtime_r(&time_t, &tm) == nullptr) { |
| 33 | + std::cerr << "Error: failed to convert timestamp" << std::endl; |
| 34 | + } |
| 35 | + char buffer[20]; |
| 36 | + std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &tm); |
| 37 | + auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(tick.timestamp.time_since_epoch()) % 1000; |
| 38 | + printf("symbol=%s, ask=%.4f, bid=%.4f timestamp=%s.%03lld\n", tick.symbol.c_str(), tick.ask, tick.bid, buffer, |
| 39 | + static_cast<long long>(ms.count())); |
| 40 | + } |
| 41 | + |
| 42 | + auto tradeManager = TradeManager::getInstance(); |
| 43 | + |
| 44 | + // std::string tradeId = tradeManager->openTrade(ticks[0].ask, 100000, true); |
| 45 | + // std::cout << "Opened trade: " << tradeId << std::endl; |
| 46 | + |
| 47 | + // size_t openTrades = tradeManager->reviewAccount(); |
| 48 | + // std::cout << "Number of open trades: " << openTrades << std::endl; |
| 49 | + |
| 50 | + // bool closed = tradeManager->closeTrade(tradeId); |
| 51 | + // std::cout << "Trade closed: " << (closed ? "yes" : "no") << std::endl; |
| 52 | +} |
0 commit comments