Trong bài viết trước, chúng ta đã cùng nhau thực hiện một chiến lược bảo hiểm đơn giản, và sau đó chúng ta sẽ học cách nâng cấp chiến lược này. Thay đổi chiến lược sẽ không lớn, nhưng các chi tiết thay đổi cần được chú ý. Các định nghĩa ở một số nơi trong mã và những thay đổi trước đó cần được hiểu rõ hơn.
A交易所->B交易所
,B交易所->A交易所
Chúng tôi sử dụng một đường thẳng để tạo ra một đường thẳng và tạo ra một đường thẳng.画线类库
Và chúng tôi đã cùng nhau học cách sử dụng FMZ.模版类库
Các chức năng.Chúng ta hãy thực hiện từng thiết kế một.
Sử dụng mã để chuyển sang mô hình đòn bẩy tiền mặt bằng ví dụ:exchanges[i].IO
, nhập tham sốtrade_normal
Chuyển sang đòn bẩy, truyền vàotrade_super_margin
Chuyển sang full lever, không hỗ trợ kiểm tra lại.
Trongmain
Tăng giai đoạn chuẩn bị cho việc bắt đầu hàm:
// 切换杠杆模式
for (var i = 0 ; i < exchanges.length ; i++) { // 遍历检测所有添加的交易所对象
if (exchanges[i].GetName() == "Binance" && marginType != 0) { // 如果当前i索引代表的交易所对象是币安现货,并且策略界面参数marginType选择的不是「普通币币」选项,执行切换
if (marginType == 1) {
Log(exchanges[i].GetName(), "设置为杠杆逐仓")
exchanges[i].IO("trade_normal")
} else if (marginType == 2) {
Log(exchanges[i].GetName(), "设置为杠杆全仓")
exchanges[i].IO("trade_super_margin")
}
}
}
Ở đây, chỉ thêm mã cho mô hình đòn bẩy chuyển đổi đồng xu cho tiền mặt đồng xu, vì vậy việc đặt chuyển đổi trên các tham số chính sách cũng chỉ có hiệu quả đối với tiền mặt đồng xu.
Sử dụng mẫu hình đã đóng gói rất đơn giản.画线类库
◎ Có thể tìm kiếm trực tiếp trên quảng trường chiến lược của nền tảng FMZ.
Bạn có thể tham khảo thêm tại đây:https://www.fmz.com/strategy/27293Bạn có thể chuyển sang trang sao chép mẫu này.
Bạn có thể nhấp vào nút để sao chép thư viện mẫu này vào thư viện chính sách của mình.
Sau đó, trong trang chỉnh sửa chính sách, bạn có thể chọn thư mục mẫu cần sử dụng trong cửa sổ mẫu. Sau khi chọn, hãy lưu chính sách, chính sách sẽ tham khảo mẫu này. Đây chỉ là một hướng dẫn đơn giản về việc sử dụng thư mục mẫu, vì vậy bạn không cần phải lặp lại các hoạt động.画线类库
Những người tham gia vào cuộc thảo luận đã được trích dẫn.
Chúng tôi chủ yếu học cách sử dụng nó.画线类库
Chế độ này được sử dụng để vẽ các biểu đồ.
Chúng tôi đang lên kế hoạchA->B
Những người dân Việt Nam đang sống trong tình trạng khó khăn.B->A
Các đường chênh lệch, các đường kích hoạt chênh lệch đều được vẽ. Bạn cần vẽ hai đường cong (mức chênh lệch hiện tại từ A đến B, B đến A), hai đường ngang (mức chênh lệch kích hoạt giá), như hình trên.
Vì chúng ta phải thiết kế một cách đơn phương, và chúng ta phải làm điều đó một cách đơn giản.A->B
vàB->A
Các thiết kế khác nhau trong bài viết trước đây không thể được sử dụng.
Bài trước:
var targetDiffPrice = hedgeDiffPrice
if (diffAsPercentage) {
targetDiffPrice = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentage
}
Chỉ có một sự khác biệt kích hoạt.targetDiffPrice
‖
Vì vậy, ở đây chúng ta sẽ thay đổi mã, thay đổi các tham số đầu tiên.
Sau đó, thay đổi mã:
var targetDiffPriceA2B = hedgeDiffPriceA2B
var targetDiffPriceB2A = hedgeDiffPriceB2A
if (diffAsPercentage) {
targetDiffPriceA2B = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageA2B
targetDiffPriceB2A = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageB2A
}
Điều này có nghĩa là giá cả sẽ giảm so với trước đây.targetDiffPrice
Một trở thành hai.targetDiffPriceA2B
、targetDiffPriceB2A
‖
Sau đó, bạn có thể vẽ dữ liệu này trên biểu đồ bằng cách sử dụng hàm vẽ đường trong thư viện lớp vẽ đường.
// 画图
$.PlotHLine(targetDiffPriceA2B, "A->B") // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
$.PlotHLine(targetDiffPriceB2A, "B->A")
Khi chiến lược được thực hiện, biểu đồ này cho thấy:
Tiếp theo, vẽ đường cong chênh lệch thời gian thực, để tránh đường vẽ quá nhiều. Đặt mã của đường cong vẽ dữ liệu chênh lệch thời gian thực vào kiểm tra cân bằng.
if (ts - lastKeepBalanceTS > keepBalanceCyc * 1000) {
nowAccs = _C(updateAccs, exchanges)
var isBalance = keepBalance(initAccs, nowAccs, [depthA, depthB])
cancelAll()
if (isBalance) {
lastKeepBalanceTS = ts
if (isTrade) {
var nowBalance = _.reduce(nowAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
var initBalance = _.reduce(initAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
LogProfit(nowBalance - initBalance, nowBalance, initBalance, nowAccs)
isTrade = false
}
}
$.PlotLine("A2B", depthA.Bids[0].Price - depthB.Asks[0].Price) // 画实时差价曲线
$.PlotLine("B2A", depthB.Bids[0].Price - depthA.Asks[0].Price) // 第一个参数是曲线名称,第二个参数是曲线当前时刻的值,即当前时刻Y轴方向上的值
}
Điều này chỉ cho phép bạn vẽ 4 dòng mã biểu đồ, cho phép chính sách hiển thị biểu đồ khi chạy.
Trong bài viết trên, chúng tôi đã đề cập đến việc các đường dẫn kích hoạt chênh lệch giá đã được thay đổi thành hai đường, kiểm soát riêng biệt.A->B
Những người tham gia vào cuộc họp này nói rằng:B->A
Điều này không thể sử dụng thuật toán giá đặt hàng trước đó, thay thế cho cách giảm giá giao dịch.
if (depthA.Bids[0].Price - depthB.Asks[0].Price > targetDiffPriceA2B && Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount) >= minHedgeAmount) { // A -> B 盘口条件满足
var priceSell = depthA.Bids[0].Price - slidePrice
var priceBuy = depthB.Asks[0].Price + slidePrice
var amount = Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount)
if (nowAccs[0].Stocks > minHedgeAmount && nowAccs[1].Balance * 0.8 / priceSell > minHedgeAmount) {
amount = Math.min(amount, nowAccs[0].Stocks, nowAccs[1].Balance * 0.8 / priceSell, maxHedgeAmount)
Log("触发A->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[1].Balance * 0.8 / priceSell, nowAccs[0].Stocks) // 提示信息
hedge(exB, exA, priceBuy, priceSell, amount)
cancelAll()
lastKeepBalanceTS = 0
isTrade = true
}
} else if (depthB.Bids[0].Price - depthA.Asks[0].Price > targetDiffPriceB2A && Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount) >= minHedgeAmount) { // B -> A 盘口条件满足
var priceBuy = depthA.Asks[0].Price + slidePrice
var priceSell = depthB.Bids[0].Price - slidePrice
var amount = Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount)
if (nowAccs[1].Stocks > minHedgeAmount && nowAccs[0].Balance * 0.8 / priceBuy > minHedgeAmount) {
amount = Math.min(amount, nowAccs[1].Stocks, nowAccs[0].Balance * 0.8 / priceBuy, maxHedgeAmount)
Log("触发B->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[0].Balance * 0.8 / priceBuy, nowAccs[1].Stocks) // 提示信息
hedge(exA, exB, priceBuy, priceSell, amount)
cancelAll()
lastKeepBalanceTS = 0
isTrade = true
}
}
Vì giá mua bán đã được chia ra thành hai dữ liệu, chúng ta có thể tính toán các hàm đầu cơ.hedge
Những điều này cũng cần phải được sửa đổi.
function hedge(buyEx, sellEx, priceBuy, priceSell, amount) {
var buyRoutine = buyEx.Go("Buy", priceBuy, amount)
var sellRoutine = sellEx.Go("Sell", priceSell, amount)
Sleep(500)
buyRoutine.wait()
sellRoutine.wait()
}
Có một số điều chỉnh nhỏ dựa trên những thay đổi này, không được mô tả ở đây, bạn có thể xem mã cụ thể.
Thêm sự tương tác cho các chiến lược, cho phép các chiến lược có thể sửa đổi đường kích hoạt chênh lệch trong thời gian thực. Đây là nhu cầu thiết kế cho một chiến lược bán tự động, được thực hiện cùng với đây như một ví dụ giảng dạy. Thiết kế giao tiếp chính sách cũng rất đơn giản, đầu tiên là thêm điều khiển tương tác vào chính sách trên trang chỉnh sửa chính sách.
Thêm hai điều khiển, một tên là A2B và một tên là B2A. Khi nhập số vào hộp đầu vào của điều khiển, bấm vào nút nhập bên phải hộp. Nó sẽ ngay lập tức gửi lệnh cho chính sách, ví dụ: nhập số vào hộp đầu vào.123
Nhấp vàoA2B
Sau khi nhấn nút này, bạn sẽ được lệnh ngay lập tức đến chính sách.
A2B:123
Khám phá, xử lý mã tương tác trên thiết kế trong mã chiến lược.
// 交互
var cmd = GetCommand() // 每次循环执行到这里时,都检测有没有交互指令过来,没有则返回空字符串
if (cmd) { // 检测到有交互指令,例如:A2B:123
Log("接收到命令:", cmd)
var arr = cmd.split(":") // 拆分出交互控件名称和输入框中的值,arr[0]就是A2B,arr[1]就是123
if (arr[0] == "A2B") { // 判断触发的交互控件是不是A2B
Log("修改A2B的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageB2A = parseFloat(arr[1]) // 修改触发差价线
} else {
hedgeDiffPriceA2B = parseFloat(arr[1]) // 修改触发差价线
}
} else if (arr[0] == "B2A") { // 检测到触发的控件是B2A
Log("修改B2A的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageA2B = parseFloat(arr[1])
} else {
hedgeDiffPriceB2A = parseFloat(arr[1])
}
}
}
Để hiển thị dữ liệu trạng thái có nhiều quy định hơn, dễ quan sát hơn.
var tbl = {
"type" : "table",
"title" : "数据",
"cols" : ["交易所", "币", "冻结币", "计价币", "冻结计价币", "触发差价", "当前差价"],
"rows" : [],
}
tbl.rows.push(["A:" + exA.GetName(), nowAccs[0].Stocks, nowAccs[0].FrozenStocks, nowAccs[0].Balance, nowAccs[0].FrozenBalance, "A->B:" + targetDiffPriceA2B, "A->B:" + (depthA.Bids[0].Price - depthB.Asks[0].Price)])
tbl.rows.push(["B:" + exB.GetName(), nowAccs[1].Stocks, nowAccs[1].FrozenStocks, nowAccs[1].Balance, nowAccs[1].FrozenBalance, "B->A:" + targetDiffPriceB2A, "B->A:" + (depthB.Bids[0].Price - depthA.Asks[0].Price)])
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Trả lời chỉ là một chiến lược thử nghiệm, chức năng phát hiện ban đầu, nhiều BUG trong giai đoạn kiểm tra lại thực sự có thể được thử nghiệm. Không cần phải quan tâm nhiều đến kết quả trả lời, chiến lược cuối cùng vẫn cần đạn thật trong môi trường thực tế.
Nguồn mã chiến lược:https://www.fmz.com/strategy/302834
15570686905Chiến lược giao dịch này được thêm vào chức năng hợp đồng, tốt hơn hết là thêm vào hợp đồng lâu dài, hợp đồng tỷ lệ giao dịch.
Những đám mây nhẹĐánh giá lại main:127:9 - TypeError: Cannot read property 'SetPrecision' of undefined
Chiến lược bảo hiểm hiện tại với các đồng tiền khác nhau Ver1.1
Những nhà phát minh định lượng - những giấc mơ nhỏĐược rồi, có cơ hội cho bài học.
Những đám mây nhẹTôi hiểu rồi, cảm ơn bạn rất nhiều.
Những nhà phát minh định lượng - những giấc mơ nhỏBạn cần thêm hai đối tượng giao dịch.