Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
build/
build/
.idea/
.__DS_STORE__
54 changes: 46 additions & 8 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,17 +1,55 @@
#Declare the project and it's langugages
cmake_minimum_required(VERSION 3.21)
project(learnsomething LANGUAGES CXX)

#Make C++ 20 required.
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

#Fetch GTest
include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG release-1.11.0
googletest
URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) #windows tings
FetchContent_MakeAvailable(googletest)
enable_testing()

FetchContent_Declare(
quill
GIT_REPOSITORY https://github.com/odygrd/quill.git
GIT_TAG master
)

FetchContent_MakeAvailable(quill)

add_executable(
TradeRiskTracker
${CMAKE_SOURCE_DIR}/src/main.cpp
${CMAKE_SOURCE_DIR}/src/trade.cpp
${CMAKE_SOURCE_DIR}/src/risktracker.cpp
)
target_include_directories(
TradeRiskTracker PRIVATE
${CMAKE_SOURCE_DIR}/src
)

target_link_libraries(
TradeRiskTracker
GTest::gtest_main
quill
)

add_executable(
TradeRiskTrackerTests
${CMAKE_SOURCE_DIR}/tst/test_trade.cpp
${CMAKE_SOURCE_DIR}/tst/test_traderisktracker.cpp
${CMAKE_SOURCE_DIR}/src/trade.cpp
${CMAKE_SOURCE_DIR}/src/risktracker.cpp
)
target_include_directories(
TradeRiskTrackerTests PRIVATE
${CMAKE_SOURCE_DIR}/src
)
target_link_libraries(
TradeRiskTrackerTests
GTest::gtest_main
)
30 changes: 29 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,30 @@
# unnamed learning project
# Part 0: Debugging, Logging, and PRs.

## Scenario
It is your first day as a SWE at a trading firm that specializes in trading Oleos, a fictional currency. Your team's intern, during their final week, created this risk tracking utility to help traders keep track of their risk exposure. Unfortunately, the intern has already left for their next internship and you are left to debug and fix the code. The traders tell you that the script is not working as expected and they are losing money because of it. You have been tasked with fixing the script and ensuring that it is working as expected. Consider the following tips:
- Read the code and understand what it is doing - all of the unit tests will pass.
- Use the logging library to help you understand what is happening in the code.

## Instructions
- [ ] Add yourself to the `progress.md` file on the main branch.
- [ ] Fork this repo for yourself
- [ ] Clone the repo locally (Ensure you are on Branch 0!)
- [ ] Navigate to the repository root and use `mkdir build && cd build` to create a build directory and navigate to it
- [ ] Use `task build` to build the project, `./TradeRiskTracker` to run the executable, and `task test` to run the tests
- [ ] Identify the bug in the script and fix it
- [ ] Update unit tests to cover the bug
- [ ] Create a PR answering the questions below and send it to your project mentor


## Questions
Please include the following when you are writing your PR:
General things:
1. What is the purpose of this PR?
2. What changes did you make? Why?
3. What bugs did you find while testing?

This PR Specific:
1. What was the bug you found?
2. How did you address it?
3. What did you struggle with?
4. Is there anything you would change about this step?
15 changes: 15 additions & 0 deletions Taskfile.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
version: '3'

tasks:
build:
dir: './build'
cmds:
- cmake ..
- cmake --build .

test:
dir: './build'
cmds:
- cmake ..
- cmake --build .
- ./TradeRiskTrackerTests
Empty file removed src/init.cpp
Empty file.
28 changes: 28 additions & 0 deletions src/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#include <iostream>
#include <vector>
#include <quill/Quill.h>

#include "trade.h"
#include "risktracker.h"

int main() {
//logging setup start
quill::start();
quill::Logger *logger = quill::create_logger("RiskTrackingLogger");
logger->set_log_level(quill::LogLevel::TraceL2);
// logging setup end

std::vector <Trade> trades;
trades.push_back(Trade(7, false, 1.4));
RiskTracker riskTracker(0.0, trades);
QUILL_LOG_INFO(logger, "Current risk held is {}.", riskTracker.getRisk());
riskTracker.addTrade(Trade(7, false, 1.6));
riskTracker.updateRisk();
QUILL_LOG_INFO(logger, "Current risk held is {}.", riskTracker.getRisk());
riskTracker.addTrade(Trade(44, true, 2.3));
riskTracker.updateRisk();
QUILL_LOG_INFO(logger, "Current risk held is {}.", riskTracker.getRisk());
riskTracker.updateRisk();
QUILL_LOG_INFO(logger, "Current risk held is {}.", riskTracker.getRisk());
return 0;
}
31 changes: 31 additions & 0 deletions src/risktracker.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// Created by Ethan on 8/16/2023.
//

#include "risktracker.h"

RiskTracker::RiskTracker(float x, std::vector <Trade> trades) : totalRisk(x), pendingTrades(trades) {};

int RiskTracker::updateRisk() {
float runningSum = 0;
for (const auto &x: this->pendingTrades) {
if (x.side) {
runningSum += (x.price * x.quantity);
} else {
runningSum -= (x.price * x.quantity);
}
}
this->totalRisk += runningSum;
this->pendingTrades.clear();
return 0;
}

int RiskTracker::addTrade(Trade trade) {
this->pendingTrades.push_back(trade);
return 0;
}

float RiskTracker::getRisk() {
return this->totalRisk;
}

24 changes: 24 additions & 0 deletions src/risktracker.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//
// Created by Ethan on 8/16/2023.
//
#include <vector>
#include "trade.h"

#ifndef LEARNSOMETHING_RISKTRACKER_H
#define LEARNSOMETHING_RISKTRACKER_H

class RiskTracker {
public:
float totalRisk = 0;
std::vector <Trade> pendingTrades;

RiskTracker(float x, std::vector <Trade> trades);

int updateRisk();

int addTrade(Trade trade);

float getRisk();
};

#endif //LEARNSOMETHING_RISKTRACKER_H
4 changes: 4 additions & 0 deletions src/trade.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#include "trade.h"

//Initialize with the initializer list.
Trade::Trade(int q, bool buy, float p) : quantity(q), side(buy), price(p) {};
12 changes: 12 additions & 0 deletions src/trade.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef TRADE_H
#define TRADE_H

class Trade {
public:
int quantity;
bool side;
float price;
Trade(int q, bool buy, float p);
};

#endif // TRADE_H
1 change: 0 additions & 1 deletion tst/temp.cpp

This file was deleted.

9 changes: 9 additions & 0 deletions tst/test_trade.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#include "trade.h"
#include <gtest/gtest.h>

TEST(TradeRiskTrackerTest, TradeInit) {
Trade testTrade(7, true, 1.2);
EXPECT_EQ(testTrade.quantity, 7);
EXPECT_NEAR(testTrade.price, 1.2, 1e-6); //fp
EXPECT_EQ(testTrade.side, true);
}
40 changes: 40 additions & 0 deletions tst/test_traderisktracker.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#include "trade.h"
#include "risktracker.h"
#include <gtest/gtest.h>
#include <vector>

TEST(TradeRiskTrackerTest, TrackerInit) {
std::vector<Trade> trackedTrades;
Trade testTrade1(7, true, 1.2);
Trade testTrade2(7, false, 1.2);
trackedTrades.push_back(testTrade1);
trackedTrades.push_back(testTrade2);
RiskTracker riskTracker(0, trackedTrades);
EXPECT_NEAR(riskTracker.getRisk(), 0, 1e-4);
riskTracker.updateRisk();
EXPECT_NEAR(riskTracker.getRisk(), 0, 1e-4);
Trade testTrade3(14, true, 1.55);
riskTracker.addTrade(testTrade3);
riskTracker.updateRisk();
EXPECT_NEAR(riskTracker.getRisk(), 21.7, 1e-4);
}

TEST(TradeRiskTrackerTest, TrackerZeroTest) {
std::vector<Trade> trackedTrades;
RiskTracker riskTracker(0, trackedTrades);
EXPECT_NEAR(riskTracker.getRisk(), 0, 1e-4);
riskTracker.addTrade(Trade(44, true, 1.6));
riskTracker.addTrade(Trade(44, false, 1.6));
riskTracker.updateRisk();
EXPECT_NEAR(riskTracker.getRisk(), 0, 1e-4);
}

TEST(TradeRiskTrackerTest, UpdateRiskTrackerTest) {
std::vector<Trade> trackedTrades;
RiskTracker riskTracker(0, trackedTrades);
riskTracker.addTrade(Trade(44, true, 1.6));
riskTracker.addTrade(Trade(44, false, 1.6));
riskTracker.updateRisk();
EXPECT_TRUE(riskTracker.pendingTrades.empty());

}