Skip to content

Commit 2ea944f

Browse files
authored
Merge pull request #19 from bmf-san/feature/1.0.1
Minor fixes and refactoring
2 parents e79de59 + 0a7820b commit 2ea944f

File tree

11 files changed

+54
-78
lines changed

11 files changed

+54
-78
lines changed

.env.example

-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
11
# bitflyer
22
BITFLYER_API_KEY=
33
BITFLYER_API_SECRET=
4-
5-
# redis
6-
REDIS_HOST=redis
7-
REDIS_PORT=6379
8-
REDIS_PASSWORD=

.gitignore

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
.env
2-
oilking
3-
!app/log/.gitkeep
2+
/app/oilking
43
/redis/data
54
!/redis/data/.gitkeep

README.md

+14-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@
44

55
A trading bot using bitflyer api.
66

7-
If you use the code, please take responsibility at your own risk. We do not take any responsibility even if you suffer a loss.
7+
This repository is a template repository, so if you use it, we recommend using it as a template repository.
8+
9+
cf. [docs.github.com - creating-a-repository-from-a-template](https://docs.github.com/en/free-pro-team@latest/github/creating-cloning-and-archiving-repositories/creating-a-repository-from-a-template#creating-a-repository-from-a-template)
10+
11+
# Disclaimer
12+
Please take responsibility at your own risk if you use this program.
13+
14+
We do not take any responsibility even if you suffer a loss.
815

916
# Get started
1017
## Set enviroment variables
@@ -19,7 +26,12 @@ Build the source code.
1926
Run the binary file.
2027
`make docker-compose-up` or `make docker-compose-up-d`
2128

22-
# Supporting API
29+
# Exchange marketplaces supported
30+
| Support | Exchange markeplaces |
31+
| ------------------ | -------------------- |
32+
| :white_check_mark: | Bitflyer |
33+
34+
# API supported
2335
## HTTP API
2436
### HTTP Public API
2537
| Support | Method | Endpoint |

app/_examples/main.go

-9
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,7 @@ import (
1313

1414
// Example codes for api client.
1515
func main() {
16-
// TODO: Replace with test code later.
1716
l := logger.NewLogger(logger.LevelInfo, time.FixedZone("Asia/Tokyo", 9*60*60))
18-
f, err := l.SetOutput()
19-
if err != nil {
20-
l.Error(logger.Entry{
21-
Message: err.Error(),
22-
})
23-
os.Exit(1)
24-
}
25-
defer f.Close()
2617
ak := os.Getenv("BITFLYER_API_KEY")
2718
as := os.Getenv("BITFLYER_API_SECRET")
2819
c := api.NewClient(ak, as, l)

app/logger/logger.go

+19-5
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ const (
1717
LevelError
1818
// LevelFatal is an abend error.
1919
LevelFatal
20-
)
21-
22-
const (
2320
// LevelTextInfo is the text for info.
2421
LevelTextInfo = "info"
2522
// LevelTextWarn is the text for warn.
@@ -28,6 +25,24 @@ const (
2825
LevelTextError = "error"
2926
// LevelTextFatal is the text for fatal.
3027
LevelTextFatal = "fatal"
28+
// LabelBalance is a label for balance.
29+
LabelBalance = "[Balance]"
30+
// LabelBalanceHistory is a label for balance history.
31+
LabelBalanceHistory = "[Balance History]"
32+
// LabelChat is a label for chat.
33+
LabelChat = "[Chat]"
34+
// LabelChildOrder is a label for child order.
35+
LabelChildOrder = "[ChildOrder]"
36+
// LabelCollateral is a label for collateral.
37+
LabelCollateral = "[Collateral]"
38+
// LabelExecution is a label for execution.
39+
LabelExecution = "[Execution]"
40+
// LabelPosition is a label for position.
41+
LabelPosition = "[Position]"
42+
// LabelTicker is a label for Ticker.
43+
LabelTicker = "[Ticker]"
44+
// LabelTradingCommission is a label for trading commission.
45+
LabelTradingCommission = "[Trading Commission]"
3146
)
3247

3348
var levelText = map[int]string{
@@ -73,8 +88,8 @@ type AccessLogEntry struct {
7388
type TradingLogEntry struct {
7489
Level string `json:"level"`
7590
Time time.Time `json:"time"` // UTC
91+
Label string `json:"label"`
7692
Action string `json:"action"`
77-
Result string `json:"result"`
7893
}
7994

8095
// NewLogger creates a logger.
@@ -116,7 +131,6 @@ func (l *Logger) Fatal(entry interface{}) {
116131

117132
// OutputJSON outputs logs.
118133
func (l *Logger) OutputJSON(level string, entry interface{}) error {
119-
// HACK: I think it's better to handle errors.
120134
switch reflect.TypeOf(entry).Name() {
121135
case "Entry":
122136
if e, ok := entry.(Entry); ok {

app/main.go

+1-12
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,14 @@ import (
1111
"github.com/bmf-san/oilking/app/model"
1212
"github.com/bmf-san/oilking/app/trade"
1313
"github.com/bmf-san/oilking/app/types"
14-
"github.com/go-redis/redis/v7"
1514
)
1615

1716
func main() {
1817
l := logger.NewLogger(logger.LevelInfo, time.FixedZone("Asia/Tokyo", 9*60*60))
1918
ak := os.Getenv("BITFLYER_API_KEY")
2019
as := os.Getenv("BITFLYER_API_SECRET")
2120
c := api.NewClient(ak, as, l)
22-
// TODO: I haven't planned to use it yet, so I commented it out.
23-
// db := database.NewDB()
24-
// d, err := db.Conn()
25-
// if err != nil {
26-
// l.Error(logger.Entry{
27-
// Message: err.Error(),
28-
// })
29-
// os.Exit(1)
30-
// }
31-
// defer d.Close()
32-
t := trade.NewTrade(c, l, &redis.Client{})
21+
t := trade.NewTrade(c, l)
3322
ch := make(chan model.TickerResponse)
3423
w := &model.Writer{
3524
Channel: types.ChannelTickerFXBTCJPY,

app/trade/logic.go

+18-24
Original file line numberDiff line numberDiff line change
@@ -10,40 +10,26 @@ import (
1010
"github.com/bmf-san/oilking/app/logger"
1111
"github.com/bmf-san/oilking/app/model"
1212
"github.com/bmf-san/oilking/app/types"
13-
"github.com/go-redis/redis/v7"
1413
)
1514

1615
const (
17-
// NOTE: These values ​​can be parameterized later.
1816
// targetProductCode is a types for trading.
1917
targetProductCode = types.ProductCodeFXBTCJPY
2018
// targetSize is a size for buy or sell.
2119
targetSize = 0.01
22-
23-
// TODO: Will be defined later in the logger.
24-
// NOTE: These values user for logging. It ​​may be used when implementing reporting services.
25-
// NOTE: It seems better to prepare the action name as well. ex. [ACTION]
26-
// labelPosition is a label for position.
27-
labelPosition = "[Position]"
28-
// labelOrder is a label for order.
29-
labelOrder = "[Order]"
30-
// labelCollateral is a label for collateral.
31-
labelCollateral = "[Collateral]"
3220
)
3321

3422
// Trade is a trade.
3523
type Trade struct {
3624
apiClient *api.Client
3725
logger *logger.Logger
38-
dbClient *redis.Client
3926
}
4027

4128
// NewTrade creates a new trade.
42-
func NewTrade(c *api.Client, l *logger.Logger, db *redis.Client) *Trade {
29+
func NewTrade(c *api.Client, l *logger.Logger) *Trade {
4330
return &Trade{
4431
apiClient: c,
4532
logger: l,
46-
dbClient: db,
4733
}
4834
}
4935

@@ -101,8 +87,9 @@ func (t *Trade) buy(p float64) {
10187
Message: err.Error(),
10288
})
10389
} else {
104-
t.logger.Info(logger.Entry{
105-
Message: fmt.Sprintf("%s send a child order", labelOrder),
90+
t.logger.Info(logger.TradingLogEntry{
91+
Label: logger.LabelChildOrder,
92+
Action: "send a child order",
10693
})
10794
}
10895
}
@@ -124,8 +111,9 @@ func (t *Trade) sell(p float64) {
124111
Message: err.Error(),
125112
})
126113
} else {
127-
t.logger.Info(logger.Entry{
128-
Message: fmt.Sprintf("%s send a child order", labelOrder),
114+
t.logger.Info(logger.TradingLogEntry{
115+
Label: logger.LabelChildOrder,
116+
Action: "send a child order",
129117
})
130118
}
131119
}
@@ -195,12 +183,13 @@ func (t *Trade) StopSafety() {
195183
Message: err.Error(),
196184
})
197185
} else {
198-
t.logger.Info(logger.Entry{
199-
Message: fmt.Sprintf("%s All orders have been cancelled.", labelOrder),
186+
t.logger.Info(logger.TradingLogEntry{
187+
Label: logger.LabelChildOrder,
188+
Action: "all orders have been cancelled",
200189
})
201190
}
202191

203-
// I want to close the position by counter-trading, but for the time being I will make an error instead of an alert.
192+
// Check the remaining open interest
204193
pp := &model.PositionParams{
205194
ProductCode: targetProductCode,
206195
}
@@ -210,8 +199,13 @@ func (t *Trade) StopSafety() {
210199
Message: err.Error(),
211200
})
212201
} else {
213-
t.logger.Info(logger.Entry{
214-
Message: fmt.Sprintf("%s %d positions", labelPosition, len(pr)),
202+
msg := "no positions"
203+
if len(pr) > 0 {
204+
msg = fmt.Sprintf("get %d positions", len(pr))
205+
}
206+
t.logger.Info(logger.TradingLogEntry{
207+
Label: logger.LabelPosition,
208+
Action: msg,
215209
})
216210
}
217211
}

docker-compose.yml

+1-13
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,4 @@ services:
99
dockerfile: "Dockerfile"
1010
ports:
1111
- "8083:8083"
12-
restart: always
13-
redis:
14-
container_name: "oilking-redis"
15-
env_file: ".env"
16-
build:
17-
context: "./redis"
18-
dockerfile: "Dockerfile"
19-
ports:
20-
- "6379:6379"
21-
volumes:
22-
- ./redis/data:/var/lib/redis
23-
depends_on:
24-
- app
12+
restart: always

redis/Dockerfile

-3
This file was deleted.

redis/data/.gitkeep

Whitespace-only changes.

redis/redis.conf

-3
This file was deleted.

0 commit comments

Comments
 (0)