-
Notifications
You must be signed in to change notification settings - Fork 2
/
index.js
143 lines (122 loc) · 4.57 KB
/
index.js
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//index.js
"use strict";
require("dotenv-safe").load()
const MercadoBitcoin = require("./api").MercadoBitcoin
const MercadoBitcoinTrade = require("./api").MercadoBitcoinTrade
var infoApi = new MercadoBitcoin({ currency: 'LTC' })
var tradeApi = new MercadoBitcoinTrade({
currency: 'LTC',
key: process.env.KEY,
secret: process.env.SECRET,
pin: process.env.PIN
})
const UtilClass = require("./util").Util
var U = new UtilClass()
// tradeApi.getAccountInfo(response_data => {
// console.log(response_data);
// process.exit();
// })
// getQuantity('LTC', 1, false, (qty) => {
// console.log(qty)
// process.exit();
// })
//TODO avaliar disponibilidade antes de executar a operação
var d = {}
d.env = "production" // test | production
d.crawlerIntevalo = 40000 // Em milisegundos
d.quantidadeVendaLtc = 0.05
d.quantidadeCompraLtc = 0.05
d.lucroMinimo = 0.08
d.tradesExecutionMax = 5000
if (d.lucroMinimo < 0.0065 && d.env != "test") {
console.log("Lucro muito baixo para produção");
process.exit(1);
}
function definirPrecos(d, lastPrice) {
d.precoBase = lastPrice
d.precoMinimoVenda = d.precoBase * (1 + parseFloat(d.lucroMinimo))
d.precoMaximoCompra = d.precoBase * (1 - parseFloat(d.lucroMinimo))
let precos = {}
precos.precoBase = d.precoBase
precos.precoMinimoVenda = d.precoMinimoVenda
precos.precoMaximoCompra = d.precoMaximoCompra
console.log("Novos preços obtidos: ");
console.log(precos)
}
function calcularDefinicoesVariaves(d) {
infoApi.ticker((tick) => {
definirPrecos(d, parseFloat(tick.ticker.last))
rodar()
})
}
function tentarTrade() {
if (!d.tradeExecution && d.tradeExecution != 0 || !d.tradesExecutionMax || d.tradesExecution > d.tradesMax) {
console.log("Número máximo de trades executados, finalizando... bom lucro!");
console.log(d)
process.exit(0)
}
console.log(d)
infoApi.ticker((tick) => {
tick = tick.ticker
console.log(tick)
// console.log(tick.last)
// Vender
if (tick.last >= d.precoMinimoVenda) {
if (d.env === "test") {
console.log(`SIMULAÇÃO - Criada ordem de venda ${d.quantidadeVendaLtc} por ${tick.last}`)
console.log('SIMULAÇÃO - Ordem de venda inserida no livro.')
d.tradeExecution++;
definirPrecos(d, tick.last)
}
if (d.env === "production") {
tradeApi.placeSellOrder(d.quantidadeVendaLtc, tick.last,
(data) => {
console.log(`Criada ordem de venda ${d.quantidadeVendaLtc} por ${tick.last}`)
console.log('Ordem de venda inserida no livro. ' + data)
d.tradeExecution++;
definirPrecos(d, tick.last)
},
(data) => {
console.log('Erro ao inserir ordem de venda no livro. ' + data)
}
)
}
} else {
console.log("Barato demais para vender, aguarde mais um pouco até alcançar " + d.precoMinimoVenda)
}
// Comprar
if (tick.last <= d.precoMaximoCompra) {
if (d.env === "test") {
console.log(`SIMULAÇÃO - Criada ordem de compra ${d.quantidadeCompraLtc} por ${tick.last}`)
console.log('SIMULAÇÃO - Ordem de compra inserida no livro.')
d.tradeExecution++;
definirPrecos(d, tick.last)
}
if (d.env === "production") {
tradeApi.placeBuyOrder(d.quantidadeCompraLtc, tick.last,
(data) => {
console.log(`Criada ordem de compra ${d.quantidadeCompraLtc} por ${tick.last}`)
console.log('Ordem de compra inserida no livro. ' + data)
d.tradeExecution++;
definirPrecos(d, tick.last)
},
(data) => {
console.log('Erro ao inserir ordem de compra no livro. ' + data)
}
)
}
} else {
console.log("Caro demais para comprar, aguarde mais um pouco até alcançar " + d.precoMaximoCompra)
}
})
}
function preparar() {
d.tradeExecution = 0
// Irá chamar rodar no final
calcularDefinicoesVariaves(d)
}
function rodar() {
setInterval(() => tentarTrade(), d.crawlerIntevalo)
}
////////////////////////////// Início da execução //////////////////////////////////////////////////
preparar();