avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Analisis Strategi Penuai Leek (2)

Dicipta dalam: 2020-11-16 10:03:52, dikemas kini pada: 2024-12-05 22:03:01
comments   23
hits   8088

Analisis Strategi Penuai Leek (2)

Analisis Strategi Penuai Leek (2)

kemudianKandungan sebelumnyaterangkan.

Fungsi tambahan ketiga:

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

PembinaLeeksReaper()Apabila membina objek, tambahbalanceAccount()Fungsinya adalah untuk mengemas kini maklumat aset akaun, yang disimpan dalamself.account, iaitu objek yang dibinaaccountharta benda. Kira dan cetak nilai keuntungan dengan kerap. Kemudian, berdasarkan maklumat aset akaun terkini, nisbah baki mata wang spot (baki kedudukan spot) dikira Apabila ambang sisihan dicetuskan, pesanan kecil ditutup untuk memulihkan mata wang (kedudukan) kepada keadaan seimbang. Tunggu tempoh masa tertentu untuk menyelesaikan transaksi, kemudian batalkan semua pesanan yang belum selesai Pusingan seterusnya pelaksanaan fungsi ini akan menyemak baki sekali lagi dan membuat pemprosesan yang sepadan.

Mari lihat kod fungsi ini baris demi baris: Ayat pertamavar account = exchange.GetAccount()Ia mengisytiharkan pembolehubah tempatanaccount, dan panggil antara muka API penciptaexchange.GetAccount()Berfungsi, dapatkan data terkini akaun semasa dan tetapkan kepadaaccountpembolehubah. Kemudian menilaiaccountPembolehubah ini, jika pembolehubah adalahnullJika nilai (seperti tamat masa, rangkaian, pengecualian antara muka pertukaran, dll.) gagal diperoleh, ia akan dikembalikan secara langsung (bersamaan denganif (!account){...}di sini).

self.account = accountAyat ini adalah untuk meletakkan pembolehubah tempatanaccountDitugaskan kepada objek yang dibinaaccountAtribut digunakan untuk merekod maklumat akaun terkini dalam objek yang dibina.

var now = new Date().getTime()Pernyataan ini mengisytiharkan pembolehubah tempatannow, dan panggil objek masa dan tarikh bahasa JavaScriptgetTime()Fungsi ini mengembalikan cap masa semasa. Tugaskan kepadanowpembolehubah.

if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {...}Kod ini menentukan sama ada perbezaan antara cap masa semasa dan cap masa yang direkodkan terakhir melebihi parameterCalcNetInterval * 1000Ini bermakna daripada kemas kini terakhir hingga sekarang, lebih daripadaCalcNetInterval * 1000milisaat(CalcNetIntervalsaat), untuk mencapai fungsi pencetakan masa pendapatan Memandangkan harga tawaran pertama digunakan semasa mengira pendapatan, syarat-syarat juga mengehadkanself.orderBook.Bids.length > 0Keadaan ini (data kedalaman, mesti ada maklumat gear yang sah dalam senarai pesanan beli). Apabila ini jika keadaan pernyataan dicetuskan, laksanakanself.preCalc = nowKemas kini pembolehubah cap masa hasil cetakan terbaharuself.preCalcCap masa semasanow. Statistik pendapatan di sini menggunakan kaedah pengiraan nilai bersih, kodnyavar net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks)), iaitu, tukar syiling kepada wang (penyebut) mengikut harga belian semasa, dan kemudian tambahkannya pada jumlah wang dalam akaun dan tetapkan ia kepada pembolehubah tempatan yang diisytiharkannet. Tentukan sama ada jumlah nilai bersih semasa adalah konsisten dengan jumlah nilai bersih yang dicatatkan kali terakhir:

            if (net != self.preNet) {
                self.preNet = net
                LogProfit(net)
            }

Jika mereka tidak konsisten,net != self.preNetJika benar, gunakannetKemas kini pembolehubah digunakan untuk merekodkan sifat nilai bersihself.preNet. Kemudian cetak ininetJumlah data nilai bersih kepada carta keluk keuntungan robot platform dagangan kuantitatif pencipta (boleh ditanya dalam dokumen API FMZLogProfitfungsi ini).

Jika hasil cetakan yang dijadualkan tidak dicetuskan, maka teruskan dengan proses berikut.account.Stocks(bilangan syiling yang tersedia dalam akaun semasa),account.Balance(Jumlah semasa wang yang tersedia dalam akaun) direkodkan dalamself.btcself.cny. Kira nisbah offset dan tetapkan nilai kepada rekodself.p

self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny)

Algoritma ini juga sangat mudah, iaitu mengira nilai semasa syiling sebagai peratusan daripada jumlah nilai bersih akaun.

