
Để đáp ứng nhu cầu của nhiều người dùng, nền tảng FMZ gần đây đã hỗ trợ sàn giao dịch phi tập trung dYdX. Những người bạn có chiến lược có thể vui vẻ khai thác dYdX. Tình cờ là tôi đã muốn viết một chiến lược giao dịch ngẫu nhiên từ lâu rồi. Việc tôi kiếm được tiền hay mất tiền không quan trọng. Mục đích là để thực hành và dạy thiết kế chiến lược cùng một lúc. Vậy chúng ta hãy cùng nhau thiết kế một chiến lược trao đổi ngẫu nhiên. Đừng lo lắng về hiệu suất của chiến lược. Chúng ta hãy cùng tìm hiểu về thiết kế chiến lược.
Ảnh chụp màn hình hoạt động khai thác chiến lược trong bài viết này.

Những người bạn có ý tưởng chiến lược khai thác tốt cũng có thể để lại tin nhắn!
Hãy “suy nghĩ táo bạo”! Tôi dự định thiết kế một chiến lược đặt lệnh ngẫu nhiên mà không cần xem xét các chỉ số hoặc giá. Lệnh không gì khác hơn là mua hoặc bán, và tất cả những gì bạn phải làm là dự đoán xác suất. Sau đó, chúng tôi sử dụng các số ngẫu nhiên từ 1 đến 100 để xác định vị thế mua và bán.
Điều kiện dài: số ngẫu nhiên 1~50. Điều kiện bán khống: số ngẫu nhiên 51~100.
Số lượng cho cả vị thế mua và bán đều là 50. Tiếp theo, chúng ta hãy nghĩ về cách đóng vị thế. Vì đây là một canh bạc, nên phải có tiêu chuẩn cho việc thắng và thua. Sau đó, trong giao dịch, chúng ta đặt mức chốt lời và dừng lỗ cố định làm tiêu chuẩn cho việc thắng hay thua. Nếu bạn dừng lợi nhuận, bạn thắng; nếu bạn dừng lỗ, bạn thua. Đối với các thiết lập chốt lời và dừng lỗ phù hợp, điều này thực sự ảnh hưởng đến tỷ lệ lãi lỗ, đúng vậy! Nó cũng ảnh hưởng đến tỷ lệ chiến thắng! (Chiến lược thiết kế này có hiệu quả không? Nó có thể đảm bảo kỳ vọng toán học tích cực không? Chúng ta hãy thực hiện trước! Dù sao thì, nó cũng là để học tập và nghiên cứu!)
Giao dịch không phải là miễn phí. Các yếu tố như trượt giá và phí xử lý đủ để kéo tỷ lệ thắng giao dịch ngẫu nhiên của chúng tôi xuống dưới 50%. Tôi nên tiếp tục thiết kế như thế nào khi lưu ý điều này? Tốt hơn là nên thiết kế một sự gia tăng nhiều vị thế. Vì đây là một canh bạc, nên khả năng thua 8 giao dịch ngẫu nhiên trong số 10 giao dịch liên tiếp không nên quá cao. Vì vậy, tôi muốn thiết kế giao dịch đầu tiên có quy mô đơn hàng rất nhỏ, nhỏ nhất có thể. Sau đó, nếu bạn thua cược, hãy tăng số lượng đơn hàng và tiếp tục đặt lệnh ngẫu nhiên.
Được rồi, chiến lược thiết kế đơn giản như vậy thôi.
Thiết kế mã nguồn:
var openPrice = 0
var ratio = 1
var totalEq = null
var nowEq = null
function cancelAll() {
while (1) {
var orders = _C(exchange.GetOrders)
if (orders.length == 0) {
break
}
for (var i = 0 ; i < orders.length ; i++) {
exchange.CancelOrder(orders[i].Id, orders[i])
Sleep(500)
}
Sleep(500)
}
}
function main() {
if (isReset) {
_G(null)
LogReset(1)
LogProfitReset()
LogVacuum()
Log("重置所有数据", "#FF0000")
}
exchange.SetContractType(ct)
var initPos = _C(exchange.GetPosition)
if (initPos.length != 0) {
throw "策略启动时有持仓!"
}
exchange.SetPrecision(pricePrecision, amountPrecision)
Log("设置精度", pricePrecision, amountPrecision)
if (!IsVirtual()) {
var recoverTotalEq = _G("totalEq")
if (!recoverTotalEq) {
var currTotalEq = _C(exchange.GetAccount).Balance // equity
if (currTotalEq) {
totalEq = currTotalEq
_G("totalEq", currTotalEq)
} else {
throw "获取初始权益失败"
}
} else {
totalEq = recoverTotalEq
}
} else {
totalEq = _C(exchange.GetAccount).Balance
}
while (1) {
if (openPrice == 0) {
// 更新账户信息,计算收益
var nowAcc = _C(exchange.GetAccount)
nowEq = IsVirtual() ? nowAcc.Balance : nowAcc.Balance // equity
LogProfit(nowEq - totalEq, nowAcc)
var direction = Math.floor((Math.random()*100)+1) // 1~50 , 51~100
var depth = _C(exchange.GetDepth)
if (depth.Asks.length <= 2 || depth.Bids.length <= 2) {
Sleep(1000)
continue
}
if (direction > 50) {
// long
openPrice = depth.Bids[1].Price
exchange.SetDirection("buy")
exchange.Buy(Math.abs(openPrice) + slidePrice, amount * ratio)
} else {
// short
openPrice = -depth.Asks[1].Price
exchange.SetDirection("sell")
exchange.Sell(Math.abs(openPrice) - slidePrice, amount * ratio)
}
Log("下", direction > 50 ? "买单" : "卖单", ",价格:", Math.abs(openPrice))
continue
}
var orders = _C(exchange.GetOrders)
if (orders.length == 0) {
var pos = _C(exchange.GetPosition)
if (pos.length == 0) {
openPrice = 0
continue
}
// 平仓检测
while (1) {
var depth = _C(exchange.GetDepth)
if (depth.Asks.length <= 2 || depth.Bids.length <= 2) {
Sleep(1000)
continue
}
var stopLossPrice = openPrice > 0 ? Math.abs(openPrice) - stopLoss : Math.abs(openPrice) + stopLoss
var stopProfitPrice = openPrice > 0 ? Math.abs(openPrice) + stopProfit : Math.abs(openPrice) - stopProfit
var winOrLoss = 0 // 1 win , -1 loss
// 画线
$.PlotLine("bid", depth.Bids[0].Price)
$.PlotLine("ask", depth.Asks[0].Price)
// 止损
if (openPrice > 0 && depth.Bids[0].Price < stopLossPrice) {
exchange.SetDirection("closebuy")
exchange.Sell(depth.Bids[0].Price - slidePrice, pos[0].Amount)
winOrLoss = -1
} else if (openPrice < 0 && depth.Asks[0].Price > stopLossPrice) {
exchange.SetDirection("closesell")
exchange.Buy(depth.Asks[0].Price + slidePrice, pos[0].Amount)
winOrLoss = -1
}
// 止盈
if (openPrice > 0 && depth.Bids[0].Price > stopProfitPrice) {
exchange.SetDirection("closebuy")
exchange.Sell(depth.Bids[0].Price - slidePrice, pos[0].Amount)
winOrLoss = 1
} else if (openPrice < 0 && depth.Asks[0].Price < stopProfitPrice) {
exchange.SetDirection("closesell")
exchange.Buy(depth.Asks[0].Price + slidePrice, pos[0].Amount)
winOrLoss = 1
}
// 检测挂单
Sleep(2000)
var orders = _C(exchange.GetOrders)
if (orders.length == 0) {
pos = _C(exchange.GetPosition)
if (pos.length == 0) {
if (winOrLoss == -1) {
ratio++
} else if (winOrLoss == 1) {
ratio = 1
}
break
}
} else {
// 撤销挂单
cancelAll()
Sleep(2000)
pos = _C(exchange.GetPosition)
// 撤销后更新持仓,需要再次检查
if (pos.length == 0) {
if (winOrLoss == -1) {
ratio++
} else if (winOrLoss == 1) {
ratio = 1
}
break
}
}
var tbl = {
"type" : "table",
"title" : "info",
"cols" : ["totalEq", "nowEq", "openPrice", "bid1Price", "ask1Price", "ratio", "pos.length"],
"rows" : [],
}
tbl.rows.push([totalEq, nowEq, Math.abs(openPrice), depth.Bids[0].Price, depth.Asks[0].Price, ratio, pos.length])
tbl.rows.push(["pos", "type", "amount", "price", "--", "--", "--"])
for (var j = 0 ; j < pos.length ; j++) {
tbl.rows.push([j, pos[j].Type, pos[j].Amount, pos[j].Price, "--", "--", "--"])
}
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
}
} else {
// 撤销挂单
// 重置openPrice
cancelAll()
openPrice = 0
}
Sleep(1000)
}
}
Các thông số chiến lược:

Ồ vâng! Chiến lược này cần có tên, chúng ta hãy gọi là “Đoán kích thước (phiên bản dYdX)”.
Kiểm tra ngược chỉ mang tính chất tham khảo._<! Mục đích chính là kiểm tra xem có lỗi nào trong chiến lược hay không và sử dụng thử nghiệm ngược của Binance futures.




Kiểm tra ngược đã hoàn tất, không có lỗi. Nhưng tôi cảm thấy có thể tôi đã áp dụng sai hệ thống kiểm tra ngược…T_T, để tôi thử nghiệm theo thời gian thực.



Chiến lược này chỉ mang tính chất học tập và tham khảo.10 triệu~10 triệuĐừng sử dụng nó thật! !