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.
Une capture d'écran de l'article sur les stratégies minières.
Les partenaires qui ont des idées stratégiques pour l'exploitation minière sont les bienvenus pour laisser des commentaires!
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:
C'est vrai! la stratégie a besoin d'un nom, alors appelez-la "dYdX".
Les réactions sont à titre de référence seulement, >_
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.
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!
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?
L'inventeur de la quantification - un petit rêveDYdX est une plateforme publique avec un contrat permanent.
L'inventeur de la quantification - un petit rêveLe code source de la stratégie est simplement le code de la stratégie, avec des paramètres à configurer.