Jadi bagaimana kita menentukan apabila baki wang (kedudukan) dicetuskan? Penulis menggunakan 2 mata peratusan di atas dan di bawah 50% sebagai penimbal, dan melakukan keseimbangan di luar penimbal, iaitu,self.p < 0.48Penyimpangan baki syiling dicetuskan, dan dipercayai bahawa terdapat lebih sedikit syiling, jadi mula membeli pada kedudukan dalam pasaran dan naikkan harga sebanyak 0.01 setiap kali, dan buat tiga pesanan kecil. Begitu juga imbangan mata wangself.p > 0.52, jika anda rasa anda mempunyai terlalu banyak syiling, anda boleh membuat pesanan kecil dengan menjual pada harga pembukaan. Akhir sekali, tunggu masa tertentu mengikut tetapan parameterSleep(BalanceTimeout)Semua pesanan akan dibatalkan selepas itu.

        var orders = exchange.GetOrders()                  # 获取当前所有挂单,存在orders变量
        if (orders) {                                      # 如果获取当前挂单数据的变量orders不为null
            for (var i = 0; i < orders.length; i++) {      # 循环遍历orders,逐个取消订单
                if (orders[i].Id != self.tradeOrderId) {
                    exchange.CancelOrder(orders[i].Id)     # 调用exchange.CancelOrder,根据orders[i].Id取消订单
                }
            }
        }

Fungsi tambahan keempat:

Bahagian teras strategi, kemuncaknya ada di sini,self.poll = function() {...}Fungsi adalah logik utama keseluruhan strategi Kami juga membincangkannya dalam artikel sebelumnya.main()Fungsi mula melaksanakan dan masukwhileSebelum gelung tak terhingga, kita gunakanvar reaper = LeeksReaper()Membina objek penuai daun bawang, dan kemudianmain()Fungsi panggilan dalam gelungreaper.poll()Inilah fungsi yang dipanggil.

self.pollFungsi mula melaksanakan dan melakukan beberapa kerja penyediaan sebelum setiap gelung.self.numTick++Tingkatkan bilangan,self.updateTrades()Kemas kini rekod transaksi pasaran terkini dan kira data yang berkaitan.self.updateOrderBook()Kemas kini data buku pesanan dan kira data berkaitan.self.balanceAccount()Semak baki wang (kedudukan).

        var burstPrice = self.prices[self.prices.length-1] * BurstThresholdPct   # 计算爆发价格
        var bull = false             # 声明牛市标记的变量,初始为假
        var bear = false             # 声明熊市标记的变量,初始为假
        var tradeAmount = 0          # 声明交易数量变量,初始为0

Langkah seterusnya adalah untuk menentukan sama ada pasaran jangka pendek semasa adalah menaik atau menurun.

        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
        }

Ingat, dalam artikel sebelum iniself.updateOrderBook()fungsi, di mana kami menggunakan algoritma purata wajaran untuk membina siri masa dengan tertibpricesSusunan. Tiga fungsi baharu digunakan dalam kod ini_.min_.maxsliceKetiga-tiga fungsi ini juga sangat mudah difahami.

  • _.min: Fungsinya adalah untuk mencari nilai terkecil dalam tatasusunan parameter.

  • _.max: Fungsinya adalah untuk mencari nilai terbesar dalam tatasusunan parameter.

  • slice: Fungsi ini ialah fungsi ahli objek tatasusunan JavaScript Fungsinya adalah untuk memintas sebahagian daripada tatasusunan mengikut indeks dan mengembalikannya.

  function main() {
      // index     .. -8 -7 -6 -5 -4 -3 -2 -1
      var arr = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      Log(arr.slice(-5, -1))    // 会截取 4 ~ 1 这几个元素,返回一个新数组:[4,3,2,1]
  }

Analisis Strategi Penuai Leek (2)

Syarat untuk menilai beruang dan lembu jantan di sini ialah:

  • self.numTick > 2Untuk diwujudkan, ini bermakna apabila pusingan baharu harga pengesanan tercetus, ia mesti dicetuskan selepas sekurang-kurangnya tiga pusingan pengesanan untuk mengelak daripada dicetuskan pada permulaan.
  • Siri Hargaself.pricesData terakhir dalamself.pricesPerbezaan antara harga maksimum atau minimum dalam julat sebelumnya dalam tatasusunan akan dipecahkanburstPriceIni adalah harga letupan.

Jika semua syarat dipenuhi, maka tandakanbullataubear,untuktrue, dan memberitradeAmountTetapkan pembolehubah dan rancang dagangan Stud.

