Sau đóNội dung lênCác bạn có thể tham khảo bài viết này.
Chức năng thứ ba được thêm vào:
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)
}
}
}
}
Xây dựng hàmLeeksReaper()
Khi tạo một đối tượng, thêm vào đối tượngbalanceAccount()
Chức năng là cập nhật thông tin tài sản tài khoản, lưu trữself.account
Và chúng ta có thể tạo ra một hình ảnh.account
Tính năng: Tính đến thời điểm tính toán giá trị lợi nhuận và in. Sau đó, dựa trên thông tin tài sản tài khoản mới nhất, tính toán tỷ lệ cân bằng tiền mặt (tương đương tiền mặt), khi kích hoạt ngưỡng di chuyển, thực hiện thanh toán nhỏ, để tiền tệ (tương đương tiền mặt) trở lại cân bằng. Chờ một thời gian giao dịch nhất định, sau đó hủy tất cả các đơn hàng bị treo, và trong vòng tiếp theo thực hiện chức năng này, sẽ kiểm tra lại cân bằng và xử lý tương ứng.
Chúng ta hãy xem từng câu mã của hàm này:
Đầu tiên là câu đầu tiên.var account = exchange.GetAccount()
là một biến địa phương được tuyên bố.account
, và gọi API của nhà phát minhexchange.GetAccount()
Chức năng lấy dữ liệu mới nhất của tài khoản hiện tại, gán giá trị choaccount
Các biến. Rồi đánh giáaccount
Và chúng ta có thể tính toán nó như sau.null
Các giá trị (ví dụ như lỗi thời gian, mạng, giao diện giao dịch, và các vấn đề khác) sẽ được trả về trực tiếp (đối vớiif (!account){...}
(Trong đây)
self.account = account
Đây là một câu nói về biến địa phương.account
Đặt giá trị cho các đối tượng được tạo raaccount
Các thuộc tính được sử dụng để ghi lại thông tin tài khoản mới nhất trong các đối tượng được tạo.
var now = new Date().getTime()
Câu này tuyên bố một biến địa phương.now
, và gọi các đối tượng thời gian ngày của ngôn ngữ JavaScriptgetTime()
Chức năng trả về thời gian hiện tại.now
Các biến.
if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {...}
Mã này sẽ xác định giá trị chênh lệch giữa thời gian hiện tại và thời gian cuối cùng được ghi nhận nếu vượt quá các tham sốCalcNetInterval * 1000
Điều này có nghĩa là chúng ta đã có nhiều hơn so với lần cập nhật cuối cùng.CalcNetInterval * 1000
MilisecondsCalcNetInterval
Trong trường hợp này, giá trị của sản phẩm được tính theo giá bán hàng được giới hạn trong điều kiện tính toán lợi nhuận.self.orderBook.Bids.length > 0
Điều kiện này (thông tin sâu, phải có thông tin cấp độ hợp lệ trong danh sách thanh toán). Khi điều kiện if được kích hoạt, thực hiệnself.preCalc = now
Cập nhật các biến thời gian cuối cùng của thu nhập inself.preCalc
Tiếp tục thời giannow
Trong số đó, các doanh nghiệp có tỷ lệ tăng trưởng cao hơn so với các doanh nghiệp khác.var net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks))
, tức là đổi đồng tiền thành tiền theo giá mua hiện tại (tiền hóa), và cộng với số tiền trong tài khoản với các biến địa phương được gán cho tuyên bốnet
Đánh giá liệu tổng giá trị ròng hiện tại có phù hợp với tổng giá trị ròng được ghi nhận lần trước không:
if (net != self.preNet) {
self.preNet = net
LogProfit(net)
}
Nếu không,net != self.preNet
Thực sự, hãy sử dụngnet
Tính năng cập nhật biến để ghi lại giá trị ròngself.preNet
Và sau đó in cái này.net
Dữ liệu tổng giá trị ròng cho các nhà phát minh trên biểu đồ đường cong thu nhập của robot sàn giao dịch định lượng ((có thể được truy vấn trong tài liệu API FMZ)LogProfit
Chức năng này).
Nếu không kích hoạt thu nhập in đúng thời điểm, hãy tiếp tục quá trình sau đây và sẽ có kết quả tương tự.account.Stocks
(Số đồng có sẵn trong tài khoản hiện tại)account.Balance
(Số tiền có sẵn trong tài khoản hiện tại) được ghi lại trongself.btc
,self.cny
◎ Tính toán tỷ lệ sai lệch và ghi lại giá trịself.p
。
self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny)
Một thuật toán rất đơn giản, tính giá trị hiện tại của đồng tiền là tỷ lệ phần trăm của tổng giá trị tài khoản.
Vậy khi nào bạn sẽ quyết định kích hoạt sự cân bằng của đồng tiền?
Các tác giả ở đây sử dụng 50% lên xuống 2 điểm phần trăm như một đệm, vượt quá sự cân bằng thực hiện vùng đệm, đó là:self.p < 0.48
Sự dịch chuyển cân bằng tiền xu được kích hoạt, cho rằng đồng xu ít hơn, bắt đầu mua một vị trí trên sàn, tăng giá 0.01 mỗi lần, đặt ba tờ giấy nhỏ.self.p > 0.52
Sau đó, người ta sẽ bán một tờ giấy nhỏ trên sàn. Cuối cùng, chờ một thời gian nhất định theo cài đặt tham số.Sleep(BalanceTimeout)
Sau đó hủy tất cả các đơn đặt hàng.
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取消订单
}
}
}
Chức năng thứ tư được thêm vào:
Trong khi đó, một người đàn ông người Việt Nam có thể nói rằng:self.poll = function() {...}
Các hàm là logic chính của toàn bộ chiến lược, và trong bài viết trước, chúng tôi đã nói về,main()
Các hàm bắt đầu thực hiện, vàowhile
Trước khi chết, chúng ta sử dụngvar reaper = LeeksReaper()
Chúng tôi đã tạo ra các đối tượng cho máy thu hoạch hạt cải, và sau đó chúng tôi đã tạo ra các đối tượng cho máy thu hoạch hạt cải.main()
Gọi vòng trong hàmreaper.poll()
Đó là chức năng được gọi.
self.poll
Các chức năng bắt đầu thực hiện, thực hiện một số công việc chuẩn bị trước mỗi vòng lặp, và sau đó thực hiện một số công việc khác.self.numTick++
Những người khác cũng có thể làm điều đó.self.updateTrades()
Bạn có thể cập nhật hồ sơ giao dịch thị trường gần đây và tính toán dữ liệu sử dụng liên quan.self.updateOrderBook()
Những người tham gia cuộc họp báo này đã được mời đến tham dự các cuộc họp báo trên mạng xã hội.self.balanceAccount()
Theo đó, các nhà đầu tư sẽ có thể kiểm tra số tiền (được đặt) cân bằng.
var burstPrice = self.prices[self.prices.length-1] * BurstThresholdPct # 计算爆发价格
var bull = false # 声明牛市标记的变量,初始为假
var bear = false # 声明熊市标记的变量,初始为假
var tradeAmount = 0 # 声明交易数量变量,初始为0
Tiếp theo là đánh giá thị trường ngắn hạn hiện tại là bò hay gấu.
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
}
Bạn có nhớ bài viết trước không?self.updateOrderBook()
Một hàm trong đó chúng ta sử dụng một thuật toán tính phương trọng số để tạo ra một chuỗi thời gian theo thứ tự.prices
Định số. Có 3 hàm mới được sử dụng trong đoạn code này._.min
,_.max
,slice
Các hàm này cũng rất dễ hiểu.
_.min
: là giá trị nhỏ nhất trong một mảng tham số.
_.max
: là giá trị lớn nhất trong các mảng tham số.
slice
: là một hàm thành viên của một đối tượng matrix JavaScript, nó trả về một phần của một matrix theo chỉ mục, ví dụ:
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]
}
Ở đây, điều kiện để đánh giá gấu hay bò là:
self.numTick > 2
Để được thành lập, nghĩa là khi một vòng kiểm tra mới bùng nổ, bạn phải trải qua ít nhất ba vòng kiểm tra trước khi được kích hoạt, tránh kích hoạt ngay từ đầu.self.prices
Những con số cuối cùng, là những con số mới nhất,self.prices
Điểm chênh lệch giá tối đa hoặc tối thiểu trong phạm vi trước trong mảngburstPrice
Một số người cho rằng, "Điều này là một sự cố lớn".Nếu tất cả các điều kiện được đáp ứng, đánh dấubull
Hoặcbear
, chotrue
Và chotradeAmount
Các nhà phân tích khác cũng cho biết rằng các nhà phân tích khác cũng có thể sử dụng các phương pháp này.
Một lần nữa,self.updateTrades()
Đổi mới, tính toán trong hàmself.vol
, đối với các tham sốBurstThresholdVol
Quyết định liệu có giảm cường độ giao dịch hay không (giảm số lượng giao dịch dự kiến).
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
}
Sau đó, đánh giá các tín hiệu giao dịch, khối lượng giao dịch có phù hợp hay không:
if ((!bull && !bear) || tradeAmount < MinStock) { # 如果非牛市并且也非熊市,或者计划交易的量tradeAmount小于参数设置的最小交易量MinStock,poll函数直接返回,不做交易操作
return
}
Sau khi đưa ra phán quyết trên, thực hiệnvar tradePrice = bull ? self.bidPrice : self.askPrice
Theo thị trường gấu hay thị trường bò, đặt giá giao dịch và gán giá đặt hàng tương ứng.
Cuối cùng là mộtwhile
Chuyển vòng, và điều kiện duy nhất để dừng lại làtradeAmount >= MinStock
Số lượng giao dịch được lên kế hoạch nhỏ hơn số lượng giao dịch tối thiểu.
Trong vòng lặp, thực hiện các lệnh theo trạng thái thị trường bò hoặc thị trường gấu hiện tại.orderId
◎ Sau mỗi vòng đặt hàngSleep(200)
Chờ 200 millisecond.orderId
Có phải là true (không kích hoạt điều kiện if nếu đặt hàng thất bại và không trả lại ID đặt hàng), nếu điều kiện là true;; được gán ID đặt hàng choself.tradeOrderId
。
Xác định một biến để lưu trữ dữ liệu đơn đặt hàngorder
Đặt giá trị ban đầu lànull
│ Sau đó vòng lặp lấy dữ liệu đặt hàng của ID này, và quyết định xem lệnh có đang bị treo hay không, nếu đang bị treo, hủy lệnh của ID đó, nếu không thì thoát khỏi vòng lặp này.
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
}
}
}
Sau đó thực hiện các quy trình sau:
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
}
}
Khi quá trình thoát khỏiwhile (tradeAmount >= MinStock) {...}
Khi chu kỳ này diễn ra, điều này cho thấy quá trình giao dịch bùng nổ giá đã hoàn tất.
Thực thiself.numTick = 0
Đặt lạiself.numTick
Nó là 0.
LeeksReaper()
Chế độ xây dựng cuối cùng sẽself
Và chúng ta sẽ quay lại.var reaper = LeeksReaper()
Và tôi sẽ trả lại cho anh ấy.reaper
。
Cho đến nayLeeksReaper()
Chúng tôi đã phân tích một lần nữa cách các hàm cấu trúc cấu trúc đối tượng máy thu hoạch hạt cải này và các phương pháp thực hiện đối tượng máy thu hoạch hạt cải, các quy trình thực thi các hàm logic chính. Tôi tin rằng sau khi đọc bài viết này, bạn nên có một sự hiểu biết rõ ràng hơn về quy trình thuật toán chiến lược tần suất cao này.
xukittyXin vui lòng cho biết ý tưởng của bạn về việc kết hợp máy thu hoạch cải xanh và robot cao tần số của thần cỏ đã có gì không?
Mattzhang1988Một số người đã nói rằng họ không thể làm điều đó.
CyndiYY1024Có một chút không hiểu, tại sao phải duy trì sự cân bằng của đồng tiền và tiền tệ, nếu không đạt được sự cân bằng, bạn sẽ phải mua và bán. Sau đó, sau khi BalanceTimeout, bạn sẽ hủy đơn đặt hàng, không cân bằng nữa, nhưng đi vào vòng bùng nổ tiếp theo.
Sức mạnh của DamasusĐâu là lệnh dưới đây?
Eddie.Trong đám mây trước đây, xem lại FMZ một lần nữa. Theo dõi biến động giá sàn, phát hiện sự bùng nổ giá, theo hướng xu hướng, tính tỷ lệ tỷ lệ hối đoái với quy mô giao dịch như một tham chiếu. Tôi đã nói đúng không, Dream General?
xukittyXin vui lòng cho chúng tôi biết tổng thể, chương trình liên tục cân bằng đồng tiền và tiền, tính năng này được tính đến với mục đích gì?
xukittyCảm ơn Dreamz, FMZ thật sự là kho báu.
printbtcKhông hiểu.
KhoangBurstThresholdVol là gì?
Evan1987Một số người cho rằng video này là một phần của bộ phim truyền hình, nhưng không phải là một phần của bộ phim truyền hình.
rootme666, sau khi nghiên cứu, tôi có thể viết một máy thu hoạch cải giống như tiền in không?
Những nhà phát minh định lượng - những giấc mơ nhỏTrong một bài viết, Grasshopper đã nói rằng tần số cao cần một môi trường thị trường. Về chiến lược, máy thu hoạch rau củ và robot tần số cao của Grasshopper có cùng một ý tưởng.
Những nhà phát minh định lượng - những giấc mơ nhỏXin lỗi, bài viết này chủ yếu dành cho những người mới bắt đầu thực hiện quy trình, một loạt những lời vớ vẩn thực sự rất rõ ràng, bạn đã bỏ qua.
Những nhà phát minh định lượng - những giấc mơ nhỏtuyệt!
Những nhà phát minh định lượng - những giấc mơ nhỏMáy thu hoạch cải bắp nguyên bản có một mô-đun cân bằng, có thể xem xét loại bỏ.
Những nhà phát minh định lượng - những giấc mơ nhỏKhông lịch sự
Những nhà phát minh định lượng - những giấc mơ nhỏ
Những nhà phát minh định lượng - những giấc mơ nhỏSố lượng bùng phát, đây là một tham số chính sách, được đặt bởi con người, hãy xem chi tiết chính sách, bài viết, và bạn sẽ biết những gì biến này kiểm soát.
Những nhà phát minh định lượng - những giấc mơ nhỏCó lẽ nguyên tắc là tương tự.