Contoh Desain Strategi dYdX - Strategi Perdagangan acak

Penulis:Mimpi kecil, Dibuat: 2021-11-03 15:40:56, Diperbarui: 2023-09-15 21:02:48

img

Contoh Desain Strategi dYdX

Untuk memenuhi kebutuhan pengguna, FMZ platform baru-baru ini mendukung pertukaran terdesentralisasi dYdX. Mitra-mitra yang memiliki strategi dapat menambang dYdX dengan senang hati. Sudah lama saya ingin menulis strategi perdagangan acak, menghasilkan uang dan kehilangan uang tanpa tujuan apa pun adalah latihan untuk mengajarkan desain strategi. Jadi selanjutnya kita bersama-sama merancang strategi pertukaran acak, kinerja strategi baik atau tidak peduli, kita berhak dan harus belajar desain strategi.

"Sebelumnya, kita harus melakukan penggalian.

Gambar gambar strategi penambangan di artikel ini.

img

Jika Anda memiliki ide tentang strategi penambangan yang bagus, silakan tinggalkan komentar!

Desain strategi perdagangan acak

Mari kita bercerita tentang hal-hal yang aneh! Kita berencana untuk merancang strategi yang tidak melihat indikator, tidak melihat harga, tidak ada pilihan lain selain melakukan lebih banyak, hanya melakukan kosong, yang tersumbat adalah probabilitas.

Menggunakan beberapa kondisi: Nomor acak 1 - 50. Kondisi kosong: 51-100 angka acak.

Banyak kosong adalah 50 angka. Selanjutnya kita akan memikirkan bagaimana untuk menyeimbangkan, karena itu adalah taruhan, maka harus ada standar menang dan kalah. Jadi dalam perdagangan kita akan menetapkan stop loss tetap sebagai standar menang dan kalah. Stop loss adalah menang, stop loss adalah kehilangan.

Perdagangan tidak bebas biaya, ada titik slippage, biaya proses, dan faktor lain yang cukup untuk menarik peluang kemenangan perdagangan acak kami ke bawah 50%. Lebih baik kita merancang perkalian, karena jika itu adalah taruhan, maka kemungkinan kehilangan 8 transaksi acak 10 kali berturut-turut seharusnya tidak terlalu besar. Jadi saya ingin merancang transaksi pertama dengan jumlah yang sangat kecil, dan jika Anda kehilangan, maka tingkatkan jumlah berikutnya untuk melanjutkan transaksi acak.

OK, strategi desain sederhana seperti ini.

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 kebijakan:

img

Ya, itu benar! Kebijakan ini membutuhkan nama, sebut saja "Tebak Ukuran" (versi dYdX).

Pengamatan

Untuk referensi saja, >_

img

img

img

img

T_T, saya sedang bermain, tapi saya merasa bahwa saya sudah sesuai dengan sistem retesting.

Berlari dengan benar

img

img

img

Strategi ini hanya untuk pembelajaran, referensi, dan informasi.Miliaran~MiliaranJangan gunakan hardisk!


Berkaitan

Lebih banyak

xionglonghuiJika didydx mendukung perdagangan langsung, Anda dapat mempertimbangkan untuk melakukan strategi perdagangan grid langsung. Ada juga pertukaran yang terdesentralisasi, dan untuk mengkonfirmasi apakah pembelian dan penjualan berhasil, Anda harus menunggu waktu, tidak seperti pertukaran terdesentralisasi yang cepat seperti kilat, yang membutuhkan konfirmasi lama.

hyc1743Si putih kecil, tolong tanyakan mengapa dia tidak bisa berlari.

Mimpi kecilDYdX saya publikasikan dengan kontrak permanen.

Mimpi kecilKode sumber strategi hanyalah kode strategi, dan parameternya harus dikonfigurasi. Parameter memiliki screenshot di artikel.