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

Анатомия стратегии капустного комбайна (2)

Автор:Изобретатели количественного измерения - мечты, Создано: 2020-11-16 10:03:52, Обновлено: 2023-09-26 21:05:07

img

Анатомия стратегии капустного комбайна (2)

А потомСодержимоеПояснение.

Третья добавленная функция:

    self.balanceAccount = function() {
        var account = exchange.GetAccount()
        if (!account) {
            return
        }
        self.account = account
        var now = new Date().getTime()
        if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {
            self.preCalc = now
            var net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks))
            if (net != self.preNet) {
                self.preNet = net
                LogProfit(net)
            }
        }
        self.btc = account.Stocks
        self.cny = account.Balance
        self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny)
        var balanced = false
        
        if (self.p < 0.48) {
            Log("开始平衡", self.p)
            self.cny -= 300
            if (self.orderBook.Bids.length >0) {
                exchange.Buy(self.orderBook.Bids[0].Price + 0.00, 0.01)
                exchange.Buy(self.orderBook.Bids[0].Price + 0.01, 0.01)
                exchange.Buy(self.orderBook.Bids[0].Price + 0.02, 0.01)
            }
        } else if (self.p > 0.52) {
            Log("开始平衡", self.p)
            self.btc -= 0.03
            if (self.orderBook.Asks.length >0) {
                exchange.Sell(self.orderBook.Asks[0].Price - 0.00, 0.01)
                exchange.Sell(self.orderBook.Asks[0].Price - 0.01, 0.01)
                exchange.Sell(self.orderBook.Asks[0].Price - 0.02, 0.01)
            }
        }
        Sleep(BalanceTimeout)
        var orders = exchange.GetOrders()
        if (orders) {
            for (var i = 0; i < orders.length; i++) {
                if (orders[i].Id != self.tradeOrderId) {
                    exchange.CancelOrder(orders[i].Id)
                }
            }
        }
    }

Функции построенияLeeksReaper()При создании объекта добавляетсяbalanceAccount()Функция обновляет информацию об активах счета, хранитself.accountИменно поэтому мы и создаем объекты.accountПринадлежность.....................................

Давайте посмотрим на код этой функции слово в слово: Сначала первое предложение.var account = exchange.GetAccount()Это объявление локальной переменной.accountИзобретатель API-интерфейсаexchange.GetAccount()Функция, которая получает последние данные о текущем аккаунте, присваивает значенияaccountПеременные.accountЕсли эта переменнаяnullЗначения (например, проблемы с отставанием времени, сетью, обменным интерфейсом и т. д. не удалось получить) возвращаются напрямую (соответствующие)if (!account){...}Здесь).

self.account = accountЭто означает, что мы можем использовать локальные переменные.accountОпределение значения объектаaccountАтрибуты используются для записи новейшей информации об аккаунте в созданных объектах.

var now = new Date().getTime()Это заявление о локальной переменной.now, и вызывает объекты времени и даты в языке JavaScriptgetTime()Функция возвращает текущее время.nowПеременные.

if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {...}Этот код определяет разницу между текущим временем и временем последней записи, если он превышает параметр.CalcNetInterval * 1000Это означает, что с момента последнего обновления, это уже больше, чем в прошлый раз.CalcNetInterval * 1000МиллисекундыCalcNetIntervalВторой вариант, который используется для расчёта прибыли, заключается в том, что при расчете прибыли используется цена покупки на бирже.self.orderBook.Bids.length > 0Это условие (длинные данные, в списке платежей должна быть действительная информация о рейтинге).self.preCalc = nowОбновление переменных временной шкалы для последних печатных доходовself.preCalcНажмите на время.nowНапример, если вы хотите получить доход, вы должны получить доход, который вы получаете в результате использования метода вычисления чистой стоимости.var net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks))Это означает, что в соответствии с текущей ценой покупки, валюты обмениваются на деньги (счетная валюта), а затем сумма денег в счете, добавленная к локальной переменной, которая присваивается заявлению.netОпределить, совпадает ли текущая сумма с суммой, зафиксированной в прошлый раз:

            if (net != self.preNet) {
                self.preNet = net
                LogProfit(net)
            }

Если это не так,net != self.preNetИ действительно, используйте.netОбновление характеристик для записи чистой стоимостиself.preNetИ печатайте это.netДанные об общем доходе к изобретателям на графике кривой прибыли для торговых платформ-роботов (см.) можно запросить в документации FMZ APILogProfitЭта функция) ⋅

Если не запустить типовую печать прибыли, то продолжить следующий процесс, и будетaccount.StocksНапример, если вы хотите, чтобы ваш аккаунт был открыт, вы можете загрузить его в Google Play.account.Balance(Должность денег в текущем счете)self.btcself.cny‒ Расчет соотношения отклонений и присвоение записейself.p

self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny)

Алгоритм также очень прост, он рассчитывает текущую стоимость монеты в процентах от общей чистой стоимости счета.

В то же время, как вы думаете, когда же начнется баланс монеты? Автор здесь использует 50% вверх и вниз в качестве буфера на 2 процентных пункта, что превышает баланс выполнения буферной зоны, т.е.self.p < 0.48Снижение валютного баланса вызывается, когда считается, что меньше монет, и начинается покупка позиции на бирже с увеличением цены на 0.01 каждый раз, размещая три листовки.self.p > 0.52В конце концов, в соответствии с параметрами настройки, ждать определенное время.Sleep(BalanceTimeout)После этого все заказы были отменены.

        var orders = exchange.GetOrders()                  # 获取当前所有挂单,存在orders变量
        if (orders) {                                      # 如果获取当前挂单数据的变量orders不为null
            for (var i = 0; i < orders.length; i++) {      # 循环遍历orders,逐个取消订单
                if (orders[i].Id != self.tradeOrderId) {
                    exchange.CancelOrder(orders[i].Id)     # 调用exchange.CancelOrder,根据orders[i].Id取消订单
                }
            }
        }

Четвертая добавленная функция:

Именно поэтому мы и создали эту стратегию.self.poll = function() {...}Функции - это главная логика всей стратегии, о которой мы говорили в предыдущей статье.main()Функция начинает выполняться.whileПеред тем, как начать цикл смерти, мы использовалиvar reaper = LeeksReaper()Мы создаем объекты для салатных комбайнов, и мы используем их для того, чтобыmain()Круговые вызовы функцийreaper.poll()Это функция, которую вы называете.

self.pollФункция начинает выполняться, выполняет некоторые приготовления перед каждым циклом, и затем начинает работать.self.numTick++Повышение счетов.self.updateTrades()Обновление последних записей сделок на рынке и расчет данных, используемых для этого.self.updateOrderBook()Обновление расчетных данных и вычисление соответствующих данных.self.balanceAccount()Проверьте баланс монеты.

        var burstPrice = self.prices[self.prices.length-1] * BurstThresholdPct   # 计算爆发价格
        var bull = false             # 声明牛市标记的变量,初始为假
        var bear = false             # 声明熊市标记的变量,初始为假
        var tradeAmount = 0          # 声明交易数量变量,初始为0

Следующее, что нужно сделать, это определить, является ли текущий краткосрочный рынок быком или медведем.

        if (self.numTick > 2 && (
            self.prices[self.prices.length-1] - _.max(self.prices.slice(-6, -1)) > burstPrice ||
            self.prices[self.prices.length-1] - _.max(self.prices.slice(-6, -2)) > burstPrice && self.prices[self.prices.length-1] > self.prices[self.prices.length-2]
            )) {
            bull = true
            tradeAmount = self.cny / self.bidPrice * 0.99
        } else if (self.numTick > 2 && (
            self.prices[self.prices.length-1] - _.min(self.prices.slice(-6, -1)) < -burstPrice ||
            self.prices[self.prices.length-1] - _.min(self.prices.slice(-6, -2)) < -burstPrice && self.prices[self.prices.length-1] < self.prices[self.prices.length-2]
            )) {
            bear = true
            tradeAmount = self.btc
        }

