OKCoin-Transplantation von Kabeljauern

Schriftsteller:Null, Datum: 2017-01-30 19:38:25
Tags:Hochfrequenz

Die Transplantation von:https://github.com/richox/okcoin-leeks-reaper

Ich habe nur Transplantationen gemacht, keine Festplattenuntersuchungen, interessiert, zu lernen. Erfinder Quantitative Tick-Level-Rückprüfung unterstützt die Wiedergabe von Deepth und Trades, die direkt die Lernstrategie Logik zurückprüfen können

Hier ist die Originalbeschreibung:

OKCoin ist ein Kohlenfischern

Es handelt sich um einen High-Frequency-Trading-Roboter auf der OKCoin-Bitcoin-Handelsplattform, der von Juni 2016 bis Mitte Januar 2017 erfolgreich die ursprünglich eingesetzten 6000 auf 250000 geblasen hat. Die Strategie ist praktisch ausgelöscht, da die großen Plattformen aufgrund der jüngsten Hochdruckpolitik der Zentralbank gegen Bitcoin ihre Zuteilung eingestellt und Transaktionsgebühren erhoben haben.

image

Der Roboterprogramm basiert auf zwei Hauptstrategien:

  1. Trendstrategie: Beim Auftreten von Trendschwankungen in den Preisen rechtzeitig ein Auftrag geben und folgen.Die Jagd nach dem Fliegen
  2. Ausgleichsstrategie: Wenn die Position 50% abweicht, wird die Kleinanzeige freigegeben, um die Position schrittweise um 50% zurückzukehren, um zu verhindern, dass eine Umkehr am Ende des Trends zu einem Rückzug führt, d.h.Die Gewinne fallen in den Sack, der Fisch ist nicht zu essen

Dieses Verfahren erfordert ein Ausgleich der Positionen, d.h. Kapital+Finanzierung=Finanzierung, so dass die Positionen bei 50% die Nettowerte nicht mit den Preisen schwanken, sondern auch bei Trendschwankungen gewährleistet sind.Die Stürze sind schmerzhaft.

Ich danke zwei Projekten:

Dank an OKCoin:

Die in Artikel 1 Absatz 2 Buchstabe a genannten Informationen werden in der Liste der in Anhang I der Verordnung (EU) Nr. 1095/2010 aufgeführten Daten enthalten.


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

Verwandt

Mehr

Der König des Hip Hop.Die Strategie ist gescheitert und die Gewinne stammen aus einem hohen Frequenz-Spiegel-Einkommen mit null Bearbeitungsgebühren.

- Ich weiß nicht. self.vol到底是个啥?是一个ticker期间内所有交易量的总和吗?

dayTrader2018Für (var i = 0; i < 15; i++) { sel.prices[i] = trades[trades.length - 1].Preis }; Ist das nicht ein Problem, dass jedes Element in der Array der Preise der letzte Transaktionspreis ist?

Sie sind 7035Ich habe mehrere Börsen, auf denen es keine Bearbeitungsgebühren gibt, und ich bin sehr tief in den Handel eingegangen.

- Das ist nicht wahr.Das ist großartig, leider nicht, ist es jetzt möglich?

SkyfffireAnmerkung: Verkaufspreis: 2000 Exemplare, inoffiziell, mit Absicht zu verlinken

SchlagzeugWer hat es getestet, kommt und diskutiert über die Vorteile?

- Was ist?Wann kommt die Anmerkung?

WeiweiWie kann man eine freie Börse ohne botvs laufen lassen, wie muss man eine Börsen-API schreiben?

JDanke, dass du so eine gute Strategie geteilt hast! exchange.CancelOrder ((orders[i].Id) Der Code für die Abbestellung ist ein wenig problematisch. Der ursprüngliche Code sollte nach 10 Sekunden zurückgezogen werden. Ich habe es geändert und habe es auf einer kostenlosen Börse geladen, die sich gut anfühlt.

Kmstudio 66行prices需加.length

SchneeerbsenWas ist das für eine Sprache?

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

WasserbewohnerEs scheint, als ob es eine Strategie gibt, um Geld zu verdienen, oder nicht zu verkaufen, um die eigenen Pflanzen zu behalten.

1213761768Ich habe es nicht rausgelassen.

Zhang WeiweiNein, der Bid-Preis muss kleiner sein als der Ask-Preis, einer ist der Buy-Preis, einer ist der Sell-Preis.

- Ich weiß nicht.Bitte, bei der Berechnung des Bid-Preises und des Ask-Preises wird die Bestellung so ausgeführt, als ob man nicht entscheidet, ob der Bid-Preis größer als der Ask-Preis ist, also wenn ein Kauf und ein Verkauf sehr nahe sind, wird es wahrscheinlich hoch oder niedrig sein.

Ich liebe Flieder.Ich habe eine Kommentarversion geschrieben, in der alle meine Tweet Hoo_tongxue hinzufügen können, und vor allem kostenlos.

Ich liebe Flieder.Die echte Haut ist dick genug für ein Kleid.

Kleine KohlenkugelnWelche Börsen?

NullDas sollte initialiert werden zu den neuesten Preisen, hinter denen die Shift-Operation steht.

Die Umlagerung ist ein Wunder.Es ist ein Kampf um die Roboter, der schon lange nicht funktioniert.

KürbisDas ist eine gute Idee, das ist eine gute Idee.

SkyfffireDer Verkäufer soll verkaufen, und der Käufer soll kaufen, ohne dich zu streiten.

Auch die BrautIch habe die Idee, dass ich das in meinem eigenen Land tun kann, aber ich habe keine Ahnung, ob ich das tun kann.

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

Weiweiwei001Ich sehe die ID.

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

JIst das nicht wahr? Kommen Sie und lehren Sie.

Weiweiwei001Überraschender Autor

JIch habe ein paar Fragen, bitte, und ich habe einen weiteren Beitrag gemacht: https://www.botvs.com/bbs-topic/677

NullWenn Sie irgendwelche Lehren oder Fragen zu dieser Strategie haben, schreiben Sie bitte im Forum, danke für Ihre Unterstützung!

NullDank der Empfehlung habe ich einen Parameter hinzugefügt, die Wartezeit der Balance-Order, wenn Sie gleichzeitig verarbeiten möchten, können Sie die ID jedes Auftrags mit der Zeit der Bestellung erfassen und dann selektiv stornieren, um die Verzögerung zu reduzieren.

Weiweiwei001Ich finde diese Strategie seltsam, ich mag sie.

NullDas habe ich noch nicht versucht, aber ich möchte, dass Sie das selbst untersuchen.

Orion 1708Schwierige Z-Transportation. Bitte, hat eine Änderung des Standardwerts der Strategieparameter einen großen Einfluss auf die Strategie?

NullJa, danke, es ist hinzugefügt.

NullJavascript wird verwendet.

NullHäufige Transaktionen

Kleine TräumeDer Autor des Artikels wurde auch erst an jenen Tagen veröffentlicht, an denen er die Gebühren für die Bearbeitung erhoben hat.

Weiweiwei001Warum haben Trendstrategen Angst vor den Kosten eines Schlages?