Ein einfacher Kryptowährungs-Handelsbot

Hallo allerseits! Heute werden wir unseren ersten Kampfhandelsroboter für das Spielen an der Börse schreiben. Kryptoaustausch. Warum Kryptowährungsaustausch?


a) Hype-Thema;
b) sie sind irgendwie einfacher.


Zunächst möchte ich die Fans des Three Axes Casinos sofort warnen: Sie werden morgen kein Auto verdienen. In diesem Artikel erfahren Sie mehr darüber, wie Sie mit dem Schreiben Ihrer Roboter beginnen, sodass der Algorithmus primitiv ist, aber funktioniert.


Zweitens werden Sie verdienen. Nur ein bisschen.


C / f „Das Spiel für einen Herbst“ (2015)
- Dieser Geruch, was ist das? Wie riecht es?
- Köln?
- Nein…
- Chancen?
- Nein. Geld.
- Oh ... alles ist klar
- Der Geruch von Geld!
- Ich verstehe.

Für die Ungeduldigsten der gesamte Code auf dem Exmo-Exchange-Trade-Bot-Github .


Stufe 1: Austausch.


Wir werden an der EXMO-Börse handeln. Es gibt mehrere Gründe. Der Austausch ist in der GUS beliebt, er ist russischsprachig und unterstützt die Eingabe von Rubeln. Er kann Paare zum Rubel bilden.


Zu den Minuspunkten zählen der unbequeme Prozess der Einzahlung von Rubel, eine anständige Provision und wenige gehandelte Paare.


Für uns ist die Hauptsache, dass es vorgefertigte Lösungen für die Arbeit mit ihrer API gibt. Dies wird sicherlich unsere Arbeit erleichtern.


Also fangen wir an.


Natürlich müssen Sie sich an der Börse registrieren und etwas Geld einzahlen. Zum Beispiel habe ich 5 Dollar beigesteuert.


Weiter in Ihrem Konto erhalten Sie Schlüssel für den Zugriff auf die API.


Ich werde den Client für NodeJS verwenden (Sie müssen also nodejs und npm installieren).


Erstellen Sie auf Ihrem Computer einen neuen Ordner und eine Datei, in der sich unser Handelsroboter befindet (z. B. exmo / index.js), öffnen Sie die Konsole und treffen Sie die letzten Standardvorbereitungen.


Wir gehen mit unserem Projekt in den Ordner und schreiben - npm init, drücken dann die Eingabetaste für alle Fragen.


Als nächstes schreiben wir


npm install exmo-api 

Erstellen Sie während der Installation der Pakete eine weitere Datei, nennen Sie sie exmo.js und füllen Sie sie mit diesem Inhalt.


mit diesen Inhalten
 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; }; 

Diese Datei enthält die Adresse der API, die Verbindung zusätzlicher Bibliotheken, die wir für die Arbeit mit der API benötigen, und die Hauptfunktion für Anforderungen an die API.


Das ist alles, wir haben alles vorbereitet und jetzt können wir direkt damit beginnen, eine persönliche „Geldmaschine“ zu schaffen;)


Stufe 2: Code


Öffnen Sie unsere index.js und verbinden Sie die Datei exmo.js:


 const exmo = require("./exmo"); 

Gehen Sie als Nächstes zum Austausch in Ihrem persönlichen Konto zu dem Ort, an dem wir unsere Schlüssel für den Zugriff auf die API erstellt haben. Wir kopieren sie und speichern sie in Variablen:


 const apiKey = ' '; const apiSecret = ' '; 

Erstellen Sie nun zwei Variablen:
Währung1 ist WAS wir kaufen;
Währung2 - Währung, für die wir kaufen.


Ich möchte Bitcoins für Dollar kaufen:


 const currency1 = 'BTC'; const currency2 = 'USD'; 

