Browse Source

Market data/charts

dev
fekt 4 weeks ago
parent
commit
5ce2cd53b9
  1. 2
      README.md
  2. 1
      silentdragon.pro
  3. 1
      silentdragonx.pro
  4. 12
      src/mainwindow.cpp
  5. 5
      src/mainwindow.h
  6. 222
      src/mainwindow.ui
  7. 220
      src/rpc.cpp
  8. 1
      src/rpc.h

2
README.md

@ -84,7 +84,7 @@ sudo apt-get -y install libglu1-mesa-dev freeglut3-dev mesa-common-dev
You can install the pre-reqs and build on Ubuntu 18.04 & 20.04 with:
```shell script
sudo apt-get -y install qt5-default qt5-qmake qtcreator
sudo apt-get -y install qt5-default qt5-qmake qtcreator libqt5charts5-dev
git clone https://git.hush.is/hush/SilentDragon
cd SilentDragon
./build.sh linguist

1
silentdragon.pro

@ -9,6 +9,7 @@ CONFIG += precompile_header
PRECOMPILED_HEADER = src/precompiled.h
QT += widgets
QT += charts
TARGET = silentdragon

1
silentdragonx.pro

@ -8,6 +8,7 @@ CONFIG += precompile_header
PRECOMPILED_HEADER = src/precompiled.h
QT += widgets
QT += charts
TARGET = silentdragonx

12
src/mainwindow.cpp

@ -25,6 +25,7 @@
#include "requestdialog.h"
#include <QLCDNumber>
#include <QThread>
#include <QtCharts>
#include "sd.h"
extern bool isdragonx;
@ -2247,6 +2248,10 @@ void MainWindow::setupMarketTab() {
ui->volume->setText(QString::number((double) s->get_volume("HUSH") ,'f',8) + " HUSH");
ui->volumeLocal->setText(QString::number((double) s->get_volume(ticker) ,'f',8) + " " + ticker);
ui->volumeBTC->setText(QString::number((double) s->get_volume("BTC") ,'f',8) + " BTC");
ui->chartType->addItem("Price");
ui->chartType->addItem("Volume");
//ui->chartType->addItem("Marketcap");
}
void MainWindow::setupTransactionsTab() {
@ -2848,3 +2853,10 @@ MainWindow::~MainWindow()
delete logger;
}
void MainWindow::on_chartType_currentTextChanged(const QString &chartType)
{
qDebug() << "chartType = " << chartType;
rpc->getMarketChart(chartType);
}

5
src/mainwindow.h

@ -81,7 +81,10 @@ protected slots:
// this slot is called by the language menu actions
void slotLanguageChanged(QString lang);
private:
private slots:
void on_chartType_currentTextChanged(const QString &chartType);
private:
void closeEvent(QCloseEvent* event);

222
src/mainwindow.ui

@ -14,7 +14,7 @@
<string>SilentDragon</string>
</property>
<property name="windowIcon">
<iconset resource="../application.qrc">
<iconset resource="../application-sdx.qrc">
<normaloff>:/icons/icon.ico</normaloff>:/icons/icon.ico</iconset>
</property>
<widget class="QWidget" name="centralWidget">
@ -22,7 +22,7 @@
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
<number>5</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
@ -388,8 +388,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>1447</width>
<height>860</height>
<width>1439</width>
<height>899</height>
</rect>
</property>
<layout class="QVBoxLayout" name="sendToLayout">
@ -1053,145 +1053,181 @@
<string>Market</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_5">
<item row="11" column="0" colspan="3">
<widget class="QLabel" name="label_24">
<property name="font">
<font>
<pointsize>15</pointsize>
</font>
</property>
<item row="3" column="3">
<widget class="QLabel" name="marketcapBTC">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Market Information&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="12" column="0" colspan="3">
<widget class="Line" name="line_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<string>Loading...</string>
</property>
</widget>
</item>
<item row="13" column="0">
<item row="3" column="0">
<widget class="QLabel" name="label_31">
<property name="text">
<string>Market Cap</string>
</property>
</widget>
</item>
<item row="13" column="1">
<widget class="QLabel" name="marketcap">
<item row="4" column="2">
<widget class="QLabel" name="volumeLocal">
<property name="text">
<string>Loading...</string>
</property>
</widget>
</item>
<item row="13" column="2">
<item row="3" column="2">
<widget class="QLabel" name="marketcapLocal">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="13" column="3">
<widget class="QLabel" name="marketcapBTC">
<item row="3" column="1">
<widget class="QLabel" name="marketcap">
<property name="text">
<string>Loading...</string>
</property>
</widget>
</item>
<item row="14" column="0">
<widget class="QLabel" name="volumeLabel">
<item row="4" column="1">
<widget class="QLabel" name="volume">
<property name="text">
<string>24H Volume</string>
<string>Loading...</string>
</property>
</widget>
</item>
<item row="14" column="1">
<widget class="QLabel" name="volume">
<property name="text">
<string>Loading...</string>
<item row="2" column="0" colspan="4">
<widget class="Line" name="line_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="14" column="2">
<widget class="QLabel" name="volumeLocal">
<item row="4" column="0">
<widget class="QLabel" name="volumeLabel">
<property name="text">
<string>Loading...</string>
<string>24H Volume</string>
</property>
</widget>
</item>
<item row="14" column="3">
<item row="4" column="3">
<widget class="QLabel" name="volumeBTC">
<property name="text">
<string>Loading...</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="4">
<widget class="QChartView" name="marketChart">
<property name="autoFillBackground">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QComboBox" name="chartType">
<property name="palette">
<palette>
<active>
<colorrole role="PlaceholderText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>192</red>
<green>191</green>
<blue>188</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="PlaceholderText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>192</red>
<green>191</green>
<blue>188</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="PlaceholderText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>192</red>
<green>191</green>
<blue>188</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="currentText">
<string/>
</property>
<property name="placeholderText">
<string>Select chart to display</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_debug">
<attribute name="title">
<string>Debug Log</string>
</attribute>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QPushButton" name="refreshDebugButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
Click to see the latest debug log data
<string/>
</property>
<property name="text">
<string>Refresh</string>
</property>
</widget>
</item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QPushButton" name="refreshDebugButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string/>
</property>
<property name="text">
<string>Refresh</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="debugLabel">
<property name="text">
<string>Number of lines to show</string>
</property>
</widget>
<widget class="QLabel" name="debugLabel">
<property name="text">
<string>Number of lines to show</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLineEdit" name="debugLines">
<property name="enabled">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>50</string>
</property>
</widget>
<widget class="QLineEdit" name="debugLines">
<property name="enabled">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>50</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="4">
<widget class="QPlainTextEdit" name="debugLog">
<property name="plainText">
<string/>
</property>
</widget>
</item>
<item row="1" column="0" colspan="4">
<widget class="QPlainTextEdit" name="debugLog">
<property name="plainText">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_5">
<attribute name="title">
<string>Node info</string>
@ -1664,14 +1700,13 @@
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1487</width>
<height>30</height>
<height>22</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@ -1838,6 +1873,11 @@
<extends>QLabel</extends>
<header>qrcodelabel.h</header>
</customwidget>
<customwidget>
<class>QChartView</class>
<extends>QGraphicsView</extends>
<header location="global">QtCharts</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>inputsCombo</tabstop>
@ -1863,7 +1903,7 @@
<tabstop>sendToScrollArea</tabstop>
</tabstops>
<resources>
<include location="../application.qrc"/>
<include location="../application-sdx.qrc"/>
</resources>
<connections/>
</ui>

220
src/rpc.cpp

@ -1574,12 +1574,15 @@ void RPC::refreshPrice() {
return noConnection();
QString price_feed;
QString history_feed;
// TODO: Make price_feed dynamic to support HACs
// TODO: Make feeds dynamic to support HACs
if (isdragonx) {
price_feed = "https://api.coingecko.com/api/v3/simple/price?ids=dragonx-2&vs_currencies=btc%2Cusd%2Ceur%2Ceth%2Cgbp%2Ccny%2Cjpy%2Cidr%2Crub%2Ccad%2Csgd%2Cchf%2Cinr%2Caud%2Cinr%2Ckrw%2Cthb%2Cnzd%2Czar%2Cvef%2Cxau%2Cxag%2Cvnd%2Csar%2Ctwd%2Caed%2Cars%2Cbdt%2Cbhd%2Cbmd%2Cbrl%2Cclp%2Cczk%2Cdkk%2Chuf%2Cils%2Ckwd%2Clkr%2Cpkr%2Cnok%2Ctry%2Csek%2Cmxn%2Cuah%2Chkd&include_market_cap=true&include_24hr_vol=true&include_24hr_change=true";
history_feed = "https://api.coingecko.com/api/v3/coins/dragonx-2/market_chart?vs_currency=usd&days=90&precision=full";
} else {
price_feed = "https://api.coingecko.com/api/v3/simple/price?ids=hush&vs_currencies=btc%2Cusd%2Ceur%2Ceth%2Cgbp%2Ccny%2Cjpy%2Cidr%2Crub%2Ccad%2Csgd%2Cchf%2Cinr%2Caud%2Cinr%2Ckrw%2Cthb%2Cnzd%2Czar%2Cvef%2Cxau%2Cxag%2Cvnd%2Csar%2Ctwd%2Caed%2Cars%2Cbdt%2Cbhd%2Cbmd%2Cbrl%2Cclp%2Cczk%2Cdkk%2Chuf%2Cils%2Ckwd%2Clkr%2Cpkr%2Cnok%2Ctry%2Csek%2Cmxn%2Cuah%2Chkd&include_market_cap=true&include_24hr_vol=true&include_24hr_change=true";
history_feed = "https://api.coingecko.com/api/v3/coins/hush/market_chart?vs_currency=usd&days=90&precision=full";
}
auto s = Settings::getInstance();
@ -1713,6 +1716,221 @@ void RPC::refreshPrice() {
Settings::getInstance()->setHUSHPrice(0);
Settings::getInstance()->setBTCPrice(0);
});
getMarketChart("Price");
}
// Get price history chart
void RPC::getMarketChart(QString chartType) {
if (conn == nullptr)
return noConnection();
QString history_feed;
// TODO: Make feeds dynamic to support HACs
if (isdragonx) {
history_feed = "https://api.coingecko.com/api/v3/coins/dragonx-2/market_chart?vs_currency=usd&days=7";
} else {
history_feed = "https://api.coingecko.com/api/v3/coins/hush/market_chart?vs_currency=usd&days=7";
}
auto s = Settings::getInstance();
if (s->getAllowFetchPrices() == false) {
qDebug() << "Price fetching disabled";
return;
}
qDebug() << "Requesting history feed data via " << history_feed;
QUrl histURL(history_feed);
QNetworkRequest req;
req.setUrl(histURL);
QNetworkReply *reply = conn->restclient->get(req);
QObject::connect(reply, &QNetworkReply::finished, [=] {
reply->deleteLater();
try {
QByteArray ba_raw_reply = reply->readAll();
QString raw_reply = QString::fromUtf8(ba_raw_reply);
QByteArray unescaped_raw_reply = raw_reply.toUtf8();
QJsonDocument jd_reply = QJsonDocument::fromJson(unescaped_raw_reply);
QJsonObject parsed = jd_reply.object();
QJsonArray prices = parsed["prices"].toArray();
QJsonArray volumes = parsed["total_volumes"].toArray();
QJsonArray mcaps = parsed["market_caps"].toArray();
if (prices.size()>0 && volumes.size()>0) {
// Create Price Series
QLineSeries *priceSeries = new QLineSeries();
// Loop through price data and add to series
for (int i = 0; i < prices.size(); i++){
// QJson doesn't support long ints so we convert - https://bugreports.qt.io/browse/QTBUG-28560
quint64 timestamp = QString("%1").arg(prices.at(i).toArray().at(0).toDouble(),0,'f',0).toLongLong();
auto price = prices.at(i).toArray().at(1).toDouble();
qDebug() << "Epoch = " << timestamp;
qDebug() << "Price = " << price;
priceSeries->append(timestamp, price);
}
// Set color of price series
priceSeries->setColor(Qt::green);
// Create Price chart
QChart *priceChart = new QChart();
priceChart->setTitleBrush(QBrush(Qt::darkGray));
priceChart->addSeries(priceSeries);
priceChart->setTitle("Price History");
priceChart->setBackgroundVisible(false);
priceChart->legend()->hide();
auto priceaxisX = new QDateTimeAxis;
priceaxisX->setTickCount(7);
priceaxisX->setFormat("yyyy-MM-dd");
priceaxisX->setLabelsColor(Qt::lightGray);
priceaxisX->setGridLineColor(Qt::darkGray);
priceaxisX->setTitleText("Date");
priceChart->addAxis(priceaxisX, Qt::AlignBottom);
priceSeries->attachAxis(priceaxisX);
auto priceaxisY = new QValueAxis;
priceaxisY->setTickCount(10);
priceaxisY->setLabelsColor(Qt::lightGray);
priceaxisY->setGridLineColor(Qt::darkGray);
priceaxisY->setTitleText("USD Price");
priceChart->addAxis(priceaxisY, Qt::AlignLeft);
priceSeries->attachAxis(priceaxisY);
// Create Volume Series
QLineSeries *volumeSeries = new QLineSeries();
// Loop through price data and add to series
for (int i = 0; i < volumes.size(); i++){
// QJson doesn't support long ints so we convert - https://bugreports.qt.io/browse/QTBUG-28560
quint64 timestamp = QString("%1").arg(volumes.at(i).toArray().at(0).toDouble(),0,'f',0).toLongLong();
auto volume = volumes.at(i).toArray().at(1).toDouble();
qDebug() << "Epoch = " << timestamp;
qDebug() << "Volume = " << volume;
volumeSeries->append(timestamp, volume);
}
// Set color of Volume series
volumeSeries->setColor(Qt::green);
// Create Volume chart
QChart *volumeChart = new QChart();
volumeChart->setTitleBrush(QBrush(Qt::darkGray));
volumeChart->addSeries(volumeSeries);
volumeChart->setTitle("Volume History");
volumeChart->setBackgroundVisible(false);
volumeChart->legend()->hide();
auto volumeaxisX = new QDateTimeAxis;
volumeaxisX->setTickCount(7);
volumeaxisX->setFormat("yyyy-MM-dd");
volumeaxisX->setLabelsColor(Qt::lightGray);
volumeaxisX->setGridLineColor(Qt::darkGray);
volumeaxisX->setTitleText("Date");
volumeChart->addAxis(volumeaxisX, Qt::AlignBottom);
volumeSeries->attachAxis(volumeaxisX);
auto volumeaxisY = new QValueAxis;
volumeaxisY->setTickCount(10);
volumeaxisY->setLabelsColor(Qt::lightGray);
volumeaxisY->setGridLineColor(Qt::darkGray);
volumeaxisY->setTitleText("DRGX");
volumeChart->addAxis(volumeaxisY, Qt::AlignLeft);
volumeSeries->attachAxis(volumeaxisY);
// Create Market Cap Series
QLineSeries *mcapSeries = new QLineSeries();
// Loop through price data and add to series
for (int i = 0; i < mcaps.size(); i++){
// QJson doesn't support long ints so we convert - https://bugreports.qt.io/browse/QTBUG-28560
quint64 timestamp = QString("%1").arg(mcaps.at(i).toArray().at(0).toDouble(),0,'f',0).toLongLong();
auto mcap = mcaps.at(i).toArray().at(1).toDouble();
qDebug() << "Epoch = " << timestamp;
qDebug() << "Mcap = " << mcap;
mcapSeries->append(timestamp, mcap);
}
// Set color of Market Cap series
mcapSeries->setColor(Qt::green);
// Create Market Cap chart
QChart *mcapChart = new QChart();
mcapChart->setTitleBrush(QBrush(Qt::darkGray));
mcapChart->addSeries(mcapSeries);
mcapChart->setTitle("Market Cap History");
mcapChart->setBackgroundVisible(false);
mcapChart->legend()->hide();
auto mcapaxisX = new QDateTimeAxis;
mcapaxisX->setTickCount(7);
mcapaxisX->setFormat("yyyy-MM-dd");
mcapaxisX->setLabelsColor(Qt::lightGray);
mcapaxisX->setGridLineColor(Qt::darkGray);
mcapaxisX->setTitleText("Date");
mcapChart->addAxis(mcapaxisX, Qt::AlignBottom);
mcapSeries->attachAxis(mcapaxisX);
auto mcapaxisY = new QValueAxis;
mcapaxisY->setTickCount(10);
mcapaxisY->setLabelsColor(Qt::lightGray);
mcapaxisY->setGridLineColor(Qt::darkGray);
mcapaxisY->setTitleText("DRGX");
mcapChart->addAxis(mcapaxisY, Qt::AlignLeft);
mcapSeries->attachAxis(mcapaxisY);
// Add chart to UI
qDebug() << "chartType = " << chartType;
if(chartType=="Price") {
ui->marketChart->setChart(priceChart);
} else if(chartType=="Volume") {
ui->marketChart->setChart(volumeChart);
} else if(chartType=="Marketcap") {
ui->marketChart->setChart(mcapChart);
} else{
ui->marketChart->setChart(priceChart);
}
// Set anti-aliasing
ui->marketChart->setRenderHint(QPainter::Antialiasing, true);
return;
} else {
qDebug() << "No market_chart history returned. API might be down or we are rate-limited";
QMessageBox msgBox;
msgBox.setText("No market data returned. API is down or rate limited. Try again after a minute.");
msgBox.exec();
}
} catch (const std::exception& e) {
qDebug() << QString("History feed update failure");
}
});
}
void RPC::shutdownHushd() {

1
src/rpc.h

@ -76,6 +76,7 @@ public:
void checkForUpdate(bool silent = true);
void refreshPrice();
void getMarketChart(QString chartType);
void executeTransaction(Tx tx,
const std::function<void(QString opid)> submitted,

Loading…
Cancel
Save