2.1 Utilize API para obter informações de contas, dados de mercado, dados de linha K, informações de profundidade de mercado

Autora:Sonhos pequenos, Criado: 2016-11-05 16:41:04, Atualizado: 2019-08-01 09:31:23

2.1 Utilize API para obter informações de contas, dados de mercado, dados de linha K, informações de profundidade de mercado

Finalmente, chegamos ao capítulo 2, e, ao visitar o capítulo anterior, devemos ter um pouco de conhecimento sobre as funções da quantificação dos inventores.


  • Usar a API para obter informações de conta

    Supondo que o passeio pelo primeiro capítulo já tenha adicionado administradores, bolsas, é claro que podemos testar o código com o inventor quantificando o simulador.

    Primeiro, vamos criar uma estratégia, que podemos chamar de teste 1.img

    Interface de edição de estratégiasimg img

    O código é o seguinte:

function main() {
    Log(exchange.GetAccount()); // 看过API 文档后知道, exchange就是交易所对象,实际上策略有个全局变量
                                // exchanges 数组,这个数组存放的就是你创建机器人或者回测时添加的交易所(可以是多个)
                                // 添加1个交易所 exchanges 数组就只包含1个交易所对象,即添加的交易所对象。
                                // 那么 exchange 和 exchanges 是什么关系呢? 其实 exchange 就是 exchanges[0] ,
                                // exchange 就是 exchanges 数组的第一个元素(这里这个元素是交易所对象)。
                                
                                // Log()函数应该也不陌生吧,这个API 就是输出一条日志,日志内容就是Log括号里面的参数。
}

Criar um robô também chamado Test1 é uma estratégia chamada Test1 de ligação, cuantificada pelo inventor.img img

A estratégia é executada instantaneamente e mostra uma informação de conta.img

A partir daí, o Google mostrou-nos que podemos comparar as informações da conta com as do disco.img

  • Obtenção de dados de mercado

function main() {
    Log(exchange.GetAccount()); // 已经知道怎么获取 主交易所 账户信息了
    //下面我们来试试 不停的获取行情数据。 
    while(true){ // 这里用一个无限循环的结构来不停的获取 交易所行情数据。
        Log("行情数据:", exchange.GetTicker()); // 哇! Log() 函数的括号里面可以写2个参数,第一个参数是: "行情数据:"
                                               // 第二个参数是 exchange.GetTicker() 这个函数的返回值。就是主交易所的行情数据。
                                               // 注意 Log() 函数的参数要用 逗号分隔。
        Sleep(1000);   // 咦~ 这个又是什么? 答:机器人程序 执行循环也需要休息!它可是执行很快的哦!(一秒N次)
                       // Sleep 函数的作用就是让程序暂停一会儿,括号里面的参数 1000 是 毫秒数, 1秒 = 1000毫秒。Sleep(1000);就是暂停1000毫秒。
                       // 不要小看这个参数,这个参数控制了程序的轮询频率,间接影响访问 交易所API 的频率,有些交易所API访问过于频繁可是会拒绝访问的。
    }
}

img Nota:Alguns colegas podem descobrir que os preços máximos e mínimos dos dados obtidos pela função GetTicker são muito diferentes, ou seja, o High e o Low dos dados de mercado que o GetTicker retorna são os preços máximos e mínimos dentro do ciclo acordado pela bolsa, especificamente dependendo da configuração da bolsa.

  • Obter dados da linha K

    A primeira coisa a fazer é ver a descrição do documento da API:
GetRecords(Period)	返回一个K线历史, K线周期在创建机器人时指定, Record数组结构
不加参数, 默认返回添加机器人时时指量的K线周期, 但也可以自定义K线周期
支持: PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟, PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天

Nós escrevemos um teste de código para obter dados da linha K do ciclo padrão (de 5 minutos).

function main() {
    Log(exchange.GetAccount()); // 已经知道怎么获取 主交易所 账户信息了
    //下面我们来试试 不停的获取行情数据。 
    var records = exchanges[0].GetRecords();  // 按照默认周期获取K线数据
    Log("records:", records);  // 在日志中输出 获取到的K线数据。
}

Mostrar a saída: Recordes: [{Time:1478260200000,Open:4765.14,High:4773,Low:4764.54,Close:4769.47,Volume:5211.539999999999} A primeira coisa que eu sei é que o que você está fazendo não é bom para você. A primeira coisa que eu sei é que o meu pai é um homem muito bom. A primeira coisa que eu sei é que o que eu fiz foi muito bom. A primeira coisa que eu disse foi: "Não, não, não, não". {Time:1478261700000,Open:4786.51,High:4788.66,Low:4775,Close:4775.31,Volume:7722.33999999965}

Como pode ser visto, a variável records é uma matriz estrutural, que é ordenada em ordem de tempo de K linhas, de distância (index0) para perto (indexrecords.length - 1). A propósito, vamos entender a linha K: ((alguns gráficos são vermelhos para a linha do sol, verdes para a linha do pénis, outros são de cores opostas)).imgVeja abaixo um exemplo de gráfico de K-lines com ciclos de 5 minutos na plataforma.img Atenção:O valor de uma linha K é determinado após o término de um ciclo. Na prática, chamamos var records = exchanges [0].GetRecords ((); o último elemento da matriz de registros de dados retornados, ou seja: records[records.length-1], é ininterruptamente alterado até o término de seu ciclo.

A função GetRecords retorna dados de ciclo padrão de acordo com a configuração da política sem adição de parâmetros. Também é possível passar parâmetros para especificar o ciclo da linha K. Atualmente, o sistema de retorno já suporta o GetRecords para passar parâmetros para especificar o ciclo (retorna dados de ciclo padrão sem adição de parâmetros), permitindo que a política use diferentes períodos ao mesmo tempo no retorno.

  • Obtenha informações de mercado mais profundas

    GetDepth retorna uma estrutura de profundidade
function main() {
    var depth = exchanges[0].GetDepth();   //获取市场深度信息,  返回订单薄信息,一个对象包含2个属性,每个属性是一个对象数组。
    Log("depth:", depth);    // 日志中输出,一下的输出是 整理过的格式,是方便读者理解,实际上是所有内容都在一行显示的。
}

A análise do código acima mostra o seguinte:

depth: 
{"Asks":[{"Price":4726.07,"Amount":15},   // 卖单数组,回测时,数据都是模拟出来的,所以Amount 都是 15,索引为0的是卖一,依次类推。
         {"Price":4726.08,"Amount":15},
         {"Price":4726.09,"Amount":15},
         {"Price":4726.1,"Amount":15},
         {"Price":4726.11,"Amount":15},
         {"Price":4726.12,"Amount":15},
         {"Price":4726.13,"Amount":15},
         {"Price":4726.14,"Amount":15},
         {"Price":4726.15,"Amount":15},
         {"Price":4726.16,"Amount":15},
         {"Price":4726.17,"Amount":15}],
"Bids":[{"Price":4726.05,"Amount":15},   //  买单数组,索引为0的是买一, 向后依次类推。
        {"Price":4726.04,"Amount":15},
        {"Price":4726.03,"Amount":15},
        {"Price":4726.02,"Amount":15},
        {"Price":4726.01,"Amount":15},
        {"Price":4726,"Amount":15},
        {"Price":4725.99,"Amount":15},
        {"Price":4725.98,"Amount":15},
        {"Price":4725.97,"Amount":15},
        {"Price":4725.96,"Amount":15},
        {"Price":4725.95,"Amount":15}]
}

Os respectivos bolsos de ordem são os seguintes (aqui estão os dados reais da OKCoin): informações de profundidade de mercado no processo real (os bolsos de ordem) são rápidos de mudança e os alunos interessados podem registrar o OKCoin e entrar para ver.

img

O que fazer com a informação de profundidade do mercado (datos de transação)? Os dados de transação são de muitas utilidades, como por exemplo, o menu de refeições (claro que também há um menu pendurado).

function main() {    
    var depth = exchanges[0].GetDepth();    // 获取市场深度
    Log("depth:", depth);                   // 日志输出显示
    Log(exchanges[0].GetAccount());         // 输出 吃单前的 账户信息
    var buyPrice = depth.Asks[0].Price;     // 设置吃卖单的价格,即卖一,
                                            // 有时为确保吃单成功,这样处理:var buyPrice = depth.Asks[0].Price + slidePrice;
    var buyAmount = depth.Asks[0].Amount;   // 吃卖单的量
    exchanges[0].Buy(buyPrice, buyAmount);  // 执行买入操作, 吃掉卖一 这个单子
    Log(exchanges[0].GetAccount());         // 显示买入后的  账户信息,对比初始账户信息。可以对比出 买入操作的成交的数量。
}

Os resultados da operação do disco analógico quantificado pelos inventores:img


Mais.

FlydogA segunda coisa que eu descobri foi que, quando eu escolhi o servidor público dos EUA, o bot não tinha esse sinal de aviso na lista, mas quando ele foi executado, não havia nenhuma informação no log, sugerindo que não havia nenhuma informação no log.

FlydogComplementar a descoberta do problema: na lista de robôs, o estado é o triângulo vermelho com um ponto de exclamação, como se fosse uma sugestão de anomalia.

FlydogOlá, estou fazendo um teste de simulação com a plataforma, primeiro passo é testar informações de conta, não há saída de log, indica erros, não sei onde o problema está? O código de teste do robô: função main (() { Log (exchange.GetAccount) (em inglês); Log (("test"); Não. Resultado: Teste 1 Estratégia: Teste 1 (última atualização 2018-09-13 14:25:33) Dates: Criado em 2018-09-13 14:07:57 Recentemente iniciado em 2018-09-13 14:40:24 Parado em 2018-09-13 14:40:25 Status: K linha ciclo 1 minuto Há um erro Hospedado na China: 42.236.82.38 - linux/amd64 (public), ID: 118025 A plataforma de negociação é BotVS/BTC_USD

FlydogOlá, estou fazendo um teste de simulação com a plataforma, primeiro passo é testar informações de conta, não há saída de log, indica erros, não sei onde o problema está? O código de teste do robô: função main (() { Log (exchange.GetAccount) (em inglês); Log (("test"); Não. Resultado: Teste 1 Estratégia: Teste 1 (última atualização 2018-09-13 14:25:33) Dates: Criado em 2018-09-13 14:07:57 Recentemente iniciado em 2018-09-13 14:40:24 Parado em 2018-09-13 14:40:25 Status: K linha ciclo 1 minuto Há um erro Hospedado na China: 42.236.82.38 - linux/amd64 (public), ID: 118025 A plataforma de negociação é BotVS/BTC_USD

HokshelatoQuando a simulação é chamada `exchange.GetTicker()`, muitas vezes aparece **GetTicker: timeout**, por favor pergunte por quê?

- O quê?Olá, os dados de simulação de disco real são os dados de disco real daquela bolsa?

BijiasuoXuexizhong

ShandianliyuPor favor, exchange.GetDepth (()) retorna toda a informação sobre os pedidos pendurados da bolsa atual? Será que haverá muitos pedidos pendurados e só retornará uma parte dos dados?

MaohbaoGetRecords ((Period) retorna um histórico de linha K, mas quantos K-bars contém este histórico de linha K, onde isso é especificado?

PenglihengBem, eu fiz o código errado, corrigi.

PenglihengGetAccount: assinaturas não correspondem Como é que conseguiste, Monstro?

Andy2simplesPor que a quantidade de profundidade do disco analógico é sempre 15? O disco analógico é um dado passado ou um dado gerado aleatoriamente? Se for um dado passado, a quantidade pode ter um valor.

Cjz140Record é uma função, length é o que? Depth é um objeto? Como distinguir o objeto da função?

FangBeiO que é o slidePrice?

Sonhos pequenosSe você tiver alguma dúvida, pode acessar o grupo oficial do QQ.

FlydogObrigado por todas as respostas, eu vou seguir as dicas e tentar novamente.

Sonhos pequenosNão sei se é um problema de um servidor público, você pode testar com um servidor privado, um servidor privado deve ser possível, você deve implementar um em seu próprio computador.

Sonhos pequenosO blog do blogueiro e blogueiro de Facebook, Mark Zuckerberg, escreveu:

Sonhos pequenosIsso pode ser específico para ver qual é a lógica de execução da política, ou pode ser que a política funcione normalmente, mas não desencadeie nenhuma ação.

Sonhos pequenosO sinal vermelho indica que o robô está sendo executado. O erro é reportado e requer a verificação do registro do robô ou do registro do administrador.

Sonhos pequenosOs problemas de rede recentes, além de que os procedimentos não são atualizados no disco analógico, são ultrapassados e podem ser ajustados usando o exchange.IO ("mode").

Sonhos pequenosO simulador de mercado é um simulador de mercado que funciona 24 horas por dia, seguindo a tendência de vários mercados principais. Todos os usuários que usam o simulador são participantes deste simulador.

ShandianliyuMuito bem, já percebi, obrigado.

Sonhos pequenosA pesquisa foi realizada em uma base de dados de mercado real, onde os preços de compra e venda de um lote são dados reais.

ShandianliyuMuito obrigado. Além disso, pergunte, quando simula a simulação em nível de disco real, o exchange.GetDepth () retorna dados compatíveis com o BotVS ou dados históricos reais?

Sonhos pequenosO BotVS é um envelope que retorna dados por padrão, se você quiser ligar diretamente, pode usar a função exchange.IO para definir os parâmetros de chamada (a função é livre de assinatura, veja a documentação da API).

Sonhos pequenosEste não pode especificar, quantos K-strings retornam são empurrados especificamente pelo exchange, cada exchange pode ter um número diferente de empurrões, outros não oferecem interface de K-string, o administrador coleta automaticamente os registros de transações do exchange, gerando K-string, que é acumulado a partir da primeira raiz.

Sonhos pequenosNo começo, eu também me enganei.

Sonhos pequenosBem, vamos considerar que há dois pontos principais: - 1, o volume de dados em profundidade é tão grande, está mudando a cada segundo, e a uma velocidade tão rápida, que o que vemos na realidade são apenas pedaços de dados. - 2, mesmo se fizermos dados reais de profundidade, não é possível simular com precisão um ambiente de ordem de pouca profundidade, porque o participante no retesting neste momento é apenas nós mesmos e não há outros participantes. Mas vamos considerar otimizar o que estiver mais próximo da realidade, obrigado por sugerir ^^

Andy2simplesOs dados profundos ainda não ocorreram e as curvas de preços ocorreram no passado. Os indivíduos acreditam que os dados do passado e do futuro juntos julgam os compras e vendas atuais de forma mais confiável. Recomenda-se fortemente que os dados profundos também sejam registrados.

Sonhos pequenosOs dados de profundidade são muito grandes. Se todos forem registrados, haverá muito. Portanto, os dados de profundidade, exceto o primeiro grau, são valores analógicos.

Sonhos pequenosrecords é uma variável usada para receber dados de linha K retornados pela função API GetRecords, length é a propriedade de comprimento de uma variável de tipo de arquivo no linguagem JS, representando o comprimento de um arquivo (ou seja, o número de elementos), depth é uma variável usada para receber dados de profundidade retornados pela função GetDepth, e a estrutura de dados dos records, depth e ticker pode ser encontrada na documentação API.

Sonhos pequenosO preço de venda, traduzido um pouco direto, é para comer um pouco mais um pouco de preço, mais fácil de negociar.