Teknik pemotongan kacang kedelai (2)

Penulis:Mimpi kecil, Dibuat: 2020-11-16 10:03:52, Diperbarui: 2023-09-26 21:05:07

img

Teknik pemotongan kacang kedelai (2)

Dan kemudianIsi di atasSaya tidak tahu apa yang terjadi.

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 konstruksiLeeksReaper()Jika Anda membuat sebuah objek, Anda menambahkannya ke objek.balanceAccount()Fungsi adalah untuk memperbarui informasi aset akun, menyimpanself.accountDengan kata lain, objek yang dibuataccountProperti: Menghitung nilai laba secara berkala dan mencetak. Kemudian berdasarkan informasi aset akun terbaru, menghitung rasio saldo mata uang saat ini (saldo posisi posisi saat ini) dan melakukan penarikan pesanan kecil saat memicu penurunan ambang nilai, sehingga koin (posisi) kembali ke keseimbangan. Menunggu waktu tertentu untuk bertransaksi, kemudian membatalkan semua order yang terikat, menjalankan fungsi ini pada putaran berikutnya, mendeteksi saldo lagi dan melakukan pengolahan yang sesuai.

Kita akan melihat kode untuk fungsi ini, kalimat demi kalimat: Pertama, kalimat pertama.var account = exchange.GetAccount()Ini adalah variabel lokal yang dinyatakan.accountUntuk mengkoneksikan aplikasi ini, Anda dapat mengklik tombol "Inventor API".exchange.GetAccount()Fungsi yang mendapatkan data terbaru dari akun saat ini, memberikan nilai keaccountVariabel. Kemudian menilai.accountJika variabel ini adalahnullNilai (misalnya, kegagalan untuk mendapatkan masalah seperti latency, jaringan, dan kesalahan antarmuka pertukaran) dikembalikan langsung.if (!account){...}Di sini.

self.account = accountIni adalah kalimat untuk mengubah variabel lokal.accountHal ini dapat dilakukan dengan cara mengetikkan nilai.accountAtribut digunakan untuk mencatat informasi akun terbaru pada objek yang dibuat.

var now = new Date().getTime()Ini menyatakan variabel lokal.now, dan memanggil objek tanggal waktu dalam bahasa JavaScriptgetTime()Fungsi ini mengembalikan waktu saat ini.nowVariabel.

if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {...}Kode ini menentukan perbedaan antara waktu saat ini dan waktu terakhir yang dicatat jika melebihi parameter.CalcNetInterval * 1000Ini berarti lebih banyak dari update terakhir.CalcNetInterval * 1000Milisekund (CalcNetIntervaldetik), yang memungkinkan pencetakan pendapatan secara tepat waktu, karena untuk menghitung pendapatan harus menggunakan harga pembelian satu di rekening, maka kondisi ini juga dibatasiself.orderBook.Bids.length > 0Kondisi ini (dalam data, daftar pembayaran harus memiliki informasi peringkat yang valid). Ketika kondisi pernyataan if ini dipicu,self.preCalc = nowUpdate variabel timestamp hasil pencetakan terbaruself.preCalcUntuk waktu saat ininowDi sini, statistik pendapatan menggunakan metode perhitungan nilai bersih, yang dikodekan sebagaivar net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks)), yaitu mengubah mata uang menjadi uang berdasarkan harga pembelian saat ini (mata uang tagihan), dan jumlah uang dalam rekening ditambah dengan variabel lokal yang diberikan kepada pernyataannetUntuk menentukan apakah total bersih saat ini dan total bersih yang tercatat terakhir:

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

