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.
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.
Interface de edição de estratégias
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.
A estratégia é executada instantaneamente e mostra uma informação de conta.
A partir daí, o Google mostrou-nos que podemos comparar as informações da conta com as do disco.
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访问过于频繁可是会拒绝访问的。
}
}
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.
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:
[{
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)).Veja abaixo um exemplo de gráfico de K-lines com ciclos de 5 minutos na plataforma. 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.
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.
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:
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.