Mengikut sebelumnyaself.updateTrades()Dikemas kini dan dikira dalam fungsiself.vol, untuk parameterBurstThresholdVolTentukan sama ada untuk mengurangkan intensiti dagangan (mengurangkan saiz dagangan yang dirancang).

        if (self.vol < BurstThresholdVol) {
            tradeAmount *= self.vol / BurstThresholdVol   // 缩减计划交易量,缩减为之前量的self.vol / BurstThresholdVol 倍
        }
        
        if (self.numTick < 5) {
            tradeAmount *= 0.8      // 缩减为计划的80%
        }
        
        if (self.numTick < 10) {    // 缩减为计划的80%
            tradeAmount *= 0.8
        }

Seterusnya, tentukan sama ada isyarat dagangan dan volum dagangan memenuhi keperluan:

        if ((!bull && !bear) || tradeAmount < MinStock) {   # 如果非牛市并且也非熊市,或者计划交易的量tradeAmount小于参数设置的最小交易量MinStock,poll函数直接返回,不做交易操作
            return
        }

Selepas penghakiman di atas, laksanakanvar tradePrice = bull ? self.bidPrice : self.askPriceTetapkan harga urus niaga mengikut sama ada ia adalah pasaran beruang atau pasaran lembu, dan tetapkan nilai dengan harga bil muatan yang sepadan.

Akhirnya masukkan awhileSatu-satunya syarat untuk menghentikan gelung ialahtradeAmount >= MinStockJumlah urus niaga yang dirancang adalah kurang daripada jumlah urus niaga minimum. Dalam gelung, pesanan dibuat berdasarkan sama ada pasaran semasa adalah menaik atau menurun. Dan rekodkan ID pesanan dalam pembolehubahorderId. Selepas setiap pusingan pesananSleep(200)Tunggu 200 milisaat. Kemudian menilai dalam gelungorderIdAdakah ia benar (jika pesanan gagal, ID pesanan tidak akan dikembalikan dan syarat jika tidak akan dicetuskan), jika syarat itu benar. Dapatkan ID pesanan dan serahkan kepadaself.tradeOrderId

Isytiharkan pembolehubah untuk menyimpan data pesananorderNilai awal ialahnull. Kemudian gelung untuk mendapatkan data pesanan ID ini dan tentukan sama ada pesanan itu berada dalam status pesanan belum selesai. Jika dalam status pesanan belum selesai, batalkan pesanan ID ini gelung pengesanan.

                var order = null           // 声明一个变量用于保存订单数据
                while (true) {             // 一个while循环
                    order = exchange.GetOrder(orderId)    // 调用GetOrder查询订单ID为 orderId的订单数据
                    if (order) {                          // 如果查询到订单数据,查询失败order为null,不会触发当前if条件
                        if (order.Status == ORDER_STATE_PENDING) {   // 判断订单状态是不是正在挂单中
                            exchange.CancelOrder(orderId)            // 如果当前正在挂单,取消该订单
                            Sleep(200)
                        } else {                                     // 否则执行break跳出当前while循环
                            break
                        }
                    }
                }

Kemudian ikuti proses di bawah:

                self.tradeOrderId = 0              // 重置self.tradeOrderId
                tradeAmount -= order.DealAmount    // 更新tradeAmount,减去提单的订单已经成交的数量
                tradeAmount *= 0.9                 // 减小下单力度
                if (order.Status == ORDER_STATE_CANCELED) {     // 如果订单已经是取消了
                    self.updateOrderBook()                      // 更新订单薄等数据
                    while (bull && self.bidPrice - tradePrice > 0.1) {   // 牛市时,更新后的提单价格超过当前交易价格0.1就减小交易力度,略微调整交易价格
                        tradeAmount *= 0.99
                        tradePrice += 0.1
                    }
                    while (bear && self.askPrice - tradePrice < -0.1) {  // 熊市时,更新后的提单价格超过当前交易价格0.1就减小交易力度,略微调整交易价格
                        tradeAmount *= 0.99
                        tradePrice -= 0.1
                    }
                }

Apabila aliran program melompat keluarwhile (tradeAmount >= MinStock) {...}Kitaran ini menunjukkan bahawa proses transaksi letupan harga telah selesai. melaksanakanself.numTick = 0, iaitu, tetapkan semulaself.numTickialah 0.

LeeksReaper()Pembina akhirnya melaksanakanselfObjek yang dikembalikan ialahvar reaper = LeeksReaper()Apabila ia dikembalikan kepadareaper

Setakat iniLeeksReaper()Kami telah menganalisis bagaimana pembina membina objek penuai daun bawang, pelbagai kaedah objek penuai daun bawang, dan proses pelaksanaan fungsi logik utama saya percaya bahawa selepas membaca artikel ini, anda harus mempunyai pemahaman yang lebih jelas tentang frekuensi tinggi proses algoritma strategi memahami.