Pemangsa lobak OKCoin dipindahkan

Penulis:Sifar, Tarikh: 2017-01-30 19:38:25
Tag:Frekuensi tinggi

Transplantasi daripada:https://github.com/richox/okcoin-leeks-reaper

Saya hanya melakukan pemindahan, tidak ada ujian cakera fizikal, dan saya berminat untuk belajar. Pencipta Kuantitized Tick-Level Retargeting menyokong permainan Deepth dan Trades, yang boleh melakukan retargeting secara langsung ke arah logik strategi pembelajaran

Berikut adalah gambaran asal:

OKCoin pemetik lobak

Ini adalah program bot perdagangan frekuensi tinggi di platform dagangan Bitcoin OKCoin, yang telah berjaya menyalurkan 6,000 ringgit kepada 250,000 ringgit pada pertengahan Januari 2017. Strategi ini sebenarnya telah gagal kerana dasar tekanan tinggi Bank Sentral terhadap Bitcoin yang baru-baru ini, platform utama telah menghentikan pembiayaan dan mula mengenakan bayaran transaksi.

image

Program robot ini berdasarkan dua strategi utama:

  1. Strategi trend: mengikut pesanan tepat pada masanya apabila turun naik trend harga, yang dikatakanPercubaan untuk membunuh
  2. Strategi rebalancing: apabila kedudukan menyimpang 50%, keluarkan risalah untuk meletakkan kedudukan secara beransur-ansur kembali ke 50% dan mengelakkan pembalikan pada akhir trend menyebabkan kemunduran, iaitu:Penghasilan di dalam beg, tidak makan ekor ikan

Prosedur ini memerlukan kedudukan yang seimbang, iaitu (modal + pembiayaan = wang tunai), supaya aset bersih tidak berubah seiring dengan harga ketika kedudukan 50%, tetapi juga menjamin apabila turun naik trend berlaku.Terjatuh dan terjatuh

Terima kasih kepada dua projek berikut:

Terima kasih kepada 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 lanjut

Raja Hip-HopStrategi telah gagal dan keuntungan berasal dari pendapatan frekuensi tinggi dengan sedikit perbezaan dengan bayaran sifar.

Kongbai979 self.vol到底是个啥?是一个ticker期间内所有交易量的总和吗?

hariTrader2018for (var i = 0; i < 15; i++) { self.prices[i] = trades[trades.length - 1].Price }; adakah ini sedikit masalah, adakah setiap elemen dalam array harga adalah harga transaksi terkini?

Kouyou7035Saya mempunyai beberapa bursa yang tidak mempunyai bayaran pembetulan dan berdagang dengan mendalam. Bolehkah anda mencuba strategi ini? Adakah Tuhan memberi panduan, saya boleh membantu memohon akaun bursa?

bijiasuoBagus, sayangnya tidak boleh, boleh sekarang?

SkyfffireHarga: 2000 keping, tidak rasmi, boleh dihubungi

RajajackAdakah ada yang telah mencuba dan datang untuk membincangkan manfaatnya?

valennnBilakah versi nota akan datang?

WuqianmingBagaimana untuk menjalankan bursa yang tidak disokong oleh botvs, yang bebas dagangan, bagaimana untuk menulis API bursa?

JTerima kasih kerana berkongsi strategi yang baik! exchange.CancelOrder ((orders[i].Id) Ada sedikit masalah dengan kod pencabutan, pencabutan yang berterusan semasa ujian. Jika anda melihat kod versi asal, anda seharusnya menunggu 10 saat untuk menarik balik. Saya tidak mempunyai masalah dengan apa-apa yang lain, saya mengubahnya dan meletakkannya di bursa percuma, dan rasanya sangat baik.

Kmstudio 66行prices需加.length

Buah kacang saljiBahasa apa itu?

Sifar 平衡那里下单忘加上Price属性了。。已更正,有发现bug请及时提交.

Air TawarMenurutnya, ada lagi strategi untuk mendapatkan wang, atau tidak menjual, dan menyimpan wang sendiri.

1213761768Tidak boleh keluar.

Zhang tidak boleh menahan diri.Tidak, harga tawaran mestilah lebih rendah daripada harga permintaan, satu adalah harga beli, satu adalah harga jual.

bwxiaokJika anda ingin mengetahui harga jual atau harga jual, anda perlu mengetahui harga jual atau harga jual. Jika anda ingin mengetahui harga jual atau harga jual, anda perlu mengetahui harga jual atau harga jual.

Saya suka bulu.Saya telah menulis nota, dan semua orang perlu dapat menambahkan Weibo saya Hoo_tongxue, dan yang paling penting, percuma.

Saya suka bulu."Sudah lama saya tidak memakai pakaian yang tebal.

Bola arang kecilDi mana-mana bursa?

SifarIni sepatutnya initialize kepada harga terkini, disusul dengan operasi shift.

Kemunculan MuzikIni adalah satu-satunya cara yang boleh anda lakukan untuk menghidupkan semula robot.

suskiYa, boleh, lobak ini akan lebih baik ^_^

SkyfffireBiarlah penjual menjual dan pembeli membeli, dan jangan berdebat dengan anda.

Perempuan juga.Semua orang telah membuka kod sumbernya, anda boleh komen, jual 2000?

Akkk 请问zaif.jp现在还是免手续费吗?怎么通过认证呢

Xiahaohuan001Lihat ID ya

J 在Zaif.jp上测试,买一卖一间经常就没有空间,用这个策略有什么问题吗?

JAdakah itu benar? Marilah kita keluar dan beri pengajaran kepada semua orang.

Xiahaohuan001Penulis yang terkejut

JBaiklah, ada beberapa soalan lagi, sila, dan ada satu lagi catatan: https://www.botvs.com/bbs-topic/677

SifarJika anda mempunyai apa-apa maklumat atau pertanyaan mengenai strategi ini, sila post di forum, terima kasih atas sokongan anda!

SifarTerima kasih untuk cadangan, saya menambah parameter, masa menunggu pesanan imbangan, jika anda ingin memproses secara serentak, anda boleh merakam ID setiap pesanan dengan masa pesanan, dan kemudian membatalkan secara selektif, yang dapat mengurangkan kelewatan, tetapi secara logiknya, harus menyeimbangkan semula perdagangan terlebih dahulu, kerana tidak semua bursa menyokong sifat Time untuk mendapatkan pesanan, jadi platform tidak menambahkan sifat ini dalam Perintah, memerlukan statistik sendiri.

Xiahaohuan001Saya rasa strategi ini agak pelik, saya suka.

SifarSaya tak pernah cuba. Saya perlukan kajian anda sendiri.

Orion1708Z besar yang sukar dipindahkan. Sila, adakah perubahan pada parameter dasar lalai mempunyai kesan yang besar pada dasar?

SifarHahah, terima kasih, sudah ditambah.

SifarJavascript

SifarFrekuensi perdagangan tinggi

Mimpi kecilPenulis asal juga hanya didedahkan pada hari-hari yang sama ketika ia menerima bayaran.

Xiahaohuan001Mengapa strategi trend takut dengan kos kejutan?