大家好! 今天,我们将编写第一个用于在证券交易所交易的战斗交易机器人。 加密货币交易所。 为什么要进行加密货币交换?
a)炒作主题;
b)它们在某种程度上更简单。
首先,我要立即警告“三斧”赌场的粉丝:您明天不会赚钱。 本文更多地是关于如何开始编写机器人的,因此该算法将是原始的,但是可以工作。
其次,您将获得收入。 一点点。
C / f“秋天的游戏”(2015年)-这是什么味道? 闻起来像什么?
-科隆?
-不...
-机会?
-不 钱
-哦...一切都清楚了
-钱的味道!
我知道了
最不耐烦的是, exmo-exchange-trade-bot github上的所有代码。
阶段1:交换。
我们将在EXMO交易所进行交易。 有几个原因。 该交易所在独联体很流行,它是俄语,支持卢布的输入,它具有创建卢布对的能力。
缺点之一是卢布存入过程不便,佣金不错,交易对很少。
对于我们来说,最主要的是它具有使用其API的现成解决方案。 这肯定会促进我们的工作。
因此,让我们开始吧。
当然,您需要在证券交易所进行注册并入金。 例如,我捐了5美元。
在您的帐户中,您还将收到用于访问API的密钥。
我将使用NodeJS客户端(因此您需要安装nodejs和npm)。
在您的计算机上,创建一个新文件夹和一个文件,供我们的交易机器人使用(例如exmo / index.js),打开控制台并进行最后的标准准备。
我们转到项目所在的文件夹并输入-npm init,然后按Enter键以回答所有问题。
接下来我们写
npm install exmo-api
在安装软件包时,创建另一个文件,将其命名为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; };
该文件包含API的地址,与该API一起使用所需的其他库的连接以及向API发出请求的主要功能。
仅此而已,我们已经准备了一切,现在我们可以直接开始创建个人的“赚钱机器”;)
阶段2:代码
打开我们的index.js并连接exmo.js文件:
const exmo = require("./exmo");
接下来,转到您的个人帐户中的交易所,进入我们创建用于访问api的密钥的位置。 我们复制它们并将它们保存在变量中:
const apiKey = ' '; const apiSecret = ' ';
现在创建两个变量:
currency1是我们所购买的;
currency2-我们要购买的货币。
我想用美元购买比特币:
const currency1 = 'BTC'; const currency2 = 'USD';
接下来,要点-我们创建一个具有最小下注量的变量。 交易所不允许购买少于此金额的股票。
我们转到地址https://api.exmo.com/v1/pair_settings/查找您的货币对(对我来说是BTC_USD),并查看第一个参数-min_quantity-0.001
const currency1MinQuantity = 0.001;
还有更多变量:
分钟数,未完成的订单将在该分钟后被取消,货币1
const orderLifeTime = 3;
兑换佣金(0.002 = 0.2%)
const stockFee = 0.002;
计算平均价格的时间段(以分钟为单位)(我们的算法将需要此时间)
const avgPricePeriod = 1;
一次性交易中购买currency1的currency2的金额(我投入了$ 5-我将与他们进行交易)
const canSpend = 5;
每笔交易的期望利润量(0.001 = 0.1%)
const profit = 0.001;
如果交换时间与当前时间不同
const stockTimeOffset = 0;
为了方便起见,我们通过_组合一对
let currentPair = currency1+'_'+currency2;
初始化连接。
exmo.init_exmo({key:apiKey, secret:apiSecret});
对于测试,您可以要求提供有关您自己的信息:
exmo.api_query("user_info", { }, result => console.log(result););
转到控制台并运行
node index.js
如果一切都正确完成,那么您将看到有关您的信息!
一切正常,您可以继续进行最有趣的部分-祖母将为我们生成的功能。
因此,我在上面已经说过我们的算法将很愚蠢,现在您将了解多少)
诀窍是获取任何时期内已完成交易的历史记录-我们让变量avgPricePeriod负责此工作-并计算出售currency1的平均价格。 对于这个平均价格,我们将下订单。
因此,让我们开始吧。 我们编写我们的trade()函数
function trade(){}
首先,我们获得一份未结订单清单:
1)我们使用user_open_orders api方法检查对是否有未结订单。 如果也有出售,
那么我们只是等待它们实现(有时直到时间结束)。 如果有采购单,请记住它们。
exmo.api_query("user_open_orders", { }, result => { let res = JSON.parse(result); if(res[currentPair] == undefined) console.log(' '); let buyOrders = []; for(let i in res[currentPair]){ console.log(res[currentPair][i]); if(res[currentPair][i].type == 'sell'){ console.log(', / '); }else{ buyOrders.push(res[currentPair][i]); } }
2)我们检查是否有未结采购订单。
我们对所有订单进行排序,并使用order_trades方法获取历史记录,并在此传递订单ID。
可以有3个选项:
if(buyOrders.length > 0){ for(let key in buyOrders){ console.log(', ', buyOrders[key]['order_id']); exmo.api_query('order_trades', {"order_id": buyOrders[key]['order_id']}, result => { let res = JSON.parse(result);
1)我们可以全部购买必要的货币,但可以从卖方的订单中部分购买。
因此,如果我们已经以期望的价格购买了商品,那么我们正在等待购买全部金额。
if(res.result !== false){ console.log(', , '); }
2)在第二种选择下,我们需要检查订单是否挂得太久。 价格变化很快,也许平均价格不再重要。 为此,我们创建了变量orderLifeTime,该变量指示在几分钟内挂起多少订单。
如果时间到了,请使用order_cancel方法取消订单, 并向其传递订单ID。
let timePassed = (new Date().getTime() / 1000) + stockTimeOffset * 60 * 60 - (buyOrders[key]['created']); if(timePassed > orderLifeTime * 60){ exmo.api_query('order_cancel',{"order_id":buyOrders[key]['order_id']}, res => { let result = JSON.parse(res); if(result.error) console.log(result.error); console.log(` ${orderLifeTime} ${currency1}`); }); }else{
3)如果时间还没有到,那么我们只是希望我们能以我们的价格购买。
console.log(`, , ${timePassed} `); } } }); } }else{
我们已经找出了所有未结订单,现在我们的机器人知道在创建订单时该如何处理订单。 完成一半的工作。
因此,如果我们没有订单,则阻止。
我们使用user_info方法获取有关我们帐户的信息:
exmo.api_query('user_info',{},(result)=>{ let res = JSON.parse(result);
为了方便起见,我们为我们的货币对记下余额:
let balance = res.balances[currency1]; let balance2 = res.balances[currency2];
检查是否有可以出售的currency1?
if(balance >= currency1MinQuantity){}
如果是这样,我们需要计算销售率。
您需要出售所购买的所有货币,所购买的金额加上利润减去汇兑佣金。
重要的一点! 我们所购买的货币少于购买的货币-交易所收取了佣金。
let wannaGet = canSpend + canSpend * (stockFee+profit); console.log('sell', balance, wannaGet, (wannaGet/balance));
创建订单时,需要向order_create方法传递参数:
- 对是我们目前的交易对;
- 数量-数量;
- 价格-价格;
- type-创建的订单的类型(买/卖);
我们要以指定的类型卖出 。
let options = { "pair": currentPair, "quantity": balance, "price": wannaGet / balance, "type": 'sell' };
并发送请求,如果一切正确,那么您将看到条目“已创建卖单”
exmo.api_query("order_create", options,(result)=>{ if(result.error) console.log(result.error); console.log(" ", currency1, result.order_id); });
仅此而已。 如果我们有货币,我们只需创建一个定单来出售它。
现在我们转到最有趣的代码块:如果我们没有currency1(btc),而我们想以我们的currency2(usd)购买它。
首先,检查资产负债表上是否有足够的货币货币2。
if(balance2 >= canSpend){}
如果存在,那么我们需要获取在avgPricePeriod中指定的时间段内针对currency1(btc)出售的平均价格。
歌词:
Exmo提供一种行情自动收录器方法,其中包含货币对的统计数据和交易量。 统计信息显示最近24小时的平均价格。 但是,平均价格与当前举行拍卖的价格之间的差异可能非常不同。
因此,我们可以等待很长时间来执行卖单。
我们将制造自行车。
Exmo有一个trades方法,它返回一个货币对的交易列表。
我们将对感兴趣的avgPricePeriod进行完美交易,然后从中计算平均价格。
这不是一个理想的选择,但是它将显示他们买卖的真实价格。
例如,在撰写本文时,BTC_USD的平均价格为8314,而在交易所购买的价格为7970。
如果我们以平均价格下订单,它将立即以卖出订单中指定的最低价格执行。
但是增加利润和交易佣金,我们可能要等待很长的时间才能进行出售。
因此,让我们转向交易方法,并请他提供有关currentPair对的统计信息:
exmo.api_query("trades",{"pair":currentPair}, result => { let res = JSON.parse(result); let prices = []; let summ = 0;
我们将查看所有结果,仅保留适合我们时间段的结果。
for(deal in res[currentPair]){ let timePassed = (new Date().getTime() / 1000) + stockTimeOffset * 60 * 60 - res[currentPair][deal].date; if(timePassed < avgPricePeriod * 60){ summ += parseInt(res[currentPair][deal].price); prices.push(parseInt(res[currentPair][deal].price)); } }
并计算平均价格。
let avgPrice = summ2 / prices.length;
我们有一个平均价格,但是我们需要修正一下-减去stockFee交易佣金并增加期望的利润。 因此,在收到低于平均市场价格的价格后,我们将购买更多的货币,因为交易所随后参与其中。
let needPrice = avgPrice - avgPrice * (stockFee + profit)
我们得到需要购买的最终金额。
let ammount = canSpend / needPrice; console.log('Buy', ammount, needPrice);
我们检查是否可以购买这样数量的货币(是否违反了最低购买量)。
if(ammount >= currency1MinQuantity){}
如果数量更大,则仅在这次使用购买类型时才形成order_create方法的参数。
let options = { "pair": currentPair, "quantity": ammount, "price": needPrice, **"type": 'buy'** }; exmo.api_query('order_create', options, res => { let result = JSON.parse(res); if(result.error) console.log(result.error); console.log(' ', result.order_id); }); }else{ console.log(', '); } }); }else{ console.log(', '); }
现在,我们需要将函数放在计时器上(例如,范围是每5秒一次),然后可以运行它。
var timerId = setTimeout(function tick() { trade(); timerId = setTimeout(tick, 5000); }, 5000);
node index.js
恭喜,您编写了第一个交易机器人:可以完成算法并赚很多钱) 开玩笑的 。
我认为您有一个合理的问题,“通过这种方式您可以赚多少钱?”
一笔5美元的手术,我能赚2-3美分。 这是由于算法的原始性,如果价格在一定范围内波动,该算法就可以工作(并且在加密货币交易中几乎始终不是这种情况)。 每天大约要进行10到20次操作(好手)。 你可以数一数;)
但是我们不是为了省钱而掌握代码)
再次提供指向github的链接,其中包含该机器人的完整版本和注释。
https://github.com/v-florinskiy/exmo-exchange-trade-bot
这是我的第一篇文章-不要严格判断)
所有的利润。
PS:对于那些不使用节点的用户,您的脚本在控制台打开时自然可以工作。
为了使机器人能够24/7全天候工作,您需要某种vps:在其中放置了nodejs,npm和pm2等。 使用此实用程序,即使关闭控制台,脚本也将继续运行。