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