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

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

Autora:Inventor quantificado - sonho pequeno, 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?

Inventor quantificado - sonho pequenoSe 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.

Inventor quantificado - sonho pequenoNã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.

Inventor quantificado - sonho pequenoO blog do blogueiro e blogueiro de Facebook, Mark Zuckerberg, escreveu:

Inventor quantificado - sonho pequenoIsso 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.

Inventor quantificado - sonho pequenoO 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.

Inventor quantificado - sonho pequenoOs 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").

Inventor quantificado - sonho pequenoO 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.

Inventor quantificado - sonho pequenoA 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?

Inventor quantificado - sonho pequenoO 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).

Inventor quantificado - sonho pequenoEste 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.

Inventor quantificado - sonho pequenoNo começo, eu também me enganei.

Inventor quantificado - sonho pequenoBem, 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.

Inventor quantificado - sonho pequenoOs 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.

Inventor quantificado - sonho pequenorecords é 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.

Inventor quantificado - sonho pequenoO preço de venda, traduzido um pouco direto, é para comer um pouco mais um pouco de preço, mais fácil de negociar.