Sumber dimuat naik... memuat...

Analisis Strategi LeeksReaper (2)

Penulis:FMZ~Lydia, Dicipta: 2022-11-07 16:38:41, Dikemas kini: 2023-09-15 21:07:34

img

Analisis Strategi LeeksReaper (2)

Mari kita terus menerangkan kandungan bab terakhir (https://www.fmz.com/bbs-topic/9725).

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 ( \"\" Start Balance \"\", 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 ( \"\" Start Balance \"\", 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)
                }
            }
        }
    }

Apabila pembinaLeeksReaper ()membina objek,balanceAccount ()fungsi yang ditambahkan kepada objek mengemas kini maklumat aset akaun yang disimpan dalamself.account, iaitu,accountAtribut objek yang dibina. Hitung nilai pendapatan dan cetak pada masa. Kemudian, mengikut maklumat aset akaun terkini, mengira nisbah baki mata wang tempat (saldo kedudukan tempat), apabila mencetuskan ambang offset, tutup kedudukan dengan pesanan kecil, supaya mata wang (kedudukan) kembali ke keadaan keseimbangan. Tunggu masa tertentu untuk berurusan, kemudian batalkan semua pembuat, pusingan seterusnya pelaksanaan fungsi, ia akan memeriksa baki dan membuat pemprosesan yang sesuai lagi.

Mari kita lihat kod fungsi ini ayat demi ayat: Pertama, ayat pertama.var account = exchange.GetAccount ()menyatakan pembolehubah tempatanaccountdan memanggil fungsiexchange.GetAccountDapatkan data terkini akaun semasa dan menetapkannya kepada pembolehubahaccount. Kemudian menilai pembolehubahaccount. Jika pembolehubah adalahnull(contohnya, masa lapang, rangkaian, pertukaran antara muka pengecualian, dan lain-lain), ia akan kembali (mengikutif (!account) {...}) secara langsung.

self.account = accountadalah untuk menetapkan pembolehubah tempatanaccountkepadaaccountatribut objek yang dibina untuk merakam maklumat akaun terkini dalam objek yang dibina.

Var now = new Date().getTime ()menyatakan pembolehubah tempatannowdan memanggilgetTime()Fungsi objek tarikh masa bahasa JavaScript untuk mengembalikan cap masa semasa. Menugaskan nilai kepada pembolehubahnow.

if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)){...}menentukan bahawa jika perbezaan antara cap masa semasa dan cap masa yang direkodkan kali terakhir melebihi parameterCalcNet Interval * 1000, ia bermakna ia telah dikemas kini dari kali terakhir.CalcNetInterval * 1000Milisaat (CalcNetInterval(sekunder), yang merealisasikan fungsi pendapatan cetak pada masa yang tetap.self.orderBook.Bids.length > 0juga ditakrifkan dalam keadaan (data kedalaman, mesti ada maklumat tahap yang sah dalam senarai susunan). Apabila keadaan if perintah dicetuskan,self.PreCalc = nowdilaksanakan untuk mengemas kini pembolehubah cap masa pulangan yang paling baru dicetakself.preCalckepada stempel masa semasanowDi sini, kaedah pengiraan nilai bersih digunakan dalam statistik pulangan.var net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks)), iaitu menukar mata wang ke dalam wang (mata wang yang diisytiharkan) mengikut pembelian semasa satu harga, dan kemudian menambahkannya kepada jumlah wang dalam akaun dan menetapkannya kepada pembolehubah tempatan yang dinyatakannet. Menilai sama ada nilai bersih keseluruhan semasa adalah konsisten dengan nilai bersih keseluruhan yang direkodkan kali terakhir:

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

Jika ia tidak konsisten, iaitu,net! = self.preNetadalah benar, mengemas kini atributself.preNetdigunakan untuk merekodkan nilai bersih dengan pembolehubahnet. Kemudian cetak jumlah bersihnetdata kepada carta lengkung hasil dari FMZ Quant Robot platform Dagangan (yangLogProfitfungsi boleh ditanyakan dalam dokumen FMZ API).

Jika pencetakan pendapatan yang biasa tidak dicetuskan, teruskan proses berikut untuk merekodkan pendapatan yang telah diperoleh.account.Stocks(mata wang yang tersedia dalam akaun semasa) danaccount.Balance(mata wang yang tersedia dalam akaun semasa) dalamself.BTCdanself.CNY. Mengira skala offset dan mencatat tugasan dalamself.p.

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

Algoritma juga sangat mudah, iaitu untuk mengira peratusan nilai semasa mata wang kepada jumlah nilai bersih akaun.