Jika tidak,net != self.preNetJadi, gunakan.netAtribut pembaruan variabel untuk mencatat nilai bersihself.preNetKemudian cetak ini.netData total bersih ke inventor di grafik kurva pendapatan dari robot platform perdagangan kuantitatif ((bisa dicek di dokumen FMZ APILogProfitFungsi ini) ⋅

Jika tidak memicu pendapatan pencetakan tepat waktu, maka lanjutkan dengan proses berikut, dan akanaccount.Stocks(Jumlah koin yang tersedia di akun saat ini)account.Balance(Jumlah uang yang tersedia di rekening saat ini)self.btcself.cny❖ Menghitung perbandingan pergeseran dan mencatat nilai padaself.p

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

Algorithmnya juga sangat sederhana, yaitu menghitung nilai saat ini koin sebagai persentase dari total nilai bersih akun.

Jadi, bagaimana menentukan kapan mata uang (posisi) akan terikat? Penulis di sini menggunakan 50% ke atas 2 poin persentase sebagai buffer, melampaui keseimbangan pelaksanaan area buffer, yaitu:self.p < 0.48Pergeseran keseimbangan koin dipicu, berpikir bahwa koin kurang, membeli satu posisi di pasar dan mulai setiap kali harga meningkat 0.01, menempatkan tiga lembar kertas.self.p > 0.52Jika Anda memiliki uang lebih banyak, maka Anda akan menjual sebuah kertas di pasar. Akhirnya, Anda harus menunggu beberapa waktu sesuai dengan pengaturan parameter.Sleep(BalanceTimeout)Setelah itu, semua pesanan dibatalkan.

        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:

Pada saat itu, para pemimpin negara-negara Eropa yang terlibat dalam perang itu, mulai mengkritik dan mengkritik pemerintah.self.poll = function() {...}Fungsi adalah logika utama dari strategi ini, dan kita sudah berbicara tentang hal ini di artikel sebelumnya.main()Fungsi mulai dijalankan, masukwhileSebelum siklus kematian, kita menggunakanvar reaper = LeeksReaper()Kami membuat objek mesin pemanen lobak, dan kemudian kami membuatnya di mesin pemanen lobak.main()Panggilan loop dalam fungsireaper.poll()Fungsi yang disebut adalah fungsinya sendiri.

self.pollFungsi mulai dijalankan, melakukan beberapa persiapan sebelum setiap putaran, dan kemudian melakukan beberapa langkah untuk mengaktifkannya.self.numTick++"Saya tidak tahu apa yang terjadi.self.updateTrades()Untuk memperbarui catatan transaksi pasar terbaru dan menghitung data yang digunakan.self.updateOrderBook()Untuk memperbarui data persediaan (order thin) dan menghitung data terkait.self.balanceAccount()Periksa saldo koin (posisi).

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

Di sini, Anda akan melihat apakah pasar jangka pendek saat ini 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
        }

Dan ingat artikel sebelumnya?self.updateOrderBook()Fungsi dimana kita menggunakan algoritma dengan rata-rata yang ditimbang untuk membangun urutan waktu yangpricesArray. Tiga fungsi baru digunakan dalam kode ini._.min_.maxsliceJika Anda ingin melihat apa yang terjadi, maka Anda harus melihat apa yang terjadi.

  • _.minFungsi: adalah mencari nilai terkecil dari array parameter.

  • _.max: fungsi adalah mencari nilai terbesar dari array parameter.

  • slice: Fungsi ini adalah fungsi anggota dari obyek array JavaScript yang berfungsi untuk mengembalikan bagian dari array yang dipotong sesuai 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))    // 会截取 4 ~ 1 这几个元素,返回一个新数组:[4,3,2,1]
    }
    

    img

Di sini, kondisi untuk menilai seekor beruang atau sapi adalah:

  • self.numTick > 2Untuk membangun, yaitu ketika harga deteksi baru meletus, setidaknya tiga putaran deteksi harus dipicu, menghindari pemicu di awal.
  • Serial hargaself.pricesDan data terakhir, yang merupakan data terbaru, adalah data yang menunjukkan bahwaself.pricesPerbedaan harga maksimum atau minimum dalam rentang sebelumnya harus dipecahkan.burstPriceHarga ledakan ini.

Jika kondisi tersebut berlaku, tandabullAtaubearUntuktruedan memberikantradeAmountVariable Assignment, Perencanaan Perdagangan Hip Hop.

Jadi, apa yang akan kita lakukan?self.updateTrades()Fungsi yang diperbarui, dihitungself.volUntuk parameterBurstThresholdVolMemutuskan apakah akan mengurangi intensitas transaksi (mengurangi jumlah transaksi yang direncanakan).

        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 apakah sinyal transaksi atau volume transaksi memenuhi persyaratan berikut:

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

Setelah memutuskan atas, pelaksanaanvar tradePrice = bull ? self.bidPrice : self.askPriceJika Anda ingin melakukan transaksi, Anda harus memilih antara harga yang sesuai dengan pasar yang Anda inginkan.

Akhirnya masuk ke sebuahwhileAnda dapat melihat bahwa jika Anda tidak melakukan hal yang sama, maka Anda tidak akan dapat melakukan hal yang sama.tradeAmount >= MinStockJumlah transaksi yang direncanakan lebih kecil dari jumlah transaksi minimum. Melakukan perintah berikut sesuai dengan apakah saat ini pasar buaya atau pasar beruang dalam siklus; dan mencatat ID tunggal pada variabelorderId◎ Setelah setiap putaran pesananSleep(200)Tunggu 200 millisecond.orderIdApakah benar (jika pemesanan gagal, tidak mengembalikan ID pesanan, tidak akan memicu kondisi if), jika kondisi benar.self.tradeOrderId

