А потомСодержимоеПояснение.
Третья добавленная функция:
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.btc
,self.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
,_.max
,slice
И эти три функции очень хорошо понятны.
_.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]
}
В этом случае, если вы считаете, что медведь или корова - это вы, то вы должны быть уверены в том, что они не являются бедняками.
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В этом фильме есть много деталей, и я смотрю их уже час, чтобы понять их.
кореньИ после того, как я провел исследование, я понял, что я могу написать кабачный комбайн, похожий на печатные деньги.
Изобретатели количественного измерения - мечтыВ одной из статей Грас-Гона говорится, что высокая частота требует наличия рыночной среды.
Изобретатели количественного измерения - мечтыПростите, но эта статья, в основном, предназначена для новичков, чтобы рассказать о процессе выполнения.
Изобретатели количественного измерения - мечтыОтлично!
Изобретатели количественного измерения - мечтыОригинальный салатный комбайнер имеет балансирующий модуль, который можно рассмотреть. Конкретные последствия не очень ясны.
Изобретатели количественного измерения - мечтыНеприветливо
Изобретатели количественного измерения - мечтыО, да.
Изобретатели количественного измерения - мечтыВзрывная величина, это параметр политики, который настраивается человеком, и если вы посмотрите на эту политику или статью в деталях, вы узнаете, что эта переменная контролирует.
Изобретатели количественного измерения - мечтыЭто примерно то же самое.