· 5 years ago · Jul 02, 2020, 06:06 PM
1var qs = require("querystring");
2var crypto = require('crypto');
3var https = require('https');
4
5var path_accounts = "/ver1/accounts";
6var path_markets = "/ver1/accounts/market_pairs";
7var path_deals = "/ver1/deals";
8var path_bots = "/ver1/bots";
9
10var queryString = "/public/api";
11
12var fullPack = {
13 host: "api.3commas.io",
14 method: 'GET',
15 headers: {
16 apiKey: "yourapikeyhere",
17 secretKey: "yoursecretkeyhere"
18 },
19 timeout: 10
20};
21
22var marketList = new Map();
23var accounts = new Map();
24var bots = new Map();
25
26var MarketConfig = [];
27
28MarketConfig["USDT_BTC"] = {
29 [0]: {
30 BO: 2.0,
31 SO: 1.0,
32 Leverage: 125.0
33 },
34 [2000]: {
35 BO: 2.0,
36 SO: 0.5,
37 Leverage: 125.0
38 }
39}
40
41MarketConfig["USDT_ETH"] = {
42 [0]: {
43 BO: 2.0,
44 SO: 0.5,
45 Leverage: 50.0
46 }
47}
48
49MarketConfig["USDT_BNB"] = {
50 [0]: {
51 BO: 1.0,
52 SO: 0.2,
53 Leverage: 20.0
54 }
55}
56
57MarketConfig["USDT_LINK"] = MarketConfig["USDT_ETH"]
58MarketConfig["USDT_XTZ"] = MarketConfig["USDT_ETH"]
59MarketConfig["USDT_XLM"] = MarketConfig["USDT_ETH"]
60MarketConfig["USDT_ADA"] = MarketConfig["USDT_ETH"]
61MarketConfig["USDT_XMR"] = MarketConfig["USDT_ETH"]
62MarketConfig["USDT_LTC"] = MarketConfig["USDT_ETH"]
63MarketConfig["USDT_BCH"] = MarketConfig["USDT_ETH"]
64MarketConfig["USDT_ETC"] = MarketConfig["USDT_ETH"]
65MarketConfig["USDT_XRP"] = MarketConfig["USDT_ETH"]
66MarketConfig["USDT_EOS"] = MarketConfig["USDT_ETH"]
67MarketConfig["USDT_TRX"] = MarketConfig["USDT_ETH"]
68
69MarketConfig["USDT_DASH"] = MarketConfig["USDT_BNB"]
70MarketConfig["USDT_ONT"] = MarketConfig["USDT_BNB"]
71MarketConfig["USDT_NEO"] = MarketConfig["USDT_BNB"]
72MarketConfig["USDT_ATOM"] = MarketConfig["USDT_BNB"]
73MarketConfig["USDT_BAT"] = MarketConfig["USDT_BNB"]
74MarketConfig["USDT_IOST"] = MarketConfig["USDT_BNB"]
75MarketConfig["USDT_IOTA"] = MarketConfig["USDT_BNB"]
76MarketConfig["USDT_QTUM"] = MarketConfig["USDT_BNB"]
77MarketConfig["USDT_VET"] = MarketConfig["USDT_BNB"]
78MarketConfig["USDT_ZEC"] = MarketConfig["USDT_BNB"]
79MarketConfig["USDT_THETA"] = MarketConfig["USDT_BNB"]
80MarketConfig["USDT_ALGO"] = MarketConfig["USDT_BNB"]
81MarketConfig["USDT_ZIL"] = MarketConfig["USDT_BNB"]
82MarketConfig["USDT_KNC"] = MarketConfig["USDT_BNB"]
83MarketConfig["USDT_ZRX"] = MarketConfig["USDT_BNB"]
84MarketConfig["USDT_COMP"] = MarketConfig["USDT_BNB"]
85MarketConfig["USDT_OMG"] = MarketConfig["USDT_BNB"]
86
87
88//Use configs from below for templates.
89
90function GetMarketList()
91{
92 marketList = new Map();
93
94 var usedQuery = queryString + path_markets + "?market_code=binance_futures";
95 var signature = crypto.createHmac("sha256", fullPack.headers.secretKey).update(usedQuery).digest("hex");
96
97 fullPack.headers.Signature = signature;
98 fullPack.path = usedQuery;
99
100 var getReq = https.get(fullPack,function(res)
101 {
102 var str='';
103
104 res.on('data',function(chunk){
105 str+=chunk;
106 });
107
108 res.on('end',function(){
109 console.log("Received market:");
110 var jsonData = JSON.parse(str);
111
112 jsonData.forEach(function(data) {
113
114 marketList.set(data,data);
115
116 if (!MarketConfig[data])
117 {
118 console.log("Missing market: " + data);
119 }
120 else
121 {
122 console.log(data);
123 }
124 });
125
126 GetAccounts();
127 });
128 });
129
130 return marketList;
131}
132
133function GetAccounts()
134{
135 accounts = new Map();
136
137 var usedQuery = queryString + path_accounts;
138 var signature = crypto.createHmac("sha256", fullPack.headers.secretKey).update(usedQuery).digest("hex");
139
140 fullPack.headers.Signature = signature;
141 fullPack.path = usedQuery;
142
143 var getReq = https.get(fullPack,function(res)
144 {
145 var str='';
146
147 res.on('data',function(chunk){
148 str+=chunk;
149 });
150
151 res.on('end',function(){
152 console.log("Received accounts:");
153 var jsonData = JSON.parse(str);
154
155 jsonData.forEach(function(data) {
156 var accountID = data.id;
157 var accountName = data.name;
158 var accountMarketCode = data.market_code;
159
160 if (accountMarketCode == "binance_futures")
161 {
162 accounts.set(accountID,data);
163 console.log(accountID + " : " + accountName + " at " + accountMarketCode);
164
165 //console.log(data);
166 GetBots(accountID);
167 }
168 });
169 });
170 });
171
172 return accounts;
173}
174
175function GetBots(accountID)
176{
177 var account = accounts.get(accountID);
178
179 if (!account) {
180 return;
181 }
182
183 var accountBalance = account.usd_amount;
184
185 bots = new Map();
186 var usedQuery = queryString + path_bots + "?account_id=" + accountID;
187 var signature = crypto.createHmac("sha256", fullPack.headers.secretKey).update(usedQuery).digest("hex");
188
189 fullPack.headers.Signature = signature;
190 fullPack.path = usedQuery;
191
192 var getReq = https.get(fullPack,function(res)
193 {
194 var str='';
195
196 res.on('data',function(chunk){
197 str+=chunk;
198 });
199
200 res.on('end',function(){
201 console.log("Received bots for " + account.name);
202 var jsonData = JSON.parse(str);
203
204 bots.clear();
205
206 jsonData.forEach(function(data) {
207 var pair = data.pairs[0];
208 bots.set(pair,data);
209 });
210
211 for (var pair in MarketConfig)
212 {
213 var configLayer = MarketConfig[pair];
214 var data = bots.get(pair);
215 var config = configLayer[0];
216
217 if (data)
218 {
219 var id = data.id;
220 var name = data.name;
221
222 var BO = parseFloat(data.base_order_volume);
223 var SO = parseFloat(data.safety_order_volume);
224 var Leverage = parseFloat(data.leverage_custom_value);
225 var BotName = account.name + " " + pair;
226
227 //Select the correct config for balance
228 for (var maxCap in configLayer)
229 {
230 maxCap = parseFloat(maxCap);
231
232 if (accountBalance > maxCap)
233 {
234 config = configLayer[maxCap];
235 }
236 }
237
238 if (BO != config.BO || SO != config.SO || Leverage != config.Leverage || name !== BotName)
239 {
240 console.log("BOT DIFFERENCE: " + id + " : " + name + " : " + pair + " BO:"+BO+" v "+config.BO+" SO:"+SO+" v "+config.SO+" LEV:"+Leverage+" v "+config.Leverage);
241 UpdateBot(accountID,id,pair);
242 }
243 }
244 else
245 {
246 console.log("MISSING BOT FOR PAIR: " + pair);
247 CreateBot(accountID,pair);
248 }
249 }
250 });
251 });
252
253 return accounts;
254}
255
256function VerifyBots()
257{
258 //Start chain from this; Need to cleanup later.
259 GetMarketList();
260}
261
262function UpdateBot(AccountID,BotID,Pair)
263{
264 var account = accounts.get(AccountID);
265 var bot = bots.get(Pair);
266
267 if (!account || !bot) {
268 return;
269 }
270
271 var accountBalance = account.usd_amount;
272
273 var configLayer = MarketConfig[Pair];
274 var config = configLayer[0];
275
276 //Select the correct config for balance
277 for (var maxCap in configLayer)
278 {
279 maxCap = parseFloat(maxCap);
280
281 if (accountBalance > maxCap)
282 {
283 config = configLayer[maxCap];
284 }
285 }
286
287 var query = qs.stringify(
288 {
289 "name": account.name + " " + Pair,
290 "pairs": bot.pairs,
291 "base_order_volume": config.BO,
292 "safety_order_volume": config.SO,
293 "pairs": bot.pairs,
294 "take_profit": bot.take_profit,
295 "martingale_volume_coefficient": bot.martingale_volume_coefficient,
296 "martingale_step_coefficient": bot.martingale_step_coefficient,
297 "max_safety_orders": bot.max_safety_orders,
298 "active_safety_orders_count": bot.active_safety_orders_count,
299 "trailing_enabled": bot.trailing_enabled,
300 "trailing_deviation": bot.trailing_deviation,
301 "safety_order_step_percentage": bot.safety_order_step_percentage,
302 "take_profit_type": bot.take_profit_type,
303 "strategy_list": JSON.stringify(bot.strategy_list),
304 "leverage_type": bot.leverage_type,
305 "leverage_custom_value": config.Leverage,
306 "stop_loss_percentage": bot.stop_loss_percentage,
307 "cooldown": bot.cooldown,
308 "bot_id": bot.id,
309 })
310
311
312 var usedQuery = queryString + "/ver1/bots/"+BotID+"/update";
313
314 var signature = crypto.createHmac("sha256", fullPack.headers.secretKey).update(usedQuery + "?"+query).digest("hex");
315
316 fullPack.method = "PATCH";
317 fullPack.headers.Signature = signature;
318 fullPack.path = usedQuery;
319 fullPack.port = 443;
320 fullPack.hostname = "api.3commas.io";
321 fullPack.headers["content-type"] = "application/x-www-form-urlencoded";
322
323 var req = https.request(fullPack,function(res)
324 {
325 var str='';
326
327 res.on('data',function(chunk){
328 str+=chunk;
329 });
330
331 res.on('end',function(){
332 console.log("Updated bot: " + bot.name);
333 var jsonData = JSON.parse(str);
334
335 //console.log(jsonData);
336 });
337 });
338
339 req.write(query);
340
341 req.end();
342}
343
344function CreateBot(AccountID,Pair)
345{
346 var account = accounts.get(AccountID);
347 var bot = bots.get(Pair);
348
349 if (!account || bot)
350 {
351 console.log("Account does not exist or bot exists.");
352 return;
353 }
354
355 var accountBalance = account.usd_amount;
356
357 var configLayer = MarketConfig[Pair];
358 var config = configLayer[0];
359
360 //Select the correct config for balance
361 for (var maxCap in configLayer)
362 {
363 maxCap = parseFloat(maxCap);
364
365 if (accountBalance > maxCap)
366 {
367 config = configLayer[maxCap];
368 }
369 }
370
371 var strategyList = {
372 options: {},
373 strategy: "nonstop"
374 }
375
376 var query = qs.stringify(
377 {
378 "name": account.name + " " + Pair,
379 "account_id": AccountID,
380 "pairs": Pair,
381 "base_order_volume": config.BO,
382 "base_order_volume_type": "percent",
383 "safety_order_volume": config.SO,
384 "safety_order_volume_type": "percent",
385 "take_profit": 0.85,
386 "martingale_volume_coefficient": 2.8,
387 "martingale_step_coefficient": 1.7,
388 "max_safety_orders": 6,
389 "active_safety_orders_count": 6,
390 "trailing_enabled": true,
391 "trailing_deviation": 0.15,
392 "safety_order_step_percentage": 0.89,
393 "take_profit_type": "total",
394 "strategy": "long",
395 "strategy_list": JSON.stringify(strategyList),
396 "leverage_type": "custom",
397 "leverage_custom_value": config.Leverage,
398 "stop_loss_percentage": 0.0,
399 "cooldown": 0,
400 "start_order_type": "market",
401 })
402
403
404 var usedQuery = queryString + "/ver1/bots/create_bot";
405
406 var signature = crypto.createHmac("sha256", fullPack.headers.secretKey).update(usedQuery + "?"+query).digest("hex");
407
408 fullPack.method = "POST";
409 fullPack.headers.Signature = signature;
410 fullPack.path = usedQuery;
411 fullPack.port = 443;
412 fullPack.hostname = "api.3commas.io";
413 fullPack.headers["content-type"] = "application/x-www-form-urlencoded";
414
415 var req = https.request(fullPack,function(res)
416 {
417 var str='';
418
419 res.on('data',function(chunk){
420 str+=chunk;
421 });
422
423 res.on('end',function(){
424 console.log("Created bot: " + account.name + " " + Pair);
425 var jsonData = JSON.parse(str);
426
427 console.log(jsonData);
428 });
429 });
430
431 req.write(query);
432
433 req.end();
434}
435
436VerifyBots()