Bot perdagangan cryptocurrency sederhana

Halo semuanya! Hari ini kita akan menulis robot perdagangan tempur pertama kita untuk bermain di bursa saham. Cryptoexchange. Mengapa pertukaran cryptocurrency?


a) tema sensasi;
b) mereka entah bagaimana lebih sederhana.


Pertama, saya ingin segera memperingatkan para penggemar kasino Three Axes: Anda tidak akan mendapatkan mobil besok. Artikel ini lebih lanjut tentang cara mulai menulis robot Anda, sehingga algoritme akan primitif, tetapi berfungsi.


Kedua, Anda akan mendapat penghasilan. Sedikit saja.


C / f “Game for a fall” (2015)
- Bau ini, apa itu? Seperti apa baunya?
- Cologne?
- Tidak ...
- Peluang?
- Tidak. Uang
- Oh ... semuanya jelas
- Bau uang!
- Begitu.

Untuk yang paling tidak sabar, semua kode di exmo-exchange-trade-bot github .


Tahap 1: Pertukaran.


Kami akan berdagang di bursa EXMO. Ada beberapa alasan. Pertukaran populer di CIS, itu berbahasa Rusia dan mendukung input rubel, ia memiliki kemampuan untuk membuat pasangan ke rubel.


Di antara minusnya adalah proses penyetoran rubel yang tidak nyaman, komisi yang layak, beberapa pasangan yang diperdagangkan.


Bagi kami, hal utama adalah bahwa ia memiliki solusi siap pakai untuk bekerja dengan API mereka. Ini tentu akan memudahkan pekerjaan kita.


Jadi mari kita mulai.


Tentu saja, Anda perlu mendaftar di bursa saham dan menyetor sejumlah uang. Sebagai contoh, saya berkontribusi $ 5.


Lebih lanjut dalam akun Anda, Anda akan menerima kunci untuk akses ke API.


Saya akan menggunakan klien untuk NodeJS (jadi Anda harus menginstal nodejs dan npm).


Di komputer Anda, buat folder baru dan file tempat robot perdagangan kami akan (mis. Exmo / index.js), buka konsol dan buat persiapan standar terakhir.


Kami pergi ke folder dengan proyek kami dan menulis - npm init, lalu tekan enter untuk semua pertanyaan.


Selanjutnya kita menulis


npm install exmo-api 

Ketika paket sedang diinstal, buat file lain, sebut saja exmo.js dan isi dengan konten ini.


dengan konten ini
 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; }; 

File ini berisi alamat API, koneksi pustaka tambahan yang kami perlukan untuk bekerja dengan API, dan fungsi utama untuk permintaan ke API.


Itu saja, kami telah menyiapkan segalanya dan sekarang kami dapat langsung mulai membuat "mesin penghasil uang" pribadi;)


Tahap 2: Kode


Buka index.js kami dan hubungkan file exmo.js:


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

Selanjutnya, pergi ke pertukaran di akun pribadi Anda ke tempat kami membuat kunci kami untuk akses ke api. Kami menyalinnya dan menyimpannya dalam variabel:


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

Sekarang buat dua variabel:
currency1 adalah APA yang kami beli;
currency2 - mata uang yang kami beli.


Saya ingin membeli bitcoin untuk dolar:


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

Selanjutnya, poin penting - kami membuat variabel dengan jumlah taruhan minimum. Pertukaran tidak memungkinkan untuk membeli kurang dari jumlah ini.


Kami pergi ke alamat https://api.exmo.com/v1/pair_settings/ mencari pasangan Anda (bagi saya ini BTC_USD) dan lihat parameter pertama - min_quantity - 0,001


 const currency1MinQuantity = 0.001; 

Dan beberapa variabel lagi:


jumlah menit setelah pesanan pembelian yang tidak terpenuhi akan dibatalkan mata uang1


 const orderLifeTime = 3; 

komisi pertukaran (0,002 = 0,2%)


 const stockFee = 0.002; 

periode waktu (dalam menit) untuk menghitung harga rata-rata (ini akan diperlukan untuk algoritma kami)


 const avgPricePeriod = 1; 

jumlah mata uang2 untuk membeli mata uang1 dalam satu kali transaksi (saya melemparkan $ 5 - saya akan beroperasi dengan mereka)


 const canSpend = 5; 

