Skip to content
Merged
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 CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ SET( SOURCE_FILES
common/avgcoststocks.cpp
common/chart.cpp
common/csvmodel.cpp
common/tradelog.cpp
main.cpp)
SET( HEADER_FILES
Model/acsmodel.h
Expand All @@ -71,7 +72,8 @@ SET( HEADER_FILES
common/threadpool.h
common/timer.h
common/csvreader.h
common/csvmodel.h )
common/csvmodel.h
common/tradelog.h)

#file(GLOB CLIENT_FILE *.cpp *.h)

Expand Down
4 changes: 2 additions & 2 deletions Model/acsmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,11 @@ QVariant ACSModel::headerData(int section, Qt::Orientation orientation, int role
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
switch (section) {
case 0:
return QString("Assets");
return QString("Amount");
case 1:
return QString("Price");
case 2:
return QString("TotalAmount");
return QString("Total");
}
}

Expand Down
25 changes: 16 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
#Service Stock Markets
## Service Stock Markets
The service for calculate some parameters stock market
##Requirements
<br>-QT
## Requirements
<br>-C++17 compiler support
<br>-Cmake
<br>-QT
<br>-Doxygen
<br>-C++17 compiler support
##Build

## Build
git clone https://github.com/silverstringer/ssm.git

mkdir build && cd build
Expand All @@ -14,18 +15,24 @@ cmake ..

make -j8

##Install
## Install
make install

##Run
## Run


##Usage
## Usage
1) Simple Dollar Cost Average Digital Asset( on bull market)
2) Different percentage on month
3) Calculate average price of asset

*Advanced. Save result on *.csv file, build graph
*Advanced. Save resultDCA on *.csv file, build graph

## TODO.
1.Assets allocation by percentage [ ]

2.Import history order from broker [ ]

3.Analyze history orders, profit and loss all assets [any]

4.Usage DB sqlite for store or csv?
2 changes: 1 addition & 1 deletion common/avgcoststocks.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@


