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

Стратегия торговли сетями

Автор:Доброта, Создано: 2018-08-23 13:45:27, Обновлено:

Стратегия торговли сетями (www.fmz.com) Основная идея торговли по сетке очень проста. Вместо того, чтобы размещать одну торговлю, мы размещаем несколько сделок, образующих сетку. Обычно они вводятся как stop или limit ордера вокруг текущего уровня цены , но не всегда. Я объясню это более подробно ниже, но это основная идея.

Что такое сетевая торговля и как она работает? Торговля по сетке - это игра волатильности рынка. Есть две причины, по которым она предпочтительна трейдерам. Первая заключается в том, что она не требует от вас окончательного прогноза направления рынка.

Во-вторых, он хорошо работает на волатильных рынках, где нет четкой тенденции.

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

Решетка может настроить направление

Основная торговая операция: сначала покупать, а затем продавать.

Решетка начнет отправлять ордер на покупку по цене ниже первой цены, которая является ценой, за которой следует первая цена (вторая последняя цена покупки, третья последняя цена покупки и так далее).

После завершения любого заказа на покупку, программа будет на основе покупной цены, добавить цену параметра разница в цене к цене продажи, после того как заказ был продан, а затем возобновить ход этой сетки стратегии (проверка, место заказа, ждать, пока он не будет выполнен, продать)

Сначала продавать коротко, а затем покупать для покрытия: операция прямо противоположная

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

Следующий код создал сетку с автоматической функцией остановки и движения.

Примечания:

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

Логика сетки гибкая по конструкции и умная по структуре.

Расчет прибыли и убытка, каждый численный статистический алгоритм может быть использован в качестве ссылки, и каждый дизайн обнаружения состояния является строгим. (для минимизации возможности BUG)

Исходный код очень стоит изучить.

Для получения дополнительной информации см.

https://www.fmz.com/strategy/112633

Источник:

