Skip to content

Instantly share code, notes, and snippets.

@maurodelazeri
Last active May 15, 2020 17:23
Show Gist options
  • Select an option

  • Save maurodelazeri/e216dd66b5b6bc109d0643e856884d11 to your computer and use it in GitHub Desktop.

Select an option

Save maurodelazeri/e216dd66b5b6bc109d0643e856884d11 to your computer and use it in GitHub Desktop.
#include <iostream>
#include <unordered_map>
#include <random>
#include <functional>
#include <iterator>
#include <sstream>
using namespace std;
enum entryType {
DEAL_ENTRY_IN = 0, DEAL_ENTRY_OUT = 1, DEAL_ENTRY_INOUT = 2, DEAL_ENTRY_OUT_BY = 3
};
struct Deal {
int entry;
double profit;
};
std::unordered_map<std::string, double> profit_loss_series_ = {{"profit_count", 0.0},
{"loss_count", 0.0},
{"profit_sum", 0.0},
{"loss_sum", 0.0},
{"current_profit_count", 0.0},
{"current_loss_count", 0.0},
{"current_profit_sum", 0.0},
{"current_loss_sum", 0.0}};
std::vector<double> create_random_data(unsigned int n, double from, double to) {
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 eng(seed); // a source of random data
std::uniform_real_distribution<double> dist(from, to);
std::vector<double> v(n);
generate(begin(v), end(v), bind(dist, eng));
return v;
}
void calculateSeriesProfitLoss(const Deal &data) {
if (data.entry == entryType::DEAL_ENTRY_OUT || data.entry == entryType::DEAL_ENTRY_OUT_BY ||
data.entry == entryType::DEAL_ENTRY_INOUT) {
// Not accounting for 0
if (data.profit > 0) {
if (profit_loss_series_["current_loss_count"] > profit_loss_series_["loss_count"]) {
profit_loss_series_["loss_count"] = profit_loss_series_["current_loss_count"];
profit_loss_series_["loss_sum"] = profit_loss_series_["current_loss_sum"];
} else if (profit_loss_series_["current_loss_count"] == profit_loss_series_["loss_count"]) {
if (profit_loss_series_["current_loss_sum"] > profit_loss_series_["loss_sum"]) {
profit_loss_series_["loss_count"] = profit_loss_series_["current_loss_count"];
profit_loss_series_["loss_sum"] = profit_loss_series_["current_loss_sum"];
}
}
profit_loss_series_["current_loss_count"] = 0.0;
profit_loss_series_["current_loss_sum"] = 0.0;
profit_loss_series_["current_profit_count"]++;
profit_loss_series_["current_profit_sum"] = profit_loss_series_["current_profit_sum"] + data.profit;
} else if (data.profit < 0) {
if (profit_loss_series_["current_profit_count"] > profit_loss_series_["profit_count"]) {
profit_loss_series_["profit_count"] = profit_loss_series_["current_profit_count"];
profit_loss_series_["profit_sum"] = profit_loss_series_["current_profit_sum"];
} else if (profit_loss_series_["current_profit_count"] == profit_loss_series_["loss_sum"]) {
if (profit_loss_series_["current_profit_count"] > profit_loss_series_["loss_sum"]) {
profit_loss_series_["profit_count"] = profit_loss_series_["current_profit_count"];
profit_loss_series_["profit_sum"] = profit_loss_series_["current_profit_sum"];
}
}
profit_loss_series_["current_profit_count"] = 0.0;
profit_loss_series_["current_profit_sum"] = 0.0;
profit_loss_series_["current_loss_count"]++;
profit_loss_series_["current_loss_sum"] = profit_loss_series_["current_loss_sum"] + data.profit;
}
}
}
int main() {
// auto randon_vec = create_random_data(10, -10, 10);
std::vector<double> randon_vec{8.04746, -6.40536, 1.72168, 1.47353, 1.99461, 4.02581, 2.32858, 5.84028, 4.61741,
-3.56588};
std::stringstream output;
std::copy(randon_vec.begin(), randon_vec.end(), std::ostream_iterator<double>(output, "|"));
for (auto const &num :randon_vec) {
calculateSeriesProfitLoss(Deal{DEAL_ENTRY_OUT, num});
cout << "---- BEGIN---" << endl;
for (auto const&[key, val] : profit_loss_series_) {
if (key.find("current") != std::string::npos){ // doing this to not show the current key
continue;
}
cout << key << " " << val << endl;
}
cout << "---- END---\n" << endl;
}
cout << output.str() << endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment