Transplantation de OKCoin dans une récolteuse de noix de cajou

Auteur:Nul, Date: le 30 janvier 2017 à 19h38h25
Les étiquettes:À haute fréquence

Les greffes de:https://github.com/richox/okcoin-leeks-reaper

L'auteur original a dit que les frais de procédure n'étaient pas valables, je n'ai fait que des greffes, pas de test sur disque, et j'étais intéressé à apprendre. L'inventeur de Tick quantifie la répétition de niveau avec le support de la répétition de Depth et Trades, permettant une répétition directe de la logique stratégique d'apprentissage.

Voici les détails

La récolteuse de légumineuses OKCoin

Il s'agit d'un programme de robot de trading à haute fréquence sur la plateforme de trading Bitcoin OKCoin, qui a été mis au point en juin 2016 et qui a réussi à réduire la somme initiale de 6000 à 250000 par la mi-janvier 2017.

image

Le programme est basé sur deux stratégies principales:

  1. Stratégie de tendance: suivre les ordres en temps opportun lorsque des fluctuations tendancielles se produisent, c'est-à-dire selon le proverbeLa chasse au requin
  2. Stratégie d'équilibrage: lorsque les positions s'écartent de 50%, la libération de la feuille de calcul entraîne une régression progressive des positions de 50% et empêche l'inversion de la tendance à la fin de la tendance de provoquer une régression, c'est-à-dire que la tendance se détériore.Les bénéfices dans les sacs, pas la queue de poisson

Cette procédure nécessite un équilibre des positions, c'est-à-dire (capital + financement = finance), de sorte que les actifs nets ne fluctuent pas avec les prix à 50% des positions, mais assurent également une fluctuation tendancielle en cas de fluctuation.Ils tombent.

Merci pour les deux projets suivants:

Merci à OKCoin:

Le montant de l'impôt sur les sociétés est calculé en fonction de l'impôt sur les sociétés.


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

Relationnée

Plus de

Le roi du hip-hopLa stratégie a échoué et les bénéfices proviennent de revenus à faible décalage de haute fréquence avec des frais de traitement nuls.

Je suis désolée. self.vol到底是个啥?是一个ticker期间内所有交易量的总和吗?

jourTrader2018pour (var i = 0; i < 15; i++) { Le prix est le prix de l'offre. }; est-ce que c'est un peu un problème, que chaque élément de l'ensemble des prix n'est pas le prix de transaction le plus récent?

Je vous en prie.J'ai plusieurs bourses qui ne paient pas de frais de transaction et qui sont très profondes. Pouvez-vous essayer cette stratégie?

- Je vous en prie.C'est génial, désolé, ça ne fonctionne pas, ça fonctionne maintenant?

le feu de l'airPrix de vente: 2000 exemplaires, non officiel, avec lien

- Je vous en prie.Avez-vous déjà testé et discuté des avantages?

ValennnQuand est-ce qu'il y aura une annotation?

le groupe WuqianmingComment faire pour exécuter un échange gratuit et non pris en charge par botvs, comment écrire un API d'échange?

JeMerci d'avoir partagé cette bonne stratégie! Le code de révocation est un peu problématique, car le test de révocation est en cours. Le code de l'édition précédente devrait être retiré au bout de 10 secondes. Le reste n'a pratiquement pas de problème, je l'ai modifié et je l'ai mis sur une bourse sans frais d'entretien.

Je suis désolée. 66行prices需加.length

les pois de neigeQuelle est cette langue?

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

Les aquatiquesIl semble qu'il y ait des stratégies pour gagner de l'argent, ou ne pas vendre et garder votre argent.

1213761768Je ne l'ai pas laissé sortir.

Je ne peux pas.Non, le prix d'achat doit être inférieur au prix d'achat, l'un est le prix d'achat, l'autre le prix de vente.

- Je ne sais pas.S'il vous plaît, lorsque vous calculez le prix d'achat et le prix d'achat, la commande est comme si vous ne jugez pas que le prix d'achat est supérieur au prix d'achat, donc si vous achetez une vente très proche, vous calculerez qu'il est très probable que vous achetez plus cher ou moins cher.

J'aime les moules.J'ai écrit un commentaire sur ce que j'ai écrit et je veux que tout le monde puisse ajouter Hoo_tongxue à mon compte, et surtout gratuitement.

J'aime les moules.La peau du vrai visage est assez épaisse pour un vêtement.

Une petite boule de charbonQuels sont les échanges?

NulCelle-ci devrait être initialement au prix le plus récent, suivi d'une opération de shift.

Le miracle du remontageC'est une guerre des robots, et c'est une guerre des robots.

les sourisC'est vrai, c'est mieux avec cette salade.

le feu de l'airQue le vendeur vende, et que l'acheteur achète, et qu'il n'y ait pas de contestation entre toi et lui!

Les fiancées aussi.Tout le monde a publié le code source, comment voulez-vous qu'il soit vendu en 2000?

Je suis désolée. 请问zaif.jp现在还是免手续费吗?怎么通过认证呢

Je vous en prie.Voir l'identifiant

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

JeC'est vrai! Sortez et donnez-leur une leçon!

Je vous en prie.L'auteur est surpris

JeBon, j'ai encore quelques questions à vous poser et j'ai créé un autre post: https://www.botvs.com/bbs-topic/677

NulSi vous avez des leçons à partager ou des questions sur cette stratégie, veuillez les poster sur le forum, merci de votre soutien!

NulMerci pour les suggestions, j'ai ajouté un paramètre, temps d'attente de l'ordre d'équilibrage, si vous voulez le traitement en parallèle, vous pouvez enregistrer l'ID de chaque ordre avec l'heure de commande, puis l'annulation sélective, ce qui réduit le retard, mais logiquement, devrait être d'équilibrer d'abord de re-ouvrir, car pas tous les échanges prennent en charge l'attribut de temps d'obtention de l'ordre, donc la plate-forme n'a pas ajouté cette attribut dans l'ordre, besoin de ses propres statistiques.

Je vous en prie.Je trouve cette tactique bizarre, j'aime ((*^__^*)

NulJe n'ai jamais essayé ça, mais je veux que vous le découvriez.

Orion 1708Le déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie de déploiement d'une stratégie.

NulMerci, j'ai déjà ajouté.

NulLe code Javascript

NulLa fréquence des transactions

Le petit rêveL'auteur original n'a été publié que quelques jours après la facturation des frais de procédure.

Je vous en prie.Pourquoi les stratégies de tendance craignent-elles le coût du choc?