一个简单的加密货币交易机器人

大家好! 今天,我们将编写第一个用于在证券交易所交易的战斗交易机器人。 加密货币交易所。 为什么要进行加密货币交换?


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等。 使用此实用程序,即使关闭控制台,脚本也将继续运行。

Source: https://habr.com/ru/post/zh-CN416073/


All Articles