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.account
Dengan kata lain, objek yang dibuataccount
Properti: 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.account
Untuk mengkoneksikan aplikasi ini, Anda dapat mengklik tombol "Inventor API".exchange.GetAccount()
Fungsi yang mendapatkan data terbaru dari akun saat ini, memberikan nilai keaccount
Variabel. Kemudian menilai.account
Jika variabel ini adalahnull
Nilai (misalnya, kegagalan untuk mendapatkan masalah seperti latency, jaringan, dan kesalahan antarmuka pertukaran) dikembalikan langsung.if (!account){...}
Di sini.
self.account = account
Ini adalah kalimat untuk mengubah variabel lokal.account
Hal ini dapat dilakukan dengan cara mengetikkan nilai.account
Atribut 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.now
Variabel.
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 * 1000
Ini berarti lebih banyak dari update terakhir.CalcNetInterval * 1000
Milisekund (CalcNetInterval
detik), 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 > 0
Kondisi ini (dalam data, daftar pembayaran harus memiliki informasi peringkat yang valid). Ketika kondisi pernyataan if ini dipicu,self.preCalc = now
Update variabel timestamp hasil pencetakan terbaruself.preCalc
Untuk waktu saat ininow
Di 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 pernyataannet
Untuk 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.preNet
Jadi, gunakan.net
Atribut pembaruan variabel untuk mencatat nilai bersihself.preNet
Kemudian cetak ini.net
Data total bersih ke inventor di grafik kurva pendapatan dari robot platform perdagangan kuantitatif ((bisa dicek di dokumen FMZ APILogProfit
Fungsi 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.btc
,self.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.48
Pergeseran 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.52
Jika 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, masukwhile
Sebelum 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.poll
Fungsi 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 yangprices
Array. Tiga fungsi baru digunakan dalam kode ini._.min
,_.max
,slice
Jika Anda ingin melihat apa yang terjadi, maka Anda harus melihat apa yang terjadi.
_.min
Fungsi: 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]
}
Di sini, kondisi untuk menilai seekor beruang atau sapi adalah:
self.numTick > 2
Untuk membangun, yaitu ketika harga deteksi baru meletus, setidaknya tiga putaran deteksi harus dipicu, menghindari pemicu di awal.self.prices
Dan data terakhir, yang merupakan data terbaru, adalah data yang menunjukkan bahwaself.prices
Perbedaan harga maksimum atau minimum dalam rentang sebelumnya harus dipecahkan.burstPrice
Harga ledakan ini.Jika kondisi tersebut berlaku, tandabull
Ataubear
Untuktrue
dan memberikantradeAmount
Variable Assignment, Perencanaan Perdagangan Hip Hop.
Jadi, apa yang akan kita lakukan?self.updateTrades()
Fungsi yang diperbarui, dihitungself.vol
Untuk parameterBurstThresholdVol
Memutuskan 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.askPrice
Jika Anda ingin melakukan transaksi, Anda harus memilih antara harga yang sesuai dengan pasar yang Anda inginkan.
Akhirnya masuk ke sebuahwhile
Anda dapat melihat bahwa jika Anda tidak melakukan hal yang sama, maka Anda tidak akan dapat melakukan hal yang sama.tradeAmount >= MinStock
Jumlah 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.orderId
Apakah 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 pesananorder
Nilai awal adalahnull
Kemudian 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 = 0
Dan itu adalah cara yang tepat untuk mengubahnya.self.numTick
0 ∞ adalah 0
LeeksReaper()
Fungsi pembangun akan dieksekusi pada akhirnya.self
Jadi 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.
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?
Penemu Kuantitas - 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.
Penemu Kuantitas - Mimpi KecilMaaf, artikel ini terutama untuk pemula tentang proses pelaksanaan, banyak omong kosong yang benar-benar mencolok, Anda mengabaikannya.
Penemu Kuantitas - Mimpi KecilBagus!
Penemu Kuantitas - Mimpi KecilMesin pemetik kedelai asli memiliki modul keseimbangan yang dapat dipertimbangkan untuk dihilangkan.
Penemu Kuantitas - Mimpi KecilTidak sopan
Penemu Kuantitas - Mimpi Kecil♪ Oh, tidak.
Penemu Kuantitas - Mimpi KecilJumlah ledakan, ini adalah parameter kebijakan, diatur secara manusiawi, lihat secara rinci kebijakan, artikel, dan tahu apa yang dikendalikan oleh variabel ini.
Penemu Kuantitas - Mimpi KecilPada dasarnya, itu hampir sama.