Contoh Reka Bentuk Strategi dYdX - Strategi Dagangan Acak

Penulis:Mimpi kecil, Dicipta: 2021-11-03 15:40:56, Dikemas kini: 2023-09-15 21:02:48

img

Contoh reka bentuk strategi dYdX

FMZ platform menyokong pertukaran dYdX yang terdesentralisasi. Rakan-rakan yang mempunyai strategi dapat menggali dYdX dengan menyenangkan. Sudah lama saya ingin menulis strategi perdagangan rawak, menghasilkan wang dan kehilangan wang tanpa tujuan yang jelas untuk berlatih dengan mudah mengajar reka bentuk strategi. Jadi seterusnya kita bersama-sama merancang strategi pertukaran rawak, prestasi strategi baik atau tidak, kita berhak dan belajar reka bentuk strategi.

Pergilah menggali.

Gambar skrin untuk strategi perlombongan di sini.

img

Rakan-rakan yang mempunyai idea strategi perlombongan yang baik juga dialu-alukan untuk meninggalkan komen!

Reka bentuk strategi dagangan rawak

Mari kita berangan-angan! Rancangan untuk merancang strategi tanpa melihat petunjuk, tanpa melihat harga, hanya melakukan lebih banyak, hanya melakukan kosong, yang tersumbat adalah kebarangkalian. Kemudian kita akan menggunakan nombor rawak 1-100 untuk menentukan berapa banyak kosong.

Buat pelbagai syarat: nombor rawak 1 hingga 50. Syarat kosong: nombor rawak 51 hingga 100.

Sebilangan besar ruang adalah 50 nombor. Seterusnya kita akan memikirkan bagaimana untuk menyeimbangkan, kerana ia adalah permainan, maka mesti ada standard menang dan kalah. Jadi dalam perdagangan, kita menetapkan stop loss tetap sebagai standard menang dan kalah. Stop loss adalah menang, stop loss adalah kehilangan.

Perdagangan bukan tanpa kos, terdapat titik licin, bayaran prosedur dan lain-lain yang cukup untuk menarik peluang kemenangan dagangan rawak kami ke bawah 50%. Lebih baik anda merancang perbelanjaan berganda, kerana jika anda menang, maka kemungkinan kehilangan 10 kali berturut-turut 8 kali perdagangan rawak tidak akan begitu besar. Jadi saya ingin merancang jumlah yang kecil untuk perdagangan pertama, dan jika anda kalah, maka tambah jumlah berikutnya dan teruskan dengan pesanan rawak.

OK, strategi ini mudah seperti ini.

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

Ya! Strategi ini memerlukan nama, sebut sahaja anda meneka saiz (dYdX versi).

Ujian semula

Rujukan hanya untuk rujukan sahaja, >_

img

img

img

img

Selepas ujian selesai, tidak ada bug. Tetapi saya rasa saya sudah sesuai dengan sistem ujian. T_T, saya sedang bermain.

Berlari dengan sebenar-benarnya

img

img

img

Strategi ini hanya untuk tujuan pembelajaran, rujukan, dan rujukan.Berjuta~BerjutaJangan gunakan cakera sebenar!


Berkaitan

Lebih lanjut

XionglonghuiSaya ingin bertanya, adakah pertukaran didentral didydx kini menyokong dagangan segera? atau hanya kontrak kekal? Tidak pernah menggunakan pertukaran didentral, jika didydx menyokong dagangan segera, anda boleh mempertimbangkan untuk membuat strategi dagangan grid langsung. Atau pertukaran didentral, untuk mengesahkan sama ada pembelian dan penjualan berjaya, perlu menunggu masa, tidak seperti pertukaran pusat yang cepat seperti kilat, memerlukan pengesahan lama.

hyc1743Yang putih, tolong tanya kenapa dia tak boleh berlari.

Mimpi kecilDYdX saya telah mendedahkan bahawa saya mempunyai rekod sebenar dan kontrak kekal.

Mimpi kecilKod sumber strategi hanyalah kod strategi, dan parameter harus dikonfigurasikan. Parameter mempunyai gambar skrin di dalam artikel.