Bagaimana dengan menilai bila untuk mencetuskan baki wang (posisi)? Di sini, saya mengambil 50% tambah atau tolak 2 mata peratusan sebagai penyangga, dan melaksanakan baki di luar penyangga, iaitu jikaself.p < 0.48, baki wang dipicu oleh penyimpangan. Jika wang kurang, harga akan meningkat sebanyak 0.01 setiap kali dari kedudukan membeli pada pembukaan pasaran, dan tiga pesanan kecil akan diatur.self.p > 0.52, jika mata wang lebih, menjual satu dan melepaskan pesanan kecil.Sleep(BalanceTimeout)untuk masa tertentu mengikut tetapan parameter.

        Var orders = exchange. Get Orders () # Get all current makers, with orders variable
        If (orders) { # If the variable orders used to obtain the current order data is not null
            for (var i = 0; i < orders.length; I + +) { # Loop through orders and cancel orders one by one
                if (orders[i].Id != self.tradeOrderId) {
                    Exchange. CancelOrder (orders [I]. Id) # Call exchange. CancelOrder to cancel orders based on orders [I]. Id
                }
            }
        }

Fungsi yang keempat:

Dalam bahagian teras strategi, inilah permainan utama.self.poll = function(){...}Fungsi adalah logik utama keseluruhan strategi. Seperti yang kita katakan dalam artikel sebelumnya, sebelummain()fungsi bermula untuk melaksanakan dan memasuki tanpa akhirwhilegelung, kita gunakanvar reaper = LeeksReaper()untuk membina objek leeksreaper, dan kemudian menjalankan panggilan gelungreaper.poll()dalammain() function.

Peraturanself.pollfungsi mula menjalankan, melakukan beberapa kerja persediaan sebelum setiap gelung.self.numTick++meningkatkan jumlah.self.updateTrades()mengemas kini rekod perdagangan pasaran terkini dan mengira data penggunaan yang relevan.self.updateOrderBook()mengemas kini data pesanan dan mengira data yang relevan.self.balanceAccount()periksa baki wang (posisi).

        Var burstPrice = self. Prices [self. Prices. Length-1] * BurstThresholdPct # Calculate Burst Price
        Var bull = false                   # Declare a bull-marked variable, initially false
        Var bear = false                  # Declare a bear marked variable, initially false
        Var tradeAmount = 0         # Declare the transaction amount variable, initially 0

Langkah seterusnya adalah untuk menilai sama ada pasaran jangka pendek semasa adalah lembu atau beruang.

        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
        }

Adakah anda ingatself.updateOrderBook()fungsi dari artikel sebelumnya di mana kita menggunakan algoritma purata bertimbang untuk membina masa yang diarahkanpricesTiga fungsi baru:_.min, _.max, danslicedigunakan dalam kod dan mereka mudah difahami.

· _. min: Fungsi adalah untuk mencari nilai minimum dalam array parameter.

· _.max: Fungsi adalah untuk mencari nilai maksimum dalam array parameter.

· slice: Fungsi ini merupakan fungsi anggotaJavaScriptarray object. Ia digunakan untuk mengembalikan sebahagian daripada array mengikut indeks. Sebagai contoh:

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))   // it will intercept the elements from 4 to 1 and return a new array: [4,3,2,1]
}

img

Syarat untuk menilai pasaran beruang atau lembu adalah:

· Pengurusanself.numTick > 2mesti benar, iaitu, apabila satu pusingan baru harga pengesanan pecah, ia mesti dicetuskan selepas sekurang-kurangnya tiga pusingan pengesanan, supaya mengelakkan mencetuskan pada mulanya. · Perbezaan antara data terakhir dalamself.pricesdaripada urutan harga, iaitu data terkini, dan harga maksimum atau minimum dalam julat sebelumnya dalamself.pricesarray harus melebihi harga pecah dariburstPrice.

Jika semua syarat adalah benar, tandabullataubearsebagai benar, dan menetapkan nilai kepada pembolehubahtradeAmountuntuk merancang transaksi Stud.

Kemudian, mengikutself.voldiperbaharui dan dikira pada tahun sebelumnya.self.updateTrades()fungsi,BurstThresholdVolparameter menentukan sama ada untuk mengurangkan intensiti transaksi (mengurangkan jumlah transaksi yang dirancang).

        if (self.vol < BurstThresholdVol) {
            TradeAmount * = self. Vol/BurstThresholdVol      //Reduce the planned volume by self. Vol/BurstThresholdVol times of the previous volume
        }
        
        if (self.numTick < 5) {
            TradeAmount * = 0.8      // reduced to 80% of the plan
        }
        
        If (self. NumTick < 10) {       // reduce to 80% of the plan
            tradeAmount *= 0.8
        }

