В процессе загрузки ресурсов... загрузка...

Куантизация монетного круга выглядит совершенно по-новому - приближает вас к квантизации монетного круга.

Автор:Изобретатели количественного измерения - мечты, Создано: 2021-06-04 10:08:48, Обновлено: 2023-09-21 21:01:06

img

Куантизация монетного круга. Новый взгляд на монетный круг.

В предыдущей статье мы начали с простой стратегии сетки, в этой статье мы расширили эту стратегию, расширили ее, расширили в многообразную стратегию сетки на месте и проверили ее на практике. Цель не в том, чтобы найти "святой кубок", а в том, чтобы обсудить все вопросы, которые возникают при разработке стратегии, и решить их. В этой статье я расскажу о некоторых моих опытах при разработке этой стратегии.

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

Как и в предыдущей статье, эта статья по-прежнему основана на количественном определении изобретателя.FMZ.COMМы хотим, чтобы вы знали, что мы можем сделать для вас.

  • Многообразие Я хочу сказать, что я хочу, чтобы эта стратегия сетки была не толькоBTC_USDTЯ могу.LTC_USDT/EOS_USDT/DOGE_USDT/ETC_USDT/ETH_USDTВ то же время, в то время, как в Китае существуют недвижимость и недвижимость, в Китае существуют недвижимость и недвижимость.

    Я не могу сказать, что это было бы хорошо, если бы я не видел, что это было бы хорошо. Необходимость звучит очень просто, но когда дело доходит до проектирования, возникают проблемы.

    • Первое: приобретение различных рынков. Это первая проблема, которую нужно решить. После просмотра API-документов бирж я обнаружил, что обычные биржи предлагают агрегированные интерфейсы. ОК, мы получаем данные с помощью интерфейса для агрегированного рынка.

    • Вторая проблема, с которой я столкнулся, - это аккаунтные активы. Поскольку это многообразная стратегия, нужно учитывать отдельное управление каждой сделкой по активам. Потому что вам нужно оценить доступные активы, когда вы их заказываете, или вы хотите их получить и оценить? Или вам нужно вычислить прибыль, или вы должны сначала записать первоначальные данные о активах счета, а затем получить текущие данные о активах счета и вычислить прибыль и убыток по сравнению с первоначальным? К счастью, интерфейс счета активов на биржах обычно также возвращает данные активов всех валют, которые мы получаем только один раз, а затем обрабатываем данные.

    • 3, Стратегический дизайн параметров. Параметровый дизайн многообразия и параметровый дизайн однообразия отличаются, потому что разные разновидности торговли, хотя и имеют одинаковую логику, могут иметь разные параметры при торговле. Например, сетевая стратегия, возможно, делать BTC_USDT торговля, когда пара надеется на 0.01 BTC на каждую сделку, но если делать DOGE_USDT, если этот параметр ((торговля 0.01 монет) явно не подходит, конечно, вы также можете обрабатывать по сумме USDT. Может быть, другие ученики подумают над этим вопросом и предложат: может быть, я могу установить несколько наборов параметров, чтобы отдельно контролировать параметры различных пар сделок? Это все еще не может быть гибким, чтобы удовлетворить потребности, установить несколько наборов параметров? установить три набора параметров, а если я сделаю четыре разновидности? Поэтому при разработке параметров для поливариантных стратегий необходимо полностью учитывать потребности в таких дифференцированных параметрах. Одним из решений является проектирование параметров в виде обычных строк или JSON-строк. Например:

      ETHUSDT:100:0.002|LTCUSDT:20:0.1
      

      Это означает, что у каждого вида есть данные.ETHUSDT:100:0.002В то же время, многие пользователи не хотят, чтобы их акции были закрыты, потому что они хотят, чтобы они были закрыты.LTCUSDT:20:0.1В основном, это связано с тем, что LTC_USDT - это пара, которая контролирует транзакции.ETHUSDT:100:0.002, где ETHUSDT указывает, что вы собираетесь делать, 100 - это интервал сетки, 0.002 - это количество монет ETH, которые были проданы в каждой сетке, и ххх: клеймо - это разделение этих данных ((Конечно, правила этих параметров созданы стратегическими дизайнерами, и вы можете разработать их в зависимости от ваших потребностей)). В этих строках содержится информация о параметрах для различных видов, которые вы собираетесь сделать, чтобы проанализировать эти строки в стратегии, конкретно присвоив значениям переменным стратегии, которые используются для управления логикой транзакций для различных видов.

      function main() {
          var net = []  // 记录的网格参数,具体运行到网格交易逻辑时,使用这里面的数据
          var params = "ETHUSDT:100:0.002|LTCUSDT:20:0.1"
          var arrPair = params.split("|")
          _.each(arrPair, function(pair) {
              var arr = pair.split(":")
              var symbol = arr[0]              // 交易对名称
              var diff = parseFloat(arr[1])    // 网格间距
              var amount = parseFloat(arr[2])  // 网格下单量
              net.push({symbol : symbol, diff : diff, amount : amount})
          })
          Log("网格参数数据:", net)
      }
      

      img

      Если вы хотите, чтобы параметры были простыми, вы можете использовать строку JSON, чтобы сделать это проще.

      function main() {        
          var params = '[{"symbol":"ETHUSDT","diff":100,"amount":0.002},{"symbol":"LTCUSDT","diff":20,"amount":0.1}]'
          var net = JSON.parse(params)  // 记录的网格参数,具体运行到网格交易逻辑时,使用这里面的数据        
          _.each(net, function(pair) {
              Log("交易对:", pair.symbol, pair)
          })
      }
      

      img

    • 4, устойчивость данных Также существует большая разница между стратегией и обучающей стратегией. Предыдущая стратегия обучения - это только первоначальное тестирование стратегии логики, дизайна, а во время реального боя больше вопросов; в реальном режиме может быть включено или остановлено реальное устройство. Здесь необходимо сделать перманентное сохранение ключевых данных при запуске реального диска, чтобы прочитать эти данные при повторном запуске и продолжить работу. Например, вы можете использовать их на своем изобретательском количественном торговом платформе._G()Функции, или использовать функции для работы с базами данныхDBExec()В данном случае можно обратиться к документации FMZ API.

      Например, мы спроектировали функцию сжатия хвоста._G()Функции, хранящие сетевые данные.

      var net = null 
      function main() {  // 策略主函数
          // 首先读取储存的net
          net = _G("net")
          
          // ...
      }
      
      function onExit() {
          _G("net", net)
          Log("执行扫尾处理,保存数据", "#FF0000")
      }
      
      function onexit() {    // 平台系统定义的退出扫尾函数,在点击实盘停止时触发执行
          onExit()
      }
      
      function onerror() {   // 平台系统定义的异常退出函数,在程序发生异常时触发执行
          onExit()
      }
      
    • 5. Пределы точности объема заказа, точности цены заказа, минимального объема заказа, минимальной суммы заказа

      В системе обратной проверки не делается столь жестких ограничений на количество, точность и т. д., но в реальном времени на разных биржах могут быть строгие стандарты на цены, количество и т. д., и эти ограничения не одинаковы для разных торговых пар.

      В случае с множественными сортами это требование более сложное. В моносортах можно разработать параметры для указания точности и т. д., но при разработке многосортах эта информация, очевидно, будет выглядеть очень параметричной.

      В этом случае необходимо просмотреть API-документы биржи, чтобы увидеть, есть ли в документации биржи интерфейсы для соответствующей информации. Если такие интерфейсы имеются, можно спроектировать в стратегии автоматический доступ к интерфейсу, чтобы получить информацию о точности и т. д. и настроить ее на информацию о сделках, которые участвуют в сделке (просто говоря, то, что именно автоматически запрашивается биржевой запрос на доступ, а затем приспособить к параметрам стратегии, связанным с переменными).

    • 6. Приспособление к различным биржам Почему этот вопрос остался последним? Поскольку эти решения, о которых мы говорили выше, приводят к этой последней проблеме, поскольку наша стратегия планирует использовать агрегированный рыночный интерфейс, доступ к биржевым операциям с точностью к таким данным, как адаптация, доступ к информации о счетах, обработка отдельных транзакций, и т. д. Эти решения могут сильно отличаться в зависимости от биржи. Существуют различия в интерфейсных вызовах, различия в механизмах. Для насущных бирж различия немного меньше, если эта сетевая стратегия распространяется на версии фьючерсов. Различия в механизмах различных бирж больше. Одним из решений является проектирование библиотеки шаблонов FMZ. Недостатком этого является необходимость написания библиотеки классов шаблонов, и в этом шаблоне для каждой биржи.

Создание библиотеки шаблонов

Основываясь на вышеизложенном анализе, была разработана библиотека шаблонов для снижения совпадения между стратегией и механизмами и интерфейсами бирж.

Мы можем спроектировать эту библиотеку шаблонов так ((частичный код исключен):

function createBaseEx(e, funcConfigure) {
    var self = {}
    self.e = e 
    
    self.funcConfigure = funcConfigure
    self.name = e.GetName()
    self.type = self.name.includes("Futures_") ? "Futures" : "Spot"
    self.label = e.GetLabel()
    
    // 需要实现的接口
    self.interfaceGetTickers = null   // 创建异步获取聚合行情数据线程的函数
    self.interfaceGetAcc = null       // 创建异步获取账户数据线程的函数
    self.interfaceGetPos = null       // 获取持仓
    self.interfaceTrade = null        // 创建并发下单
    self.waitTickers = null           // 等待并发行情数据 
    self.waitAcc = null               // 等待账户并发数据
    self.waitTrade = null             // 等待下单并发数据
    self.calcAmount = null            // 根据交易对精度等数据计算下单量
    self.init = null                  // 初始化工作,获取精度等数据
    
    // 执行配置函数,给对象配置
    funcConfigure(self)

    // 检测configList约定的接口是否都实现
    _.each(configList, function(funcName) {
        if (!self[funcName]) {
            throw "接口" + funcName + "未实现"
        }
    })
    
    return self
}

$.createBaseEx = createBaseEx
$.getConfigureFunc = function(exName) {
    dicRegister = {
        "Futures_OKCoin" : funcConfigure_Futures_OKCoin,    // OK期货的实现
        "Huobi" : funcConfigure_Huobi,
        "Futures_Binance" : funcConfigure_Futures_Binance,
        "Binance" : funcConfigure_Binance,
        "WexApp" : funcConfigure_WexApp,                    // wexApp的实现
    }
    return dicRegister
}

В шаблоне реализуется написание для конкретных бирж, например, с аналогом FMZ WexApp:

function funcConfigure_WexApp(self) {
    var formatSymbol = function(originalSymbol) {
        // BTC_USDT
        var arr = originalSymbol.split("_")
        var baseCurrency = arr[0]
        var quoteCurrency = arr[1]
        return [originalSymbol, baseCurrency, quoteCurrency]
    }

    self.interfaceGetTickers = function interfaceGetTickers() {
        self.routineGetTicker = HttpQuery_Go("https://api.wex.app/api/v1/public/tickers")
    }

    self.waitTickers = function waitTickers() {
        var ret = []
        var arr = JSON.parse(self.routineGetTicker.wait()).data
        _.each(arr, function(ele) {
            ret.push({
                bid1: parseFloat(ele.buy), 
                bid1Vol: parseFloat(-1),
                ask1: parseFloat(ele.sell), 
                ask1Vol: parseFloat(-1),
                symbol: formatSymbol(ele.market)[0],
                type: "Spot", 
                originalSymbol: ele.market
            })
        })
        return ret 
    }

    self.interfaceGetAcc = function interfaceGetAcc(symbol, updateTS) {
        if (self.updateAccsTS != updateTS) {
            self.routineGetAcc = self.e.Go("GetAccount")
        }
    }

    self.waitAcc = function waitAcc(symbol, updateTS) {
        var arr = formatSymbol(symbol)
        var ret = null 
        if (self.updateAccsTS != updateTS) {
            ret = self.routineGetAcc.wait().Info
            self.bufferGetAccRet = ret 
        } else {
            ret = self.bufferGetAccRet
        }
        if (!ret) {
            return null 
        }        
        var acc = {symbol: symbol, Stocks: 0, FrozenStocks: 0, Balance: 0, FrozenBalance: 0, originalInfo: ret}
        _.each(ret.exchange, function(ele) {
            if (ele.currency == arr[1]) {
                // baseCurrency
                acc.Stocks = parseFloat(ele.free)
                acc.FrozenStocks = parseFloat(ele.frozen)
            } else if (ele.currency == arr[2]) {
                // quoteCurrency
                acc.Balance = parseFloat(ele.free)
                acc.FrozenBalance = parseFloat(ele.frozen)
            }
        })
        return acc
    }

    self.interfaceGetPos = function interfaceGetPos(symbol, price, initSpAcc, nowSpAcc) {
        var symbolInfo = self.getSymbolInfo(symbol)
        var sumInitStocks = initSpAcc.Stocks + initSpAcc.FrozenStocks
        var sumNowStocks = nowSpAcc.Stocks + nowSpAcc.FrozenStocks
        var diffStocks = _N(sumNowStocks - sumInitStocks, symbolInfo.amountPrecision)
        if (Math.abs(diffStocks) < symbolInfo.min / price) {
            return []
        }
        return [{symbol: symbol, amount: diffStocks, price: null, originalInfo: {}}]
    }

    self.interfaceTrade = function interfaceTrade(symbol, type, price, amount) {
        var tradeType = ""
        if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
            tradeType = "bid"
        } else {
            tradeType = "ask"
        }
        var params = {
            "market": symbol,
            "side": tradeType,
            "amount": String(amount),
            "price" : String(-1),
            "type" : "market"
        }
        self.routineTrade = self.e.Go("IO", "api", "POST", "/api/v1/private/order", self.encodeParams(params))
    }

    self.waitTrade = function waitTrade() {
        return self.routineTrade.wait()
    }

    self.calcAmount = function calcAmount(symbol, type, price, amount) {
        // 获取交易对信息
        var symbolInfo = self.getSymbolInfo(symbol)
        if (!symbol) {
            throw symbol + ",交易对信息查询不到"
        }
        var tradeAmount = null 
        var equalAmount = null  // 记录币数
        if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
            tradeAmount = _N(amount * price, parseFloat(symbolInfo.pricePrecision))
            // 检查最小交易量
            if (tradeAmount < symbolInfo.min) {
                Log(self.name, " tradeAmount:", tradeAmount, "小于", symbolInfo.min)
                return false 
            }
            equalAmount = tradeAmount / price
        } else {
            tradeAmount = _N(amount, parseFloat(symbolInfo.amountPrecision))
            // 检查最小交易量
            if (tradeAmount < symbolInfo.min / price) {
                Log(self.name, " tradeAmount:", tradeAmount, "小于", symbolInfo.min / price)
                return false 
            }
            equalAmount = tradeAmount
        }
        return [tradeAmount, equalAmount]
    }

    self.init = function init() {   // 自动处理精度等条件的函数
        var ret = JSON.parse(HttpQuery("https://api.wex.app/api/v1/public/markets"))
        _.each(ret.data, function(symbolInfo) {
            self.symbolsInfo.push({
                symbol: symbolInfo.pair,
                amountPrecision: parseFloat(symbolInfo.basePrecision),
                pricePrecision: parseFloat(symbolInfo.quotePrecision),
                multiplier: 1,
                min: parseFloat(symbolInfo.minQty),
                originalInfo: symbolInfo
            })
        })        
    }
}

