Penggambaran teknik mesin pemetik ketumbar (2)

Penulis:Mimpi kecil, Dicipta: 2020-11-16 10:03:52, Dikemas kini: 2023-09-26 21:05:07

img

Penggambaran teknik mesin pemetik ketumbar (2)

KemudianMenarikDifahamkan.

Fungsi ketiga yang ditambahkan:

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

Fungsi pembinaanLeeksReaper()Apabila anda membuat objek, apa yang anda tambahkan kepada objek?balanceAccount()Fungsi adalah untuk mengemas kini maklumat aset akaun, menyimpanself.accountIa adalah satu bentuk yang berbeza dari yang lain.accountSifat: Menghitung nilai pendapatan secara berkala dan mencetak. Kemudian berdasarkan maklumat aset akaun terkini, mengira nisbah baki wang tunai semasa (pembalan kedudukan tunai), melakukan penempatan kecil untuk membalikkan wang tunai (posisi) ke tahap keseimbangan apabila memicu penurunan ambang nilai. Menunggu masa tertentu untuk berdagang, kemudian membatalkan semua order yang terikat, menjalankan fungsi ini pada pusingan seterusnya, mengesan semula baki dan melakukan pengolahan yang sesuai.

Mari kita lihat secara ringkas kod untuk fungsi ini: Pertama, ayat pertama.var account = exchange.GetAccount()Ia adalah menyatakan satu pembolehubah tempatan.account, dan memanggil antara muka API penciptaexchange.GetAccount()Fungsi untuk mendapatkan data terkini untuk akaun semasa, memberikan nilai kepadaaccountVariabel. Kemudian menilai.accountIni adalah satu variabel yang boleh diukur jikanullNilai (misalnya, kegagalan untuk mendapatkan masalah seperti ketidakselesaan masa, rangkaian, antarmuka pertukaran) akan dikembalikan secara langsung.if (!account){...}Di sini) ◄

self.account = accountIni adalah perkataan untuk mengubah pembolehubah tempatan.accountNilai yang diberikan kepada objek yang dibinaaccountSifat digunakan untuk merakam maklumat akaun terkini dalam objek yang dibina.

var now = new Date().getTime()Perkataan ini menyatakan satu pembolehubah tempatan.now, dan memanggil objek tarikh masa dalam bahasa JavaScriptgetTime()Fungsi ini akan kembalikan ketukan masa semasa.nowVariabel.

if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {...}Kod ini akan menentukan perbezaan antara senar masa semasa dan senar masa terakhir yang dirakam jika melebihi parameter.CalcNetInterval * 1000Ini bermakna lebih banyak daripada sebelum ini.CalcNetInterval * 1000Milisegund (((CalcNetIntervaldetik), mewujudkan fungsi mencetak pendapatan secara tepat pada masanya, kerana pendapatan dikira menggunakan harga pembelian satu dalam akaun, maka syaratnya juga terhadself.orderBook.Bids.length > 0Syarat ini (dalam data, senarai bayaran mesti mempunyai maklumat peringkat yang sah) ≠ Apabila syarat if statement ini dicetuskan, pelaksanaanself.preCalc = nowMengemas kini pembolehubah timestamp hasil cetak terkiniself.preCalcTanda untuk masa kininow◦ Statistik pendapatan di sini menggunakan kaedah pengiraan nilai bersih, yang dikodkan sebagaivar net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks))Iaitu menukar mata wang kepada wang mengikut harga pembelian semasa (mata wang bil) dan jumlah wang dalam akaun ditambah dengan pembolehubah tempatan yang diberikan kepada pernyataan.netUntuk menilai sama ada jumlah bersih semasa dan jumlah bersih terakhir yang direkodkan:

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

