-
Notifications
You must be signed in to change notification settings - Fork 1
/
tradehandler.h
75 lines (70 loc) · 2.54 KB
/
tradehandler.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#ifndef __TRADEHANDLER__
#define __TRADEHANDLER__
#ifndef __FP__
#define fp stdout
#endif
#include <cstdio>
#include <iostream>
#include <cstring>
#include "mysqlhandler.h"
#include "account.h"
#include "enum.h"
#include "api.h"
#define TRADE_FEE 0.0015
class _Tradehandler
{
private:
char name[64];
const int * coinvalue;
char query[1024];
_Mysqlhandler * mysqlhandler;
_API * api;
public:
_Tradehandler(_Mysqlhandler * mysqlhandler, _API * api):mysqlhandler(mysqlhandler),api(api){}
void init_coinvalue(const int * coinvalue)
{
this->coinvalue=coinvalue;
}
int run(_Account * account, int COIN, double volume)
{
get_name_no_krw(name, COIN);
const int price = coinvalue[COIN];
double total_order = price * volume;
if(strcmp(account->apikey,"test")==0){
if(volume > 0){
account->total_coin[(int)enum_Account::KRW] -= total_order;
account->available_coin[(int)enum_Account::KRW] -= total_order;
account->total_coin[COIN+(int)enum_Coinvalue::COIN_OFFSET] += volume * (1.0-TRADE_FEE);
account->available_coin[COIN+(int)enum_Coinvalue::COIN_OFFSET] += volume * (1.0-TRADE_FEE);
#ifdef TRADE_DEBUG
fprintf(fp, "TESTER INDEX %d :: BUY %s, volume : %f (%f)\n", account->_index, name, volume, total_order);
#endif
}
else{
account->total_coin[(int)enum_Account::KRW] -= total_order*(1.0-TRADE_FEE);
account->available_coin[(int)enum_Account::KRW] -= total_order*(1.0-TRADE_FEE);
account->total_coin[COIN+(int)enum_Coinvalue::COIN_OFFSET] += volume;
account->available_coin[COIN+(int)enum_Coinvalue::COIN_OFFSET] += volume;
#ifdef TRADE_DEBUG
fprintf(fp, "TESTER INDEX %d :: SELL %s, volume : %f (%f)\n", account->_index, name, -volume, -total_order);
#endif
}
account->tradesum += (total_order > 0)?total_order :-total_order;
}
else{ //매수시 volume 양수, 매도시 volume 음수!
if(volume > 0){
//account->in_use_coin[(int)enum_Account::KRW] += total_order;
//account->available_coin[(int)enum_Account::KRW] -= total_order;
fprintf(fp, "TRADEHANDLER :: BUY %s, volume : %f (%f)\n", name, volume, total_order);
}
else{
//account->in_use_coin[COIN+(int)enum_Coinvalue::COIN_OFFSET] += -volume;
//account->available_coin[COIN+(int)enum_Coinvalue::COIN_OFFSET] -= -volume;
fprintf(fp, "TRADEHANDLER :: SELL %s, volume : %f (%f)\n", name, -volume, -total_order);
}
api->trade(account, COIN, price, volume);
}
return 0;
}
};
#endif