Type/to search
8
Follow
1364
Followers
Contoh Reka Bentuk Strategi dYdX - Strategi Perdagangan Stokastik
Discussions
Created 2021-11-03 15:40:56  Updated 2023-09-15 21:02:48
 6
 2828

img

Contoh Reka Bentuk Strategi dYdX

Sebagai tindak balas kepada banyak permintaan pengguna, platform FMZ baru-baru ini menyokong pertukaran terdesentralisasi dYdX. Rakan yang mempunyai strategi boleh dengan senang hati melombong dYdX. Kebetulan saya telah lama ingin menulis strategi perdagangan rawak Tidak kira sama ada saya membuat wang atau kehilangan wang Tujuannya adalah untuk berlatih dan mengajar reka bentuk strategi pada masa yang sama. Jadi mari kita reka strategi pertukaran rawak bersama-sama Jangan risau tentang prestasi strategi.

Mari tunjukkan beberapa perlombongan dahulu

Tangkapan skrin perlombongan strategik dalam artikel ini.

img

Rakan-rakan yang mempunyai idea strategi perlombongan yang bagus juga dialu-alukan untuk meninggalkan mesej!

Reka bentuk strategi dagangan stokastik

Mari "berfikir secara liar"! Saya merancang untuk mereka strategi yang membuat pesanan secara rawak tanpa melihat penunjuk atau harga Pesanan tidak lebih daripada panjang atau pendek, dan anda hanya perlu meramalkan kebarangkalian. Kemudian kita menggunakan nombor rawak 1 hingga 100 untuk menentukan panjang dan pendek.

Keadaan panjang: nombor rawak 1~50.
Syarat jualan singkat: nombor rawak 51~100.

Nombor untuk kedua-dua kedudukan panjang dan pendek ialah 50. Seterusnya, mari kita fikirkan bagaimana untuk menutup kedudukan Memandangkan ia adalah perjudian, mesti ada standard untuk menang dan kalah. Kemudian dalam urus niaga kami menetapkan ambil untung dan henti rugi tetap sebagai standard untuk menang atau kalah. Jika anda menghentikan keuntungan, anda menang jika anda menghentikan kerugian, anda kalah. Bagi tetapan ambil untung dan henti rugi yang sesuai, ini sebenarnya mempengaruhi nisbah untung dan rugi, oh ya! Ia juga mempengaruhi kadar kemenangan! (Adakah strategi reka bentuk ini berkesan? Bolehkah ia menjamin jangkaan matematik yang positif? Mari lakukannya dahulu! Lagipun, ia untuk pembelajaran dan penyelidikan!)

Dagangan tidak bebas kos Faktor seperti kegelinciran dan yuran pengendalian sudah cukup untuk menarik kadar kemenangan dagangan rawak kami kepada kurang daripada 50%. Bagaimanakah saya harus meneruskan mereka bentuk dengan mengambil kira perkara ini?
Adalah lebih baik untuk mereka bentuk peningkatan kedudukan berganda Memandangkan ia adalah satu perjudian, kebarangkalian untuk kehilangan 8 transaksi rawak daripada 10 berturut-turut seharusnya tidak terlalu tinggi. Jadi saya ingin mereka bentuk transaksi pertama untuk mempunyai saiz pesanan yang sangat kecil, sekecil mungkin. Kemudian jika anda kalah pertaruhan, tambahkan kuantiti pesanan dan teruskan membuat pesanan rawak.

OK, reka bentuk strategi semudah itu.

Kod sumber reka bentuk:

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:

img

Oh ya! Strategi ini memerlukan nama, mari kita panggil "Teka Saiz (versi dYdX)".

Ujian belakang

Ujian belakang adalah untuk rujukan sahaja._<!
Tujuan utama adalah untuk menyemak sama ada terdapat sebarang pepijat dalam strategi dan menggunakan ujian belakang niaga hadapan Binance.

img

img

img

img

Ujian belakang selesai, tiada pepijat. Tetapi saya rasa saya mungkin telah overfit sistem backtest...T_T, izinkan saya mencubanya dalam masa nyata.

Perdagangan sebenar

img

img

img

Strategi ini adalah untuk pembelajaran dan rujukan sahaja.10 juta~10 jutaJangan gunakannya secara nyata! !

Related Recommendations
Comment
All comments (4)

    问一下, dydx去中心化交易所现在是否支持现货交易? 还是只能永续合约? 从来没用过 去中心化交易所, 如果dydx支持现货交易, 可以考虑做个现货网格交易策略. 还有就是去中心化交易所, 确认买卖是否成功还需要等待时间, 不像中心化交易所那么闪电般快, 需要旷工确认. 要是速度这些克服了, 又支持写网格等量化策略, 那是非常好.

    5 years ago

    dYdX我公开的有实盘,永续合约。

    5 years ago

    小白一个,请问怎么跑不起来

    5 years ago

    策略源码只是策略代码,还要配置上参数。参数在文章里有截图。

    5 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)