` // Решетка может настроить направление // Основная торговая операция: сначала покупать, а потом продавать. // Сеть начнет отправлять ордер на покупку по цене, которая ниже первой цены, которая является следующей ценой // по первой цене (вторая последняя цена покупки, третья последняя цена покупки... и так далее). // параметр price interval. Количество ожидаемых заказов одно количество, и будет отправлять общий объем заказа до // общая величина заполнена. // После того, как любой заказ покупки завершен, программа будет на основе покупной цены, добавить цену цены // параметр разница к цене продажи, после того как заказ был продан, а затем перезапустить прогресс этого // сетка стратегия (проверка, место заказа, ждать, пока он выполнен, продать) // Сначала продавать коротко, а затем покупать, чтобы покрыть: операция прямо противоположная // Самый большой риск этой стратегии, когда рыночная тенденция является односторонним движение, и колебания цен превышают сетку. // Следующий код сделал сетку с автоматической остановки потери и движения функции. // Комментарии: // Стратегия использует виртуальный ожидания дизайн ордера, который обеспечивает большое количество обработки для биржи, чтобы ограничить количество // ожидающих заказов, и решает проблему гибко. // Логика сетки гибкая в дизайне и умная в структуре. // Расчет прибыли и убытка, каждый числовой статистический алгоритм может быть использован в качестве ссылки, и каждый дизайн обнаружения состояния // является строгим. (для минимизации возможности BUG) // Исходный код очень стоит изучить.

// Исходный код: /* Параметры интерфейса (показаны как глобальные переменные в коде) OpType Grid Direction Drop-down box (selected) Купить сначала, а потом продать. FirstPriceAuto начальная цена автоматическая булевая (правда/ложно) true FirstPrice@!FirstPriceАвтоматическая начальная цена (номер) 100 Все число общее число числовое (число) 10 PriceGrid Ценовой интервал (число) 1 Численный спред PriceDiff (число) 2 СуммаТип размера заказа выпадающее окно (выбранное) купить и продать одну и ту же сумму AmountOnce@AmountType==0 Количество единичной сделки BAmountOnce@AmountType==1 Размер заказа на покупку SAmountOnce@AmountType==1 Размер ордера на продажу (число) 0.1 AmountCoefficient@AmountType==0 Разница количества Структура (структура) *1 AmountDot Число с запятой (число) 3 EnableProtectDiff Включить защиту от распространения Булево (правда/ложно) ложно ProtectDiff@EnableProtectDiff Входный спред Числовая защита цены (номер) 20 CancelAllWS stop отменяет все ожидающие заказы Булева (правда/ложно) true CheckИнтервал избирательного интервала номер (номер) 2000 Неудача интервала перепробовать интервал числовой (номер) 1300 RestoreProfit восстанавливает последнюю прибыль Булево (правда/ложно) ложно Последняя прибыль@Восстановление прибыли Последняя прибыль числовая (число) 0 ProfitAsOrg@RestoreProfit Последняя прибыль учитывается как средняя цена Булева (правда/ложно) ложная EnableAccountCheck включить проверку баланса Булева (правда/ложно) true EnableStopLoss@EnableAccountCheck открыть Stop Loss Булева (правда/ложно) ложно StopLoss@EnableStopLoss максимальная плавающая потеря (число) 100 StopLossMode@EnableStopLoss Операция после остановки потери Выпадающее окно (выбранное) Перезагрузить и выйти EnableStopWin@EnableAccountCheck Включить прием прибыли Булева (правда/ложно) ложь StopWin@EnableStopWin Максимальная плавающая прибыль Тип номера (номер) 120 StopWinMode@EnableStopWin после операции по получению прибыли выпадающее окно (выбранное) Перерабатывать и выходить. AutoMove@EnableAccountПроверка автоматического перемещения Булево (правда/ложно) ложно MaxDistance@AutoMove максимальное числовое расстояние (число) 20 MaxIdle@AutoMove максимальная безработная работа (секунды) числовая (число) 7200 EnableDynamic Поворачивает динамические ожидающие заказы Булева (правда/ложно) ложно DynamicMax@EnableDynamic расстояние истечения срока действия ордера Номер (номер) 30 ResetData очищает все данные при запуске Булево (правда/ложно) true Длина десятичной цифры точности цены (число) 5 */

function hasOrder ((orders, orderId) { // Проверьте, есть ли порядок с идентификатором порядка в параметрах порядка for (var i = 0; i < orders.length; i++) { // Пройдите по командам, чтобы проверить, есть ли одинаковые идентификаторы, если есть, то верните true если (заказы[i].Id == orderId) { возвращает true; Я не знаю. Я не знаю. return false; // Все пройдено, нет триггера если означает не найдено порядка с ID orderId, возвращается false Я не знаю.

функция cancelPending() { // Отменить все ожидающие функции заказа var ret = false; // Установка переменной успешного тега возврата пока (правда) { // пока петля если (ret) { // Если ret является истинным, то сон в течение определенного времени Спящий ((Интервал); Я не знаю. var orders = _C(exchange.GetOrders); // Вызвать API, чтобы получить информацию о заказе, который обмен не выполнял. if (orders.length == 0) { // Если возвращается пустой массив, обмен не имеет неисполненных заказов. Break; // Выйти из цикла while Я не знаю.

    for (var j = 0; j < orders.length; j++) {              // Traverse the unfinished order array and use orders[j].Id one by one to cancel the order based on the index j.
        exchange.CancelOrder(orders[j].Id, orders[j]);
        ret = true;                                        // Once there is a cancel operation, ret is assigned a value of true. Used to trigger above Sleep, wait for re-exchange.GetOrders detection 
    }
}
return ret;                                                // return ret

}

function valuesToString(values, pos) { // Значение, преобразованное в строку var result = ; // Декларировать результат пустой строки для возврата if (typeof(pos) === undefined) { // Если параметр pos не передан, присвоить pos значение 0. pos = 0; Я не знаю. для (var i = pos; i < values.length; i++) { // Массив значений процесса в соответствии с прошедшим pos if (i > pos) { // В дополнение к первой петле, добавить пробелы после последовательности результатов результат += ; Я не знаю. if (values[i] === null) { // If values (function argument list array) текущий элемент индексаs является нулевым, то результат добавляет строку null результат += null; } else if (typeof(values[i]) == undefined) { // Если он не определен, добавить undefined результат += неопределенный; } else { // Остальные типы делают обнаружение переключателя отдельно switch (values[i].constructor.name) { // Проверьте свойство имени конструктора значений[i], которое является именем типа Дело Дата : Дело Номер : случай String: Дело Функция : результат += values[i].toString(); // Если это тип даты, числовой тип, тип строки или тип функции, вызовите его функцию toString и конвертируйте ее в строку, затем добавляйте перерыв; по умолчанию: result += JSON.stringify(values[i]); // В других случаях используйте функцию JSON.stringify для преобразования в строку JSON. Добавить в результат перерыв; Я не знаю. Я не знаю. Я не знаю. возвращает результат; // возвращает результат Я не знаю.

Функция Trader() { // Функция Trader, использующая закрытия. var vId = 0; // Идентификатор инкремента заказа var orderBooks = []; // Книга заказов var hisBooks = []; // Книга исторического порядка var orderBooksLen = 0; // Длина книги заказов this.Buy = function ((цена, сумма, дополнительная) { // Функция покупки, параметры: цена, количество, расширенная информация if (typeof(extra) === undefined) { // Если параметр extra не передается, то есть typeof возвращает undefined extra = ; // Назначить пустую строку для extra { \ cHFFFFFF } еще { \ cHFFFFFF } extra = valuesToString ((arguments, 2); // Аргументы аргументов, которые передаются при вызове this.Buy функции, передаются в функцию valuesToString. Я не знаю. vId++; // var orderId = V + vId; // orderBooks[orderId] = { // Добавьте атрибут orderId к массиву orderbook и инициализируйте его с построенным объектом. Тип: ORDER_TYPE_BUY, // Конструированный объект Тип свойства: Тип купить Состояние: ORDER_STATE_PENDING, // Состояние ожидания ID: 0, // orderID 0 Цена: цена, // параметр цены цена Сумма: сумма, // параметр объема заказа Extra: extra // Расширенная информация Стринг, обработанный valuesToString }; orderBooksLen++; // Длина книги заказов увеличивается на 1 return orderId; // Возвращает orderId заказа, построенного на этот раз (ID заказа, не связанного с обменом, не путать). }; this.Sell = function ((цена, сумма, дополнительная) { // В основном подобно этому.Купить, построить ордер на продажу. if (typeof(extra) === неопределенный) { extra = ; { \ cHFFFFFF } еще { \ cHFFFFFF } extra = valuesToString ((arguments, 2)); Я не знаю. vId++; var orderId = V + vId; orderBooks[orderId] = { Тип: ORDER_TYPE_SELL, Состояние: ORDER_STATE_PENDING, Идентификатор: 0, Цена: цена Сумма: сумма Дополнительная: дополнительная }; orderBooksLen++; ордер на возврат; }; this.GetOrders = function() { // Получить информацию о незавершенном заказе var orders = _C(exchange.GetOrders); // Вызов API GetOrders для получения незавершенной информации о заказе Назначен на заказы для (orderId в orderBooks) { // Прохождение orderBooks в объекте Trader var order = orderBooks[orderId]; // Вывести заказ на основе orderId if (order.Status!== ORDER_STATE_PENDING) { // Если состояние порядка не равно состоянию приостановки, пропустите этот цикл продолжать; Я не знаю. var found = false; // Инициализировать переменную found (отмеченную при обнаружении) на true для (var i = 0; i < orders.length; i++) { // Прохождение данных для неисполненных заказов, возвращенных API
if (orders[i].Id == order.Id) { // Когда вы находите порядок с тем же идентификатором порядка в orderBooks, назначьте значение true для поиска, что означает найти. найдено = верно;
Break; // Выйти из текущей петли Я не знаю. Я не знаю. if (!found) { // Если не найдено, нажмите orderBooks[orderId] на order. orders.push ((orderBooks[orderId]); // Почему вы хотите нажать так? Я не знаю. Я не знаю. ордера на возврат; // ордера на возврат Я не знаю. это.GetOrder = функция ((orderId) { // Получить порядок if (typeof(orderId) === number) { // Если прошедший аргумент orderId является числовым типом return exchange.GetOrder(orderId); // Вызвать API GetOrder, чтобы получить информацию о заказе на основе orderId и вернуть. Я не знаю. if (typeof(hisBooks[orderId])!== undefined) { // Typeof(hisBooks[orderId]) если не равна undefined return hisBooks[orderId]; // возвращает данные в hisBooks с атрибутом orderId Я не знаю. if (typeof(orderBooks[orderId])!== undefined) { // Как и выше, если в orderBooks есть значение orderId, эти данные возвращаются. Книги с заказами на возврат[orderId]; Я не знаю. return null; // Return null если вышеперечисленные условия не выполнены }; this.Len = function() { // возвращает переменную orderBookLen трейдера, которая возвращает длину книги ордеров. Заказ на возврат БуксЛен; }; this.RealLen = function() { // Возвращение в книгу заказов Активировать количество заказов. var n = 0; // Первоначальное число равно 0 для (orderId в orderBooks) { // Прохождение книги заказов if (orderBooks[orderId].Id > 0) { // Если Id текущего порядка в прохождении больше 0, то есть 0 других, чем начальное время, // указывает, что заказ был размещен, заказ был активирован. n++; // Кумулятивно активированный порядок Я не знаю. Я не знаю. return n; // возвращает значение n, которое возвращает истинную длину книги заказов. (количество заказов, активированных) }; это.Опрос = функция ((тикер, ценаDiff) { // var orders = _C ((exchange.GetOrders); // Получить все неисполненные заказы для (orderId в orderBooks) { // Прохождение книги заказов var order = orderBooks[orderId]; // Принять текущий порядок назначить на порядок if (order.Id > 0) { // Если заказ активен, то есть order.Id не равен 0 (уже размещен) var found = false; // переменная found (знак found) является false для (var i = 0; i < orders.length; i++) { // Найти тот же номер заказа в исполненной информации заказа, возвращенной обменником if (order.Id == orders[i].Id) { // Если найдено, назначить значение true на find, что означает, что оно было найдено. найдено = верно; Я не знаю. Я не знаю. if (!found) { // If current orderId представляет собой ордер, который не найден в порядке незавершенного ордера, возвращенного биржей. order.Status = ORDER_STATE_CLOSED; // Обновляет порядок, соответствующий orderId в orderBooks (т.е. текущую переменную порядка) и обновляет // свойство Status в ORDER_STATE_CLOSED (т.е. закрыто) hisBooks[orderId] = order; // Завершенный заказ записывается в историческую книгу заказов, т.е. hisBooks, унифицированную, и уникальный номер заказа orderId delete ((orderBooks[orderId]); // Удалить атрибут книги заказов, названный orderId value. (Завершенный порядок удаляется из нее) orderBooksLen; // Уменьшение длины книги заказов Продолжайте; // Следующий код пропускает петлю. Я не знаю. Я не знаю. var diff = _N(order.Type == ORDER_TYPE_BUY? (тикер.Купить - order.Price) : (order.Price - ticker.Sell)); // Diff - это разница между запланированной ценой открытия ордера в текущей книге ордеров и текущей ценой открытия в реальном времени.

        var pfn = order.Type == ORDER_TYPE_BUY ? exchange.Buy : exchange.Sell;   // Assign the corresponding API function reference to pfn according to the type of the order.
        // That is, if the order type is a buy order, pfn is a reference to the exchange.Buy function, the same as the sell order.

        if (order.Id == 0 && diff <= priceDiff) {                                // If the order order in the order book is not activated (ie Id is equal to 0) and the current price is less than or 
                                                                                 // equal to the order plan price, the priceDiff passed in the parameter.   
            var realId = pfn(order.Price, order.Amount, order.Extra + "(distance: " + diff + (order.Type == ORDER_TYPE_BUY ? (" ask price: " + ticker.Buy) : (" bid price: " + ticker.Sell))+")");
            // Execute order function, parameter passing price, quantity, order extension information + pending order distance + market data (ask price or bid price), return exchange order id

            if (typeof(realId) === 'number') {    // If the returned realId is a numeric type
                order.Id = realId;                // Assign the Id attribute of the current order order to the order book.
            }
        } else if (order.Id > 0 && diff > (priceDiff + 1)) {  // If the order is active and the current distance is greater than the distance passed in by the parameter
            var ok = true;                                    // Declare a variable for tagging       Initially set true 
            do {                                              // Execute "do" first and then judge while    
                ok = true;                                    // Ok assign true
                exchange.CancelOrder(order.Id, "unnecessary" + (order.Type == ORDER_TYPE_BUY ? "buying" : "selling"), "placed order price:", order.Price, "volume:", order.Amount, ", distance:", 
                                             diff, order.Type == ORDER_TYPE_BUY ? ("ask price: " + ticker.Buy) : ("bid price: " + ticker.Sell));
                // Cancel the pending order that is out of range. After canceling the order, print the current order information and the current distance diff.

                Sleep(200);                                   // Wait 200 milliseconds
                orders = _C(exchange.GetOrders);              // Call the API to get an uncompleted order in the exchange.
                for (var i = 0; i < orders.length; i++) {     // Traverse these unfinished orders.
                    if (orders[i].Id == order.Id) {           // If the cancelled order is found in the list of orders that have not been completed by the exchange
                        ok = false;                           // Assign ok this variable to false, that is, no cancellation is successful.
                    }
                }
            } while (!ok);                                    // If ok is false, then !ok is true and while will continue to repeat the loop, continue to cancel the order,
                                                              // and check if the cancellation is successful.
            order.Id = 0;                                     // Assigning a value of 0 to order.Id means that the current order is inactive.
        }
    }
};

}

function balanceAccount ((orgAccount, initAccount) { // Balance Account Function Parameter Initial account information when the strategy is started) { // Balance Account Function Parameter Initial account information when the strategy is started } - функция баланса аккаунта (англ. баланс аккаунта) { // Balance Account Function Parameter Initial account information when the strategy is started) cancelPending ((); // Call the custom function cancelPending (()) to cancel all pending orders (Вызвать настройку cancelPending (()) для отмены всех ожидаемых заказов. var nowAccount = _C ((exchange.GetAccount); // Declare a variable nowAccount to record the latest information about the account at the moment. // Declare a variable nowAccount to record the latest information about the account at the moment. // Declare a variable nowAccount to record the latest information about the account at the moment. // Declare a variable nowAccount to record the latest information about the account at the moment. // Declare a variable nowAccount to record the latest information about the account at the moment. var slidePrice = 0.2; // Set the slip price when placing the order as 0.2 - Установите слиповую цену при размещении ордера как 0.2 var ok = true; // Tag variable initially set true - переменная с тегом, изначально установленная как true while (true) { // в то время как петля var diff = _N ((nowAccount.Stocks - initAccount.Stocks); // Calculate the difference between the current account and the initial account diff (Вычислить разницу между текущим счетом и начальным счетом) if (Math.abs(diff) < exchange.GetMinStock()) { // If the absolute value of the currency difference is less than the minimum transaction volume of the exchange, то это означает, что абсолютная стоимость валютной разницы меньше минимального объема транзакций на бирже. // break выходит из цикла и не выполняет балансирующие операции. "Я не хочу, чтобы ты был здесь". {y:bi} var depth = _C ((exchange.GetDepth); // Get the exchange depth information Определить объявленную переменную глубины var books = diff > 0? depth.Bids : depth.Asks; // According to the difference of the currency is greater than 0 or less than 0, extract the buy order array or // sell order array in depth (equal to 0 will not be processed, it is break when it is judged to be less than GetMinStock) // sell order array in depth (равный 0 не будет обработан, он будет нарушен, когда он будет оценен как меньше GetMinStock) // The difference between the coins is greater than 0 to sell the balance, so look at the buy order array, так что если вы хотите продать баланс, вы должны продать его. // the difference between the coins is less than 0 is the opposite. // the difference between the coins is less than 0 is the opposite. // the difference between the coins is less than 0 is the opposite. var n = 0; // Statement n initial is 0 var price = 0; // Statement price initial 0 (Статья о цене начальной 0) for (var i = 0; i < books.length; i++) { // Traversing the buy or sell order array n += books[i].Amount; // Accumulate Amount (order quantity) for each order based on the index i traversed (Списывайте количество заказов для каждого заказа, основанного на индексе, через который я прошел) if (n >= Math.abs ((diff)) { // If the cumulative order quantity n is greater than or equal to the currency difference, then: Если суммарное количество n больше или равно валютной разнице, то: price = books[i].Price; // Get the price of the current indexed order, assign it to price (получить цену текущего индексированного заказа, назначить ее цене) break; // Jump out of the current for traversal cycle (выйти из потока для прохождения цикла) {y:bi} {y:bi} var pfn = diff > 0? exchange.Sell : exchange.Buy; // Pass the sell order API (exchange.Sell) or the next buy order API (exchange.Buy) reference to the declared pfn. // на основе валютной разницы больше 0 или меньше 0 var amount = Math.abs(diff); // The amount of the order to be balanced is diff, the difference in the currency, assigned to the declared amount variable. // The amount of the order to be balanced is diff, the difference in the currency, assigned to the declared amount variable. // The amount of the order to be balanced is diff, the difference in the currency, assigned to the declared amount variable. var price = diff > 0? (price - slidePrice) : (price + slidePrice); // The direction of buying and selling according to the difference in the currency, increase or decrease the // Slip price based on the price (slip price is to make it easier to trade), and then assign it to price. // Слип цена основана на цене (слип цена для того, чтобы легче торговать), и затем назначить ее на цену Log ((start the balance, (diff > 0? sell: buy), amount, of coins); // The number of coins that the output log balances. // The number of coins that the output log balances. // The number of coins that the output log balances. If (diff > 0) { // According to the direction of the buying and selling, determine whether the account currency or the amount of coins is sufficient. Если (diff > 0) { // Согласно направлению покупки и продажи, определить, достаточно ли валюты счета или количества монет. amount = Math.min ((nowAccount.Stocks, amount); // Убедитесь, что сумма заказа не превысит доступные монеты текущего счета. } else { amount = Math.min ((nowAccount.Balance / price, amount); // Убедитесь, что сумма размещенного заказа не превышает сумму денег, доступных в текущем счете. {y:bi} if (amount < exchange.GetMinStock()) { // Check if the final order quantity is less than the minimum order quantity allowed by the exchange Если количество заказов меньше минимального количества заказов, разрешенного биржей Log ((Insufficient funds, unable to balance to the initial state); // Если количество заказа слишком мало, информация печатается. OK = false; // Tag balance failed Ошибка в балансе тегов break; // Jump out of the while loop (выйти из петли в то время) {y:bi} pfn ((price, amount); // Использовать API заказа (pfn reference) Sleep ((1000); // Pause for 1 second (Пуск на 1 секунду) cancelPending(); // Отменить все ожидаемые заказы. nowAccount = _C ((exchange.GetAccount); // Получить информацию о текущем счете {y:bi} execute the code inside curly braces when ok is true (balance is successful) - выполнять код внутри кривых скоб, когда ok является истинным (баланс является успешным) LogProfit ((_N ((nowAccount.Balance - orgAccount.Balance)); // Use the Balance property of the incoming parameter orgAccount (account information before balancing) // Используйте свойство Balance входящего параметра // to subtract the Balance property of the current account information, that is, the difference in the amount of money. // вычитать балансовое свойство информации о текущем счете, то есть разницу в сумме денег. // That is, profit and loss (потому что количество монет не меняется, есть небольшая ошибка, потому что некоторые небольшие // суммы не могут быть сбалансированы) Log (сбалансированный log, nowAccount); // The output log is balanced. {y:bi} {y:bi}

var STATE_WAIT_OPEN = 0; // Используется для состояния каждого узла в fishTable var STATE_WAIT_COVER = 1; //... var STATE_WAIT_CLOSE = 2; //... var ProfitCount = 0; // Запись прибыли и убытка var BuyFirst = true; // Первоначальные параметры интерфейса var IsSupportGetOrder = true; // определить обменную поддержку функции GetOrder API, глобальной переменной, используемой для определения начала основной функции var LastBusy = 0; // Запишите последний обрабатываемый объект времени

функция setBusy() { // Установка времени занятости LastBusy = new Date(); // Назначить LastBusy на объект текущего времени Я не знаю.

функция isTimeout() { // Определить, если это время if (MaxIdle <= 0) { // Максимальное время простоя (в зависимости от того, перемещается ли сетка автоматически), // если максимальное время простоя MaxIdle меньше или равно 0 return false; // возвращает false, не оценивает времяпроход. то есть всегда возвращает false без временипрохода. Я не знаю. var now = new Date ((); // Получить объект текущего времени if (((now.getTime() - LastBusy.getTime()) / 1000) >= MaxIdle) { // Используйте функцию getTime текущего объекта времени для получения временной метки и временной метки LastBusy для расчета разницы, // Разделите на 1000, чтобы вычислить количество секунд между двумя объектами времени. // Определить, если это больше, чем максимальное время простоя MaxIdle LastBusy = сейчас; // Если он больше, обновление LastBusy к текущему объекту времени сейчас return true; // возвращает true, что является тайм-аутом. Я не знаю. return false; // Return false без отсрочки Я не знаю.

функция onexit() { // Функция закрытия при выходе программы. if (CancelAllWS) { // Для отмены всех ожидаемых заказов при остановке вызовите cancelPending() для отмены всех ожидаемых заказов. Журнал ((Выход, попытка отменить все ожидающие заказы); отменитьОжидается (((); Я не знаю. Регистр (Стратегия успешно остановлена); Log ((_C(exchange.GetAccount)); // Напечатайте информацию о положении учетной записи при выходе из программы. Я не знаю.

Функция рыболовства ((orgСчет, рыбаСчет) { // Параметры литья: информация о счете, количество литья setBusy(); // Настроить LastBuys на текущий временной штемпель var account = _C(exchange.GetAccount); // Декларируйте переменную учетной записи, чтобы получить информацию о текущем счете и назначить ее. Log ((account); // Выводит информацию об учетной записи в начале вызова в функцию рыболовства. var InitAccount = account; // Декларируйте переменную InitAccount и назначьте ее с учетом. // этот отлив, используется для расчета плавающей прибыли и убытка.
var ticker = _C(exchange.GetTicker); // Получить цену котировки, присвоенную объявленной переменной ticker var amount = _N(AmountOnce); // В соответствии с количеством параметров интерфейса, используйте _N для обработки десятичных мест (_N по умолчанию до 2 бит) и присвоите их сумме. var amountB = [amount]; // Декларировать переменную под названием amountB - массив, инициализировать элемент с amount var amountS = [amount]; // Декларировать переменную под названием amountS... if (typeof(AmountType)!== undefined && AmountType == 1) { // В соответствии с пользовательской суммой, тип размера заказа, если этот параметр интерфейса не является неопределенным, // И AmountType устанавливается на пользовательскую сумму на интерфейсе, то есть значение AmountType составляет 1 (индекс выпадающего окна) for (var idx = 0; idx < AllNum; idx++) { // Общее количество AllNum. Если вы установили пользовательскую сумму, цикл amountB/amountS в массив порядкового количества в соответствии с общим количеством циклов. amountB[idx] = BAmountOnce; // Назначить значение массива ордеров покупки с использованием параметров интерфейса amountS[idx] = SAmountOnce; //... к ордеру продажи... Я не знаю. { \ cHFFFFFF } еще { \ cHFFFFFF } еще для (var idx = 1; idx < AllNum; idx++) { // Циклы, основанные на общем количестве сеток. switch (AmountCoefficient[0]) { // Согласно разнице параметров интерфейса, первый символ строки AmountCoefficient[0] равен +, -, , / случай +: // В соответствии с параметрами интерфейса создается сетка с одним добавлением и увеличением. amountB[idx] = amountB[idx - 1] + parseFloat(AmountCoefficient.substring(1)); перерыв; место -: //... amountB[idx] = amountB[idx - 1] - parseFloat(AmountCoefficient.substring(1)); перерыв; случай : amountB[idx] = amountB[idx - 1] * parseFloat(AmountCoefficient.substring(1)); перерыв; место /: amountB[idx] = amountB[idx - 1] / parseFloat(AmountCoefficient.substring(1)); перерыв; Я не знаю. amountB[idx] = _N(amountB[idx], AmountDot); // покупный заказ, сумма покупки и обработка данных за десятичными знаками. суммаS[idx] = суммаB[idx]; // Присвоение Я не знаю. Я не знаю. if (FirstPriceAuto) { // Если первый параметр автоматически установлен на true, если параметр интерфейса установлен, код внутри крутых скоб выполняется. Первая цена = Первая покупка? _N(ticker.Buy - PriceGrid, Precision) : _N(ticker.Sell + PriceGrid, Precision); // Параметр интерфейса FirstPrice устанавливает первую цену в соответствии с глобальной переменной BuyFirst (первоначальное утверждение верно, // и был назначен в соответствии с OpType в начале основного). // Цена устанавливается ценовым тикером и ценовым параметром PriceGrid.
Я не знаю. // Инициализировать рыбную таблицу
var fishTable = {}; // Декларировать объект сетки var uuidTable = {}; // Объект таблицы идентификационного кода var needStocks = 0; // Необходимые монеты переменная var needMoney = 0; // Требуемая денежная переменная var actualNeedMoney = 0; // На самом деле нужны деньги var actualNeedStocks = 0; // Действительно нужные монеты var notEnough = false; // Недофинансируемая переменная тега, изначально установлена на false var canNum = 0; // Доступная сетка for (var idx = 0; idx < AllNum; idx++) { // Структура проходит в соответствии с числом сетки AllNum. var price = _N((BuyFirst? FirstPrice - (idx * PriceGrid) : FirstPrice + (idx * PriceGrid)), точность); // При прохождении конструкции текущая цена индекса idx устанавливается в соответствии с BuyFirst. needStocks += amountS[idx]; // Количество проданных монет постепенно накапливается с циклом. needMoney += price * amountB[idx]; // Сумма денег, необходимая для покупки, постепенно накапливается с циклом. if (BuyFirst) { // Первое обращение с покупкой если (_N(needMoney) <= _N ((account.Balance)) { // Если сетке требуется меньше денег, чем сумма денег, доступная на счете actualNeedMondy = needMoney; // Назначен на фактическую сумму требуемых денег actualNeedStocks = needStocks; // Назначение фактического количества требуемых монет. canNum++; // Совокупное количество доступных сеток } else { // _N(needMoney) <= _N ((account.Balance) Если это условие не выполнено, то переменная "underfunded" должна быть установлена на значение true notEnough = true; Я не знаю. { \ cHFFFFFF } иное { \ cHFFFFFF } if (_N(needStocks) <= _N(account.Stocks)) { // Проверьте, меньше ли требуемое количество монет, чем количество монет, доступных на счете actualNeedMondy = needMoney; // Назначение actualNeedStocks = needStocks; canNum++; // Совокупное количество доступных сеток { \ cHFFFFFF } еще { \ cHFFFFFF } notEnough = true; // Установите true, если условия финансирования не выполнены Я не знаю. Я не знаю. fishTable[idx] = STATE_WAIT_OPEN; // В соответствии с текущим индексом idx, установить состояние члена idx (узла сетки) объекта сетки, // изначально STATE_WAIT_OPEN (в ожидании открытия позиции) uuidTable[idx] = -1; // Номерированный объект также инициирует собственное значение idx (узло, соответствующее fishTable) до -1 на основе текущего idx. Я не знаю. if (!EnableAccountCheck && (canNum < AllNum)) { // Если проверка средств не включена, и количество сеток (общее количество узлов), где узел меньше // чем настройка параметров интерфейса может быть открыта. Log ((Предупреждение, текущие средства могут быть сделаны только, canNum, of Grids, общие потребности в сети, (BuyFirst? needMoney: needStocks), Пожалуйста, сохраните достаточно средств); // Log выводит предупредительное сообщение. canNum = AllNum; // Обновление количества открываемых параметров интерфейса Я не знаю. если (покупать первым) { // купить первым if (EnableProtectDiff && (FirstPrice - ticker.Sell) > ProtectDiff) { // Откройте защиту спреда и введите рыночную цену минус текущую цену предложения более чем // защита цен на вход на рынок
бросить Первая цена покупки выше, чем рыночная цена продажи + _N(Первая цена - тикер.Продать, точность) + доллар; // Бросить сообщение об ошибке. } else if (EnableAccountCheck && account.Balance < _N(needMoney)) { // Если проверка средств включена и наличная сумма денег на счете меньше // сумму денег, необходимую для сети. если (fishCount == 1) { // Если это первый раз, чтобы бросить сетку бросить Недостаточные средства, нуждаются + _N(необходимоДеньги) + доллар; // Бросить ошибку, недостаточно средств { \ cHFFFFFF } еще { \ cHFFFFFF } Log ((Недостаточные средства, нужда, _N(необходимоДеньги), доллар, программа только делает, можетNum, сеток #ff0000); // Если это не первый раз, чтобы бросить сетку, вывести сообщение. Я не знаю. } else { // В остальных случаях отсутствует контроль капитала, защита цен и т.д. Log ((Оцененное использование средств: , _N ((needMoney), dollar); // Ожидается, что выпуск будет использовать средства. Я не знаю. } else { // продать первым, Следующее похоже на купить первым если (EnableProtectDiff && (ticker.Buy - FirstPrice) > ProtectDiff) { бросить Первая цена продажи выше рыночной цены покупки + _N ((ticker.Buy - FirstPrice, Precision) + доллар ; } иное если (EnableAccountCheck && account.Stocks < _N(needStocks)) { если (fishCount == 1) { бросать недостаточные средства, нужды + _N(необходимостиСтоки) + монет; { \ cHFFFFFF } еще { \ cHFFFFFF } Регистр ((Недостаточные средства, потребность, _N(необходимоСтоки), монет, программа только для создания, canNum, сеток #ff0000); Я не знаю. { \ cHFFFFFF } еще { \ cHFFFFFF } Лог (счет использования средств: , _N (необходимо) Акции), монеты, приблизительно , _N (необходимо) Деньги), доллары); Я не знаю. Я не знаю.

var trader = new Trader();                                          // Constructs a Trader object, assigning it to the trader variable declared here.
var OpenFunc = BuyFirst ? exchange.Buy : exchange.Sell;             // According to whether to buy and sell first, set the open function OpenFunc to refer to exchange.Buy or exchange.Sell
var CoverFunc = BuyFirst ? exchange.Sell : exchange.Buy;            // same as above
if (EnableDynamic) {                                                // Set OpenFunc/CoverFunc again according to whether the interface parameter EnableDynamic is enabled.
    OpenFunc = BuyFirst ? trader.Buy : trader.Sell;                 // The member function Buy that references the trader object is used for dynamic pending orders (mainly because 
                                                                    // some exchanges limit the number of pending orders, so virtual dynamic pending orders are required)
    CoverFunc = BuyFirst ? trader.Sell : trader.Buy;                // same as above
}
var ts = new Date();                                                // Create a time object at this time (assigned to ts) to record the time at the moment.
var preMsg = "";                                                    // Declare a variable to record the last message, the initial set to empty string
var profitMax = 0;                                                  // Maximum return 
while (true) {                                                      // The main logic after the grid is casted
    var now = new Date();                                           // Record the time when the current cycle started
    var table = null;                                               // Declare a variable
    if (now.getTime() - ts.getTime() > 5000) {                      // Calculate whether the difference between the current time now and the recorded time ts is greater than 5000 milliseconds
        if (typeof(GetCommand) == 'function' && GetCommand() == "Receiving grid") {         // Check if the strategy interaction control command "receives the grid" is received, 
                                                                                            // stops and balances to the initial state.
            Log("Start executing commands to perform grid operations");                                          // Output information 
            balanceAccount(orgAccount, InitAccount);                              // Perform a balancing function to balance the number of coins to the initial state
            return false;                                                         // This time the grid function is fishing and return false
        }
        ts = now;                                                                 // Update ts with current time now for next comparison time
        var nowAccount = _C(exchange.GetAccount);                                 // Declare the nowAccount variable and initially been set as the current account information. 
        var ticker = _C(exchange.GetTicker);                                      // Declare the ticker variable and initially been set as the current market information.
        if (EnableDynamic) {                                                      // If you enable dynamic pending orders
            trader.Poll(ticker, DynamicMax);                                      // Call the Poll function of the trader object to detect and process all orders based on the 
                                                                                  // current ticker market and the interface parameter DynamicMax.
        }
        var amount_diff = (nowAccount.Stocks + nowAccount.FrozenStocks) - (InitAccount.Stocks + InitAccount.FrozenStocks);  // Calculate the current coin difference
        var money_diff = (nowAccount.Balance + nowAccount.FrozenBalance) - (InitAccount.Balance + InitAccount.FrozenBalance); // Calculate the current money difference
        var floatProfit = _N(money_diff + (amount_diff * ticker.Last));           // Calculate the current floating profit and loss of this time of casting grid
        var floatProfitAll = _N((nowAccount.Balance + nowAccount.FrozenBalance - orgAccount.Balance - orgAccount.FrozenBalance) + ((nowAccount.Stocks + nowAccount.FrozenStocks 
                                 - orgAccount.Stocks - orgAccount.FrozenStocks) * ticker.Last));
        // Calculate the overall floating profit and loss

        var isHold = Math.abs(amount_diff) >= exchange.GetMinStock();             // If the absolute value of the coin difference at this moment is greater than the minimum trading 
                                                                                  // volume of the exchange, it means that the position has been held.
        if (isHold) {                                                             // If you have already held a position, execute the setBusy() function, which will update the LastBusy time.
            setBusy();                                                            // That is, after opening the position, the opening of the opening mechanism is started.
        }

        profitMax = Math.max(floatProfit, profitMax);                             // Refresh the maximum floating profit and loss
        if (EnableAccountCheck && EnableStopLoss) {                               // If you initiate account detection and start a stop loss
            if ((profitMax - floatProfit) >= StopLoss) {                          // If the maximum floating profit or loss minus the current floating profit or loss is greater than or equal to 
                                                                                  // the maximum floating loss value, execute the code inside the curly braces
                Log("Current floating profit a

Больше информации