
Menanggapi banyaknya permintaan pengguna, platform FMZ baru-baru ini mendukung bursa terdesentralisasi dYdX. Teman yang punya strategi dapat dengan senang hati menambang dYdX. Kebetulan saja saya ingin menulis strategi perdagangan acak sejak lama. Tidak masalah apakah saya menghasilkan uang atau kehilangan uang. Tujuannya adalah untuk berlatih dan mengajarkan desain strategi pada saat yang bersamaan. Jadi mari kita rancang strategi pertukaran acak bersama-sama. Jangan khawatir tentang kinerja strategi. Mari kita pelajari saja tentang desain strategi.
Tangkapan layar penambangan strategis dalam artikel ini.

Teman-teman yang memiliki ide strategi penambangan yang bagus juga dipersilakan untuk meninggalkan pesan!
Mari kita “berpikir liar”! Saya berencana untuk merancang strategi yang menempatkan order secara acak tanpa melihat indikator atau harga. Order tidak lebih dari sekadar mengambil posisi long atau short, dan yang harus Anda lakukan hanyalah memprediksi probabilitas. Lalu kami menggunakan angka acak 1 hingga 100 untuk menentukan panjang dan pendek.
Kondisi panjang: angka acak 1~50. Kondisi penjualan pendek: angka acak 51~100.
Jumlah untuk posisi panjang dan pendek adalah 50. Selanjutnya, mari kita pikirkan cara menutup posisi. Karena ini adalah pertaruhan, harus ada standar untuk menang dan kalah. Lalu dalam transaksi kita tetapkan take profit dan stop loss yang tetap sebagai standar untung atau rugi. Kalau anda hentikan untung, anda untung; kalau anda hentikan rugi, anda rugi. Mengenai pengaturan take profit dan stop loss yang tepat, ini sebenarnya memengaruhi rasio untung rugi, oh ya! Itu juga mempengaruhi tingkat kemenangan! (Apakah strategi desain ini efektif? Bisakah strategi ini menjamin ekspektasi matematika yang positif? Mari kita lakukan terlebih dahulu! Bagaimanapun, ini untuk pembelajaran dan penelitian!)
Perdagangan tidak bebas biaya. Faktor-faktor seperti biaya selip dan biaya penanganan cukup untuk menurunkan tingkat kemenangan perdagangan acak kami menjadi kurang dari 50%. Bagaimana saya harus melanjutkan mendesain dengan mempertimbangkan hal ini? Lebih baik merancang peningkatan beberapa posisi. Karena ini adalah pertaruhan, kemungkinan kehilangan 8 transaksi acak dari 10 transaksi berturut-turut seharusnya tidak terlalu tinggi. Jadi saya ingin merancang transaksi pertama yang memiliki ukuran pesanan sangat kecil, sekecil mungkin. Lalu jika Anda kalah taruhan, tingkatkan jumlah pesanan dan teruskan melakukan pemesanan acak.
Oke, desain strateginya sesederhana itu.
Kode sumber desain:
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)
}
}
Parameter strategi:

Oh ya! Strategi ini memerlukan nama, sebut saja “Tebak Ukurannya (versi dYdX)”.
Pengujian ulang hanya untuk referensi._<! Tujuan utamanya adalah untuk memeriksa apakah ada bug dalam strategi dan menggunakan pengujian ulang berjangka Binance.




Pengujian ulang selesai, tidak ada bug. Tapi saya rasa saya mungkin telah menyesuaikan sistem pengujian ulang secara berlebihan…T_T, biarkan saya mencobanya secara langsung.



Strategi ini hanya untuk pembelajaran dan referensi.10 juta~10 jutaJangan menggunakannya secara nyata! !