И тогда в стратегии просто использовать этот шаблон:

function main() {
    var fuExName = exchange.GetName()
    var fuConfigureFunc = $.getConfigureFunc()[fuExName]
    var ex = $.createBaseEx(exchange, fuConfigureFunc)

    var arrTestSymbol = ["LTC_USDT", "ETH_USDT", "EOS_USDT"]
    var ts = new Date().getTime()
    
    // 测试获取行情
    ex.goGetTickers()
    var tickers = ex.getTickers()
    Log("tickers:", tickers)
    
    // 测试获取账户信息
    ex.goGetAcc(symbol, ts)
    
    _.each(arrTestSymbol, function(symbol) {        
        _.each(tickers, function(ticker) {
            if (symbol == ticker.originalSymbol) {
                // 打印行情数据
                Log(symbol, ticker)
            }
        })

        // 打印资产数据
        var acc = ex.getAcc(symbol, ts)
        Log("acc:", acc.symbol, acc)
    })
}

Стратегическая реальность

На основе приведенных выше шаблонов создание и написание стратегии довольно просто, и вся стратегия составляет около 300+ строк, что позволяет реализовать многообразную сетку стратегии цифровых валют.

img

img

В настоящее время убыткиT_TВ этом случае, источник кода временно не будет доступен.

Если вы хотите попробовать WexApp, отправьте несколько регистрационных кодов, чтобы те, кто заинтересован, могли загрузить и поиграть:

购买地址: https://www.fmz.com/m/s/284507
注册码: 
adc7a2e0a2cfde542e3ace405d216731
f5db29d05f57266165ce92dc18fd0a30
1735dca92794943ddaf277828ee04c27
0281ea107935015491cda2b372a0997d
1d0d8ef1ea0ea1415eeee40404ed09cc

Если у вас есть более 200 U, как только вы бежите, вы встречаете большую одностороннюю рынок, медленное кровотечение. Стабильность снова скрепилась, не двигаясь с 27 мая, и фьючерсная сеть пока не решилась попробовать.


Связанные

Больше

Количественное обучениеСпасибо, что выложили, количественно.

Девять солнцМэнь Вэй Ву!

Орбитальные организмыСпасибо.

Изобретатели количественного измерения - мечтыСпасибо за поддержку!

Изобретатели количественного измерения - мечтыСпасибо за поддержку!