jumlah laba yang diinginkan dari setiap transaksi (0,001 = 0,1%)


 const profit = 0.001; 

Jika waktu pertukaran menyimpang dari saat ini


 const stockTimeOffset = 0; 

Untuk kenyamanan, kami menggabungkan pasangan kami melalui _


 let currentPair = currency1+'_'+currency2; 

Inisialisasi koneksi.


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

Untuk ujian, Anda dapat meminta informasi tentang diri Anda:


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

Pergi ke konsol dan jalankan


 node index.js 

Jika semuanya dilakukan dengan benar, maka Anda akan melihat informasi tentang Anda!


Semuanya berfungsi dan Anda dapat beralih ke bagian yang paling menarik - fungsi yang akan dihasilkan oleh nenek bagi kami.


Jadi, saya sudah katakan di atas bahwa algoritma kami akan bodoh, sekarang Anda akan mengerti berapa banyak)


Caranya adalah dengan mengambil sejarah transaksi yang diselesaikan untuk periode apa pun - kami memiliki variabel avgPricePeriod yang bertanggung jawab untuk ini - dan menghitung harga rata-rata untuk mata uang1 yang dijual. Untuk harga rata-rata ini, kami akan melakukan pemesanan.


Jadi mari kita mulai. Kami menulis fungsi perdagangan () kami


 function trade(){} 

Pertama, kami mendapatkan daftar pesanan terbuka kami:


1) kami memeriksa apakah kami memiliki pesanan terbuka untuk pasangan kami menggunakan metode api user_open_orders. Jika ada juga untuk dijual,


maka kita tinggal menunggu mereka dipenuhi (terkadang sampai akhir zaman). Jika ada pesanan pembelian, ingat saja.


 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) Kami memeriksa apakah kami memiliki pesanan pembelian terbuka.


Kami memilah-milah semua pesanan dan mendapatkan riwayatnya menggunakan metode order_trades , melewati id pesanan di sana.


Ada 3 opsi:


 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) kita dapat membeli mata uang yang diperlukan tidak secara keseluruhan, tetapi sebagian dari pesanan penjual.
Karena itu, jika kita telah membeli dengan harga yang diinginkan, maka kita sedang menunggu pembelian seluruh jumlah.


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

2) dengan opsi kedua, kita perlu memeriksa apakah pesanan kita hang terlalu lama. Harga berubah dengan cepat dan mungkin harga rata-rata tidak lagi relevan. Untuk melakukan ini, kami membuat variabel orderLifeTime, di mana kami menunjukkan berapa banyak pesanan kami harus bertahan dalam hitungan menit.


Jika waktunya habis, maka batalkan pesanan menggunakan metode order_cancel , berikan id pesanan.


 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) jika waktunya belum tiba, maka kami hanya berharap bahwa kami dapat membeli dengan harga kami.


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

Semuanya, kami menemukan pesanan terbuka, sekarang robot kami tahu apa yang harus dilakukan dengan pesanan ketika itu menciptakan mereka. Setengah pekerjaan selesai.


Jadi, blok kalau kita tidak punya pesanan.


Kami mendapatkan informasi tentang akun kami menggunakan metode user_info :


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

Untuk kenyamanan, kami menuliskan saldo untuk pasangan kami:


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

Periksa apakah ada currency1 yang bisa dijual?


 if(balance >= currency1MinQuantity){} 

Jika demikian, kita perlu menghitung tingkat penjualan.


Anda harus menjual semua mata uang yang Anda beli, jumlah yang Anda beli plus keuntungan dikurangi komisi pertukaran.


Poin penting! Kami memiliki lebih sedikit mata uang daripada yang kami beli - bursa mengambil komisi.


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

Saat membuat pesanan, metode order_create perlu melewati parameter:


  • pair adalah pasangan kami saat ini untuk perdagangan;
  • jumlah - jumlah;
  • harga - harga;
  • jenis - jenis pesanan yang dibuat (beli / jual);

Kami ingin menjual - dalam jenis yang kami tentukan menjual .


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

dan kirim permintaan, jika semuanya benar, maka Anda akan melihat entri "Pesanan jual telah dibuat"


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

Itu saja. Jika kami memiliki mata uang, kami hanya membuat pesanan untuk menjualnya.


Sekarang kita beralih ke blok yang paling menarik: kasing jika kita tidak memiliki currency1 (btc) dan kami ingin membelinya untuk currency2 kami (usd).