Jika tidak,net != self.preNetPergilah.netPembaharuan pembolehubah untuk merekodkan sifat bersihself.preNetKemudian cetak ini.netData bersih keseluruhan kepada pencipta pada grafik kurva pendapatan bot platform dagangan kuantitatif ((boleh dicari di dokumen FMZ APILogProfitFungsi ini) ⋅

Jika tidak mencetuskan pendapatan cetak tepat pada masanya, teruskan dengan proses berikut, dan akanaccount.Stocks(Berapakah duit syiling yang ada di akaun semasa)account.Balance(Jumlah wang yang ada dalam akaun semasa)self.btcself.cny◎ Mengira kadar penyimpangan dan mencatatkan nilaiself.p

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

Algorithmnya juga sangat mudah, iaitu mengira nilai semasa mata wang sebagai peratusan daripada jumlah bersih akaun.

Jadi, bilakah kita boleh menentukan apabila mata wang (posisi) kita akan berimbang? Penulis di sini menggunakan 50% ke atas dan ke bawah 2 mata peratusan sebagai tampon, melebihi keseimbangan pelaksanaan kawasan tampon, iaitu:self.p < 0.48Perpindahan keseimbangan duit syiling mencetuskan, menganggap bahawa wang syiling kurang, dengan membeli satu kedudukan di dalam dagangan, harga meningkat sebanyak 0.01 setiap kali, meletakkan tiga lembaran; setara dengan keseimbangan wang syilingself.p > 0.52Jika anda fikir bahawa wang lebih banyak, anda akan menjual satu kertas kecil di pasaran. Akhirnya, anda harus menunggu beberapa masa mengikut tetapan parameter.Sleep(BalanceTimeout)Selepas itu, kami membatalkan semua pesanan.

        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 keempat yang ditambahkan:

Di samping itu, ia juga akan memberi peluang kepada mereka untuk menghidupkan semula sistem yang telah lama tidak berfungsi.self.poll = function() {...}Fungsi adalah logik utama keseluruhan strategi.main()Fungsi mula dijalankan, masukwhileSebelum kitaran mati, kita gunakanvar reaper = LeeksReaper()Kami telah membina objek pemetik lobak, dan kemudian kami telah membina objek pemetik lobak untuk digunakan dalam mesin pemetik lobak.main()Panggilan berputar dalam fungsireaper.poll()Fungsi yang dipanggil adalah fungsinya.

self.pollFungsi mula dijalankan, melakukan beberapa persiapan sebelum setiap kitaran, dan kemudian menghidupkan semula.self.numTick++Menambah jumlah,self.updateTrades()Mengemas kini rekod transaksi pasaran baru-baru ini dan mengira penggunaan data yang berkaitan.self.updateOrderBook()Mengemas kini data pelaburan (pesanan rendah) dan mengira data yang berkaitan.self.balanceAccount()Periksa baki mata wang (posisi).

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

Pada masa yang sama, ia adalah penting untuk mengetahui sama ada pasaran jangka pendek adalah bull atau bear.

        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, di artikel sebelumnya,self.updateOrderBook()Fungsi di mana kita menggunakan algoritma purata berat untuk membina satu siri masa yang berurutanpricesArray. Tiga fungsi baru digunakan dalam kod ini._.min_.maxslicePeranan ketiga-tiga fungsi ini juga sangat mudah difahami.

  • _.minFungsi: ialah mencari nilai terkecil dalam set parameter.

  • _.maxFungsi: mencari nilai terbesar dalam set parameter.

  • slice: Fungsi ini adalah fungsi anggota objek matriks JavaScript yang berfungsi untuk mengembalikan bahagian dalam matriks yang dipotong mengikut indeks, contohnya:

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

    img

Di sini, syarat untuk menilai seekor beruang atau lembu ialah:

  • self.numTick > 2Untuk ditubuhkan, iaitu apabila satu pusingan baru harga ujian meletus, sekurang-kurangnya tiga pusingan ujian perlu dijalankan untuk memicu, mengelakkan pemicu dari awal.
  • Siri hargaself.pricesDan data terakhir, yang merupakan data terkini, adalahself.pricesPerbezaan harga maksimum atau minimum dalam satu rentang sebelum ini dalam satu set harus dipatahkanburstPriceHarga ledakan ini.

Jika semua syarat berlaku, tandabullataubear, untuktrue, dan memberitradeAmountVariable Assignment, Perancangan Hip-Hop Transaksi.

Mengikutself.updateTrades()Pembaruan, pengiraan dalam fungsiself.volUntuk parameterBurstThresholdVolMemutuskan sama ada untuk mengurangkan intensiti dagangan (mengurangkan jumlah 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
        }

Untuk menilai sama ada isyarat dagangan atau jumlah dagangan memenuhi syarat:

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

Selepas membuat keputusan di atas, pelaksanaanvar tradePrice = bull ? self.bidPrice : self.askPriceMengikut pasaran beruang atau pasaran lembu, harga dagangan ditetapkan, dengan nilai harga yang sesuai.

Akhirnya masuk ke satuwhileSatu-satunya syarat untuk berhenti daripada berputar ialah:tradeAmount >= MinStockJumlah dagangan yang dirancang adalah lebih kecil daripada jumlah dagangan minimum. Melakukan perintah berikut mengikut keadaan pasaran lembu atau pasaran lembu semasa dalam gelung; dan mencatat ID tunggal pada pembolehubahorderId◎ Selepas membuat pesanan setiap pusinganSleep(200)Tunggu 200 ms. Kemudian menilai dalam kitaran.orderIdApakah benar (jika pesanan gagal, tidak akan mengembalikan ID pesanan, tidak akan mencetuskan syarat if), jika syarat benar.self.tradeOrderId

Mengisytiharkan pembolehubah untuk menyimpan data pesananorderNilai awal ialahnull... kemudian berputar untuk mendapatkan data pesanan ID ini, dan memutuskan sama ada pesanan itu berada dalam keadaan tergantung, jika keadaan tergantung, membatalkan pesanan ID ini, jika tidak, keluar dari pusingan pengesanan ini...

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

Selepas itu, lakukan proses berikut:

                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 proses program melompat keluarwhile (tradeAmount >= MinStock) {...}Apabila kitaran ini berlaku, ini menunjukkan bahawa proses perdagangan ledakan harga ini telah selesai. Pelaksanaanself.numTick = 0Mengubah semulaself.numTick0 ∞ ialah

LeeksReaper()Pelaksanaan fungsi pembina akan berakhirselfObjek kembali, iaituvar reaper = LeeksReaper()Saya akan kembalikan kepada anda.reaper

Sehingga kiniLeeksReaper()Fungsi pembina bagaimana untuk membina objek pemetik lobak ini dan pelbagai kaedah objek pemetik lobak, proses pelaksanaan fungsi logik utama, kami telah menganalisis semula, dan saya percaya anda akan mempunyai pemahaman yang lebih jelas mengenai proses algoritma strategi frekuensi tinggi ini.


Lebih lanjut

xukittyTerima kasih Drumshall. Drumshall, boleh saya tanya, adakah idea untuk menggabungkan mesin pemetik lobak dengan robot frekuensi tinggi dewa rumput itu?

Mattzhang1988Beliau berkata, "Saya tidak tahu apa-apa tentang perkara ini.

CyndiYY1024Tidak ada yang memahami mengapa perlu mengekalkan keseimbangan mata wang dan wang, jika tidak mencapai keseimbangan, anda perlu melakukan pembelian dan penjualan. Selepas itu, BalanceTimeout dibatalkan lagi, tidak lagi seimbang, tetapi memasuki hubungan ledakan seterusnya.

Kuasa DemasiaDi mana arahan berikut?

Eddie.Dalam keadaan seperti ini, anda boleh menggunakan FMZ untuk melihat semula gambar di atas. Memantau turun naik harga dagangan, menemui ledakan harga, mengikut hala tuju trend, mengira peratusan hip-hop sebagai rujukan untuk saiz dagangan, melakukan perdagangan hip-hop. Selepas perdagangan hip-hop, tidak memegang saham, mengekalkan keadaan keseimbangan mata wang dalam jangka panjang. Adakah saya benar, Dream?

xukittyTolong ajar saya, program yang berterusan dalam mengimbangi mata wang dan wang, apa yang mempertimbangkan fungsi ini?

xukittyTerima kasih kepada Dreamz, fmz benar-benar merupakan harta karun.

printbtcTidak faham.

KemudahanBurstThresholdVol. Apakah maksud parameter ini? Bagaimana untuk menetapkannya?

Evan1987Saya tidak mahu melihat video ini kerana ia penuh dengan butiran, saya hanya menonton selama satu jam untuk memahami butiran, Zeng.

rootme666, saya akan buat mesin pemetik lobak yang sama dengan wang cetak.

Mimpi kecilDalam satu artikel, Grasshopper berkata bahawa frekuensi tinggi memerlukan persekitaran pasaran. Secara strategik, mesin pemetik lobak mempunyai persamaan pemikiran dengan robot frekuensi tinggi Grasshopper.

Mimpi kecilMaafkan saya, artikel ini adalah untuk pemula dalam proses pelaksanaan, dan banyak omong kosong yang benar-benar menonjol, anda hanya mengabaikan.

Mimpi kecilHebat!

Mimpi kecilMesin pemetik lobak asal mempunyai modul keseimbangan yang boleh dipertimbangkan untuk dikeluarkan. Kesan spesifik tidak jelas.

Mimpi kecilTidak sopan

Mimpi kecil~ Ya ~

Mimpi kecilJumlah letupan, ini adalah parameter dasar, yang ditetapkan secara buatan, lihat secara terperinci dasar, artikel, dan tahu apa yang dikawal oleh pembolehubah ini.

Mimpi kecilIni adalah prinsip yang sama.