Напомним, что в предыдущей статьеself.updateOrderBook()Функция, в которой мы используем алгоритм с средним весом, чтобы построить временную последовательность, в которой последовательностьpricesМассивы. В этом разделе кода используются три новые функции._.min_.maxsliceИ эти три функции очень хорошо понятны.

  • _.minФункция: Найти наименьшее значение в массиве параметров.

  • _.maxФункция: искать наибольшее значение в массиве параметров.

  • sliceФункция: Функция является членом объекта матрицы JavaScript, которая возвращает часть матрицы, вырезанную по индексу, например:

    function main() {
        // index     .. -8 -7 -6 -5 -4 -3 -2 -1
        var arr = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
        Log(arr.slice(-5, -1))    // 会截取 4 ~ 1 这几个元素,返回一个新数组:[4,3,2,1]
    }
    

    img

В этом случае, если вы считаете, что медведь или корова - это вы, то вы должны быть уверены в том, что они не являются бедняками.

  • self.numTick > 2Для создания, то есть для того, чтобы вспыхнуть новый раунд испытаний цены, необходимо пройти по крайней мере три раунда испытаний, чтобы избежать запуска с самого начала.
  • Ценаself.pricesПоследние данные, последние данные,self.pricesМаксимальная или минимальная разница между ценами в предыдущем диапазоне в матрице должна быть преодолена.burstPriceЭто цена взрыва.

Если все условия выполнены, отметьтеbullИлиbearДляtrue, и дайтеtradeAmountВ этом случае, если вы не хотите, чтобы ваши деньги были потрачены на то, что вы делаете, вы должны быть готовы.

И, наконец,self.updateTrades()Обновления, вычисления в функцияхself.volДля параметровBurstThresholdVolРешение о том, следует ли уменьшить интенсивность сделок ("уменьшить количество запланированных сделок").

        if (self.vol < BurstThresholdVol) {
            tradeAmount *= self.vol / BurstThresholdVol   // 缩减计划交易量,缩减为之前量的self.vol / BurstThresholdVol 倍
        }
        
        if (self.numTick < 5) {
            tradeAmount *= 0.8      // 缩减为计划的80%
        }
        
        if (self.numTick < 10) {    // 缩减为计划的80%
            tradeAmount *= 0.8
        }

Следующее, что необходимо сделать, чтобы определить, соответствуют ли торговые сигналы или объемы:

        if ((!bull && !bear) || tradeAmount < MinStock) {   # 如果非牛市并且也非熊市,或者计划交易的量tradeAmount小于参数设置的最小交易量MinStock,poll函数直接返回,不做交易操作
            return
        }

После принятия вышеуказанного решения,var tradePrice = bull ? self.bidPrice : self.askPriceВ зависимости от того, является ли рынок медвежьим или бычьим, устанавливается цена сделки и присваивается соответствующая цена заказа.

В конце концов,whileЭто цикл, и единственное условие, при котором этот цикл прекращается, - это когда вы выходите из цикла.tradeAmount >= MinStockКоличество запланированных сделок меньше минимального объема. В цикле выполняется следующий порядок в зависимости от текущего состояния быка или медведя.orderId◎ После каждого цикла заказаSleep(200)Подождите 200 миллисекунд.orderIdЕсли true (если заказать не удалось, не вернуть ID заказа, не будет задействовано условие if), если condition true.self.tradeOrderId

