Type/to search
8
Follow
1364
Followers
Пример разработки стратегии dYdX — стратегия торговли Stochastic
Discussions
Created 2021-11-03 15:40:56  Updated 2023-09-15 21:02:48
 6
 2828

img

Пример разработки стратегии dYdX

В ответ на многочисленные запросы пользователей платформа FMZ недавно поддержала децентрализованную биржу dYdX. Друзья, обладающие стратегиями, могут с удовольствием майнить dYdX. Так уж получилось, что я давно хотел написать случайную торговую стратегию. Неважно, заработаю я деньги или потеряю. Цель — практиковать и обучать разработке стратегий одновременно. Давайте вместе разработаем стратегию случайного обмена. Не беспокойтесь о производительности стратегии. Давайте просто узнаем о разработке стратегии.

Давайте сначала покажем вам немного майнинга.

Скриншот стратегической добычи полезных ископаемых в этой статье.

img

Друзья, у которых есть хорошие идеи по стратегии добычи полезных ископаемых, также могут оставить сообщение!

Разработка стратегии торговли на основе стохастика

Давайте «мыслить дико»! Я планирую разработать стратегию, которая размещает заказы случайным образом, не глядя на индикаторы или цены. Заказы — это не более чем длинные или короткие позиции, и все, что вам нужно сделать, это предсказать вероятности. Затем мы используем случайные числа от 1 до 100, чтобы определить длину и длину.

Длинные условия: случайные числа от 1 до 50.
Условия короткой продажи: случайные числа 51~100.

Цифры для длинных и коротких позиций составляют 50. Далее, давайте подумаем, как закрыть позицию. Поскольку это азартная игра, должен быть стандарт для выигрыша и проигрыша. Затем в сделке мы устанавливаем фиксированные тейк-профит и стоп-лосс как стандарт для выигрыша или проигрыша. Если вы остановите прибыль, вы выиграете; если остановите убыток, вы проиграете. Что касается правильных настроек тейк-профита и стоп-лосса, то это на самом деле влияет на соотношение прибыли и убытков, о да! Это также влияет на процент выигрышей! (Эффективна ли эта стратегия проектирования? Может ли она гарантировать положительное математическое ожидание? Давайте сделаем это первыми! В конце концов, это для обучения и исследования!)

Торговля не обходится без издержек. Такие факторы, как проскальзывание и комиссии за обработку, достаточны для того, чтобы снизить наш процент выигрышей случайной торговли до менее 50%. Как мне продолжить проектирование, имея это в виду?
Лучше спроектировать многократное увеличение позиции. Поскольку это азартная игра, вероятность проигрыша 8 случайных транзакций из 10 подряд не должна быть очень высокой. Поэтому я хочу спроектировать первую транзакцию так, чтобы размер заказа был очень маленьким, насколько это возможно. Затем, если вы проиграете ставку, увеличьте размер заказа и продолжайте размещать случайные заказы.

Итак, схема стратегии настолько проста.

Исходный код дизайна:

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

Параметры стратегии:

img

О, да! Стратегии нужно название, назовем ее «Угадай размер (версия dYdX)».

Бэктестинг

Тестирование на исторических данных носит исключительно справочный характер._<!
Основная цель — проверить наличие ошибок в стратегии и использовать бэктестинг Binance Futures.

img

img

img

img

Тестирование завершено, ошибок нет. Но мне кажется, что я переобучил систему бэктестинга... Т_Т, давайте я попробую в реальном времени.

Реальная торговля

img

img

img

Данная стратегия предназначена только для обучения и справки.10 миллионов~10 миллионовНе используйте его по-настоящему! !

Related Recommendations
Comment
All comments (4)

    问一下, dydx去中心化交易所现在是否支持现货交易? 还是只能永续合约? 从来没用过 去中心化交易所, 如果dydx支持现货交易, 可以考虑做个现货网格交易策略. 还有就是去中心化交易所, 确认买卖是否成功还需要等待时间, 不像中心化交易所那么闪电般快, 需要旷工确认. 要是速度这些克服了, 又支持写网格等量化策略, 那是非常好.

    5 years ago

    dYdX我公开的有实盘,永续合约。

    5 years ago

    小白一个,请问怎么跑不起来

    5 years ago

    策略源码只是策略代码,还要配置上参数。参数在文章里有截图。

    5 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)