Seterusnya, menilai sama ada isyarat dagangan dan jumlah memenuhi keperluan:

        If ( (!Bull && !Bear) | | tradeAmount &lt; MinStock) {     # If it is not a bull market and not a bear market, or the amount tradeAmount planned to trade is less than the minimum trading volume MinStock set by the parameter, the poll function returns without trading operations directly
            return
        }

Selepas keputusan di atas, melaksanakanvar tradePrice = bull ? self.bidPrice: self.askPricemenetapkan harga urus niaga mengikut sama ada ia adalah pasaran beruang atau pasaran lembu, dan menetapkan nilai dengan harga bill of lading yang sepadan.

Akhirnya,whilegelung dimasukkan, dan satu-satunya keadaan berhenti gelung adalah bahawa jumlah dagangan yang dirancangtradeAmount > = MinStockadalah kurang daripada jumlah dagangan minimum. Dalam gelung, pesanan dilaksanakan mengikut keadaan pasaran semasa. dan merakam ID pesanan dalam pembolehubahorderId. Sleep(200)menunggu selama 200 milidetik selepas meletakkan perintah dalam setiap gelung. gelung kemudian menentukan sama adaorderIdadalah benar (jika pesanan gagal, ID pesanan tidak akan dikembalikan, dan syarat jika tidak akan dicetuskan). Jika keadaan adalah benar. Dapatkan ID pesanan dan menetapkannya kepadaself.tradeOrderId.

Mengisytiharkan pembolehubahorderdigunakan untuk menyimpan data pesanan, dengan nilai awalnull. Kemudian data pesanan ID diperolehi dalam gelung, dan menilai sama ada pesanan adalah keadaan pembuat, jika ya, pesanan ID dibatalkan, dan jika tidak, gelung pengesanan berakhir.

                Var order = null         // Declare a variable to hold the order data
                While (true) {             // a while loop
                    Order = exchange. GetOrder (orderId)          // Call GetOrder to query the order data whose order ID is orderId
                    If (order) {                                                   // If the order data is queried and the query fails and the order is null, the current if condition will not be triggered
                        If (order. Status = = ORDER _ STATE _ PENDING) {              // Judge whether the order status is maker
                            Exchange. CancelOrder (orderId)                                    // If the order is maker, cancel the order
                            Sleep(200)
                        } else {                                                                               // otherwise execute break to end the current while loop
                            break
                        }
                    }
                }

Proses berikut kemudian dilakukan:

                Self. TradeOrderId = 0                         // Reset self. TradeOrderId.
                TradeAmount-= order. DealAmount    // Update tradeAmount, subtract the quantity of the order on the bill of lading that has been completed
                TradeAmount * = 0.9                          //Decrease the order amount
                If (order. Status = = ORDER _ STATE _ CANCELED) {                   // if the order is already cancelled
                    Self. UpdateOrderBook ()                                                      // Update data such as order book
                    While (bull & & self. BidPrice-tradePrice &gt; 0.1) {               // In a bull market, if the updated bill of lading price exceeds the current trading price by 0.1, the trading amount will be reduced and the trading price will be adjusted slightly
                        tradeAmount *= 0.99
                        tradePrice += 0.1
                    }
                    While (bear & & self. AskPrice-tradePrice &lt; -0.1) {             // In a bear market, if the updated bill of lading price exceeds the current trading price by 0.1, the trading amount will be reduced and the trading price will be adjusted slightly
                        tradeAmount *= 0.99
                        tradePrice -= 0.1
                    }
                }

Apabila proses program berakhir daripada gelungwhile (tradeAmount > = MinStock){...}, ia menunjukkan bahawa pelaksanaan proses urus niaga harga ini telah selesai. Melakukanself.numTick = 0, iaitu, menetapkan semulaself.numTickkepada 0.

PeraturanLeeksReaper()pembina mengembalikanselfobjek pada akhir pelaksanaan, iaitu apabilavar reaper = LeeksReaper(), ia dikembalikan kepadareaper.

Setakat ini, kami telah menganalisis bagaimanaLeeksReaper()constructor membina objek LeeksReaper, setiap kaedah objek LeeksReaper, dan proses pelaksanaan fungsi logik utama. Saya percaya bahawa anda akan mempunyai pemahaman yang jelas tentang proses algoritma strategi frekuensi tinggi ini selepas membaca artikel ini.


Berkaitan

Lebih lanjut