forked from Syntax-Error/TradeSim
Added my own modification
This commit is contained in:
parent
40535f6ff1
commit
4639971faa
15 changed files with 138 additions and 14 deletions
|
@ -7,7 +7,7 @@ set(CMAKE_CXX_STANDARD 14)
|
|||
|
||||
add_subdirectory(external/curl)
|
||||
add_subdirectory(external/jsoncpp)
|
||||
add_executable(TradeSim main.cpp src/Market.cpp src/Market.h src/Exchange.cpp src/Exchange.h src/Trader.h src/TradeTracker.cpp src/TradeTracker.h src/Binance.cpp src/Binance.h src/Wallet.cpp src/Wallet.h src/Transaction.cpp src/Transaction.h src/WebAPI.cpp src/WebAPI.h)
|
||||
add_executable(TradeSim main.cpp src/Market.cpp src/Market.h src/Exchange.cpp src/Exchange.h src/Trader.h src/TradeTracker.cpp src/TradeTracker.h src/Binance.cpp src/Binance.h src/Wallet.cpp src/Wallet.h src/Transaction.cpp src/Transaction.h src/WebAPI.cpp src/WebAPI.h src/BasicTrader.cpp src/BasicTrader.h src/Trader.cpp)
|
||||
target_link_libraries(TradeSim libcurl)
|
||||
target_link_libraries(TradeSim jsoncpp_lib)
|
||||
include_directories(${CURL_INCLUDE_DIR})
|
||||
|
|
21
main.cpp
21
main.cpp
|
@ -1,10 +1,29 @@
|
|||
#include <iostream>
|
||||
#include <thread>
|
||||
#include "src/Binance.h"
|
||||
#include "src/TradeTracker.h"
|
||||
#include "src/BasicTrader.h"
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
Binance b;
|
||||
std::cout << b.getMarket("BTCBUSD")->getExchangeRate() << std::endl;
|
||||
TradeTracker ttr;
|
||||
ttr.addExchange(&b);
|
||||
|
||||
BasicTrader btr(&ttr);
|
||||
ttr.addTrader(&btr);
|
||||
|
||||
bool running = true;
|
||||
int roundsRemaining = 1000;
|
||||
|
||||
while (roundsRemaining != 0) {
|
||||
ttr.round();
|
||||
std::this_thread::sleep_for(10000ms);
|
||||
--roundsRemaining;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
46
src/BasicTrader.cpp
Normal file
46
src/BasicTrader.cpp
Normal file
|
@ -0,0 +1,46 @@
|
|||
#include "BasicTrader.h"
|
||||
#include <iostream>
|
||||
|
||||
BasicTrader::BasicTrader(TradeTracker *tradeTracker) : tradeTracker(tradeTracker) {}
|
||||
|
||||
void BasicTrader::step() {
|
||||
Market *market = tradeTracker->getExchange("Binance")->getMarket("ETHBUSD");
|
||||
calcualteEMA();
|
||||
double price = market->getExchangeRate();
|
||||
if(ema > 0) {
|
||||
if (!own && price * 1.001 <= ema) {
|
||||
market->buy(&wallet, wallet.getBalance("BUSD") * 0.9 / market->getExchangeRate());
|
||||
std::cout << "ETH bought @" << market->getExchangeRate() << " because EMA(" << queue_size << ") is down by "
|
||||
<< (1 - (ema / prev_ema)) * 100 << "%" << std::endl;
|
||||
own = true;
|
||||
price_bougth = price;
|
||||
}
|
||||
if (own && price * 0.999 >= ema && price > price_bougth) {
|
||||
market->sell(&wallet, wallet.getBalance("ETH"));
|
||||
std::cout << "ETH sold @" << market->getExchangeRate() << " because EMA(" << queue_size << ") is up by "
|
||||
<< (1 - (ema / prev_ema)) * 100 << "%" << std::endl;
|
||||
own = false;
|
||||
}
|
||||
std::cout << "EMA(" <<queue_size << ")= " << ema << ", " << prev_ema << " " << (double) ema / prev_ema << std::endl;
|
||||
}
|
||||
prev_ema = ema;
|
||||
}
|
||||
|
||||
void BasicTrader::calcualteEMA() {
|
||||
Market *market = tradeTracker->getExchange("Binance")->getMarket("ETHBUSD");
|
||||
double price = market->getExchangeRate();
|
||||
prices.push_back(price);
|
||||
if (prices.size() <= queue_size) {
|
||||
std::cout << "Gathering Data " << (double) prices.size() / queue_size * 100 << "%" << std::endl;
|
||||
} else {
|
||||
double moving_avrage = 0;
|
||||
prices.pop_front();
|
||||
for (int i = 0; i < queue_size; ++i) {
|
||||
moving_avrage += prices[i];
|
||||
}
|
||||
moving_avrage /= queue_size;
|
||||
prev_ema = (prev_ema == 0) ? moving_avrage : prev_ema;
|
||||
double k = 2 / ((double) queue_size + 1);
|
||||
ema = (price - prev_ema) * k + prev_ema;
|
||||
}
|
||||
}
|
22
src/BasicTrader.h
Normal file
22
src/BasicTrader.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
#ifndef TRADESIM_BASICTRADER_H
|
||||
#define TRADESIM_BASICTRADER_H
|
||||
#include <deque>
|
||||
|
||||
#include "TradeTracker.h"
|
||||
#include "Trader.h"
|
||||
|
||||
class BasicTrader : public Trader{
|
||||
TradeTracker* tradeTracker;
|
||||
size_t queue_size = 54;
|
||||
std::deque<double> prices;
|
||||
double prev_ema = 0,ema = 0;
|
||||
void calcualteEMA();
|
||||
bool own = false;
|
||||
double price_bougth = 0;
|
||||
public:
|
||||
BasicTrader(TradeTracker *tradeTracker);
|
||||
void step();
|
||||
};
|
||||
|
||||
|
||||
#endif //TRADESIM_BASICTRADER_H
|
|
@ -4,8 +4,8 @@
|
|||
|
||||
Binance::Binance() :Exchange("Binance",0.1){
|
||||
// TODO: Ezt lehetne configból is (pl. jsoncpp-vel)
|
||||
markets["BTCBUSD"] = Market("BTC/BUSD");
|
||||
markets["ETHBUSD"] = Market("ETH/BUSD");
|
||||
markets["BTCBUSD"] = Market("BTC/BUSD", this);
|
||||
markets["ETHBUSD"] = Market("ETH/BUSD", this);
|
||||
|
||||
updateAllMarkets();
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ const std::string &Exchange::getName() const {
|
|||
return name;
|
||||
}
|
||||
|
||||
const Market *Exchange::getMarket(std::string name) {
|
||||
Market *Exchange::getMarket(std::string name) {
|
||||
try {
|
||||
return &markets.at(name);
|
||||
}catch (std::out_of_range e) {
|
||||
|
|
|
@ -13,11 +13,10 @@ protected:
|
|||
double fee;
|
||||
public:
|
||||
Exchange(const std::string &name, double fee);
|
||||
|
||||
const std::string &getName() const;
|
||||
virtual void updateAllMarkets() = 0;
|
||||
virtual void updateMarket(std::string name) = 0;
|
||||
const Market *getMarket(std::string name);
|
||||
Market *getMarket(std::string name);
|
||||
void addMarket(Market m);
|
||||
|
||||
double getFee() const;
|
||||
|
|
|
@ -13,15 +13,15 @@ void Market::setExchangeRate(double exchangeRate) {
|
|||
exchange_rate = exchangeRate;
|
||||
}
|
||||
|
||||
Market::Market(const std::string& name): name(name) {}
|
||||
Market::Market(const std::string &name, Exchange *ex) : name(name),exchange(ex) {}
|
||||
|
||||
void Market::buy(Wallet* w, double amount) {
|
||||
w->acceptTransaction(Transaction(getLHSCurrency(),getRHSCurrency(),amount-amount*(exchange->getFee()/100),exchange_rate*amount));
|
||||
w->acceptTransaction(Transaction(getRHSCurrency(),getLHSCurrency(),amount-amount*(exchange->getFee()/100),exchange_rate*amount));
|
||||
}
|
||||
|
||||
void Market::sell(Wallet* w, double amount) {
|
||||
w->acceptTransaction(Transaction(getRHSCurrency(),getLHSCurrency(),
|
||||
amount-amount*(exchange->getFee()/100),exchange_rate*amount));
|
||||
w->acceptTransaction(Transaction(getLHSCurrency(),getRHSCurrency(),
|
||||
exchange_rate*amount,amount-amount*(exchange->getFee()/100)));
|
||||
}
|
||||
|
||||
std::string Market::getLHSCurrency() {
|
||||
|
|
|
@ -13,7 +13,7 @@ class Market {
|
|||
Exchange* exchange;
|
||||
public:
|
||||
Market();
|
||||
Market(const std::string& name);
|
||||
Market(const std::string &name, Exchange *ex);
|
||||
const std::string &getName() const;
|
||||
double getExchangeRate() const;
|
||||
void setExchangeRate(double exchangeRate);
|
||||
|
|
|
@ -16,3 +16,11 @@ Exchange *TradeTracker::getExchange(const std::string& name) {
|
|||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void TradeTracker::addExchange(Exchange* exchange) {
|
||||
exchanges.push_back(exchange);
|
||||
}
|
||||
|
||||
void TradeTracker::addTrader(Trader *t) {
|
||||
traders.push_back(t);
|
||||
}
|
||||
|
|
|
@ -9,9 +9,11 @@
|
|||
class TradeTracker {
|
||||
std::vector<Exchange*> exchanges;
|
||||
std::vector<Trader*> traders;
|
||||
void round();
|
||||
public:
|
||||
Exchange* getExchange(const std::string& name);
|
||||
void addTrader(Trader* t);
|
||||
void addExchange(Exchange* exchange);
|
||||
void round();
|
||||
};
|
||||
|
||||
#endif //TRADESIM_TRADETRACKER_H
|
||||
|
|
5
src/Trader.cpp
Normal file
5
src/Trader.cpp
Normal file
|
@ -0,0 +1,5 @@
|
|||
#include "Trader.h"
|
||||
|
||||
Trader::Trader(): wallet(std::initializer_list<std::string> {"BUSD","ETH","BTC"}) {
|
||||
wallet.acceptTransaction(Transaction("BTC","BUSD",100,0));
|
||||
}
|
|
@ -1,12 +1,16 @@
|
|||
#ifndef TRADESIM_TRADER_H
|
||||
#define TRADESIM_TRADER_H
|
||||
#include "Wallet.h"
|
||||
|
||||
class TradeTracker;
|
||||
|
||||
class Trader {
|
||||
public:
|
||||
Trader();
|
||||
virtual void step() = 0;
|
||||
protected:
|
||||
TradeTracker* tracker;
|
||||
Wallet wallet;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -7,9 +7,26 @@ Wallet::Wallet(std::string* symbols, int size) {
|
|||
}
|
||||
}
|
||||
|
||||
Wallet::Wallet(std::initializer_list<std::string> init_list) {
|
||||
for (auto i = init_list.begin();i != init_list.end();++i) {
|
||||
balances[i->c_str()] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
void Wallet::acceptTransaction(Transaction transaction) {
|
||||
if(balances.at(transaction.getCurrencyLhs()) >= transaction.getPrice()){
|
||||
balances[transaction.getCurrencyLhs()] -= transaction.getPrice();
|
||||
balances[transaction.getCurrencyRhs()] += transaction.getAmount();
|
||||
}else throw "Invalid Transaction: too low balance";
|
||||
}
|
||||
|
||||
double Wallet::getBalance(std::string currency) {
|
||||
try{
|
||||
double bal = balances.at(currency);
|
||||
return bal;
|
||||
}catch(std::out_of_range e) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -9,7 +9,9 @@ class Wallet {
|
|||
std::map<std::string, double> balances;
|
||||
public:
|
||||
Wallet(std::string* symbols, int size);
|
||||
Wallet(std::initializer_list<std::string> init_list);
|
||||
void acceptTransaction(Transaction transaction);
|
||||
double getBalance(std::string);
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue