O recurso está a ser carregado... Carregamento...

A estratégia de comércio de redes

Autora:Bem-estar, Criado: 2018-08-23 13:45:27, Atualizado:

A estratégia de comércio de redes (www.fmz.com) A ideia básica da negociação em rede é muito direta. Em vez de colocar um comércio, colocamos vários negócios formando um padrão de rede. Normalmente, estes são inseridos como ordens stop ou limit em torno do nível de preço atual , mas nem sempre.

O que é o comércio de redes e como funciona? A negociação em rede é um jogo sobre a volatilidade do mercado. Há duas razões pelas quais é favorecida pelos traders. A primeira é que não requer que você tenha uma previsão definitiva sobre a direção do mercado.

A segunda é que funciona bem em mercados voláteis, onde não há uma tendência clara. Estas condições são muito comuns nos mercados de divisas.

A negociação em grade é um tipo de negociação de análise técnica que se baseia no movimento dentro de padrões específicos de grade. A negociação em grade é popular na negociação de câmbio.

Grade pode personalizar a direção

Operação comercial básica: comprar primeiro e depois vender.

A rede começará a enviar ordens de compra no preço que está abaixo do primeiro preço, que é o preço seguido pelo primeiro preço (segundo último preço de compra, terceiro último preço de compra...e assim por diante). Cada ordem de compra é separada pelo parâmetro intervalo de preço. O número de ordens pendentes é quantidade única, e enviará o total da ordem até que a quantidade total seja preenchida.

Após qualquer ordem de compra é concluída, o programa será com base no preço de compra, adicionar o preço do parâmetro diferença de preço para o preço de venda, após a ordem ter sido vendido, e, em seguida, reiniciar o progresso desta estratégia grelha (verificação, lugar de ordem, esperar até que seja executado, vender)

Vender em curto primeiro e depois comprar para cobrir: a operação é exatamente o oposto

O maior risco desta estratégia é quando a tendência do mercado é unilateral e as flutuações de preços excedem a grelha.

O código a seguir fez a grade com perda automática de parada e função de movimento.

Observações:

A estratégia usa um projeto de ordem pendente virtual, que fornece uma grande quantidade de processamento para a troca para limitar o número de ordens pendentes e resolve o problema de forma flexível.

A lógica da grade é flexível em design e inteligente em estrutura.

Cálculo de lucro e perda, cada algoritmo estatístico numérico pode ser usado como referência e cada projeto de detecção de condição é rigoroso. (para minimizar a possibilidade de BUG)

O código fonte vale muito a pena ser aprendido.

Para mais informações, consulte:

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

Código de origem:

` // Grade pode personalizar a direção // Operação básica de negociação: comprar primeiro e depois vender. // A grade vai começar a enviar ordem de compra no preço que abaixo do primeiro preço, que é o preço seguir // pelo primeiro preço (segundo último preço de compra, terceiro último preço de compra...etc). // o parâmetro intervalo de preços. O número de encomendas pendentes é quantidade única, e enviará o total de encomendas até // a quantidade total está preenchida. // Após qualquer ordem de compra é concluída, o programa será com base no preço de compra, adicionar o preço do preço // diferença parâmetro para o preço de venda, depois que a ordem foi vendida, e, em seguida, reiniciar o progresso deste // estratégia grelha (verificação, ordem de lugar, esperar até que seja executado, vender) // Vender em curto primeiro e depois comprar para cobrir: a operação é exatamente o oposto // O maior risco desta estratégia é quando a tendência do mercado é unilateral movendo, e as flutuações de preços estão excedendo a grade. // O código a seguir fez a grade com perda de parada automática e função de movimento. // Comentários: // A estratégia usa um design de ordem virtual pendente, que fornece uma grande quantidade de processamento para a troca para limitar o número de // de pedidos pendentes, e resolve o problema de forma flexível. // A lógica da grade é flexível no design e inteligente na estrutura. // cálculo de lucros e perdas, cada algoritmo estatístico numérico pode ser usado para referência, e cada design de detecção de condição // é rigoroso. (para minimizar a possibilidade de BUG) // O código fonte vale muito a pena aprender.

// Código de origem: /* Parâmetros de interface (indicados como variáveis globais no código) OpType Grid Direção Caixa suspensa (selecionada) Compre primeiro e depois venda. FirstPriceAuto preço inicial automático booleano (verdadeiro/falso) verdadeiro FirstPrice@!FirstPriceAuto preço inicial numérico (número) 100 Todos Número total Número numérico (número) 10 PriceGrid Intervalo numérico (número) 1 Preço diferencial numérico (número) 2 quantidade Tipo de ordem tamanho caixa suspensiva (selecionado) comprar e vender a mesma quantidade Número (número) da quantidade de transacção única 0.1 BAmountOnce@AmountType==1 Ordem de compra Tamanho numérico (número) 0.1 SAmountOnce@AmountType==1 Tamanho numérico da ordem de venda (número) 0.1 AmountCoefficient@AmountType==0 Diferença de quantidade Corda (corda) *1 AmountDot Número com ponto decimal 3 AtivarProtectDiff Ativar a proteção da propagação Booleano (verdadeiro/falso) falso ProtectDiff@EnableProtectDiff Propagação de entrada Proteção de preço numérica (número) 20 CancelAllWS stop cancela todas as ordens pendentes Booleano (verdadeiro/falso) verdadeiro CheckInterval número de intervalo numérico (número) 2000 Intervalo de falha de reatendimento (número) 1300 RestoreProfit restaura o último lucro Booleano (verdadeiro/falso) falso LastProfit@RestoreProfit Último lucro numérico (número) 0 ProfitAsOrg@RestoreProfit Último lucro contado como preço médio Booleano (verdadeiro/falso) falso EnableAccountCheck habilitar verificação de saldo booleano (verdadeiro/falso) verdadeiro EnableStopLoss@EnableAccountCheck aberto Stop Loss Booleano (verdadeiro/falso) falso StopLoss@EnableStopLoss perda flutuante máxima numérica (número) 100 StopLossMode@EnableStopLoss Operação de perda pós-parada Caixa suspensa (selecionada) Reciclar e sair EnableStopWin@EnableAccountCheck Ativar Take Profit Booleano (verdadeiro/falso) falso StopWin@EnableStopWin Lucro flutuante máximo Tipo de número (número) 120 StopWinMode@EnableStopWin caixa suspensa de operação pós-tomada de lucro (selecionada) Reciclar e sair. AutoMove@EnableAccountCheck autoMove Boolean (verdadeiro/falso) falso MaxDistance@AutoMove distância máxima numérica (número) 20 MaxIdle@AutoMove (segundos) numérico (número) 7200 EnableDynamic Gira em ordens pendentes dinâmicas Boolean (verdadeiro/falso) falso DynamicMax@EnableDynamic Distância de expiração da ordem Número (número) 30 ResetData limpa todos os dados na inicialização Boolean (verdadeiro/falso) verdadeiro Precisão do preço comprimento decimal numérico (número) 5 */

função hasOrder ((ordens, orderId) { // Verifique se há uma ordem com ID de ordem em ordens de parâmetros para (var i = 0; i < ordens.length; i++) { // Traverse ordens para verificar se existem ids iguais, se houver, em seguida, retornar verdadeiro se (ordens[i].Id == orderId) { retornar verdadeiro; - Não. - Não. retornar falso; // Todos atravessados, sem gatilho se significa não encontrou a ordem com o ID de ordemId, retornar falso - Não.

função cancelPending() { // Cancelar todas as funções pendentes da ordem var ret = false; // Defina a variável de retorno da etiqueta de sucesso enquanto (verdadeiro) { // enquanto loop se (ret) { // Se ret é verdade então dormir por um certo tempo Dormir (intervalo); - Não. var ordens = _C(exchange.GetOrders); // Chame a API para obter as informações de ordem que a troca não executou. se (ordens.length == 0) { // Se uma matriz vazia for devolvida, a troca não tem ordens não executadas. interrupção; // Sair do loop enquanto - Não.

    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

}

função valuesToString(valores, pos) { // Valor convertido para uma cadeia var result = ; // Declare um resultado de cadeia vazia para retornar se (typeof(pos) === undefined) { // Se o parâmetro pos não for passado, atribuir a pos um valor de 0. pos = 0; - Não. para (var i = pos; i < values.length; i++) { // Processar a matriz de valores de acordo com a pos passada se (i > pos) { // Além do primeiro loop, adicione um espaço após a cadeia de resultados resultado += ; - Não. se (valores[i] === null) { // Se valores (função de lista de argumentos array) o elemento indexs atual é nulo, então o resultado adiciona null string Resultado += null; } else if (typeof(values[i]) == undefined) { // Se for indefinido, adicione undefined resultado += indefinido; } else { // Tipo restante fazer detecção de interruptor separadamente switch (values[i].constructor.name) { // Verifique a propriedade de nome do construtor de valores[i], que é o nome do tipo caso Data: Caso Número : caso String: caso Função: result += values[i].toString(); // Se for um tipo de data, um tipo numérico, um tipo de string, ou um tipo de função, chamar sua função toString e convertê-lo em uma string, em seguida, adicionar interrupção; padrão: result += JSON.stringify(valores[i]); // Em outros casos, use a função JSON.stringify para converter para uma cadeia de caracteres JSON. Adicionar ao resultado interrupção; - Não. - Não. - Não. retorno de resultado; // retorno de resultado - Não.

Função Trader() { // Função Trader, usando fechamentos. var vId = 0; // ID de incremento de ordem var orderBooks = []; // Livro de encomendas var hisBooks = []; // Livro de ordens históricas var orderBooksLen = 0; // comprimento do livro de ordens this.Buy = função ((preço, quantidade, extra) { // Função de compra, parâmetros: preço, quantidade, informação alargada if (typeof(extra) === undefined) { // Se o parâmetro extra não for passado, ou seja, typeof retorna indefinido extra = ; // Atribuir uma cadeia vazia para extra Outra coisa extra = valuesToString ((argumentos, 2); // Os argumentos passados ao chamar a função this.Buy são passados para a função valuesToString. - Não. vId++; // var orderId = V + vId; // orderBooks[orderId] = { // Adicionar o atributo orderId para a matriz do livro de ordens e inicializá-lo com o objeto construído. Tipo: ORDER_TYPE_BUY, // Propriedade de tipo de objeto construído: Tipo buy Estado: ORDER_STATE_PENDING, // Estado em espera Identificação: 0, // ordenaçãoID 0 Preço: preço, // parâmetro preço preço Montante: quantidade, // Parâmetro quantidade de encomenda quantidade Extra: extra // Informação estendida Uma cadeia processada por valuesToString }; orderBooksLen++; // O comprimento do livro de ordens é aumentado em 1 return orderId; // Retorna o orderId da ordem construída desta vez (ID de ordem não de troca, não confunda.) }; this.Sell = função ((preço, quantidade, extra) { // Basicamente semelhante a isso.Buy, construir uma ordem de venda. se (tipo de ((extra) === indefinido) { extra = ; Outra coisa extra = valuesToString ((argumentos, 2); - Não. vId++; var orderId = V + vId; OrdemBooks[orderId] = { Tipo: ORDER_TYPE_SELL, Estado: ORDER_STATE_PENDING, Identificação: 0, Preço: Montante: montante Extra: extra }; orderBooksLen++; Ordem de devolução; }; this.GetOrders = função() { // Obter informações de pedidos inacabados var ordens = _C(exchange.GetOrders); // Chamar API GetOrders para obter informações de ordens inacabadas Atribuído a ordens para (orderId in orderBooks) { // Atravessando o objeto orderBooks no Trader var order = orderBooks[orderId]; // Retirar a ordem com base na orderId se (order.Status!== ORDER_STATE_PENDING) prosseguir; - Não. var found = false; // Iniciar a variável encontrada (marcada se encontrada) para true para (var i = 0; i < orders.length; i++) { // Transmissão de dados para ordens não executadas retornadas pela API
se (ordens[i].Id == order.Id) { // Quando você encontrar uma ordem com o mesmo id de ordem em orderBooks, atribuir um valor de verdadeiro para encontrar, o que significa encontrar. encontrado = verdadeiro;
Break; // Sair do loop atual - Não. - Não. se (!found) { // Se não for encontrado, empurre orderBooks[orderId] para ordens. orders.push ((orderBooks[orderId]); // Por que você quer empurrar assim? - Não. - Não. ordens de devolução; // ordens de devolução - Não. this.GetOrder = função ((orderId) { // Obter ordem se (typeof(orderId) === number) { // Se o argumento passado orderId é um tipo numérico retorno exchange.GetOrder(orderId); // Chame a API GetOrder para obter as informações de ordem com base no orderId e retornar. - Não. se (typeof(hisBooks[orderId])!== indefinido) { // Typeof(hisBooks[orderId]) se não for igual a indefinido return hisBooks[orderId]; // Retorna dados em hisBooks com atributo como orderId - Não. se (typeof(orderBooks[orderId])!== undefined) { // Como acima, se houver um valor de orderId no orderBooks, estes dados são devolvidos. Livros de encomendas de devolução[orderId]; - Não. retorno null; // Retorno null se as condições acima não forem cumpridas }; this.Len = function() { // Retorna a variável OrderBookLen do Trader, que retorna o comprimento da carteira de ordens. ordem de devoluçãoBooksLen; }; this.RealLen = função() { // De volta ao livro de ordens Ativar a quantidade de ordem. var n = 0; // Contagem inicial é 0 para (orderId in orderBooks) { // atravessando o livro de pedidos se (orderBooks[orderId].Id > 0) { // Se o Id da ordem atual na travessia for maior que 0, ou seja, 0 diferente do tempo inicial, // indicando que a ordem foi colocada, a ordem foi ativada. n++; // Ordem activada cumulativamente - Não. - Não. Retorno n; // Retorna o valor de n, que retorna o comprimento verdadeiro do livro de ordens. (número de ordens ativadas) }; esta.Poll = função ((ticker, priceDiff) { // var ordens = _C ((exchange.GetOrders); // Obter todas as ordens não executadas para (orderId in orderBooks) { // atravessando o livro de pedidos var order = orderBooks[orderId]; // Tome a ordem atual atribuir a ordem se (order.Id > 0) { // Se a ordem estiver ativa, ou seja, se a ordem.Id não for 0 (já colocada) var encontrado = falso; // Variavel encontrado (marca encontrada) é falso para (var i = 0; i < ordens.length; i++) { // Encontre o mesmo número de ordem na informação de ordem executada devolvida pela troca se (order.Id == orders[i].Id) { // Se encontrado, atribuir um valor de true para encontrar, o que significa que foi encontrado. encontrado = verdadeiro; - Não. - Não. if (!found) { // If the current orderId representa uma ordem que não é encontrada na ordem da ordem não concluída devolvida pela troca. order.Status = ORDER_STATE_CLOSED; // Atualiza a ordem correspondente a orderId em orderBooks (ou seja, a variável de ordem atual) e atualizações // a propriedade Status para ORDER_STATE_CLOSED (ou seja, fechado) hisBooks[orderId] = ordem; // A ordem concluída é registada no livro de ordens histórico, ou seja, hisBooks, unificado, e o número de ordem único orderId delete(orderBooks[orderId]); // Excluir o atributo da agenda de ordens denominado orderId value. (A ordem concluída é excluída dela) orderBooksLen; // Redução do comprimento do livro de pedidos continuar; // O código a seguir pula o loop. - Não. - Não. var diff = _N(order.Type == ORDER_TYPE_BUY? (ticker.Buy - order.Price) : (order.Price - ticker.Sell)); // diferença é a diferença entre o preço de abertura previsto da ordem na carteira de ordens corrente e o preço de abertura em tempo real actual.

        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 Informação inicial da conta quando a estratégia é iniciada } Call the custom function cancelPending() to cancel all pending orders (Chamar a função custom para cancelar todas as ordens pendentes). var nowAccount = _C ((exchange.GetAccount); // 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 var ok = true; // Tag variable inicialmente definido como verdadeiro while (true) { // enquanto loop var diff = _N ((nowAccount.Stocks - initAccount.Stocks); // Calcule a 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, o valor absoluto da diferença de moeda é inferior ao volume mínimo de transações da exchange, e o valor absoluto da diferença de moeda é inferior ao volume mínimo de transações da exchange. // the break jumps out of the loop e não executa operações de equilíbrio. O que é que ele está a fazer? Não. var depth = _C ((exchange.GetDepth); // Get the exchange depth information Assign to the declared depth variable (Verificar a profundidade da troca) 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 will not be processed, it is break when it is judged to be less than GetMinStock) // sell order array in depth (equal to 0 will not be processed, it is break when it is judged to be less than GetMinStock) // A diferença entre as moedas é maior que 0 para vender o saldo, então olhe para a matriz de ordens de compra, // the difference between the coins is less than 0 is the opposite. // a diferença entre as moedas é menor que 0 é o oposto. var n = 0; // Declaração n inicial is 0 Var price = 0; // Preço inicial da declaração 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 (Amount: // Acumule quantidade de ordem) para cada ordem baseada no índice i atravessado If (n >= Math.abs ((diff)) { // If the cumulative order quantity n is greater than or equal to the currency difference, then: // Get the price of the current indexed order, assign it to price (Get the price of the current indexed order, assign it to price) // Obtenha o preço da ordem indexada atual, atribui-o ao preço break; // Jump out of the current for traversal cycle (Jump fora da corrente para o ciclo de travessia) Não. Não. Var pfn = diff > 0? exchange.Sell : exchange.Buy; // Passar a API de ordem de venda (exchange.Sell) ou a próxima API de ordem de compra (exchange.Buy) referência ao pfn declarado // baseado na diferença de moeda maior que 0 ou menor que 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. O valor da ordem a ser equilibrada é o diferencial na moeda, atribuído à variável de quantidade 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 based on the price (slip price is to make it easier to trade), and then assign it to price (preço de deslize é para tornar mais fácil o comércio), e então atribui-o ao preço Log ((start the balance, (diff > 0? sell: buy), amount, of coins); // The number of coins that the output log balances. If (diff > 0) { // De acordo com a direção da compra e venda, determine se a moeda da conta ou a quantidade de moedas é suficiente. Assuma que o valor da ordem não exceda as moedas disponíveis da conta corrente. } else { amount = Math.min ((nowAccount.Balance / price, amount); // Make sure that the amount of order placed does not exceed the amount of money available in the current account. // Verifique se o valor da ordem colocada não excede o valor do dinheiro disponível na conta corrente. Não. 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); // If the order quantity is too small, the information is printed (Se a quantidade do pedido for muito pequena, a informação é impressa). Ok = Falso; // Balanço de tags falhou break; // Jump out of the while loop (Sair do loop enquanto) Não. pfn ((price, amount); // Execute order API (pfn reference) Sleep ((1000); // Pausa por 1 segundo CancelPending ((); // Cancel all pending orders (cancelar todas as ordens pendentes). nowAccount = _C ((exchange.GetAccount); // Obter informações de conta corrente Não. Execute the code inside curly braces when ok is true (balance is successful) se (ok) { LogProfit ((_N ((nowAccount.Balance - orgAccount.Balance)); // Use the Balance property of the incoming parameter orgAccount (account information before balancing) // para subtrair a propriedade Balance da informação da conta corrente, isto é, a diferença na quantidade de dinheiro. // That is, profit and loss (because the number of coins does not change, there is a slight error because some small // Isso é, lucro e perda (porque o número de moedas não muda, há um pequeno erro porque alguns pequenos // quantidades não podem ser equilibradas) Log (Logo de equilíbrio completo, nowAccount); // O log de saída é equilibrado. Não. Não.

var STATE_WAIT_OPEN = 0; // Usado para o estado de cada nó no fishTable var STATE_WAIT_COVER = 1; //... var STATE_WAIT_CLOSE = 2; //... var ProfitCount = 0; // Registo de lucros e perdas var BuyFirst = true; // Parâmetros iniciais da interface var IsSupportGetOrder = true; // determinar o suporte de troca da função GetOrder API, uma variável global, usada para determinar o início da função principal var LastBusy = 0; // Registre o último objeto de tempo processado

função setBusy() { // Configure tempo de trabalho LastBusy = new Date(); // Atribuir LastBusy para o objeto hora atual - Não.

função isTimeout() { // Determine se ele tempo fora se (MaxIdle <= 0) { // Tempo máximo de inatividade (com base em se a grade é movida automaticamente), // se o tempo máximo de inatividade MaxIdle for definido menor ou igual a 0 return false; // Retorna false, não julga o timeout. Ou seja, sempre retorna false sem timeout. - Não. var now = new Date ((); // Obtenha objeto de tempo atual se (((now.getTime() - LastBusy.getTime()) / 1000) >= MaxIdle) { // Use a função getTime do objeto de tempo atual para obter o carimbo de tempo e o carimbo de tempo de LastBusy para calcular a diferença, // Divida por 1000 para calcular o número de segundos entre os dois objetos de tempo. // Determine se é maior que o tempo máximo de inatividade MaxIdle LastBusy = agora; // Se for maior que, atualizar LastBusy para o objeto de tempo atual agora return true; // Retorna true, que é um timeout. - Não. Return false; // Return false não há timeout - Não.

função onexit() { // A função de fechamento quando o programa sai. se (CancelAllWS) { // Para cancelar todas as ordens pendentes quando parar, chamar cancelPending() para cancelar todas as ordens pendentes. Registo ((Saindo, tentar cancelar todas as encomendas pendentes); CancelarPendente (((); - Não. Log ((Estratégia interrompida com êxito); Log ((_C(exchange.GetAccount)); // Imprima as informações da posição da conta quando você sair do programa. - Não.

Função de pesca ((orgConte, peixeConte) { // Parâmetros de lançamento: informações sobre a conta, número de lançamentos setBusy(); // Configure LastBuys para o carimbo de hora atual var account = _C(exchange.GetAccount); // Declare uma variável de conta para obter as informações da conta corrente e atribuí-la. Log ((conta); // Exporta as informações da conta no início da chamada para a função de pesca. var InitAccount = conta; // Declare uma variável InitAccount e atribuí-lo com conta. // este casting, usado para calcular lucro e perda flutuantes.
var ticker = _C(exchange.GetTicker); // Obtenha o valor da cotação atribuído à variável ticker declarada var amount = _N(AmountOnce); // De acordo com o número de parâmetros da interface, use _N para processar os lugares decimais (_N predefinições para 2 bits) e atribuí-los para quantidade. var amountB = [amount]; // Declare uma variável chamada amountB é uma matriz, inicializar um elemento com amount var amountS = [amount]; // Declare uma variável chamada amountS... se (typeof(AmountType)!== indefinido && AmountType == 1) { // De acordo com o montante personalizado, o tipo de tamanho do pedido, se este parâmetro de interface não estiver indefinido, // E AmountType é definido para uma quantidade personalizada na interface, ou seja, o valor AmountType é 1 (o índice da caixa suspensa) para (var idx = 0; idx < AllNum; idx++) { // O número total de AllNum. Se você definir uma quantidade personalizada, ciclo amountB/amountS para a matriz de quantidade de ordem de acordo com o número total de ciclos. amountB[idx] = BAmountOnce; // Atribuir valor para a matriz de ordens de compra usando parâmetros de interface quantityS[idx] = SAmountOnce; //... para a ordem de venda... - Não. Outra coisa para (var idx = 1; idx < AllNum; idx++) { // Ciclos baseados no número total de grades. switch (AmountCoefficient[0]) { // De acordo com a diferença do parâmetro da interface, o primeiro caractere da cadeia, AmountCoefficient[0] é +, -, , / caso +: // De acordo com os parâmetros da interface, uma grade com uma única adição e aumento é construída. quantidadeB[idx] = quantidadeB[idx - 1] + parseFloat(AmountCoefficient.substring(1)); interrupção; caso -: //... quantidadeB[idx] = quantidadeB[idx - 1] - parseFloat(AmountCoefficient.substring(1)); interrupção; caso : quantidadeB[idx] = quantidadeB[idx - 1] * parseFloat(AmountCoefficient.substring(1)); interrupção; Casos /: quantidadeB[idx] = quantidadeB[idx - 1] / parseFloat(AmountCoefficient.substring(1)); interrupção; - Não. amountB[idx] = _N(amountB[idx], AmountDot); // ordem de compra, quantidade de compra e processar os dados decimais. quantidadeS[idx] = quantidadeB[idx]; // Atribuição - Não. - Não. se (FirstPriceAuto) { // Se o primeiro parâmetro for automaticamente definido como verdadeiro se o parâmetro de interface for definido, o código dentro dos parênteses enrolados if é executado. PrimeiraPrice = CompraPrimeira? _N(ticker.Buy - PriceGrid, Precision) : _N(ticker.Sell + PriceGrid, Precision); // O parâmetro de interface FirstPrice define o primeiro preço de acordo com a variável global BuyFirst (a declaração inicial é verdadeira, // e foi atribuído de acordo com o OpType no início do principal). // O preço é definido pelo indicador de preço e pelo parâmetro de preço PriceGrid.
- Não. // Iniciar a tabela de peixes
var fishTable = {}; // Declare um objeto de grade var uuidTable = {}; // Objeto de tabela de código de identificação var needStocks = 0; // Moedas necessárias variável var needMoney = 0; // Variavel de dinheiro necessário var actualNeedMoney = 0; // Realmente precisava de dinheiro var actualNeedStocks = 0; // Moedas realmente necessárias var notEnough = false; // Variável de tag subfinanciada, inicialmente definida como false var canNum = 0; // Grade disponível para (var idx = 0; idx < AllNum; idx++) { // A estrutura é percorrida de acordo com o número da grade AllNum. var price = _N((BuyFirst? FirstPrice - (idx * PriceGrid) : FirstPrice + (idx * PriceGrid)), Precisão); // Ao atravessar a construção, a configuração do preço idx do índice atual é definida de acordo com BuyFirst. needStocks += amountS[idx]; // O número de moedas vendidas é gradualmente acumulado com o ciclo. needMoney += preço * amountB[idx]; // A quantidade de dinheiro necessária para comprar é gradualmente acumulada com o ciclo. (....compre a matriz de quantidade de ordem um por um...) se (BuyFirst) { // Manipulação comprar primeiro se (_N(needMoney) <= _N ((account.Balance)) { // Se a rede requer menos dinheiro do que o montante disponível na conta actualNeedMondy = needMoney; // Atribuído à quantidade real de dinheiro necessária actualNeedStocks = needStocks; // Atribuindo ao número real de moedas necessárias. canNum++; // Número acumulado de grades disponíveis } else { // _N(needMoney) <= _N(account.Balance) Se esta condição não for cumprida, definir a variável de etiqueta de insuficiência de financiamento como true notEnough = true; - Não. } outro { // Manuseio venda primeiro se (_N(needStocks) <= _N(account.Stocks)) { // Verifique se o número de moedas requerido é menor do que o número de moedas disponíveis na conta actualNeedMondy = needMoney; // Atribuição actualNeedStocks = needStocks; canNum++; // Número acumulado de grades disponíveis Outra coisa notEnough = true; // Definir true se as condições de financiamento não forem cumpridas - Não. - Não. fishTable[idx] = STATE_WAIT_OPEN; // De acordo com o índice idx atual, defina o estado do membro idx (nodo da grade) do objeto da grade, // inicialmente STATE_WAIT_OPEN (esperando para abrir a posição) uuidTable[idx] = -1; // O objeto numerado também inicializa seu próprio valor idx (o nó correspondente ao fishTable) para -1 com base no idx atual. - Não. se (!EnableAccountCheck && (canNum < AllNum)) { // Se a verificação de fundos não estiver habilitada, e o número de grades (o número total de nós) onde o nó é menor // do que a configuração do parâmetro de interface pode ser aberta. Log ((Alerta, só podem ser feitos fundos correntes, canNum, de Grades, total de necessidades de rede, (BuyFirst? needMoney : needStocks), Por favor, mantenha fundos suficientes); // Log sai uma mensagem de aviso. canNum = AllNum; // Atualize o número de configurações abertas para os parâmetros da interface - Não. se (BuyFirst) { // comprar primeiro se (EnableProtectDiff && (FirstPrice - ticker.Sell) > ProtectDiff) { // Abrir a proteção de spread e inserir o preço de mercado menos o preço de oferta atual mais do que A protecção dos preços de entrada no mercado
lançar O primeiro preço de compra é superior ao preço de venda no mercado + _N(FirstPrice - ticker.Sell, Precision) + dollar; // Lançar uma mensagem de erro. } else if (EnableAccountCheck && account.Balance < _N(needMoney)) { // Se a verificação de fundos estiver habilitada e o montante de dinheiro disponível para a conta for inferior a // a quantidade de dinheiro necessária para a rede. se (fishCount == 1) { // Se é a primeira vez para lançar a grade lançar Fundos insuficientes, necessidade + _N(needMoney) + dollar; // Lançar um erro, fundos insuficientes Outra coisa Log ((Fundos insuficientes, necessidade, _N(needMoney), dollar, o programa só faz, canNum, de grades #ff0000); // Se não for a primeira vez para lançar uma grade, faça uma mensagem. - Não. } else { // Em outros casos, não há inspecção de capital, protecção de preços, etc. Log ((Utilização estimada de fundos: , _N ((needMoney), dollar); // A produção deverá utilizar fundos. - Não. } else { // vender primeiro, O seguinte é semelhante a comprar primeiro se (EnableProtectDiff && (ticker.Buy - FirstPrice) > ProtectDiff) { lançar O primeiro preço de venda é superior ao preço de compra do mercado + _N(ticker.Buy - FirstPrice, Precision) + dólar; } else if (EnableAccountCheck && account.Stocks < _N(needStocks)) { se (fishCount == 1) { lançar fundos insuficientes, necessidade + _N(needStocks) + de moedas; Outra coisa Registo ((Fundos insuficientes, necessidade, _N(needStocks), de moedas, programa apenas fazer, canNum, de grades #ff0000); - Não. Outra coisa Log ((Utilização estimada dos fundos: , _N(needStocks), coins, aproximadamente, _N(needMoney), dollar); - Não. - Não.

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

Mais informações