OKCoinを移植する

作者: リン・ハーンゼロ, 日付: 2017-01-30 19:38:25
タグ:高周波

移植は:https://github.com/richox/okcoin-leeks-reaper

原作者は,手数料の請求が失敗すると言いました. 私は移植をしましたが,実体テストはありませんでした. 発明者 定量化 Tick 級回検は,Depth と Trades の再生をサポートし,直接回検学習戦略の論理を行うことができます.

元の説明は以下のとおりです

OKCoin 菜食器

OKCoinのビットコイン取引プラットフォームの高周波取引ロボットのプログラムで,2016年6月の基本モデルから2017年1月中旬まで,当初投資した6000を250000に成功的に刷り上げました.近年の中央銀行によるビットコインに対する高圧政策により,各プラットフォームは配当を停止し,取引手数料を徴収し始めたため,この戦略は事実上失敗しました.

image

このロボットプログラムは2つの主要な戦略に基づいています.

  1. トレンド戦略: 価格がトレンドシフトするときに,オーダーをタイムリーにフォローする,つまり,俗語で言う.追いかける
  2. バランス戦略: ポジションが50%偏ったとき,小便を放出してポジションを徐々に50%回転させ,トレンド終盤の逆転が引き下げを起こすのを防ぐ.魚尾を食べない

この手順は,ポジションを均衡させる (資本+資金=資金) ことを要求し,ポジションの50%で,純資産が価格変動に伴わないようにし,傾向変動が発生した場合に保証する.転倒する

この2つのプロジェクトに感謝します.

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

関連性

もっと

ハップ・ザ・キングこの戦略は失敗し,利益はゼロの手数料による高周波小差収入から来ています.

コングバイ979 self.vol到底是个啥?是一个ticker期间内所有交易量的总和吗?

dayTrader2018 についてfor (var i = 0; i < 15; i++) { self.prices[i] = trades[trades.length - 1].Price 価格について };これは少し問題ではありませんか? 価格の列の各要素が最新の取引価格ではありませんか?

コウヨウ7035私は,手数料なしで,取引の深度で良い取引所をいくつか持っています. この戦略を試してみませんか? 大神様に導いてください,私は取引所の口座申請に役立ちます.

ビジアスオ素晴らしい,残念ながら使えません,今使えますか?

スカイフਾਇਰコメント版販売価格:2000枚,非公式,ご連絡ください

ラジャヤックテストした人は,その成果について議論するために出てくるでしょうか?

ヴァレンン翻訳版はいつ来るのか

ウキアンミンbotvsがサポートされていない,無料取引の取引所では,どのように取引所のAPIを書く必要があるか?

J素晴らしい戦略をシェアしてくれてありがとう! exchange.CancelOrder ((orders[i].Id) 削除コードが少し問題があるため,確認時に継続的に注文を削除する. 元のコードを見てみると,10秒後には削除されるはずだった. 他のことは基本的には問題ありませんが,私はそれを修正し,手数料無料の取引所で走らせました.

KMスタジオ 66行prices需加.length

スノーピーナこれは何言語ですか?

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

水生売れないか,自分の金銭を残すか,という戦略があるようです.

1213761768早く出さない

張無忌買取価格と売り上げ価格が同じです. 買取価格と売り上げ価格は,

ブクシアック買取価格と求め価格を計算するときに,注文は,注文価格が求め価格よりも大きいと判断しないようにします. 買取価格と売り上げ価格が非常に近い場合は,高い買取価格と低い売り上げ価格が計算される可能性があります.

私は毛皮が好きです微信でHoo_tongxueを追加できるよう解説書を書きましたが,何よりも無料です.

私は毛皮が好きです顔の真皮は太い♪♪

小炭球取引所とは?

ゼロ初期化されていれば,その後にシフト操作ができます.

奇跡的な再貯蔵ロボット戦争が始まって もうすぐ終わりだ

ススキこのはもっといいね ^_^

スカイフਾਇਰ売り手は売れ,買い手は買い,あなたに争わない.

婚約者も人々がソースコードを公開しているので, 2000枚を売りたいですか?

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

シアオホアン001 ID を参照してください

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

J本当ですか? みんなに教えましょう.

シアオホアン001驚いた原作者

Jブログの記事では,ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット・ボット

ゼロこの戦略について学ぶことや疑問がある場合は,フォーラムに投稿してください. サポートありがとうございました!

ゼロ提案ありがとうございます,私はパラメータを追加しました,バランス注文待ち時間,もし同時に処理したい場合は,各注文のIDと注文の時間を記録し,選択的にキャンセルすることができます.これは遅延を減らすことができます.しかし,論理的には,すべての取引所が注文のタイム属性をサポートしていないため,最初にバランス再開する必要があります.

シアオホアン001この戦略は奇妙な感じがします. 私は好きです.

ゼロこれは私自身も試していないのですが 皆さんの研究が必要です

オリオン1708難易度Z大移植~.お願いします. 策略パラメータのデフォルト値の変化は策略に大きな影響を与えるのでしょうか.

ゼロハハ,ありがとう,追加しました.

ゼロJavascript は

ゼロ取引頻度が高い

小さな夢この記事へのトラックバック一覧です.

シアオホアン001なぜトレンド戦略者は衝撃コストを恐れているのか.