Die Ressourcen sind geladen. Beförderung...

dYdX-Strategie-Design-Parameter - Zufallsgeschäftsstrategien

Schriftsteller:Die Erfinder quantifizieren - Kleine Träume, Erstellt: 2021-11-03 15:40:56, Aktualisiert: 2023-09-15 21:02:48

img

dYdX-Strategie-Design-Problematik

Die FMZ-Plattform unterstützt kürzlich die dezentrale Börse dYdX. Die strategischen Partner können dYdX gerne minen. Vor langer Zeit wollte ich eine zufällige Handelsstrategie schreiben, bei der es nicht darum geht, einfach zu lernen, wie man Strategien entwickelt.

Erst die Mining-Welle

Ein Bild von der Strategie für das Mining in diesem Artikel.

img

Wenn Sie eine gute Mining-Strategie haben, lassen Sie sich gerne von uns berichten!

Random Trading-Strategie entwickeln

Lassen Sie uns überlegen, wie wir das machen können! Wir planen eine Strategie, bei der wir keine Indikatoren und keine Preise betrachten, sondern nur mehr tun und leere Dinge tun, und was blockiert wird, ist die Wahrscheinlichkeit. Dann bestimmen wir mit einer zufälligen Zahl von 1 bis 100 wie viele Leere es sind.

Verschiedene Bedingungen: Zufallszahlen von 1 bis 50. Leerbedingungen: Zufallszahlen von 51 bis 100.

Wie viele Leerzeichen sind 50? Als nächstes müssen wir überlegen, wie wir ausgleichen können, da es sich um eine Panne handelt, muss es ein Gewinn-und-Verlust-Standard geben. Dann setzen wir im Handel ein festes Stopp oder Stop-Loss als Gewinn- und-Verlust-Standard. Stopp ist Gewinn, Stop ist Verlust.

Es ist nicht kostengünstig, es gibt Gleitpunkte, Gebühren und andere Faktoren, die genug sind, um unsere Gewinnquote für Zufallsgeschäfte unter 50% zu bringen. Es ist besser, ein Multiplikator zu entwerfen, da es sich um eine Lose handelt, und die Wahrscheinlichkeit, dass Sie acht zufällige Transaktionen von 10 in Folge verlieren, sollte nicht groß sein. Daher möchte ich eine kleine Anzahl von Einträgen für den ersten Handel entwerfen, die so klein wie möglich ist.

OK, die Strategie ist so einfach wie entworfen.

Der Quellcode des Designs:

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)
    }
}

Strategieparameter:

img

Das ist richtig! Die Strategie muss einen Namen haben.

Wiederholung

Die Rezension ist nur zur Referenz, >_

img

img

img

img

Ich habe es überprüft, kein Bug. Aber ich habe das Gefühl, dass ich für das Recherche-System geeignet bin.

Wirkliches Laufen

img

img

img

Diese Strategie ist nur für Lernzwecke und als Referenz.Millionen~MillionenVerwenden Sie keine Festplatte!


Verwandt

Mehr

Weiwei, das ist nicht wahr.Frage: Unterstützen die Dydx-Dezentralen Börsen jetzt den Handelskontrakt? Oder können sie nur dauerhafte Verträge anbieten? Ich habe die Dydx-Dezentralen Börsen noch nie benutzt, und wenn die Dydx-Dezentralen Börsen den Handelskontrakt unterstützen, kann man eine Handelskontraktstrategie für den Handelskontrakt in Betracht ziehen.

Hyc1743Einer weißer Junge, bitte, warum kann er nicht laufen?

Die Erfinder quantifizieren - Kleine TräumeDYdX ist eine öffentlich zugängliche, dauerhafte Plattform.

Die Erfinder quantifizieren - Kleine TräumeDie Strategie-Quellcode ist nur Strategie-Code, die auch Parameter konfiguriert. Die Parameter haben Screenshots im Artikel.