Transplantasi dari:https://github.com/richox/okcoin-leeks-reaper
Saya hanya melakukan transplantasi, tidak ada tes fisik, saya tertarik untuk belajar. Penemu Kuantitatif Tick-Level Retesting mendukung playback Deepth dan Trades, yang dapat melakukan retesting langsung ke logika strategi pembelajaran
Berikut adalah penjelasan aslinya:
Ini adalah program robot perdagangan frekuensi tinggi di platform perdagangan Bitcoin OKCoin, yang telah berhasil memindahkan dana dari 6.000 yang awalnya diinvestasikan menjadi 250.000 pada pertengahan Januari 2017. Strategi ini telah benar-benar gagal karena kebijakan tekanan tinggi yang dilakukan oleh Bank Sentral terhadap Bitcoin.
Program robot ini didasarkan pada dua strategi utama:
Prosedur ini membutuhkan posisi yang seimbang, yaitu (modal + pembiayaan = mata uang), sehingga ketika posisi 50%, aset bersih tidak bergeser dengan harga, tetapi juga menjamin ketika terjadi pergerakan tren.Terombang ambing.。
Terima kasih atas dua proyek berikut:
Terima kasih OKCoin:
BTC: 3QFn1qfZMhMQ4FhgENR7fha3T8ZVw1bEeU
/*backtest start: 2019-09-05 00:00:00 end: 2019-09-05 22:00:00 period: 1h exchanges: [{"eid":"Binance","currency":"BTC_USDT","fee":[0,0]}] mode: 1 */ function LeeksReaper() { var self = {} self.numTick = 0 self.lastTradeId = 0 self.vol = 0 self.askPrice = 0 self.bidPrice = 0 self.orderBook = {Asks:[], Bids:[]} self.prices = [] self.tradeOrderId = 0 self.p = 0.5 self.account = null self.preCalc = 0 self.preNet = 0 self.updateTrades = function() { var trades = _C(exchange.GetTrades) if (self.prices.length == 0) { while (trades.length == 0) { trades = trades.concat(_C(exchange.GetTrades)) } for (var i = 0; i < 15; i++) { self.prices[i] = trades[trades.length - 1].Price } } self.vol = 0.7 * self.vol + 0.3 * _.reduce(trades, function(mem, trade) { // Huobi not support trade.Id if ((trade.Id > self.lastTradeId) || (trade.Id == 0 && trade.Time > self.lastTradeId)) { self.lastTradeId = Math.max(trade.Id == 0 ? trade.Time : trade.Id, self.lastTradeId) mem += trade.Amount } return mem }, 0) } self.updateOrderBook = function() { var orderBook = _C(exchange.GetDepth) self.orderBook = orderBook if (orderBook.Bids.length < 3 || orderBook.Asks.length < 3) { return } self.bidPrice = orderBook.Bids[0].Price * 0.618 + orderBook.Asks[0].Price * 0.382 + 0.01 self.askPrice = orderBook.Bids[0].Price * 0.382 + orderBook.Asks[0].Price * 0.618 - 0.01 self.prices.shift() self.prices.push(_N((orderBook.Bids[0].Price + orderBook.Asks[0].Price) * 0.35 + (orderBook.Bids[1].Price + orderBook.Asks[1].Price) * 0.1 + (orderBook.Bids[2].Price + orderBook.Asks[2].Price) * 0.05)) } self.balanceAccount = function() { var account = exchange.GetAccount() if (!account) { return } self.account = account var now = new Date().getTime() if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) { self.preCalc = now var net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks)) if (net != self.preNet) { self.preNet = net LogProfit(net) } } self.btc = account.Stocks self.cny = account.Balance self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny) var balanced = false if (self.p < 0.48) { Log("开始平衡", self.p) self.cny -= 300 if (self.orderBook.Bids.length >0) { exchange.Buy(self.orderBook.Bids[0].Price + 0.00, 0.01) exchange.Buy(self.orderBook.Bids[0].Price + 0.01, 0.01) exchange.Buy(self.orderBook.Bids[0].Price + 0.02, 0.01) } } else if (self.p > 0.52) { Log("开始平衡", self.p) self.btc -= 0.03 if (self.orderBook.Asks.length >0) { exchange.Sell(self.orderBook.Asks[0].Price - 0.00, 0.01) exchange.Sell(self.orderBook.Asks[0].Price - 0.01, 0.01) exchange.Sell(self.orderBook.Asks[0].Price - 0.02, 0.01) } } Sleep(BalanceTimeout) var orders = exchange.GetOrders() if (orders) { for (var i = 0; i < orders.length; i++) { if (orders[i].Id != self.tradeOrderId) { exchange.CancelOrder(orders[i].Id) } } } } self.poll = function() { self.numTick++ self.updateTrades() self.updateOrderBook() self.balanceAccount() var burstPrice = self.prices[self.prices.length-1] * BurstThresholdPct var bull = false var bear = false var tradeAmount = 0 if (self.account) { LogStatus(self.account, 'Tick:', self.numTick, ', lastPrice:', self.prices[self.prices.length-1], ', burstPrice: ', burstPrice) } if (self.numTick > 2 && ( self.prices[self.prices.length-1] - _.max(self.prices.slice(-6, -1)) > burstPrice || self.prices[self.prices.length-1] - _.max(self.prices.slice(-6, -2)) > burstPrice && self.prices[self.prices.length-1] > self.prices[self.prices.length-2] )) { bull = true tradeAmount = self.cny / self.bidPrice * 0.99 } else if (self.numTick > 2 && ( self.prices[self.prices.length-1] - _.min(self.prices.slice(-6, -1)) < -burstPrice || self.prices[self.prices.length-1] - _.min(self.prices.slice(-6, -2)) < -burstPrice && self.prices[self.prices.length-1] < self.prices[self.prices.length-2] )) { bear = true tradeAmount = self.btc } if (self.vol < BurstThresholdVol) { tradeAmount *= self.vol / BurstThresholdVol } if (self.numTick < 5) { tradeAmount *= 0.8 } if (self.numTick < 10) { tradeAmount *= 0.8 } if ((!bull && !bear) || tradeAmount < MinStock) { return } var tradePrice = bull ? self.bidPrice : self.askPrice while (tradeAmount >= MinStock) { var orderId = bull ? exchange.Buy(self.bidPrice, tradeAmount) : exchange.Sell(self.askPrice, tradeAmount) Sleep(200) if (orderId) { self.tradeOrderId = orderId var order = null while (true) { order = exchange.GetOrder(orderId) if (order) { if (order.Status == ORDER_STATE_PENDING) { exchange.CancelOrder(orderId) Sleep(200) } else { break } } } self.tradeOrderId = 0 tradeAmount -= order.DealAmount tradeAmount *= 0.9 if (order.Status == ORDER_STATE_CANCELED) { self.updateOrderBook() while (bull && self.bidPrice - tradePrice > 0.1) { tradeAmount *= 0.99 tradePrice += 0.1 } while (bear && self.askPrice - tradePrice < -0.1) { tradeAmount *= 0.99 tradePrice -= 0.1 } } } } self.numTick = 0 } return self } function main() { var reaper = LeeksReaper() while (true) { reaper.poll() Sleep(TickInterval) } }
Raja Iblis Hip HopStrategi telah gagal, dan keuntungan berasal dari pendapatan rendah frekuensi tinggi dengan biaya operasi nol.
Kongbai979 self.vol到底是个啥?是一个ticker期间内所有交易量的总和吗?
hariTrader2018for (var i = 0; i < 15; i++) { self.prices[i] = trades[trades.length - 1].Price }; Apakah ada sedikit masalah di sini, apakah setiap elemen dalam array harga adalah harga transaksi terbaru?
kau7035Saya memiliki beberapa bursa yang sangat baik dan tidak ada biaya transaksi. Bolehkah Anda mencoba strategi ini?
bijiasuo"Sangat bagus, sayangnya tidak bisa, sekarang bisa?"
SkyfffireDijual: 2000 eksemplar, tidak resmi, dengan maksud untuk dihubungi
RajajackSiapa saja yang sudah mengujinya, datang dan bahas manfaatnya?
valennnKetika versi komentar akan datang?
WuqianmingBagaimana cara menulis API bursa tanpa dukungan botvs, dan bagaimana cara menjalankan bursa bebas perdagangan?
JTerima kasih telah berbagi strategi yang bagus! exchange.CancelOrder ((orders[i].Id) Ada sedikit masalah dengan kode pembatalan, karena pemesanan terus-menerus dibatalkan saat pengujian. Setelah melihat kode versi aslinya, seharusnya Anda harus menunggu 10 detik untuk menariknya. Saya tidak punya masalah dengan hal-hal lain, dan setelah saya mengubahnya, saya menaruhnya di bursa yang bebas biaya, dan rasanya sangat baik.
Kmstudio 66行prices需加.length
kacang saljuBahasa apa itu?
Tidak ada 平衡那里下单忘加上Price属性了。。已更正,有发现bug请及时提交.
Air mancur"Saya tidak tahu apa yang akan terjadi, tapi saya pikir ada strategi untuk menghasilkan uang, atau tidak menjual, dan menyimpan uang Anda sendiri.
1213761768Tidak bisa keluar.
Zhang tidak mauTidak, bid price harus lebih kecil dari ask price, satu adalah buy price, satu adalah sell price.
BtwxiaokTanyakan pada saat menghitung bidprice dan askprice, orderan dilakukan seolah-olah tidak menilai bidprice lebih besar dari askprice, jadi jika beli satu jual satu sangat dekat, perhitungan kemungkinan besar adalah beli tinggi atau jual rendah, akankah ada masalah ini?
Aku suka bulu.Saya menulis sebuah komentar, dan semua orang harus dapat menambahkan Hoo_tongxue ke akun kami, dan yang terpenting, gratis.
Aku suka bulu."Saya tidak tahu apa yang akan terjadi", kata dia.
Bola Batubara KecilPerdagangan apa?
Tidak adaIni seharusnya initialized ke harga terbaru, di belakang ini ada operasi shift.
Pembuatan Kembali BerhasilSaat ini, kita sedang dalam perang robot.
suskiYa, bisa, ini lebih bagus ^_^
SkyfffireBiarlah penjual menjual dan pembeli membeli, dan jangan berdebat denganmu.
Perempuan juga.Orang-orang telah membuka sumbernya, komentar Anda, jual 2000? Maaf.
aku 请问zaif.jp现在还是免手续费吗?怎么通过认证呢
Xiahaohuan001Lihat ID ya
J 在Zaif.jp上测试,买一卖一间经常就没有空间,用这个策略有什么问题吗?
JApakah itu benar? Ayo keluar dan memberi pelajaran.
Xiahaohuan001Penulis asli terkejut
JBaiklah, ada beberapa pertanyaan, silakan, dan ada posting lain: https://www.botvs.com/bbs-topic/677
Tidak adaJika Anda memiliki pertanyaan tentang strategi ini, silakan kirim di forum, terima kasih atas dukungannya!
Tidak adaTerima kasih atas saran, saya menambahkan parameter, waktu tunggu order balance, jika ingin memproses secara bersamaan, Anda dapat mencatat ID setiap order dengan waktu pemesanan, dan kemudian membatalkan secara selektif, sehingga dapat mengurangi keterlambatan, namun secara logis, harus diimbangi terlebih dahulu, karena tidak semua bursa mendukung atribut Time untuk mendapatkan order, jadi platform tidak menambahkan atribut ini di Order, membutuhkan statistik sendiri.
Xiahaohuan001Saya merasa strategi ini aneh, saya suka.
Tidak adaSaya tidak pernah mencoba hal ini.
Orion1708Di sini Anda akan menemukan beberapa tips yang dapat Anda gunakan untuk membuat strategi Anda lebih mudah.
Tidak adaHa ha, terima kasih, sudah ditambahkan.
Tidak adaJavascript
Tidak adaTingkat frekuensi transaksi
Penemu Kuantitas - Mimpi KecilPenulis aslinya juga hanya dipublikasikan pada hari-hari ketika biaya pembayaran dilakukan.
Xiahaohuan001Mengapa strategi tren takut akan biaya kejutan?