Декларировать переменную для хранения данных о заказахorderПервоначальное значениеnullПосле этого цикл получает данные о заказах с этим ИД и определяет, является ли заказ находящимся в подвешенном состоянии, если он находятся в подвешенном состоянии, отменяет заказ с этим ИД, если он не находятся в подвешенном состоянии, выходит из этого цикла.

                var order = null           // 声明一个变量用于保存订单数据
                while (true) {             // 一个while循环
                    order = exchange.GetOrder(orderId)    // 调用GetOrder查询订单ID为 orderId的订单数据
                    if (order) {                          // 如果查询到订单数据,查询失败order为null,不会触发当前if条件
                        if (order.Status == ORDER_STATE_PENDING) {   // 判断订单状态是不是正在挂单中
                            exchange.CancelOrder(orderId)            // 如果当前正在挂单,取消该订单
                            Sleep(200)
                        } else {                                     // 否则执行break跳出当前while循环
                            break
                        }
                    }
                }

Затем выполните следующий процесс:

                self.tradeOrderId = 0              // 重置self.tradeOrderId
                tradeAmount -= order.DealAmount    // 更新tradeAmount,减去提单的订单已经成交的数量
                tradeAmount *= 0.9                 // 减小下单力度
                if (order.Status == ORDER_STATE_CANCELED) {     // 如果订单已经是取消了
                    self.updateOrderBook()                      // 更新订单薄等数据
                    while (bull && self.bidPrice - tradePrice > 0.1) {   // 牛市时,更新后的提单价格超过当前交易价格0.1就减小交易力度,略微调整交易价格
                        tradeAmount *= 0.99
                        tradePrice += 0.1
                    }
                    while (bear && self.askPrice - tradePrice < -0.1) {  // 熊市时,更新后的提单价格超过当前交易价格0.1就减小交易力度,略微调整交易价格
                        tradeAmount *= 0.99
                        tradePrice -= 0.1
                    }
                }

Когда процесс отскакиваетwhile (tradeAmount >= MinStock) {...}В этом цикле, это означает, что процесс выполнения сделки по взрыву цены завершен. Исполнениеself.numTick = 0Это перезагрузка.self.numTickЭто 0.

LeeksReaper()Использование конструкторской функции в конечном итоге будетselfОбъект возвращается.var reaper = LeeksReaper()В конце концов, я вернулся.reaper

До сих порLeeksReaper()Мы проанализировали, как конструкторные функции строят этот объект капустного комбайна, а также различные методы выполнения основных логических функций.


Больше

Сюкити.Спасибо, Дрем-сум. Дрем-сум, а у вас возникла мысль о том, чтобы объединить салатный комбайн с высокочастотным роботом-богом-травой?

Мэтт Чжан 1988Он сказал много глупостей. Не сказал ни одного ключевого слова.

СиндиYY1024Есть некоторое недоумение, почему необходимо поддерживать баланс монеты и денег, если баланс не достигнут, то нужно купить и продать. После BalanceTimeout снова отменить заказ, перестать балансировать, а перейти к следующему эпизоду взрыва.

Сила ДамасииГде распоряжение?

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

Сюкити.Продолжайте, пожалуйста, изучать, как вы можете использовать эту функцию, если убрать баланс аккаунта.

Сюкити.ФМЗ - это настоящая сокровищница.

printbtcИли не поняла?

КоконЧто это за параметр BurstThresholdVol? Как его установить?

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

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

Изобретатели количественного измерения - мечтыВ одной из статей Грас-Гона говорится, что высокая частота требует наличия рыночной среды.

Изобретатели количественного измерения - мечтыПростите, но эта статья, в основном, предназначена для новичков, чтобы рассказать о процессе выполнения.

Изобретатели количественного измерения - мечтыОтлично!

Изобретатели количественного измерения - мечтыОригинальный салатный комбайнер имеет балансирующий модуль, который можно рассмотреть. Конкретные последствия не очень ясны.

Изобретатели количественного измерения - мечтыНеприветливо

Изобретатели количественного измерения - мечтыО, да.

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

Изобретатели количественного измерения - мечтыЭто примерно то же самое.