En la carga de los recursos... Cargando...

La estrategia de comercio de la red

El autor:La bondad, Creado: 2018-08-23 13:45:27, Actualizado:

La estrategia de comercio de la red (www.fmz.com) La idea básica del comercio en red es muy sencilla. En lugar de colocar un comercio, colocamos múltiples operaciones formando un patrón de red. Por lo general, estos se ingresan como órdenes stop o limit alrededor del nivel de precio actual pero no siempre.

¿Qué es el comercio de redes y cómo funciona? El comercio en red es un juego sobre la volatilidad del mercado. Hay dos razones por las que es favorecido por los operadores. El primero es que no requiere que tenga una predicción definitiva sobre la dirección del mercado.

La segunda es que funciona bien en mercados volátiles, donde no hay una tendencia clara. Estas condiciones son muy comunes en los mercados de divisas.

El comercio en rejilla es un tipo de análisis técnico basado en el movimiento dentro de patrones específicos de la red. El comercio en rejilla es popular en el comercio de divisas. En general, la técnica busca capitalizar la volatilidad normal de los precios en los mercados mediante la colocación de órdenes de compra y venta a ciertos intervalos regulares por encima y por debajo de un precio base predefinido.

La cuadrícula puede personalizar la dirección

Operación comercial básica: comprar primero y luego vender.

La red comenzará a enviar órdenes de compra al precio que está por debajo del primer precio, que es el precio seguido por el primer precio (segundo último precio de compra, tercer último precio de compra... y así sucesivamente). Cada orden de compra está separada por el parámetro intervalo de precios.

Después de que se complete cualquier orden de compra, el programa se basará en el precio de compra, añadir el precio del parámetro diferencia de precio al precio de venta, después de que se haya vendido la orden, y luego reiniciar el progreso de esta estrategia de cuadrícula (comprobar, colocar la orden, esperar hasta que se ejecute, vender)

Vender en corto primero y luego comprar para cubrir: la operación es exactamente lo contrario

El mayor riesgo de esta estrategia es cuando la tendencia del mercado se mueve unilateralmente y las fluctuaciones de precios exceden la cuadrícula.

El siguiente código ha hecho la cuadrícula con pérdida automática de parada y función de movimiento.

Comentarios:

La estrategia utiliza un diseño de orden pendiente virtual, que proporciona una gran cantidad de procesamiento para el intercambio para limitar el número de órdenes pendientes, y resuelve el problema de manera flexible.

La lógica de la red es flexible en diseño y inteligente en estructura.

Cálculo de ganancias y pérdidas, cada algoritmo estadístico numérico se puede utilizar como referencia, y cada diseño de detección de condiciones es riguroso. (para minimizar la posibilidad de BUG)

El código fuente vale mucho la pena aprenderlo.

Para más información, véase:

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

Código de origen:

