Le modèle de conception de la stratégie dYdX - stratégie de trading aléatoire

Auteur:Le petit rêve, Créé: 2021-11-03 15:40:56, Mis à jour: 2023-09-15 21:02:48

img

Modèle de conception de stratégie dYdX

En réponse à de nombreuses demandes des utilisateurs, la plate-forme FMZ a récemment pris en charge l'échange décentralisé dYdX. Les petits partenaires qui ont des stratégies peuvent profiter de l'exploitation dYdX. Il y a longtemps, nous voulions écrire une stratégie de trading aléatoire, gagner de l'argent et gagner de l'argent sans aucun but.

Il y a une vague de mines.

Une capture d'écran de l'article sur les stratégies minières.

img

Les partenaires qui ont des idées stratégiques pour l'exploitation minière sont les bienvenus pour laisser des commentaires!

Des stratégies de trading aléatoires

Nous allons réfléchir et réfléchir! Nous allons concevoir une stratégie qui ne regarde pas les indicateurs, qui ne regarde pas les prix, qui ne fait que faire plus, qui ne fait que faire le vide, qui est bloqué par la probabilité. Nous allons alors déterminer le vide en utilisant des nombres aléatoires de 1 à 100.

Faire plusieurs conditions: des nombres aléatoires de 1 à 50. Conditions de remplissage: 51 à 100 nombres aléatoires.

Le nombre d'emplacements est de 50 chiffres. Ensuite, nous allons réfléchir à la façon d'équilibrer, puisque c'est le pari, il doit y avoir un critère de gain ou de perte. Alors dans le trading, nous définissons un stop-loss fixe comme critère de gain ou de perte.

La transaction n'est pas sans coût, il y a des points d'écart, des frais de traitement, des facteurs suffisants pour pousser notre taux de réussite des transactions aléatoires à moins de 50%. Il est préférable de concevoir un multiplicateur de positions, puisque c'est un pari, il ne devrait pas y avoir une grande probabilité de perdre 8 transactions aléatoires 10 fois de suite. Je veux donc concevoir une première transaction avec un seul montant très petit, et si le pari est perdu, je vais augmenter le montant suivant et continuer à acheter au hasard.

OK, la stratégie est si simple que la conception est faite.

Le code source de la conception:

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

Paramètres de stratégie:

img

C'est vrai! la stratégie a besoin d'un nom, alors appelez-la "dYdX".

Réécriture

Les réactions sont à titre de référence seulement, >_

img

img

img

img

J'ai terminé le test, il n'y a pas de bug. Mais j'ai l'impression d'être en phase avec le système de test... T_T, le disque fonctionne et je joue.

Je suis en train de courir.

img

img

img

Cette stratégie est uniquement à titre d'information, de référence et de référence.Des millions~Des millionsN'utilisez pas le disque!


Relationnée

Plus de

Je suis désolée.Demandez-vous si les échanges décentralisés dydx prennent en charge les transactions instantanées? ou seulement les contrats permanents? Je n'ai jamais utilisé d'échanges décentralisés, si dydx prend en charge les transactions instantanées, vous pouvez envisager une stratégie de négociation de grille instantanée.

hyc1743Le petit blanc, s'il vous plaît, pourquoi ne pas courir?

Le petit rêveDYdX est une plateforme publique avec un contrat permanent.

Le petit rêveLe code source de la stratégie est simplement le code de la stratégie, avec des paramètres à configurer.