Als nächstes ein wichtiger Punkt - wir erstellen eine Variable mit einem Mindesteinsatzbetrag. Die Börse erlaubt es nicht, weniger als diesen Betrag zu kaufen.


Wir gehen zur Adresse https://api.exmo.com/v1/pair_settings/ und suchen nach Ihrem Paar (für mich ist es BTC_USD) und schauen uns den ersten Parameter an - min_quantity - 0.001


 const currency1MinQuantity = 0.001; 

Und noch ein paar Variablen:


Die Anzahl der Minuten, nach denen eine nicht erfüllte Bestellung storniert wird


 const orderLifeTime = 3; 

Austauschprovision (0,002 = 0,2%)


 const stockFee = 0.002; 

Zeitraum (in Minuten) für die Berechnung des Durchschnittspreises (dies wird für unseren Algorithmus benötigt)


 const avgPricePeriod = 1; 

der Betrag von Währung2, um Währung1 in einer einmaligen Transaktion zu kaufen (ich warf 5 $ - ich werde mit ihnen operieren)


 const canSpend = 5; 

die gewünschte Gewinnsumme aus jeder Transaktion (0,001 = 0,1%)


 const profit = 0.001; 

Wenn die Austauschzeit vom Strom abweicht


 const stockTimeOffset = 0; 

Der Einfachheit halber kombinieren wir unser Paar durch _


 let currentPair = currency1+'_'+currency2; 

Initialisieren Sie die Verbindung.


 exmo.init_exmo({key:apiKey, secret:apiSecret}); 

Für den Test können Sie Informationen über sich selbst anfordern:


 exmo.api_query("user_info", { }, result => console.log(result);); 

Gehen Sie zur Konsole und starten Sie


 node index.js 

Wenn alles richtig gemacht ist, sehen Sie Informationen über Sie!


Alles funktioniert und Sie können zum interessantesten Teil übergehen - der Funktion, die das Geld generiert.


Also, ich habe oben bereits gesagt, dass unser Algorithmus dumm sein wird, jetzt werden Sie verstehen, wie viel)


Der Trick besteht darin, die Historie der abgeschlossenen Transaktionen für einen beliebigen Zeitraum zu erfassen - wir haben die Variable avgPricePeriod dafür verantwortlich - und den Durchschnittspreis zu berechnen, für den Währung1 verkauft wurde. Für diesen Durchschnittspreis geben wir unsere Bestellung auf.


Also fangen wir an. Wir schreiben unsere trade () Funktion


 function trade(){} 

Zuerst erhalten wir eine Liste unserer offenen Bestellungen:


1) Wir prüfen mit der API-Methode user_open_orders, ob wir offene Bestellungen für unser Paar haben. Wenn es auch zum Verkauf gibt,


dann warten wir nur darauf, dass sie erfüllt werden (manchmal bis zum Ende der Zeit). Wenn es Bestellungen gibt, merken Sie sich diese einfach.


 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) Wir prüfen, ob wir offene Bestellungen haben.


Wir sortieren alle Bestellungen und erhalten mithilfe der order_trades- Methode einen Verlauf von ihnen, wobei wir die Bestell- ID dort übergeben.


Es gibt 3 Möglichkeiten:


 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) Wir können die notwendige Währung nicht ganz, sondern in Teilen aus Bestellungen von Verkäufern kaufen.
Wenn wir also bereits zum gewünschten Preis gekauft haben, warten wir auf den Kauf des gesamten Betrags.


 if(res.result !== false){ console.log(',       ,     '); } 

2) Mit der zweiten Option müssen wir prüfen, ob unsere Bestellung zu lange hängt. Die Preise ändern sich schnell und möglicherweise ist der Durchschnittspreis nicht mehr relevant. Zu diesem Zweck haben wir die Variable orderLifeTime erstellt, in der wir angeben, wie viel unsere Bestellung in Minuten hängen soll.


Wenn die Zeit abgelaufen ist, stornieren Sie die Bestellung mit der Methode order_cancel und übergeben Sie ihr die Bestellnummer.


 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) Wenn die Zeit noch nicht abgelaufen ist, hoffen wir nur, dass wir zu unserem Preis kaufen können.


 console.log(`,        ,      ${timePassed} `); } } }); } }else{ 

Alles, wir haben offene Aufträge herausgefunden, jetzt weiß unser Roboter, was mit Aufträgen zu tun ist, wenn er sie erstellt. Die halbe Arbeit erledigt.


Also ein Block, wenn wir keine Bestellungen haben.


Informationen zu unserem Konto erhalten wir mithilfe der user_info- Methode:


 exmo.api_query('user_info',{},(result)=>{ let res = JSON.parse(result); 

Der Einfachheit halber schreiben wir Guthaben für unsere Paare auf:


 let balance = res.balances[currency1]; let balance2 = res.balances[currency2]; 

Überprüfen Sie, ob Währung1 verkauft werden kann.


 if(balance >= currency1MinQuantity){} 

Wenn ja, müssen wir die Verkaufsrate berechnen.


Sie müssen die gesamte Währung verkaufen, die Sie gekauft haben, den Betrag, den Sie gekauft haben, plus Gewinn abzüglich der Umtauschprovision.


Ein wichtiger Punkt! Wir haben weniger Währungen als wir gekauft haben - die Börse hat eine Provision erhalten.


 let wannaGet = canSpend + canSpend * (stockFee+profit); console.log('sell', balance, wannaGet, (wannaGet/balance)); 

Beim Erstellen von Aufträgen muss der Methode order_create die folgenden Parameter übergeben werden:


  • Paar ist unser aktuelles Paar für den Handel;
  • Menge - Menge;
  • Preis - Preis;
  • Typ - Typ der erstellten Bestellung (Kauf / Verkauf);

Wir wollen verkaufen - in der Art, die wir verkaufen .


 let options = { "pair": currentPair, "quantity": balance, "price": wannaGet / balance, "type": 'sell' }; 

und senden Sie eine Anfrage, wenn alles korrekt ist, sehen Sie den Eintrag "Ein Verkaufsauftrag wurde erstellt".


 exmo.api_query("order_create", options,(result)=>{ if(result.error) console.log(result.error); console.log("   ", currency1, result.order_id); }); 

Das ist alles. Wenn wir eine Währung hatten, haben wir einfach einen Auftrag zum Verkauf erstellt.


Nun wenden wir uns dem interessantesten Block zu: dem Fall, dass wir keine Währung1 (btc) haben und diese für unsere Währung2 (usd) kaufen möchten.


Überprüfen Sie zunächst, ob in Währung2 genügend Geld in der Bilanz vorhanden ist.


 if(balance2 >= canSpend){} 

Wenn dies der Fall ist, müssen wir den Durchschnittspreis ermitteln, für den Währung1 (BTC) für den in avgPricePeriod angegebenen Zeitraum verkauft wird .


Ein bisschen Text:
Exmo verfügt über eine Tickermethode mit Statistiken und Handelsvolumina für Währungspaare. Die Statistiken zeigen den Durchschnittspreis der letzten 24 Stunden. Der Unterschied zwischen dem Durchschnittspreis und dem Preis, zu dem die Auktion derzeit stattfindet, kann jedoch sehr unterschiedlich sein.


Aus diesem Grund können wir lange auf die Ausführung eines Verkaufsauftrags warten.


Wir werden unser Fahrrad machen.


Exmo hat eine Handelsmethode und gibt eine Liste von Geschäften für ein Währungspaar zurück.


Wir werden das perfekte Angebot für den avgPricePeriod nehmen, an dem wir interessiert sind, und daraus den Durchschnittspreis berechnen.


Dies ist keine ideale Option, zeigt jedoch die tatsächlichen Preise an, zu denen sie verkaufen und kaufen.


Zum Zeitpunkt des Schreibens beträgt der Durchschnittspreis von BTC_USD beispielsweise 8314, während der Kauf an der Börse zu einem Preis von 7970 erfolgt.


Wenn wir eine Bestellung zu einem Durchschnittspreis aufgeben, wird diese sofort zu dem in Verkaufsaufträgen angegebenen Mindestpreis ausgeführt.


Wenn wir jedoch Gewinn und Umtauschprovision hinzufügen, werden wir wahrscheinlich sehr lange auf den Verkauf warten.


Wenden wir uns also der Handelsmethode zu und fragen ihn nach Statistiken zu unserem aktuellen Paar:


 exmo.api_query("trades",{"pair":currentPair}, result => { let res = JSON.parse(result); let prices = []; let summ = 0; 

Wir werden alle Ergebnisse durchgehen und nur diejenigen belassen, die für unseren Zeitraum geeignet sind.


 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)); } } 

Und berechnen Sie den Durchschnittspreis.


 let avgPrice = summ2 / prices.length; 

Wir haben einen Durchschnittspreis, aber wir müssen ihn ein wenig korrigieren - subtrahieren Sie die Börsenprovision und addieren Sie den gewünschten Gewinn. Nachdem wir einen Preis erhalten haben, der unter dem durchschnittlichen Marktpreis liegt, werden wir etwas mehr Währung kaufen, da die Börse anschließend daran teilnimmt.


 let needPrice = avgPrice - avgPrice * (stockFee + profit); 

Wir bekommen den endgültigen Betrag, den wir kaufen müssen.


 let ammount = canSpend / needPrice; console.log('Buy', ammount, needPrice); 

Wir prüfen, ob es möglich ist, einen solchen Währungsbetrag zu kaufen (ist der Mindestkaufbetrag nicht verletzt).


 if(ammount >= currency1MinQuantity){} 

Wenn unsere Menge größer ist, bilden wir die Parameter für die Methode order_create , nur diesmal mit der Kaufart .


  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(',   '); } 