` // Grid puede personalizar la dirección // Operación comercial básica: comprar primero y luego vender. // La red comenzará a enviar la orden de compra en el precio que por debajo del primer precio, que es el precio seguir // por el primer precio (segundo último precio de compra, tercer último precio de compra... y así sucesivamente). // el parámetro intervalo de precios. El número de pedidos pendientes es cantidad única, y enviará el total de pedidos hasta // la cantidad total está llena. // Después de cualquier orden de compra se completa, el programa se basará en el precio de compra, añadir el precio del precio // diferencia parámetro al precio de venta, después de que el pedido ha sido vendido, y luego reiniciar el progreso de este // estrategia de cuadrícula (comprobar, orden de lugar, esperar hasta que se ejecute, vender) // Vender corto primero y luego comprar para cubrir: la operación es exactamente lo contrario // El mayor riesgo de esta estrategia es cuando la tendencia del mercado es unilateral movimiento, y las fluctuaciones de precios están excediendo la red. // El siguiente código ha hecho la cuadrícula con pérdida de parada automática y la función de movimiento. // Comentarios: // La estrategia utiliza un diseño de orden virtual pendiente, que proporciona una gran cantidad de procesamiento para el intercambio para limitar el número de // de pedidos pendientes, y resuelve el problema con flexibilidad. // La lógica de la red es flexible en diseño y inteligente en estructura. // cálculo de pérdidas y ganancias, cada algoritmo estadístico numérico se puede utilizar como referencia, y cada diseño de detección de condiciones // es riguroso. (para minimizar la posibilidad de BUG) // El código fuente es muy digno de aprender.

// Código de origen: /* Parámetros de interfaz (que se muestran como variables globales en el código) OpType Grid Dirección Caja desplegable (seleccionada) Compra primero y luego vende. FirstPriceAuto precio inicial automático booleano (verdadero/falso) verdadero El precio inicial automático numérico (número) 100 Todos Número total número numérico (número) 10 Precio de la red de precios Intervalo numérico (número) 1 Diferencia de precios numérica (número) Cuadro desplegable de tamaño de orden (seleccionado) comprar y vender la misma cantidad cantidad personalizada Cantidad de transacción única (número) 0.1 BAmountOnce@AmountType==1 Orden de compra Tamaño numérico (número) 0.1 SAmountOnce@AmountType==1 Tamaño numérico de la orden de venta (número) 0.1 CantidadCoefficient@AmountType==0 Diferencia de cantidad Correa (correa) *1 CantidadDot Número con punto decimal 3 HabilitarProtectDiff Activar la protección de propagación Booleano (verdadero/falso) falso ProtectDiff@EnableProtectDiff Proporción de entrada Protección de precios numérica (número) 20 CancelAllWS stop cancela todas las órdenes pendientes booleano (verdadero/falso) verdadero CheckInterval número numérico del intervalo de votación (número) 2000 Intervalo de reintentos de fallo numérico (número) 1300 RestoreProfit restaura el último beneficio booleano (verdadero/falso) falso Última ganancia (número) 0 ProfitAsOrg@RestoreProfit Última ganancia contada como precio medio Booleano (verdadero/falso) falso HabilitarAccountCheck habilitar la verificación del saldo booleano (verdadero/falso) verdadero ActivarStopLoss@EnableAccountCheck abierto Detener pérdida booleana (verdadero/falso) falso Pérdida máxima flotante numérica (número) 100 StopLossMode@EnableStopLoss Operación de pérdida post-stop Caja desplegable (seleccionada) Reciclar y salir. HabilitarStopWin@EnableAccountCheck Activar la toma de ganancias Booleano (verdadero/falso) falso StopWin@EnableStopWin Ganancia variable máxima Tipo de número (número) 120 StopWinMode@EnableStopWin cuadro desplegable de operaciones posteriores a la obtención de ganancias (seleccionado) Reciclar y salir. AutoMove@EnableAccountCheck automático Mover Booleano (verdadero/falso) falso MaxDistance@AutoMove distancia máxima numérica (número) 20 MaxIdle@AutoMove máximo tiempo de inactividad (segundos) numérico (número) 7200 Habilitar Dinámico Vueltas en ordenes dinámicas pendientes Booleano (verdadero/falso) falso Distancia de vencimiento de la orden DynamicMax@EnableDynamic Número (número) 30 ResetData borra todos los datos en el inicio Boolean (verdadero/falso) verdadero Precisión del precio longitud decimal numérica (número) 5 */

función hasOrder ((ordenes, orderId) { // Compruebe si hay un orden con orden ID en los pedidos de parámetros para (var i = 0; i < ordes.length; i++) { // Cruzar órdenes para comprobar si hay idénticos ids, si hay, a continuación, devuelva verdadero si (orden[i].Id == ordenId) { devuelve verdadero; ¿ Por qué? ¿ Por qué? Retorno falso; // Todo atravesado, sin disparador si significa que no ha encontrado el orden con el orden ID, retorno falso ¿ Por qué?

función cancelarPending() { // Cancelar todas las funciones de orden pendientes var ret = false; // Establecer la variable de la etiqueta de éxito de retorno mientras (verdadero) { // mientras el bucle si (ret) { // Si ret es verdadero entonces dormir por un cierto tiempo el sueño (intervalo de tiempo); ¿ Por qué? var órdenes = _C ((exchange.GetOrders); // Llame a la API para obtener la información de orden que el intercambio no ejecutó. si (orders.length == 0) { // Si se devuelve una matriz vacía, el intercambio no tiene órdenes no ejecutadas. Break; // Salta del bucle mientras ¿ Por qué?

    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

}

valores de funciónToString(valores, pos) { // Valor convertido a una cadena var result = ; // Declare un resultado de cadena vacía para devolver si (typeof(pos) === indefinido) { // Si el parámetro pos no se pasa, asignar pos un valor de 0. el número de puntos de referencia; ¿ Por qué? para (var i = pos; i < values.length; i++) { // Procesar valores de la matriz de acuerdo con el pasado pos si (i > pos) { // Además del primer bucle, añadir un espacio después de la cadena de resultados el resultado += ; ¿ Por qué? si (valores[i] === nulo) { // Si los valores (función de la lista de argumentos de la matriz) el elemento actual de índices es nulo entonces el resultado agrega null cadena el resultado += null; } else if (typeof(values[i]) == indefinido) { // Si no está definido, añadir indefinido resultado += no definido; } else { // El tipo restante hace la detección de interruptores por separado switch (values[i].constructor.name) { // Compruebe la propiedad de nombre del constructor de valores[i], que es el nombre del tipo caso fecha : caso número : el caso String: caso Función : resultado += valores[i].toString(); // Si es un tipo de fecha, un tipo numérico, un tipo de cadena, o un tipo de función, llamar a su función toString y convertirlo a una cadena, a continuación, añadir las interrupciones; por defecto: Resultado += JSON.stringify(valores[i]); // En otros casos, use la función JSON.stringify para convertir a una cadena JSON. Añadir al resultado las interrupciones; ¿ Por qué? ¿ Por qué? ¿ Por qué? Retorno de resultado; // retorno de resultado ¿ Por qué?

Función Trader() { // Función Trader, con el uso de cierres. var vId = 0; // ID del incremento de orden var ordenBooks = []; // libro de pedidos var hisBooks = []; // Libro de orden histórico var orderBooksLen = 0; // longitud del libro de pedidos este.Comprar = función ((precio, cantidad, extra) { // Función de compra, parámetros: precio, cantidad, información ampliada si (typeof(extra) === indefinido) { // Si el parámetro extra no se pasa, es decir, el tipo de devuelve indefinido extra = ; // Asignar una cadena vacía a extra No lo sé. extra = valuesToString ((argumentos, 2); // Los argumentos de los argumentos pasados cuando se llama a esta función. Compra se pasa a la función valuesToString. ¿ Por qué? VId++; // el orden varId = V + vId; // orderBooks[orderId] = { // Añadir el atributo orderId a la matriz de libro de órdenes e iniciar con el objeto construido. Tipo: ORDER_TYPE_BUY, // Tipo de objeto construido Propiedad: Tipo de compra Estado: ORDER_STATE_PENDING, // Estado en espera Identificador: 0, // ordenID 0 Precio: precio, // parámetro de precio precio Cantidad: cantidad, // Parámetro cantidad de pedido cantidad Extra: extra // Información extendida Una cadena procesada por valoresToString Se trata de: orderBooksLen++; // La longitud del libro de pedidos se incrementa en 1 return orderId; // Devuelve el orderId de la orden construida esta vez (ID de orden no de intercambio, no confunda.) Se trata de: esto.Vender = función ((precio, cantidad, extra) { // Básicamente similar a esto.Comprar, construir una orden de venta. si (tipo de ((extra) === indefinido) { extra = ; No lo sé. extra = valoresToString ((argumentos, 2); ¿ Por qué? vId++; el valor de la ordenId = V + vId; En el caso de las empresas de servicios de telecomunicaciones, el número de unidades de transporte será el siguiente: el tipo de producto: Estado: ORDER_STATE_PENDING, Identificación: 0, Precio: el precio, Importe: el importe, Extra: extra Se trata de: ordenBooksLen++; orden de devolución; Se trata de: this.GetOrders = función() { // Obtener información de pedidos sin terminar var órdenes = _C(exchange.GetOrders); // Llama a API GetOrders para obtener información de orden incompleta Asignado a las órdenes para (orderId en orderBooks) { // Recorriendo el objeto orderBooks en el objeto Trader var order = orderBooks[orderId]; // Sacar el orden basado en el orderId Si el estado de orden no es igual al estado suspendido, omita este bucle. seguir adelante; ¿ Por qué? var found = false; // Iniciar la variable encontrada (marcada si se encuentra) a true para (var i = 0; i < orders.length; i++) { // Recorrido de datos para órdenes no ejecutadas devueltas por la API
si (ordenes[i].Id == order.Id) { // Cuando encuentre un orden con el mismo orden id en orderBooks, asignar un valor de verdad a encontrar, lo que significa encontrar. encontrada = verdadera;
Break; // Salta fuera del bucle actual ¿ Por qué? ¿ Por qué? si (! encontrado) { // Si no se encuentra, empuje orderBooks[orderId] a las órdenes. orden.push ((orderBooks[orderId]); // ¿Por qué quieres presionar así? ¿ Por qué? ¿ Por qué? ordenes de devolución; // ordenes de devolución ¿ Por qué? Esto.GetOrder = función ((orderId) { // Obtener orden si (typeof(orderId) === number) { // Si el ordenId del argumento pasado es de tipo numérico return exchange.GetOrder(orderId); // Llame a la API GetOrder para obtener la información del pedido basado en el orderId y volver. ¿ Por qué? si (typeof(hisBooks[orderId])!== indefinido) { // Typeof(hisBooks[orderId]) si no es igual a no definido return hisBooks[orderId]; // Devuelve datos en hisBooks con el atributo como orderId ¿ Por qué? si (typeof(orderBooks[orderId])!== undefined) { // Como antes, si hay un valor de orderId en los orderBooks, se devuelven estos datos. el nombre de la persona que ha enviado el documento; ¿ Por qué? devuelve null; // devuelve null si no se cumplen las condiciones anteriores Se trata de: this.Len = function() { // Devuelve la variable de orden BookLen del comerciante, que devuelve la longitud del libro de órdenes. orden de devoluciónBooksLen; Se trata de: this.RealLen = function() { // Volver en el libro de pedidos Activar la cantidad de pedido. var n = 0; // El recuento inicial es 0 para (ordenId en orderBooks) { // Recorriendo el libro de pedidos si (orderBooks[orderId].Id > 0) { // Si el Id del orden actual en el recorrido es mayor que 0, es decir, 0 diferente del tiempo inicial, // indicando que el pedido ha sido realizado, el pedido ha sido activado. n++; // Orden activada acumulativamente ¿ Por qué? ¿ Por qué? return n; // Devuelve el valor de n, que devuelve la verdadera longitud del libro de pedidos. (número de pedidos activados) Se trata de: Esto.Poll = función (ticker, precioDiff) { // Var órdenes = _C ((exchange.GetOrders); // Obtener todas las órdenes no ejecutadas para (ordenId en orderBooks) { // Recorriendo el libro de pedidos var order = orderBooks[orderId]; // Tome el orden actual para asignarlo al orden si (order.Id > 0) { // Si la orden está activa, es decir, si order.Id no es 0 (ya colocada) var encontrado = falso; // Variable encontrado (marca encontrada) es falso para (var i = 0; i < orders.length; i++) { // Encuentre el mismo número de orden en la información de orden ejecutada devuelta por el intercambio si (order.Id == orders[i].Id) { // Si se encuentra, asignar un valor de verdadero a encontrar, lo que significa que se ha encontrado. encontrada = verdadera; ¿ Por qué? ¿ Por qué? si (!found) { // Si el orden actualId representa una orden que no se encuentra en el orden de la orden incompleta devuelta por el intercambio. order.Status = ORDER_STATE_CLOSED; // Actualiza el orden correspondiente a orderId en orderBooks (es decir, la variable de orden actual) y actualiza // la propiedad de estado a ORDER_STATE_CLOSED (es decir, cerrado) hisBooks[orderId] = orden; // El orden completado se registra en el libro de órdenes histórico, es decir, hisBooks, unificado, y el número de orden único orderId delete(orderBooks[orderId]); // Eliminar el atributo del libro de órdenes llamado orderId value. (El orden completado se elimina de él) orderBooksLen; // Reducción de la longitud del libro de pedidos Continuar; // El siguiente código salta el bucle. ¿ Por qué? ¿ Por qué? var diff = _N(orden.Tipo == ORDER_TYPE_BUY? (ticker.Comprar - orden.Precio) : (orden.Precio - ticker.Vender)); // Diff es la diferencia entre el precio de apertura previsto de la orden en el libro de órdenes actual y el precio de apertura actual en tiempo real.

        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 Información inicial de la cuenta cuando se inicia la estrategia Call the custom function cancelPending ((() to cancel all pending orders (Call the custom function cancelPending ((()) para cancelar todos los pedidos pendientes) // Llama a la función de cancelación de pedidos para cancelar todos los pedidos pendientes. var nowAccount = _C ((exchange.GetAccount); // Declare a variable nowAccount para registrar la última información sobre la cuenta en el momento. Var slidePrice = 0.2; // Set the slip price when placing the order as 0.2 El precio del deslizamiento cuando se coloca el pedido es 0.2 var ok = true; // variable de etiqueta inicialmente establecida como verdadera mientras (verdadero) { // mientras el bucle var diff = _N ((nowAccount.Stocks - initAccount.Stocks); // Calcula la diferencia entre la cuenta actual y la cuenta inicial If (Math.abs(diff) < exchange.GetMinStock()) { // If the absolute value of the currency difference is less than the minimum transaction volume of the exchange, entonces el valor absoluto de la diferencia de moneda es menor que el volumen mínimo de transacción del exchange, y el valor absoluto de la diferencia de moneda es menor que el volumen mínimo de transacción del exchange. // el break salta fuera del bucle y no realiza operaciones de equilibrio. ¿Qué es lo que está pasando? ¿Por qué no? var depth = _C ((exchange.GetDepth); // Obtenga la información de profundidad de intercambio Asignála a la variable de profundidad declarada var books = diff > 0? depth.Bids : depth.Asks; // According 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 no será procesado, se rompe cuando se juzga que es menor que GetMinStock) // La diferencia entre las monedas es mayor que 0 para vender el saldo, así que mira la matriz de órdenes de compra, // la diferencia entre las monedas es menor que 0 es la opuesta. var n = 0; // La declaración n inicial es 0 El precio inicial de la declaración es 0. para (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 (Cuantidad acumulada para cada orden basada en el índice que he atravesado) If (n >= Math.abs ((diff)) { // If the cumulative order quantity n is greater than or equal to the currency difference, then: Si la cantidad de orden acumulativa n es mayor o igual a la diferencia de moneda, entonces: Price = books[i].Price; // Obtener el precio del orden indexado actual, asignarlo al precio break; // salta fuera de la corriente para el ciclo de travesía ¿Por qué no? ¿Por qué no? Var pfn = diff > 0? exchange.Sell : exchange.Buy; // Pasa la API de orden de venta (exchange.Sell) o la siguiente API de orden de compra (exchange.Buy) referencia al pfn declarado // Basado en la diferencia de moneda mayor que 0 o menor que 0 var amount = Math.abs(diff); // La cantidad del orden a ser equilibrado es diff, la diferencia en la moneda, asignada a la variable de cantidad declarada. 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 basado en el precio (slip price is to make it easier to trade), y luego asignarlo al precio Log ((start the balance, (diff > 0? sell: buy), amount, of coins); // The number of coins that the output log balances (El número de monedas que el log de salida tiene en sus balances). If (diff > 0) { // De acuerdo con la dirección de la compra y venta, determine whether the account currency or the amount of coins is sufficient. En este caso, el número de monedas de la orden no excederá el número de monedas disponibles en la cuenta actual. ¿Por qué? En este caso, el valor de la orden no debe exceder la cantidad de dinero disponible en la cuenta corriente. ¿Por qué no? si (amount < exchange.GetMinStock()) { // Check if the final order quantity is less than the minimum order quantity allowed by the exchange Si la cantidad de pedido final es menor que la cantidad de pedido mínima permitida por el intercambio Log (( Insufficient funds, unable to balance to the initial state); // Si la cantidad de pedido es demasiado pequeña, la información se imprime. Ok = Falso; // El balance de etiquetas ha fallado break; // salta fuera del bucle mientras ¿Por qué no? pfn ((price, amount); // API de orden de ejecución (referencia pfn) Sleep ((1000); // Pause por 1 segundo Cancel Pending ((); // Cancelar todos los pedidos pendientes. ahoraAccount = _C ((exchange.GetAccount); // Obtener información de cuenta actual ¿Por qué no? if (ok) { // Ejecute el código dentro de los corchetes curly cuando ok es verdad (balance is successful) LogProfit ((_N ((nowAccount.Balance - orgAccount.Balance)); // Use the Balance property of the incoming parameter orgAccount (account information before balancing) // Utilice la propiedad Balance del parámetro entrante para obtener la información de la cuenta antes de que la balance // para restar la propiedad Balance de la información de la cuenta corriente, es decir, la diferencia en la cantidad de dinero. // That is, profit and loss (porque el número de monedas no cambia, hay un pequeño error porque algunas pequeñas Las cantidades no pueden ser equilibradas Log (el log de salida está equilibrado, nowAccount); // The output log is balanced. ¿Por qué no? ¿Por qué no?

var STATE_WAIT_OPEN = 0; // Se utiliza para el estado de cada nodo en el fishTable var STATE_WAIT_COVER = 1; //... el estado de espera de cierre = 2; var ProfitCount = 0; // Registro de pérdidas y ganancias var BuyFirst = verdadero; // Parámetros iniciales de la interfaz var IsSupportGetOrder = true; // determina el soporte de intercambio de la función GetOrder API, una variable global, utilizada para determinar el inicio de la función principal var LastBusy = 0; // Registra el último objeto de tiempo procesado

función setBusy() { // Establecer el tiempo de actividad LastBusy = new Date(); // Asignar LastBusy al objeto de tiempo actual ¿ Por qué?

Función isTimeout() { // Determina si tiene tiempo de espera si (MaxIdle <= 0) { // Tiempo máximo de inactividad (basado en si la red se mueve automáticamente), // si el tiempo máximo de inactividad MaxIdle se establece menor o igual a 0 return false; // devuelve false, no juzga el tiempo de espera. es decir, siempre devuelve false sin tiempo de espera. ¿ Por qué? var now = new Date ((); // Obtener el objeto de tiempo actual si (((now.getTime() - LastBusy.getTime()) / 1000) >= MaxIdle) { // Utilice la función getTime del objeto de tiempo actual para obtener la marca de tiempo y la marca de tiempo de LastBusy para calcular la diferencia, // Divida por 1000 para calcular el número de segundos entre los dos objetos de tiempo. // Determine si es mayor que el tiempo de inactividad máximo MaxIdle LastBusy = ahora; // Si es mayor que, actualizar LastBusy al objeto de tiempo actual ahora devuelve true; // devuelve true, que es un tiempo de espera. ¿ Por qué? Retorno falso; // Retorno falso sin tiempo de espera ¿ Por qué?

función onexit ((() { // La función de cierre cuando el programa sale. si (CancelAllWS) { // Para cancelar todas las órdenes pendientes cuando se detiene, llame a cancelPending() para cancelar todas las órdenes pendientes. Registro (( Saliendo, tratar de cancelar todos los pedidos pendientes); cancelarPendiente ¿ Por qué? Log ((Estrategia detenida con éxito); Log ((_C(exchange.GetAccount)); // Imprima la información de la posición de la cuenta cuando salga del programa. ¿ Por qué?

Función de pesca ((orgCuenta, pescadoCuenta) { // Parámetros de lanzamiento: información sobre la cuenta, número de lanzamientos SetBusy(); // Establezca LastBuys en la marca de tiempo actual var cuenta = _C(exchange.GetAccount); // Declare una variable de cuenta para obtener la información de la cuenta corriente y asignarla. Log ((cuenta); // Saca la información de la cuenta al comienzo de la llamada a la función de pesca. var InitAccount = cuenta; // Declarar una variable InitAccount y asignarlo con cuenta. // este moldeado, utilizado para calcular las ganancias y pérdidas flotantes.
var ticker = _C(exchange.GetTicker); // Obtener el valor de cotización asignado a la variable ticker declarada var amount = _N(AmountOnce); // De acuerdo con el número de parámetros de interfaz, use _N para procesar los decimales (_N por defecto a 2 bits) y asignarlos a amount. var amountB = [amount]; // Declare una variable llamada amountB es una matriz, inicializa un elemento con amount var amountS = [amount]; // Declare una variable llamada amountS... si (typeof(AmountType)!== indefinido && AmountType == 1) { // De acuerdo con el importe personalizado, el tipo de tamaño del pedido, si este parámetro de interfaz no está indefinido, // Y AmountType se establece en una cantidad personalizada en la interfaz, es decir, el valor AmountType es 1 (el índice de la casilla desplegable) para (var idx = 0; idx < AllNum; idx++) { // El número total de AllNum. Si establece una cantidad personalizada, el ciclo amountB/amountS a la matriz de cantidades de orden de acuerdo con el número total de ciclos. amountB[idx] = BAmountOnce; // Asignar valor a la matriz de órdenes de compra utilizando parámetros de interfaz cantidadS[idx] = SAmountOnce; //... a la orden de venta... ¿ Por qué? - ¿ Por qué? para (var idx = 1; idx < AllNum; idx++) { // Ciclos basados en el número total de cuadrículas. switch (AmountCoefficient[0]) { // De acuerdo con la diferencia de parámetros de la interfaz, el primer carácter de la cadena, AmountCoefficient[0] es +, -, , / caso +: // Según los parámetros de la interfaz, se construye una cuadrícula con una sola adición e incremento. En el caso de los datos de las empresas, el número de datos de las empresas es el número de datos de las empresas. las interrupciones; caso -: //... cantidadB[idx] = cantidadB[idx - 1] - parseFloat(AmountCoefficient.substring(1)); las interrupciones; caso : el valor de la cantidadB[idx] = el valorB[idx - 1] * parseFloat(AmountCoefficient.substring(1)); las interrupciones; caso /: cantidadB[idx] = cantidadB[idx - 1] / parseFloat ((AmountCoefficient.substring))); las interrupciones; ¿ Por qué? amountB[idx] = _N(amountB[idx], AmountDot); // orden de compra, cantidad de compra, y procesar los datos decimales. En el caso de las entidades de crédito, el importe de la asignación será el mismo que el importe de la asignación. ¿ Por qué? ¿ Por qué? si (FirstPriceAuto) { // Si el primer parámetro se establece automáticamente en verdadero si el parámetro de interfaz está establecido, se ejecuta el código dentro de los corchetes rizados si. En el caso de las empresas que no cumplen con los requisitos de la norma, el precio de venta se fijará en el precio de venta. // El parámetro de interfaz FirstPrice establece el primer precio de acuerdo con la variable global BuyFirst (la declaración inicial es verdadera, // y se ha asignado de acuerdo con el OpType al comienzo del principal). // El precio está establecido por el indicador de precio y el parámetro de precio PriceGrid intervalo de precios.
¿ Por qué? // Inicie la tabla de peces
var fishTable = {}; // Declarar un objeto de cuadrícula var uuidTable = {}; // Objeto de la tabla de código de identificación var needStocks = 0; // Monedas requeridas variable var needMoney = 0; // Variable dinero requerido var actualNeedMoney = 0; // En realidad necesitaba dinero var actualNeedStocks = 0; // Monedas realmente necesarias var notEnough = false; // Variable de etiqueta subfinanciada, inicialmente establecida en false var canNum = 0; // Cuadrícula disponible para (var idx = 0; idx < AllNum; idx++) { // La estructura se recorre de acuerdo con el número de la cuadrícula AllNum. el precio var = _N((ComprarPrimero? PrimeroPrecio - (idx * PriceGrid) : PrimeroPrecio + (idx * PriceGrid)), Precisión); // Al atravesar el constructo, la configuración del precio del índice idx actual se establece de acuerdo con BuyFirst. needStocks += amountS[idx]; // El número de monedas vendidas se acumula gradualmente con el ciclo. needMoney += precio * cantidadB[idx]; // La cantidad de dinero requerida para comprar se acumula gradualmente con el ciclo. (....compra la matriz de cantidad de orden una por una...) si (comprar primero) { // manejar comprar primero si (_N(needMoney) <= _N ((account.Balance)) { // Si la red requiere menos dinero que la cantidad disponible en la cuenta actualNeedMondy = needMoney; // asignado a la cantidad real de dinero requerido actualNeedStocks = needStocks; // Asignación al número real de monedas requeridas. ¿Hay algo malo en esto? canNum++; // Número acumulado de cuadrículas disponibles } else { // _N(needMoney) <= _N(account.Balance) Si no se cumple esta condición, establecer la variable de etiqueta de insuficiencia de financiación en verdadero noEnough = verdadero; ¿ Por qué? } otro { // manejar la venta primero si (_N(needStocks) <= _N(account.Stocks)) { // Compruebe si el número de monedas requerido es menor que el número de monedas disponibles en la cuenta actualNeedMondy = needMoney; // asignación actualNeedStocks = needStocks; canNum++; // Número acumulado de cuadrículas disponibles No lo sé. notEnough = true; // Establecer true si no se cumplen las condiciones de financiación ¿ Por qué? ¿ Por qué? fishTable[idx] = STATE_WAIT_OPEN; // De acuerdo con el índice idx actual, establece el estado del miembro idx (nodo de la red) del objeto de la red, // inicialmente STATE_WAIT_OPEN (esperando para abrir la posición) uuidTable[idx] = -1; // El objeto numerado también inicializa su propio valor idx (el nodo correspondiente al fishTable) a -1 basado en el idx actual. ¿ Por qué? si (!EnableAccountCheck && (canNum < AllNum)) { // Si la verificación de fondos no está habilitada, y el número de cuadrículas (el número total de nodos) donde el nodo es menor // que el parámetro de configuración de la interfaz puede ser abierto. Log ((Advertencia, sólo se pueden hacer fondos actuales, canNum, of Grids, total de las necesidades de la red, (BuyFirst? needMoney : needStocks), Please keep sufficient funds); // Log da un mensaje de advertencia. canNum = AllNum; // Actualizar el número de configuraciones abiertas para los parámetros de interfaz ¿ Por qué? si (Comprar Primero) { // comprar primero si (EnableProtectDiff && (FirstPrice - ticker.Sell) > ProtectDiff) { // Abrir la protección de diferencias y ingresar el precio de mercado menos el precio de oferta actual más de // la protección del precio de entrada en el mercado
lanzar El primer precio de compra es más alto que el precio de venta del mercado + _N(FirstPrice - ticker.Sell, Precisión) + dólar; // Lanzar un mensaje de error. } else if (EnableAccountCheck && account.Balance < _N(needMoney)) { // Si el chequeo de fondos está habilitado y la cantidad de dinero disponible para la cuenta es inferior a // la cantidad de dinero requerida para la red. si (fishCount == 1) { // Si es la primera vez que se ejecuta la cuadrícula lanzar Insuficientes fondos, necesidad + _N(needMoney) + dollar; // Lanzar un error, fondos insuficientes No lo sé. Log ((Fundos insuficientes, necesidad, _N(needMoney), dollar, el programa sólo hace, canNum, de cuadrículas #ff0000); // Si no es la primera vez que se proyecta una cuadrícula, saque un mensaje. ¿ Por qué? } else { // En otros casos, no hay inspección de capital, protección de precios, etc. Log (( Uso estimado de fondos: , _N(needMoney), dollar); // Se espera que la producción utilice fondos. ¿ Por qué? El siguiente es similar a comprar primero si (Habilitar ProtectDiff && (ticker.Buy - FirstPrice) > ProtectDiff) { El primer precio de venta es más alto que el precio de compra del mercado + _N(ticker.Buy - FirstPrice, Precisión) + dólar; } en caso de que (Activar CuentaCheck && cuenta.Stock < _N(needStock)) { si (fishCount == 1) { lanzar fondos insuficientes, necesidad + _N(needStocks) + de monedas ; No lo sé. Log ((Insuficientes fondos, necesidad, _N(needStocks), de monedas, programa sólo hacer, canNum, de cuadrículas #ff0000); ¿ Por qué? No lo sé. Log ((Uso estimado de los fondos: , _N(needStocks), coins, aproximadamente, _N(needMoney), dollar); ¿ Por qué? ¿ Por qué?

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

Más contenido