Finalmente chegamos ao segundo capítulo, e depois de passar pelo capítulo anterior, devemos ter um pouco de conhecimento sobre as funções que os inventores quantificam.
Suponha que já tenhamos adicionado um host, um exchange, e uma plataforma de negociação, e, claro, podemos usar o Inventor Quantitative Simulation Disk para testar o código.
Então vamos começar criando uma estratégia, vamos chamá-la de teste 1.

Interface de edição de políticas

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 conhecido como teste 1, é uma estratégia chamada de teste 1 de ligação, usando o inventor para quantificar o teste de disco de simulação.

A estratégia foi executada instantaneamente e uma mensagem de conta foi exibida.

A partir daí, vamos comparar as informações das contas com as do disco simulado.

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:Pode ser que alguns colegas encontrem que o preço máximo e o preço mínimo dos dados obtidos pela função GetTicker são muito diferentes, o que significa que o High, Low dos dados de mercado retornados pelo GetTicker são os preços mais altos e mais baixos do período acordado pela bolsa, dependendo da configuração da bolsa. O teste acima é o inventor quantificar o disco simulado, o inventor quantificar o disco simulado é o preço máximo e mínimo do disco simulado até o momento em que o disco simulado começa a funcionar.
A descrição da documentação 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 指一天
Vamos escrever um código para testar e obter dados de linha K com um ciclo padrão de 5 minutos.
function main() {
Log(exchange.GetAccount()); // 已经知道怎么获取 主交易所 账户信息了
//下面我们来试试 不停的获取行情数据。
var records = exchanges[0].GetRecords(); // 按照默认周期获取K线数据
Log("records:", records); // 在日志中输出 获取到的K线数据。
}
Exibe a saída: records: [{“Time”:1478260200000,“Open”:4765.14,“High”:4773,“Low”:4764.54,“Close”:4769.47,“Volume”:5211.539999999999}, {“Time”:1478260500000,“Open”:4769.47,“High”:4773.01,“Low”:4764,“Close”:4764.78,“Volume”:3742.250000000002}, {“Time”:1478260800000,“Open”:4764.78,“High”:4782,“Low”:4764,“Close”:4781.28,“Volume”:7929.090000000004}, {“Time”:1478261100000,“Open”:4781.28,“High”:4795,“Low”:4774,“Close”:4792.02,“Volume”:11793.540000000006}, {“Time”:1478261400000,“Open”:4792.02,“High”:4792.96,“Low”:4781,“Close”:4786.78,“Volume”:9204.90000000001}, {“Time”:1478261700000,“Open”:4786.51,“High”:4788.66,“Low”:4775,“Close”:4775.31,“Volume”:7722.3399999999965}]
Pode-se ver que a variável records é uma estrutura de arrays, que são ordenadas em K-linear sequência de tempo, de distante (index 0) a próximo (index records.length - 1).
A propósito, vamos conhecer a linha K: ((alguns gráficos são vermelhos para o sol, verdes para o cinza, e outros são de cores opostas.))
Veja o gráfico de exemplo da linha K com um período de 5 minutos.
Perceber:Um ciclo de K linhas é definido quando o seu valor é definido. Em aplicações práticas, chamamos var records = exchanges[0].GetRecords(); retorna o último elemento da matriz de registros de dados, ou seja: records[records.length - 1] , que muda continuamente até que seu ciclo seja concluído. É possível até mesmo que, no último segundo, o sol e a lua mudem de lado.
A função GetRecords retorna dados de acordo com o período padrão definido pela política sem adicionar parâmetros. Também é possível inserir parâmetros para especificar o período da linha K. Atualmente, o sistema de retorno suporta o GetRecords para especificar períodos (retorna dados de acordo com o período padrão sem adicionar parâmetros), permitindo que diferentes períodos sejam usados ao mesmo tempo para a retrospecção da política.
GetDepth retorna uma estrutura de profundidade
function main() {
var depth = exchanges[0].GetDepth(); //获取市场深度信息, 返回订单薄信息,一个对象包含2个属性,每个属性是一个对象数组。
Log("depth:", depth); // 日志中输出,一下的输出是 整理过的格式,是方便读者理解,实际上是所有内容都在一行显示的。
}
A retrospectiva 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}]
}
O correspondente pedido de OKCoin é o seguinte ((aqui estão os dados reais da OKCoin)). Informações de profundidade do mercado no processo real ((o pedido de OKCoin) é variável rapidamente, os colegas interessados podem se inscrever na OKCoin e depois acessar para ver.

O que fazer com a informação de profundidade do mercado (dados de inventário)? Os dados de inventário são muito úteis, por exemplo, para comer (e, claro, para pendurar).
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()); // 显示买入后的 账户信息,对比初始账户信息。可以对比出 买入操作的成交的数量。
}
Resultados da simulação do inventor:
