У многих трейдеров возникает резонный вопрос - как написать бота для торговли на бирже? И что бы работу бота можно было контролировать прямо с телефона, который всегда при себе. Я все приготовил, код с инструкцией по установке найдете ниже. После установки и запуска бота у вас в кармане будет платформа для работы с биржой EXMO, которую вы можете дорабатывать и улучшать как пожелаете, самостоятельно дописывать модули и различные индикаторы.
1. Установите на телефон Termux из Play Маркет.
2. После установки проверьте наличие обновлений используя команду $ apt update после выполнения команду $ apt upgrade
3. Далее командой $ apt install coreutils устанавливаем пакет дополнительных команд.
4. Устанавливаем на телефон Hackers Keyboard из Play Маркета, для удобной работы с командной строкой.
5. Для редактирования кода в командной строке устанавливаем редактор Nano командой $ apt install nano
6. Далее устанавливаем NodeJS используя команду $ apt install nodejs
7. Далее устанавливаем Exmo API командой $ npm install exmo-api
8. После установки всех модулей открываем Termux и создаем новую директорию где будут лежать файлы бота, для этого воспользуемся командой $ mkdir exmobot
9. Переходим в созданную директорию командой $ cd exmobot
10. Проверяем что мы в созданной директории командой $ pwd
11. Командой $ nano bot.js создаем файл и копируем туда следующий код, собственно это код самого бота:
const exmo = require("./exmo");
const apiKey = 'Ваш Ключ'; // Одинарные кавычки оставляем
const apiSecret = 'Ваш Секрет'; // Одинарные кавычки оставляем
const otstyp = 1.00251 // Сколько отступить от краев стакана
const checkprofita = 1.00001 // Минимально допустимый размер профита в процентах
exmo.init_exmo({key:apiKey, secret:apiSecret});
function trade(){
exmo.api_query("ticker",{ }, result => {
let res = JSON.parse(result);
let USD_RUB_sell_price = (res.USD_RUB.sell_price * 1) / 1.002
let USD_RUB_buy_price = (res.USD_RUB.buy_price * 1) * 1.002
let usd_sell = USD_RUB_sell_price * otstyp
let usd_buy = USD_RUB_buy_price / otstyp
let usd_sell_order = res.USD_RUB.sell_price * profit
let usd_buy_order = res.USD_RUB.buy_price / profit
let check_price = (usd_sell / usd_buy)
console.log(check_price)
if (check_price > checkprofita) {
console.log(check_price);
let options_USD_RUB_sell = {
"pair": 'USD_RUB',
"quantity": 1.1,
"price": usd_sell_order,
"type": 'sell'
};
let options_USD_RUB_buy = {
"pair": 'USD_RUB',
"quantity": 1.1,
"price": usd_buy_order,
"type": 'buy'
};
function exmo1 () {
exmo.api_query("order_create", options_USD_RUB_buy,(result)=>{
if(result.error) console.log(result.error);
console.log("Создал ордер на покупку USD");
});
}
setTimeout(exmo1, 1000);
function exmo2 () {
exmo.api_query("order_create", options_USD_RUB_sell,(result)=>{
if(result.error) console.log(result.error);
console.log("Создал ордер на продажу USD");
});
}
setTimeout(exmo2, 3000);
}
});
}
function orders (){
exmo.api_query("user_info", { }, result=>{
let res = JSON.parse(result);
let balusd= res.balances.USD;
let balrub = res.balances.RUB;
if(balusd > 1.1 && balrub > 75 ) {
console.log('денег хватает, проверяю профит')
trade();
}
else
{
console.log('недостаточно денег')
}
});
}
var timerId = setTimeout(function tick() {
orders();
timerId = setTimeout(tick, 10000);
}, 10000);
12. После копирования кода закрываем редактор нажатием клавиш Ctrl + X, подтверждаем сохранение вводим Y, после нажимаем ввод не меняя название файла.
13. Далее аналогичной командой $ nano exmo.js создаем еще один файл и копируем туда следующий код:
var CryptoJS = require("crypto-js")
http = require('http'),
querystring = require('querystring'),
request = require('request'),
config = {
url: 'https://api.exmo.me/v1/'
};
function sign(message){
return CryptoJS.HmacSHA512(message, config.secret).toString(CryptoJS.enc.hex);
}
exports.init_exmo = function (cfg) {
config.key = cfg.key;
config.secret = cfg.secret;
config.nonce = Math.floor(new Date().getTime()*1000);
};
exports.api_query = function(method_name, data, callback){
data.nonce = config.nonce++;
var post_data = querystring.stringify(data);
var options = {
url: config.url + method_name,
method: 'POST',
headers: {
'Key': config.key,
'Sign': sign(post_data)
},
form:data
};
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
callback(body);
}else{
callback(error);
}
});
};
exports.api_query2 = function(method_name, data, callback){
data.nonce = config.nonce++;
var post_data = querystring.stringify(data);
var post_options = {
host: 'api.exmo.me',
port: '80',
path: '/v1/' + method_name,
method: 'POST',
headers: {
'Key': config.key,
'Sign': sign(post_data),
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(post_data)
}
};
var post_req = http.request(post_options, function(res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
callback(chunk);
});
});
post_req.write(post_data);
post_req.end();
};
exports.test = function(){
return config.key;
};
14. После копирования кода закрываем редактор нажатием клавиш Ctrl + X, подтверждаем сохранение вводим Y, после нажимаем ввод не меняя название файла.
15. Далее командой $ node bot.js запускаем бота.
Вот и все, бот запущен.
Что бы повторно запустить бота после выхода из приложения нужно перейти в директорию где лежит файл бота командой $ cd exmobot, после запустить скрипт командой $ node bot.js
Алгоритм торговли самый простой, но вечный.
Если на балансе есть больше 1.1 доллара и 75 рублей, бот запрашивает котировки на продажу и покупку USD/RUB.
Отступает от краев стакана указанный шаг в процентах.
Далее отнимает комиссию биржи и сравнивает какой профит получается.
Если профит больше указанного минимального значения, тогда бот ставит ордер на покупку и на продажу 1.1 доллара.
Что получается на выходе?
Мы продали и одновременно купили 1.1 доллара с условным зазором в 1%, а это значит что долларов у нас столько же осталось, а вот балланс в рублях увеличился на 1%.
Ориентировочный доход за 365 дней от такого трейдинга при инвестициях $500, при условии что дневной профит 0.5 %, составляет $2500. Инвестиционный показатель ROI = 600 %.