/**
* @brief average result of buy assets
* @brief average resultDCA of buy assets
*/
class AvgCostStocks : public QWidget
{
Expand Down
139 changes: 123 additions & 16 deletions common/chart.cpp
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
#include "chart.h"
QT_CHARTS_USE_NAMESPACE


Graph::Graph() {

m_datetimeFormat = "yyyy-MM-dd HH:mm:ss";
}

void Graph::setChartView(QChart *chart)
{
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
chartView->setRubberBand(QChartView::HorizontalRubberBand); //for zoom graph

QDialog *dialog = new QDialog();
dialog->setWindowTitle(title);
dialog->setWindowTitle(m_title);
QVBoxLayout *mainlayout = new QVBoxLayout();
mainlayout->addWidget(chartView);

Expand All @@ -33,30 +39,71 @@ void Graph::buildBarChart(const std::map<QString,int> &data) {

QChart *chart = new QChart();
chart->addSeries(series);
chart->setTitle(title);
chart->setTitle(m_title);
chart->setAnimationOptions(QChart::SeriesAnimations);

QStringList categories;
categories << titleAxisX;
categories << m_titleAxisX;
QBarCategoryAxis *axisX = new QBarCategoryAxis();
axisX->append(categories);
chart->addAxis(axisX, Qt::AlignBottom);
series->attachAxis(axisX);

QValueAxis *axisY = new QValueAxis();
auto max = std::max_element(data.begin(), data.end(),
[](const std::pair<QString, int> &p1, const std::pair<QString, int> &p2) {
return p1.second < p2.second;
});
auto min = std::min_element(data.begin(), data.end(),
[](const std::pair<QString, int> &p1, const std::pair<QString, int> &p2) {
return p1.second < p2.second;
});

axisY->setRange(0, max->second + min->second);
axisY->setTickCount(10);
auto param = min_max_range_element(data);
axisY->setRange(0, param.first + param.second);

axisY->setTitleText(titleAxisY);
axisY->setTickCount(data.size() * 1.5);

axisY->setTitleText(m_titleAxisY);
chart->legend()->setVisible(true);
chart->legend()->setAlignment(Qt::AlignBottom);
chart->addAxis(axisY, Qt::AlignLeft);
series->attachAxis(axisY);

setChartView(chart);

}


void Graph::buildBarChartDiffDepo(const std::map<QString,int> &data)
{

QBarSet *set[data.size()];
auto depo = data.begin()->second;
QStackedBarSeries *series = new QStackedBarSeries();
int i = 0;
for (auto&& [key, value] : data) {
set[i] = new QBarSet(key);
*set[i] <<depo<<value;
// *set[i] <<0<<3<<4<<8<<45<<90<<123<<450 <<600<<900<<0<<0;
// *set[i] <<m_depo<<value<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0;
series->append(set[i]);
i++;
}

QChart *chart = new QChart();
chart->addSeries(series);
chart->setTitle(m_title);
chart->setAnimationOptions(QChart::SeriesAnimations);

QStringList categories;
for (auto&& [key, value] : data) {
categories << key;
}

QBarCategoryAxis *axisX = new QBarCategoryAxis();
axisX->append(categories);
chart->addAxis(axisX, Qt::AlignBottom);
series->attachAxis(axisX);

QValueAxis *axisY = new QValueAxis();
auto param = min_max_range_element(data);

// axisY->setRange(0, max->second + min->second);
// axisY->setTickCount(data.size() * 1.5);

axisY->setTitleText(m_titleAxisY);
chart->legend()->setVisible(true);
chart->legend()->setAlignment(Qt::AlignBottom);
chart->addAxis(axisY, Qt::AlignLeft);
Expand All @@ -77,7 +124,7 @@ void Graph::buildLineChart(const std::map<int,int> &data) {
chart->legend()->hide();
chart->addSeries(series);
chart->createDefaultAxes();
chart->setTitle(titleAxisY);
chart->setTitle(m_titleAxisY);
// QValueAxis *axisY = new QValueAxis();
//
// axisY->setTickCount(10);
Expand All @@ -91,3 +138,63 @@ void Graph::buildLineChart(const std::map<int,int> &data) {

setChartView(chart);
}

void Graph::buildDateTimeAxes(const std::map<QString,int> &data) {

QLineSeries *series = new QLineSeries();

for (auto items : data) {
QDateTime momentInTime = QDateTime::fromString(items.first, m_datetimeFormat);
series->append(momentInTime.toMSecsSinceEpoch(), items.second);
}

QChart *chart = new QChart();
chart->legend()->hide();
chart->addSeries(series);
chart->setTitle(m_titleAxisY);


QDateTimeAxis * axisX = new QDateTimeAxis;
axisX->setTickCount(10);
// axisX->setTickCount(data.size()/4);
axisX->setFormat(m_datetimeFormat);
chart->addAxis(axisX, Qt::AlignBottom);
series->attachAxis(axisX);


auto param = min_max_range_element(data);

QValueAxis * axisY = new QValueAxis;
axisY->setLabelFormat(" %i");
axisY->setRange(0, param.first + param.second);
axisY->setTickCount(10);

axisY->setTitleText(m_titleAxisY);
chart->addAxis(axisY, Qt::AlignLeft);
series->attachAxis(axisY);

setChartView(chart);
}

void Graph::buildPieChart(const std::map<QString,int> &data) {

QPieSeries * series = new QPieSeries();
for(auto &items: data)
series->append(items.first, items.second);

series->setLabelsVisible(true);
series->setLabelsPosition(QPieSlice::LabelInsideHorizontal);

QPieSlice * slice = series->slices().at(1);
for( auto slice : series->slices())
slice->setLabel(QString("%1% %2").arg(100 * slice->percentage(), 0, 'f', 1).arg(slice->label()));
slice->setExploded();
slice->setLabelVisible();
slice->setPen(QPen(Qt::darkGreen,2));
slice->setBrush(Qt::green);

QChart *chart = new QChart();
// chart->legend()->hide();
chart->addSeries(series);
setChartView(chart);
}
62 changes: 53 additions & 9 deletions common/chart.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,63 @@
#include <QDialog>
#include <QtCharts/QChartView>
#include <QtCharts/QBarSeries>
#include <QtCharts/QStackedBarSeries>
#include <QtCharts/QBarSet>
#include <QtCharts/QLegend>
#include <QtCharts/QBarCategoryAxis>
#include <QtCharts/QValueAxis>
#include <QtCharts/QLineSeries>
#include <QtCharts/QPieSeries>
#include <QtCharts>
#include <QVBoxLayout>

#include <map>
#include <utility>
#include <type_traits>


template<typename Container>
auto min_max_range_element (Container &data) {

auto max = std::max_element(data.begin(), data.end(),
[](const std::pair<QString, int> &p1, const std::pair<QString, int> &p2) {
return p1.second < p2.second;
});

auto min = std::min_element(data.begin(), data.end(),
[](const std::pair<QString, int> &p1, const std::pair<QString, int> &p2) {
return p1.second < p2.second;
});
return std::make_pair(min->second, max->second);
}

class Graph {
public:
enum class TypeChart {
BarChart,
LineChart
LineChart,
DateTimeAxesChart,
PieChart,
};

Graph() = default;
Graph();

void setTitleGraph(const QString title, const QString titleX, const QString titleY)
{
this->title = title;
titleAxisX = titleX;
titleAxisY = titleY;
this->m_title = title;
m_titleAxisX = titleX;
m_titleAxisY = titleY;
}

void setType(TypeChart type ) {
m_type = type;
}

void buildBarChart(const std::map<QString,int> &data);
void buildBarChartDiffDepo(const std::map<QString,int> &data);
void buildLineChart(const std::map<int,int> &data);
void buildDateTimeAxes(const std::map<QString, int> &data); // build graph by timelineseries
void buildPieChart(const std::map<QString,int> &data);

/**
*
Expand All @@ -52,15 +76,35 @@ class Graph {
// buildLineChart(dataset);
// }


// template <typename T>
// void build( T& dataset)
// {
// if(m_type == TypeChart::BarChart)
// buildBarChart(dataset);
// if(m_type == TypeChart::LineChart)
// buildLineChart(dataset);
// }

// template<>
// void build<std::map<QString,int>>(std::map<QString,int>& dataset)
// {
// if(m_type == TypeChart::BarChart)
// buildBarChart(dataset);
// }



protected:
void setChartView(QChart *chart);

private:
QString title;
QString titleAxisX;
QString titleAxisY;
QString m_title;
QString m_titleAxisX;
QString m_titleAxisY;
QString m_datetimeFormat;
TypeChart m_type;
};

};

#endif // CHART_H
3 changes: 0 additions & 3 deletions common/csvmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@ void CsvModel::build(const std::string filename, char delimeter) {

auto column = reader_csv.getSizeGrid().first;
auto rows = reader_csv.getSizeGrid().second;
std::cout << "Counter column: " << column << "\n";
std::cout << "Counter rows: " << rows << "\n";


QDialog *dlg = new QDialog();
dlg->setWindowTitle(QString::fromStdString(m_titleWindow));
Expand Down
Loading