Анатомия стратегии капустного комбайна (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В этом фильме есть много деталей, и я смотрю их уже час, чтобы понять их.

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

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

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

Маленькие мечтыОтлично!

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

Маленькие мечтыНеприветливо

Маленькие мечтыО, да.

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

Маленькие мечтыЭто примерно то же самое.