Jetzt müssen wir unsere Funktion auf den Timer stellen (der Bereich ist zum Beispiel alle 5 Sekunden einmal) und wir können ihn ausführen.


 var timerId = setTimeout(function tick() { trade(); timerId = setTimeout(tick, 5000); }, 5000); 

 node index.js 

Herzlichen Glückwunsch, Sie haben Ihren ersten Handelsroboter geschrieben: Sie können den Algorithmus beenden und viel Geld verdienen. nur ein Scherz .


Ich denke, Sie haben eine vernünftige Frage: "Wie viel Geld können Sie auf diese Weise verdienen?"


Für eine Operation mit 5 Dollar verdiene ich ungefähr 2-3 Cent. Dies liegt an der Primitivität des Algorithmus, der funktioniert, wenn der Preis in einem bestimmten Bereich schwankt (und dies ist beim Austausch von Kryptowährungen fast immer nicht der Fall). Pro Tag finden ca. 10-20 Operationen statt (mit guten Händen). Du kannst dich selbst zählen;)


Aber wir beherrschen den Code nicht um des Geldes willen.


Nochmals ein Link zum Github mit der Vollversion des Bots und Kommentaren.
https://github.com/v-florinskiy/exmo-exchange-trade-bot


Dies ist mein erster Artikel - nicht streng beurteilen)


Alle Gewinn.


PS: Für diejenigen, die nicht mit Node gearbeitet haben, funktioniert Ihr Skript natürlich, während die Konsole geöffnet ist.


Damit Ihr Roboter rund um die Uhr funktioniert, benötigen Sie eine Art vps: Dort setzen Sie nodejs, npm und beispielsweise pm2. Mit diesem Dienstprogramm funktioniert das Skript auch dann weiter, wenn die Konsole geschlossen ist.

Source: https://habr.com/ru/post/de416073/


All Articles