Mempindahkan OKCoin ke mesin pemetik lobak

Penulis:Tidak ada, Tanggal: 2017-01-30 19:38:25
Tag:Frekuensi tinggi

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:

OKCoin adalah mesin pemetik kacang kedelai

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.

image

Program robot ini didasarkan pada dua strategi utama:

  1. Strategi tren: melakukan order tepat waktu dan mengikuti ketika terjadi fluktuasi tren harga, yang merupakan pepatahMencari dan Menembak
  2. Strategi rebalancing: ketika posisi menyimpang 50%, keluarkan buku kecil yang membuat posisi kembali ke 50% secara bertahap, mencegah pembalikan pada akhir tren yang menyebabkan retracement, yaitu:Penghasilannya di tas, tidak makan ekor

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

Berkaitan

Lebih banyak

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

Mimpi kecilPenulis aslinya juga hanya dipublikasikan pada hari-hari ketika biaya pembayaran dilakukan.

Xiahaohuan001Mengapa strategi tren takut akan biaya kejutan?