avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada Pesan pribadi
4
fokus pada
1271
Pengikut

Contoh Desain Strategi dYdX - Strategi Perdagangan Stokastik

Dibuat di: 2021-11-03 15:40:56, diperbarui pada: 2023-09-15 21:02:48
comments   6
hits   2500

Contoh Desain Strategi dYdX - Strategi Perdagangan Stokastik

Contoh Desain Strategi dYdX

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.

Mari kita tunjukkan beberapa penambangan terlebih dahulu

Tangkapan layar penambangan strategis dalam artikel ini.

Contoh Desain Strategi dYdX - Strategi Perdagangan Stokastik

Teman-teman yang memiliki ide strategi penambangan yang bagus juga dipersilakan untuk meninggalkan pesan!

Desain strategi perdagangan stokastik

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:

Contoh Desain Strategi dYdX - Strategi Perdagangan Stokastik

Oh ya! Strategi ini memerlukan nama, sebut saja “Tebak Ukurannya (versi dYdX)”.

Pengujian ulang

Pengujian ulang hanya untuk referensi._<! Tujuan utamanya adalah untuk memeriksa apakah ada bug dalam strategi dan menggunakan pengujian ulang berjangka Binance.

Contoh Desain Strategi dYdX - Strategi Perdagangan Stokastik

Contoh Desain Strategi dYdX - Strategi Perdagangan Stokastik

Contoh Desain Strategi dYdX - Strategi Perdagangan Stokastik

Contoh Desain Strategi dYdX - Strategi Perdagangan Stokastik

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.

Perdagangan nyata

Contoh Desain Strategi dYdX - Strategi Perdagangan Stokastik

Contoh Desain Strategi dYdX - Strategi Perdagangan Stokastik

Contoh Desain Strategi dYdX - Strategi Perdagangan Stokastik

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