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,account
Atribut 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 tempatanaccount
dan memanggil fungsiexchange.GetAccount
Dapatkan 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 = account
adalah untuk menetapkan pembolehubah tempatanaccount
kepadaaccount
atribut objek yang dibina untuk merakam maklumat akaun terkini dalam objek yang dibina.
Var now = new Date().getTime ()
menyatakan pembolehubah tempatannow
dan 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 * 1000
Milisaat (CalcNetInterval
(sekunder), yang merealisasikan fungsi pendapatan cetak pada masa yang tetap.self.orderBook.Bids.length > 0
juga ditakrifkan dalam keadaan (data kedalaman, mesti ada maklumat tahap yang sah dalam senarai susunan). Apabila keadaan if perintah dicetuskan,self.PreCalc = now
dilaksanakan untuk mengemas kini pembolehubah cap masa pulangan yang paling baru dicetakself.preCalc
kepada stempel masa semasanow
Di 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.preNet
adalah benar, mengemas kini atributself.preNet
digunakan untuk merekodkan nilai bersih dengan pembolehubahnet
. Kemudian cetak jumlah bersihnet
data kepada carta lengkung hasil dari FMZ Quant Robot platform Dagangan (yangLogProfit
fungsi 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.BTC
danself.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 akhirwhile
gelung, kita gunakanvar reaper = LeeksReaper()
untuk membina objek leeksreaper, dan kemudian menjalankan panggilan gelungreaper.poll()
dalammain()
function.
Peraturanself.poll
fungsi 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 diarahkanprices
Tiga fungsi baru:_.min
, _.max
, danslice
digunakan 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 anggotaJavaScript
array 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]
}
Syarat untuk menilai pasaran beruang atau lembu adalah:
· Pengurusanself.numTick > 2
mesti 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.prices
daripada urutan harga, iaitu data terkini, dan harga maksimum atau minimum dalam julat sebelumnya dalamself.prices
array harus melebihi harga pecah dariburstPrice
.
Jika semua syarat adalah benar, tandabull
ataubear
sebagai benar, dan menetapkan nilai kepada pembolehubahtradeAmount
untuk merancang transaksi Stud.
Kemudian, mengikutself.vol
diperbaharui dan dikira pada tahun sebelumnya.self.updateTrades()
fungsi,BurstThresholdVol
parameter 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 < 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.askPrice
menetapkan harga urus niaga mengikut sama ada ia adalah pasaran beruang atau pasaran lembu, dan menetapkan nilai dengan harga bill of lading yang sepadan.
Akhirnya,while
gelung dimasukkan, dan satu-satunya keadaan berhenti gelung adalah bahawa jumlah dagangan yang dirancangtradeAmount > = MinStock
adalah 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 adaorderId
adalah 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 pembolehubahorder
digunakan 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 > 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 < -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.numTick
kepada 0.
PeraturanLeeksReaper()
pembina mengembalikanself
objek 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.