Pertama, periksa apakah ada cukup uang di neraca dalam mata uang2.


 if(balance2 >= canSpend){} 

Jika ada, maka kita perlu mendapatkan harga rata-rata untuk mana mata uang1 (btc) dijual untuk periode waktu yang kita tentukan dalam avgPricePeriod .


Sedikit lirik:
Exmo memiliki metode ticker dengan statistik dan volume perdagangan untuk pasangan mata uang. Statistik menunjukkan harga rata-rata selama 24 jam terakhir. Namun, perbedaan antara harga rata-rata dan harga di mana lelang saat ini diadakan bisa sangat berbeda.


Karena itu, kita bisa menunggu lama untuk pelaksanaan pesanan jual.


Kami akan membuat sepeda kami.


Exmo memiliki metode perdagangan , ia mengembalikan daftar penawaran untuk pasangan mata uang.


Kami akan mengambil tawaran sempurna untuk avgPricePeriod yang kami minati dan dari mereka kami akan menghitung harga rata-rata.


Ini bukan opsi yang ideal, tetapi ini akan menunjukkan harga riil di mana mereka menjual dan membeli.


Misalnya, pada saat penulisan, harga rata-rata BTC_USD adalah 8314, sedangkan pembelian di bursa dilakukan pada harga 7970.


Jika kami melakukan pemesanan pada harga rata-rata, itu akan segera dieksekusi pada harga minimum yang ditunjukkan dalam pesanan jual.


Tetapi menambahkan komisi laba dan pertukaran, kita cenderung menunggu waktu yang sangat lama untuk penjualan.


Jadi, mari kita beralih ke metode perdagangan dan memintanya statistik tentang pasangan currentPair kami:


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

Kami akan memeriksa semua hasil dan hanya menyisakan yang cocok untuk periode waktu kami.


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

Dan hitung harga rata-rata.


 let avgPrice = summ2 / prices.length; 

Kami memiliki harga rata-rata, tetapi kami harus memperbaikinya sedikit - kurangi komisi pertukaran stockFee dan tambahkan laba yang diinginkan. Dengan demikian, setelah menerima harga di bawah harga pasar rata-rata, kami akan membeli mata uang lebih sedikit, karena pertukaran kemudian mengambil bagian darinya;


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

Kami mendapatkan jumlah akhir yang perlu kami beli.


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

Kami memeriksa apakah mungkin untuk membeli jumlah mata uang seperti itu (apakah jumlah pembelian minimum tidak dilanggar).


 if(ammount >= currency1MinQuantity){} 

Jika jumlah kami lebih besar, maka kami membentuk parameter untuk metode order_create , hanya kali ini dengan jenis beli .


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

Sekarang kita perlu meletakkan fungsi kita pada timer (rentangnya adalah setiap 5 detik, misalnya) dan kita dapat menjalankannya.


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

 node index.js 

Selamat, Anda telah menulis robot perdagangan pertama Anda: Anda dapat menyelesaikan algoritme dan mendapatkan banyak uang) hanya bercanda .


Saya pikir Anda memiliki pertanyaan yang masuk akal, "Berapa banyak uang yang bisa Anda hasilkan dengan cara ini?"


Untuk satu operasi dengan $ 5, saya mendapat sekitar 2-3 sen. Hal ini disebabkan oleh keutamaan algoritma, yang berfungsi jika harga berfluktuasi dalam kisaran tertentu (dan ini hampir selalu tidak terjadi pada pertukaran cryptocurrency). Sekitar 10-20 operasi berlangsung per hari (dengan tangan yang baik). Anda dapat menghitung sendiri;)


Tapi kami tidak menguasai kode demi uang)


Sekali lagi, tautan ke github dengan versi lengkap dari bot dan komentar.
https://github.com/v-florinskiy/exmo-exchange-trade-bot


Ini artikel pertama saya - jangan menilai dengan keras)


Semua untung.


PS: Bagi mereka yang tidak bekerja dengan node, skrip Anda secara alami akan berfungsi saat konsol terbuka.


Agar robot Anda bekerja 24/7, Anda memerlukan beberapa vps: di sana Anda meletakkan nodejs, npm dan, misalnya, pm2. Menggunakan utilitas ini, skrip akan terus bekerja, bahkan jika konsol ditutup.

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


All Articles