Menyatakan variabel yang digunakan untuk menyimpan data pesananorderNilai awal adalahnullKemudian putaran mendapatkan data pesanan dari ID ini, dan memutuskan apakah pesanan tersebut berada dalam status yang terikat, jika status yang terikat, membatalkan pesanan dari ID ini, jika tidak status yang terikat, keluar dari putaran 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
                        }
                    }
                }

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

Ketika proses program melompat keluarwhile (tradeAmount >= MinStock) {...}Pada saat siklus ini terjadi, maka proses transaksi harga ledakan ini telah selesai. Pelaksanaanself.numTick = 0Dan itu adalah cara yang tepat untuk mengubahnya.self.numTick0 ∞ adalah 0

LeeksReaper()Fungsi pembangun akan dieksekusi pada akhirnya.selfJadi objek akan kembali.var reaper = LeeksReaper()Saat itu, saya kembalikan.reaper

Sampai saat iniLeeksReaper()Fungsi pembangun bagaimana untuk membangun obyek mesin pemetik lobak ini dan berbagai metode untuk obyek mesin pemetik lobak, proses pelaksanaan fungsi logis utama, kami menganalisis lagi, dan saya yakin setelah membaca artikel ini Anda harus memiliki pemahaman yang lebih jelas tentang proses algoritma strategi frekuensi tinggi ini.


Lebih banyak

xukittyTerima kasih, Dr. Drumshall, apakah Anda pernah berpikir tentang kombinasi mesin pemetik kacang tanah dengan robot frekuensi tinggi dewa rumput?

Mattzhang1988Dia mengatakan banyak omong kosong. Tidak ada kata inti.

CyndiYY1024Ada sedikit yang tidak jelas, mengapa harus menjaga keseimbangan mata uang dan uang, jika tidak mencapai keseimbangan, Anda harus melakukan pembelian dan penjualan. Setelah BalanceTimeout berlalu, Anda membatalkan pesanan lagi, tidak lagi seimbang, tetapi masuk ke titik ledakan berikutnya.

Kekuatan DemasiaDi mana perintah di bawah ini?

Eddie.Pada video sebelumnya, dalam kabut, saya menggunakan FMZ dan menontonnya lagi. Memantau fluktuasi harga, menemukan ledakan harga, mengikuti arah tren, menghitung persentase hip-hop dengan ukuran volume perdagangan sebagai referensi, melakukan perdagangan hip-hop. Setelah perdagangan hip-hop selesai, tidak memegang saham, mempertahankan keseimbangan mata uang dalam jangka panjang. Apakah aku benar, Dream?

xukittyJika Anda ingin tahu bagaimana cara menghapusnya, silakan lihat di bawah ini.

xukittyTerima kasih Dreamz, FMZ benar-benar harta karun.

printbtcApakah Anda tidak mengerti?

Aku tidak tahu.BurstThresholdVol adalah parameter yang digunakan untuk mengatur batas volume.

Evan1987"Sudah satu jam menontonnya, tapi saya baru bisa memahami detailnya", kata Zeng.

rootmeDream666, setelah saya meneliti, apakah saya bisa membuat mesin pemetik lobak yang sama dengan uang cetak?

Mimpi kecilDalam sebuah artikel, Grasshopper mengatakan bahwa frekuensi tinggi membutuhkan lingkungan pasar. Secara strategis, mesin pemetik lobak memiliki kesamaan ide dengan robot frekuensi tinggi Grasshopper.

Mimpi kecilMaaf, artikel ini terutama untuk pemula tentang proses pelaksanaan, banyak omong kosong yang benar-benar mencolok, Anda mengabaikannya.

Mimpi kecilBagus!

Mimpi kecilMesin pemetik kedelai asli memiliki modul keseimbangan yang dapat dipertimbangkan untuk dihilangkan.

Mimpi kecilTidak sopan

Mimpi kecil♪ Oh, tidak.

Mimpi kecilJumlah ledakan, ini adalah parameter kebijakan, diatur secara manusiawi, lihat secara rinci kebijakan, artikel, dan tahu apa yang dikendalikan oleh variabel ini.

Mimpi kecilPada dasarnya, itu hampir sama.