avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Contoh Reka Bentuk Strategi dYdX - Strategi Perdagangan Stokastik

Dicipta dalam: 2021-11-03 15:40:56, dikemas kini pada: 2023-09-15 21:02:48
comments   6
hits   2500

Contoh Reka Bentuk Strategi dYdX - Strategi Perdagangan Stokastik

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.

Contoh Reka Bentuk Strategi dYdX - Strategi Perdagangan Stokastik

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:

Contoh Reka Bentuk Strategi dYdX - Strategi Perdagangan Stokastik

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.

Contoh Reka Bentuk Strategi dYdX - Strategi Perdagangan Stokastik

Contoh Reka Bentuk Strategi dYdX - Strategi Perdagangan Stokastik

Contoh Reka Bentuk Strategi dYdX - Strategi Perdagangan Stokastik

Contoh Reka Bentuk Strategi dYdX - Strategi Perdagangan Stokastik

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

Perdagangan sebenar

Contoh Reka Bentuk Strategi dYdX - Strategi Perdagangan Stokastik

Contoh Reka Bentuk Strategi dYdX - Strategi Perdagangan Stokastik

Contoh Reka Bentuk Strategi dYdX - Strategi Perdagangan Stokastik

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