From f203bdda8599f1414fe4a5f6edb4b8cbe6d91035 Mon Sep 17 00:00:00 2001 From: Ryan <16667079+mccaffers@users.noreply.github.com> Date: Mon, 10 Feb 2025 09:09:33 +0000 Subject: [PATCH] Refactoring include out of the source folder, added in an SQL manager --- CMakeLists.txt | 10 +++++----- .../project.pbxproj | 12 ++++++++++-- {source/include => include}/configManager.hpp | 0 .../include => include}/databaseConnection.hpp | 0 {source/include => include}/jsonParser.hpp | 0 .../include => include}/models/priceData.hpp | 1 + {source/include => include}/models/trade.hpp | 0 {source/include => include}/serviceA.hpp | 0 include/sqlManager.hpp | 18 ++++++++++++++++++ .../trading/tradeManager.hpp | 0 .../trading_definitions.hpp | 0 .../trading_definitions/configuration.hpp | 0 .../trading_definitions/ohlc_rsi_variables.hpp | 0 .../trading_definitions/ohlc_variables.hpp | 0 .../trading_definitions/strategy.hpp | 0 .../trading_definitions/strategy_variables.hpp | 0 .../trading_definitions/trading_variables.hpp | 0 .../include => include}/utilities/base64.hpp | 0 scripts/run.sh | 4 ++-- source/jsonParser.cpp | 6 ++++++ source/main.cpp | 6 ++---- source/sqlManager.cpp | 14 ++++++++++++++ 22 files changed, 58 insertions(+), 13 deletions(-) rename {source/include => include}/configManager.hpp (100%) rename {source/include => include}/databaseConnection.hpp (100%) rename {source/include => include}/jsonParser.hpp (100%) rename {source/include => include}/models/priceData.hpp (96%) rename {source/include => include}/models/trade.hpp (100%) rename {source/include => include}/serviceA.hpp (100%) create mode 100644 include/sqlManager.hpp rename {source/include => include}/trading/tradeManager.hpp (100%) rename {source/include => include}/trading_definitions.hpp (100%) rename {source/include => include}/trading_definitions/configuration.hpp (100%) rename {source/include => include}/trading_definitions/ohlc_rsi_variables.hpp (100%) rename {source/include => include}/trading_definitions/ohlc_variables.hpp (100%) rename {source/include => include}/trading_definitions/strategy.hpp (100%) rename {source/include => include}/trading_definitions/strategy_variables.hpp (100%) rename {source/include => include}/trading_definitions/trading_variables.hpp (100%) rename {source/include => include}/utilities/base64.hpp (100%) create mode 100644 source/sqlManager.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 29cd38c..b6c5634 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,11 +37,11 @@ add_subdirectory(external/libpqxx EXCLUDE_FROM_ALL) # Include directories include_directories( - ${CMAKE_SOURCE_DIR}/source/include - ${CMAKE_SOURCE_DIR}/source/include/utilities - ${CMAKE_SOURCE_DIR}/source/include/models - ${CMAKE_SOURCE_DIR}/source/include/trading - ${CMAKE_SOURCE_DIR}/source/include/trading_definitions + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/include/utilities + ${CMAKE_SOURCE_DIR}/include/models + ${CMAKE_SOURCE_DIR}/include/trading + ${CMAKE_SOURCE_DIR}/include/trading_definitions ${CMAKE_SOURCE_DIR}/external ) diff --git a/backtesting-engine-cpp.xcodeproj/project.pbxproj b/backtesting-engine-cpp.xcodeproj/project.pbxproj index 8c6bf5a..7a04891 100644 --- a/backtesting-engine-cpp.xcodeproj/project.pbxproj +++ b/backtesting-engine-cpp.xcodeproj/project.pbxproj @@ -11,6 +11,8 @@ 940A61142C92CE210083FEB8 /* configManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 940A61112C92CE210083FEB8 /* configManager.cpp */; }; 940A61172C92CE960083FEB8 /* serviceA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 940A61152C92CE960083FEB8 /* serviceA.cpp */; }; 940A61182C92CE960083FEB8 /* serviceA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 940A61152C92CE960083FEB8 /* serviceA.cpp */; }; + 941408AE2D59F93F000ED1F9 /* sqlManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 941408AD2D59F93F000ED1F9 /* sqlManager.cpp */; }; + 941408AF2D59F93F000ED1F9 /* sqlManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 941408AD2D59F93F000ED1F9 /* sqlManager.cpp */; }; 941B549A2D3BBADE00E3BF64 /* trading_definitions_json.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 941B54992D3BBADD00E3BF64 /* trading_definitions_json.cpp */; }; 941B549B2D3BBADE00E3BF64 /* trading_definitions_json.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 941B54992D3BBADD00E3BF64 /* trading_definitions_json.cpp */; }; 94280BA32D2FC00200F1CF56 /* base64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94280BA22D2FC00200F1CF56 /* base64.cpp */; }; @@ -51,6 +53,8 @@ 940A61122C92CE210083FEB8 /* configManager.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = configManager.hpp; sourceTree = ""; }; 940A61152C92CE960083FEB8 /* serviceA.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = serviceA.cpp; sourceTree = ""; }; 940A61162C92CE960083FEB8 /* serviceA.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = serviceA.hpp; sourceTree = ""; }; + 941408AD2D59F93F000ED1F9 /* sqlManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = sqlManager.cpp; sourceTree = ""; }; + 941408B02D59F954000ED1F9 /* sqlManager.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = sqlManager.hpp; sourceTree = ""; }; 941B54902D3BBA4900E3BF64 /* ohlc_variables.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ohlc_variables.hpp; sourceTree = ""; }; 941B54912D3BBA5600E3BF64 /* ohlc_rsi_variables.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ohlc_rsi_variables.hpp; sourceTree = ""; }; 941B54922D3BBA6500E3BF64 /* trading_variables.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = trading_variables.hpp; sourceTree = ""; }; @@ -1317,6 +1321,7 @@ 94CD849E2D2D22C900041BBA /* external */, 944D0DD22C8C3704004DD0FC /* images */, 944D0DCE2C8C3704004DD0FC /* scripts */, + 94DE4F772C8C3E7C00FE48FF /* include */, 9470B5A22C8C5AD0007D9CC6 /* source */, 9470B5AD2C8C5B99007D9CC6 /* tests */, 948A9CEC2C906ADB00E23669 /* resources */, @@ -1395,16 +1400,16 @@ 9470B5A22C8C5AD0007D9CC6 /* source */ = { isa = PBXGroup; children = ( - 943398232D57E53400287A2D /* jsonParser.cpp */, 94674B8C2D533E7800973137 /* models */, 94674B862D533B4000973137 /* trading */, - 94DE4F772C8C3E7C00FE48FF /* include */, 941B54982D3BBAD800E3BF64 /* trading_definitions */, 94280BA72D2FC29F00F1CF56 /* utilities */, 9470B5A32C8C5AD0007D9CC6 /* main.cpp */, 940A61112C92CE210083FEB8 /* configManager.cpp */, 940A61152C92CE960083FEB8 /* serviceA.cpp */, 94CD8B9F2D2E8CE500041BBA /* databaseConnection.cpp */, + 943398232D57E53400287A2D /* jsonParser.cpp */, + 941408AD2D59F93F000ED1F9 /* sqlManager.cpp */, ); path = source; sourceTree = ""; @@ -3510,6 +3515,7 @@ 94DE4F772C8C3E7C00FE48FF /* include */ = { isa = PBXGroup; children = ( + 941408B02D59F954000ED1F9 /* sqlManager.hpp */, 943398222D57E52900287A2D /* jsonParser.hpp */, 94674B842D533B2F00973137 /* trading */, 942966D72D48E84100532862 /* models */, @@ -3616,6 +3622,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 941408AE2D59F93F000ED1F9 /* sqlManager.cpp in Sources */, 9470B5A42C8C5AD0007D9CC6 /* main.cpp in Sources */, 943398252D57E53400287A2D /* jsonParser.cpp in Sources */, 94280BA32D2FC00200F1CF56 /* base64.cpp in Sources */, @@ -3633,6 +3640,7 @@ buildActionMask = 2147483647; files = ( 94CD8BA12D2E8CE500041BBA /* databaseConnection.cpp in Sources */, + 941408AF2D59F93F000ED1F9 /* sqlManager.cpp in Sources */, 943398242D57E53400287A2D /* jsonParser.cpp in Sources */, 94280BA42D2FC00200F1CF56 /* base64.cpp in Sources */, 94674B8D2D533E7800973137 /* trade.cpp in Sources */, diff --git a/source/include/configManager.hpp b/include/configManager.hpp similarity index 100% rename from source/include/configManager.hpp rename to include/configManager.hpp diff --git a/source/include/databaseConnection.hpp b/include/databaseConnection.hpp similarity index 100% rename from source/include/databaseConnection.hpp rename to include/databaseConnection.hpp diff --git a/source/include/jsonParser.hpp b/include/jsonParser.hpp similarity index 100% rename from source/include/jsonParser.hpp rename to include/jsonParser.hpp diff --git a/source/include/models/priceData.hpp b/include/models/priceData.hpp similarity index 96% rename from source/include/models/priceData.hpp rename to include/models/priceData.hpp index 2127686..4047ffd 100644 --- a/source/include/models/priceData.hpp +++ b/include/models/priceData.hpp @@ -4,6 +4,7 @@ // This code is licensed under MIT license (see LICENSE.txt for details) // --------------------------------------- #pragma once +#include struct PriceData { double value1; diff --git a/source/include/models/trade.hpp b/include/models/trade.hpp similarity index 100% rename from source/include/models/trade.hpp rename to include/models/trade.hpp diff --git a/source/include/serviceA.hpp b/include/serviceA.hpp similarity index 100% rename from source/include/serviceA.hpp rename to include/serviceA.hpp diff --git a/include/sqlManager.hpp b/include/sqlManager.hpp new file mode 100644 index 0000000..1f65287 --- /dev/null +++ b/include/sqlManager.hpp @@ -0,0 +1,18 @@ +// Backtesting Engine in C++ +// +// (c) 2025 Ryan McCaffery | https://mccaffers.com +// This code is licensed under MIT license (see LICENSE.txt for details) +// --------------------------------------- +#pragma once +#include +#include +#include "models/priceData.hpp" +#include "databaseConnection.hpp" + +class SqlManager { +public: + static std::vector getInitialPriceData(const DatabaseConnection& db); + static std::string getBaseQuery(); +private: + static constexpr int DEFAULT_LIMIT = 1000; +}; diff --git a/source/include/trading/tradeManager.hpp b/include/trading/tradeManager.hpp similarity index 100% rename from source/include/trading/tradeManager.hpp rename to include/trading/tradeManager.hpp diff --git a/source/include/trading_definitions.hpp b/include/trading_definitions.hpp similarity index 100% rename from source/include/trading_definitions.hpp rename to include/trading_definitions.hpp diff --git a/source/include/trading_definitions/configuration.hpp b/include/trading_definitions/configuration.hpp similarity index 100% rename from source/include/trading_definitions/configuration.hpp rename to include/trading_definitions/configuration.hpp diff --git a/source/include/trading_definitions/ohlc_rsi_variables.hpp b/include/trading_definitions/ohlc_rsi_variables.hpp similarity index 100% rename from source/include/trading_definitions/ohlc_rsi_variables.hpp rename to include/trading_definitions/ohlc_rsi_variables.hpp diff --git a/source/include/trading_definitions/ohlc_variables.hpp b/include/trading_definitions/ohlc_variables.hpp similarity index 100% rename from source/include/trading_definitions/ohlc_variables.hpp rename to include/trading_definitions/ohlc_variables.hpp diff --git a/source/include/trading_definitions/strategy.hpp b/include/trading_definitions/strategy.hpp similarity index 100% rename from source/include/trading_definitions/strategy.hpp rename to include/trading_definitions/strategy.hpp diff --git a/source/include/trading_definitions/strategy_variables.hpp b/include/trading_definitions/strategy_variables.hpp similarity index 100% rename from source/include/trading_definitions/strategy_variables.hpp rename to include/trading_definitions/strategy_variables.hpp diff --git a/source/include/trading_definitions/trading_variables.hpp b/include/trading_definitions/trading_variables.hpp similarity index 100% rename from source/include/trading_definitions/trading_variables.hpp rename to include/trading_definitions/trading_variables.hpp diff --git a/source/include/utilities/base64.hpp b/include/utilities/base64.hpp similarity index 100% rename from source/include/utilities/base64.hpp rename to include/utilities/base64.hpp diff --git a/scripts/run.sh b/scripts/run.sh index 79e8dd8..7d323e1 100644 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -4,7 +4,7 @@ current_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Build the source code -source $current_dir/environment.sh +# source $current_dir/environment.sh - no longer necessary source $current_dir/clean.sh source $current_dir/build.sh @@ -49,5 +49,5 @@ output=$(echo "$json" | base64) # Step 6: Run the tests for now (/executable) from the root directory # Passing two arguements, the destination of the QuestDB and the Strategy JSON (in base64) -./"$BUILD_DIR/$EXECUTABLE_NAME" localhost "$output" +./"$BUILD_DIR/$EXECUTABLE_NAME" 100.85.44.114 "$output" diff --git a/source/jsonParser.cpp b/source/jsonParser.cpp index 37cffb7..648ab06 100644 --- a/source/jsonParser.cpp +++ b/source/jsonParser.cpp @@ -1,3 +1,9 @@ +// Backtesting Engine in C++ +// +// (c) 2025 Ryan McCaffery | https://mccaffers.com +// This code is licensed under MIT license (see LICENSE.txt for details) +// --------------------------------------- + #include "jsonParser.hpp" #include "base64.hpp" #include diff --git a/source/main.cpp b/source/main.cpp index 9f6ecea..9fb01da 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -22,6 +22,7 @@ #include "trading_definitions.hpp" // For everything #include "tradeManager.hpp" #include "jsonParser.hpp" +#include "sqlManager.hpp" using json = nlohmann::json; @@ -33,10 +34,7 @@ int main(int argc, const char * argv[]) { // Load strategy from Base64 argv[2] JsonParser::parseConfigurationFromBase64(argv[2]); - // Example query - replace with your actual query - std::string query = "SELECT * FROM EURUSD LIMIT 5;"; - - std::vector priceData = db.executeQuery(query); + std::vector priceData = SqlManager::getInitialPriceData(db); // Convert timestamp to readable format for debugging auto timeT = std::chrono::system_clock::to_time_t(priceData[0].timestamp); diff --git a/source/sqlManager.cpp b/source/sqlManager.cpp new file mode 100644 index 0000000..12152cd --- /dev/null +++ b/source/sqlManager.cpp @@ -0,0 +1,14 @@ +// Backtesting Engine in C++ +// +// (c) 2025 Ryan McCaffery | https://mccaffers.com +// This code is licensed under MIT license (see LICENSE.txt for details) +// --------------------------------------- +#include "sqlManager.hpp" + +std::string SqlManager::getBaseQuery() { + return "SELECT * FROM EURUSD LIMIT " + std::to_string(DEFAULT_LIMIT) + ";"; +} + +std::vector SqlManager::getInitialPriceData(const DatabaseConnection& db) { + return db.executeQuery(getBaseQuery()); +}