[TOC] Este tutorial contém conhecimentos iniciais de redação de políticas, incluindo API introdução, revisão, gráficos, etc. Após aprender este tutorial básico, o usuário será capaz de usar com habilidade a API básica para escrever políticas de disco rígido. Antes de aprender este tutorial, é necessário aprender.Introdução à plataforma de quantificação do inventor FMZ 。
A versão antiga do tutorial:Inventor quantificação (FMZ.COM) estratégias escritas usando totalmente Manual 2.0 (Tutorial)Este tutorial lista muitos índices de postagens, recomendamos que você veja.
A negociação programática é a ligação de um programa através de uma API e de uma bolsa para realizar compras e vendas automáticas ou realizar outras funções de acordo com a intenção do projeto.
Atualmente, as trocas de moeda digital têm dois protocolos de interface principais: REST e Websocket. O protocolo REST é usado para obter dados uma vez por ano.
{"data:{"buy":"11351.73","high":"11595.77","last":"11351.85","low":"11118.45","open":"11358.74","quoteVol":"95995607137.00903936","sell":"11356.02","time":1565593489318,"vol":"3552.5153"}}
Isso permite que você veja a atualização do mercado de negociação com o BTC_USDT, que também pode mudar a cada atualização.market=
Em seguida, os parâmetros de transação específicos podem ser modificados para obter outros parâmetros de transação. Para interfaces públicas, como o mercado, todos podem acessá-las e, portanto, não é necessário verificar, enquanto que algumas interfaces, como o seguinte e o acesso à conta, exigem a identificação do usuário, que precisa ser assinado com o API-KEY. O Websocket é um modo de assinatura, após o envio do conteúdo que precisa de assinatura, o exchange envia dados atualizados para o programa, sem precisar re-acessar cada vez, por isso é mais eficiente.
A plataforma de negociação quantitativa FMZ envolve as interfaces REST de todas as bolsas, usando um formato de chamadas e dados unificado para tornar a redação de políticas mais simples e universal. O suporte do Websocket é muito conveniente na plataforma FMZ, que será apresentado em detalhes no próximo tutorial.
A maioria dos documentos da plataforma FMZ API são baseados em JavaScript, mas, devido ao pacote, as diferentes línguas não diferem muito, basta prestar atenção aos problemas de gramática. C ++ é um pouco especial, e os tutoriais posteriores terão uma introdução especializada. Como o Js é mais simples e sem problemas de compatibilidade, recomenda-se que os iniciantes usem. A plataforma FMZ quantifica o uso do Python completo, com vários pacotes de instalação livres, recomendando um uso de uma certa base de programação.
Como o Python tem versões diferentes, pode ser especificado no início do programa, como:#!Python2
,#!Python3
Nota: O JavaScript recentemente atualizou a sintaxe para o ES6, o que é interessante de saber. Abaixo, o código Python e Javascript são mostrados para executar as mesmas funções, apenas com diferenças de sintaxe, portanto, a documentação da API só fornece exemplos de Javascript, e este tutorial também considera casos especiais de uso do Python.
#python代码
def main():
while True:
Log(exchange.GetAccount().Balance)
Sleep(2000)
#相应的Js代码
function main(){
while(true){
Log(exchange.GetAccount().Balance)
Sleep(2000)
}
}
O FMZ Quantum Platform fornece ferramentas de depuração para interfaces de API de depuração.https://www.fmz.com/m/debugO debugger só suporta JavaScript e só pode ser executado por um período de tempo, sem a necessidade de criar um disco físico. Os dados de retorno serão devolvidos como resultados, o código do debugger não será guardado.
O programa de política, como um programa normal, é executado em ordem de código, com a particularidade de que deve haver uma função principal. Uma vez que a política precisa ser executada sem interrupção, geralmente é necessário um ciclo e um tempo de repouso. Uma vez que a freqüência de acesso a todas as APIs de transações é limitada, é necessário ajustar o tempo de repouso correspondente. Esta arquitetura é uma execução típica de intervalo fixo.
Outras funções com funções especiais são:
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//在这里写策略逻辑,将会每6s调用一次
}
function main(){
while(true){
onTick()
Sleep(6000)
}
}
O exemplo anterior mostra que, se um erro de acesso à rede causar o término direto da política, se você quiser uma política semelhante ao reinicio automático que não pare, você pode usar a política de disco real try catch para permitir o ciclo de erro do mestre (revisão não usar try).
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//在这里写策略逻辑,将会每6s调用一次
}
function main(){
try{
while(true){
onTick()
Sleep(6000)
}
}catch(err){
Log(err)
}
}
Quando se invoca qualquer API relacionada a um exchange, é necessário especificar o exchange e o par de transações.exchange
O que é que isso significa?exchange.GetTicker()
O que será obtido será o ticker de transação da troca - o par de transações.
A plataforma FMZ suporta a adição simultânea de vários pares de trocas, como BTC e ETH que podem ser operados simultaneamente na mesma conta de câmbio, ou BTC e ETH que podem ser operados simultaneamente na mesma conta de câmbio.exchanges
Os arquivos são representados pela ordem em que foram criados.exchanges[0]
、exchanges[1]
... e assim por diante.BTC_USDT
O primeiro é o BTC, que é a moeda de troca, e o USDT, que é a moeda de preço.
Obviamente, se estivermos operando muitos pares de transações, isso vai ser um problema, então você pode trocar pares de transações com SetCurrency.exchange.SetCurrency("BTC_USDT")
A partir de agora,exchange
Os pares de transações ligados mudam paraBTC_USDT
A primeira é que o sistema de transferência de dados do banco de dados de um país para outro não é mais válido.Observe que o teste de retrospecção mais recente suporta pares de transações de comutação.A seguir, um exemplo concreto.
var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"]
var buyValue = 1000
function main(){
for(var i=0;i<symbols.length;i++){
exchange.SetCurrency(symbols[i])
var ticker = exchange.GetTicker()
var amount = _N(buyValue/ticker.Sell, 3)
exchange.Buy(ticker.Sell, amount)
Sleep(1000)
}
}
Como mencionado anteriormente, as interfaces de mercado são geralmente interfaces públicas e acessíveis a todos. As interfaces de mercado comuns incluem: obter tickers de mercado, obter profundidade de profundidade, obter registros de linha K, obter registros de transações.
O que é uma interface?Info
Um campo, que representa uma string de dados original retornada pelo exchange, pode ser usado para complementar informações adicionais que precisam ser analisadas antes, usando JavaScriptJSON.parse()
O Python usa a json library.Time
Os campos indicam o horário da solicitação e podem ser usados para determinar o atraso.
É possível que o acesso falhe e retorne usando uma interface de API no disco real.null
Python está de volta.None
O uso dos dados que estão nele pode causar erros e fazer com que o disco esteja parado, por isso é muito importante tolerá-los.
Obter informações sobre o mercado atual, provavelmente a interface mais utilizada, pode ver o preço do último negócio, o preço de compra e venda, o volume de negócios mais recente e outros. O preço do negócio pode ser determinado com base na informação do ticker antes de fazer o pedido.{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}
。
function main() {
var ticker = exchange.GetTicker()
Log(ticker) //在调试工具中 return ticker 。可以看到具体的结果。
Log('上次成交价: ',ticker.Last, '买一价: ', ticker.Buy)
}
Obtenha informações de profundidade do listado. Embora o GetTicker contenha um listado de compra e venda, se você quiser consultar um listado mais profundo, você pode usar essa interface para geralmente encontrar os 200 listados acima e abaixo. Você pode usar essa interface para calcular o preço de choque. Abaixo está um resultado de retorno real.
{
"Info":null,
"Asks":[
{"Price":5866.38,"Amount":0.068644},
{"Price":5866.39,"Amount":0.263985},
......
]
"Bids":[
{"Price":5865.13,"Amount":0.001898},
{"Price":5865,"Amount":0.085575},
......
],
"Time":1530241857399
}
Exemplos de compras e vendas com acesso profundo:
function main() {
var depth = exchange.GetDepth()
Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price)
}
Obter K-line, uma das interfaces mais usadas, que pode retornar informações de preços por um longo período de tempo, calculado com base em vários indicadores. K-line ciclo, se não for especificado, indica o período padrão que será usado quando o disco real é adicionado. K-line comprimento não pode ser especificado, o que aumenta com o tempo de acumulação, até 2000 bits, a primeira chamada de cerca de 200 bits ((diferentes trocas retornam diferentes); A última K-line é a mais recente K-line, por isso os dados vão mudar constantemente com a evolução, a primeira K-line é o mais antigo de dados.
exchange.SetMaxBarLen(Len)
Pode ser definido o número de linhas K obtidas pela primeira vez (suportadas por algumas bolsas) e o número máximo de linhas K é definido.Por exemplo:exchange.SetMaxBarLen(500)
GetRecords pode especificar períodos: PERIOD_M1:1 minutos, PERIOD_M5:5 minutos, PERIOD_M15:15 minutos, PERIOD_M30:30 minutos, PERIOD_H1:1 horas, PERIOD_D1:1 dias.exchange.GetRecords(PERIOD_M1)
Os administradores mais recentes são atualizados para suportar ciclos personalizados, com o número de segundos de ciclos sendo transmitidos diretamente como parâmetros, com a configuração de nível de minuto sendo sintetizada com base na linha K de 1 minuto e a linha K de menos de 1 minuto sendo sintetizada através do GetTrades (), com os futuros de commodities sendo sintetizados com base no tick.E, por isso, não se esqueça de que você pode encontrar algo semelhante em outros tutoriais.PERIOD_M1
Essas variáveis são escritas em maiúsculas, elas são variáveis globais padrão do FMZ, e os interessados podem registrar seus próprios valores específicos e usá-los diretamente.
Exemplos de dados de retorno:
[
{"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432},
{"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935},
{"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361},
......
]
Exemplo de linha K:
function main(){
var close = []
var records = exchange.GetRecords(PERIOD_H1)
Log('total bars: ', records.length)
for(var i=0;i<records.length;i++){
close.push(records[i].Close)
}
return close
}
Obter dados de transações de um determinado período de tempo (não seus próprios dados de transações) não é suportado por algumas bolsas.
Essas interfaces não podem ser acessadas diretamente porque estão relacionadas a contas e requerem a assinatura API-KEY. A plataforma FMZ já tratou a unificação automática em segundo plano e pode ser usada diretamente.
Obtenção de informações de conta. Uma das interfaces mais usadas, que precisa ser chamada antes de fazer o pedido, para evitar um saldo insuficiente. Retorna resultados como:{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}
Os stocks são os saldos disponíveis da moeda negociada, os frozen stocks são os saldos congelados das ordens pendentes, os balance são os saldos disponíveis da moeda de preço e os frozen balance são os saldos congelados da moeda negociada.BTC_USDT
O Bitcoin é o Bitcoin, o Bitcoin é o Bitcoin, o Bitcoin é o Bitcoin, e o Bitcoin é o Bitcoin.
Observe que os resultados de retorno são os resultados de um par de transações especificado, com informações de outras moedas na conta de transação no campo de informações, para operar vários pares de transações sem precisar de várias chamadas.
O que é um disco físico que continua a imprimir o valor total das transações atuais:
function main(){
while(true){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
var price = ticker.Buy
var stocks = account.Stocks + account.FrozenStocks
var balance = account.Balance + account.FrozenBalance
var value = stocks*price + balance
Log('Account value is: ', value)
LogProfit(value)
Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
//when run in debug tool, add a break here
}
}
O que é que você está fazendo?exchange.Buy(Price, Amount)
Ouexchange.Buy(Price, Amount, Msg)
,Price é o preço,Amount é a quantidade,Msg é uma string adicional que pode ser exibida no registro do disco real, não é obrigatório.null
O Google Maps é usado para consultar o status das encomendas.
Se você quiser fazer uma compra a preço de mercado, o Price é -1, o Amount é o valor da compra, como:exchange.Buy(-1, 0.5)
O negócio é certo.ETH_BTC
O ETH é comprado pelo preço de mercado de 0,5 BTC; algumas bolsas não suportam a lista de preços, nem a revisão de futuros.
Os requisitos de precisão de todos os preços e quantidades de transações são disponíveis_N()
A função de precisão para controlar. Para a negociação de futuros, Buy e Sell têm outros significados, que serão apresentados separadamente.
O que você pode fazer é comprar o que você quer, mas você não pode comprar o que você quer.
function main(){
while(true){
var ticker = exchange.GetTicker()
var price = ticker.Sell
if(price >= 7000){
exchange.Buy(_N(price+5,2), 1, 'BTC-USDT')
break
}
Sleep(3000)//Sleep 3000ms
}
Log('done')
}
Os parâmetros de venda abaixo e venda abaixo são os mesmos.exchange.Sell(-1, 0.2)
O preço de venda é de 0,2 ETH, representando o preço do mercado.
Obter informações de pedidos com base no ID do pedido.exchange.GetOrder(OrderId)
O ID da ordem é o id da encomenda, que é devolvido no momento da encomenda.Atenção ao tipo de pedidoType
Campo e estado da encomendaStatus
Os valores reais são números e representam diferentes significados, mas prejudicam a memória. A FMZ usa constantes globais para representar esses valores, como os de pedidos pendentes.Status
E isso é igual a 0.ORDER_STATE_PENDING
Todos esses constantes globais podem ser vistos na documentação.↑ Retorna resultados:
{
"Id":125723661, //订单id
"Amount":0.01, //订单数量
"Price":7000, //订单价格
"DealAmount":0, //已成交数量
"AvgPrice":0, //成交均价
"Status":0, // 0:未完全成交, 1:已成交, 2:已撤单
"Type":1,// 订单类型,0:买单, 1:卖单
"ContractType":"",//合约类型,用于期货交易
"Info":{} //交易所返回原始信息
}
}
Uma estratégia para comprar uma quantidade específica de moedas:
function main(){
while(true){
var amount = exchange.GetAccount().Stocks
var ticker = exchange.GetTicker()
var id = null
if(5-amount>0.01){
id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2))
}else{
Log('Job completed')
return //return the main function, bot will stop
}
Sleep(3000) //Sleep 3000ms
if(id){
var status = exchange.GetOrder(id).Status
if(status == 0){ //这里也可以用 status == ORDER_STATE_PENDING 来判断。
exchange.CancelOrder(id)
}
}
}
}
Obter a lista de transações atuais para todas as ordens pendentes. Se não houver ordens pendentes, retornar a matriz em branco. Resultados específicos da lista de ordens, como GetOrder.
Exemplo de cancelamento de transações atuais para todos os pedidos:
function CancelAll(){
var orders = exchange.GetOrders()
for(var i=0;i<orders.length;i++){
exchange.CancelOrder(orders[i].Id) // cancel order by orderID
}
}
function main(){
CancelAll()
while(true){
//do something
Sleep(10000)
}
}
O pedido foi cancelado com base no id da encomenda.exchange.CancelOrder(OrderId)
Não é possível fazer a transação. Não é possível fazer a transação. Não é possível fazer a transação.
A negociação de futuros de moeda digital é diferente da negociação em tempo real, as funções de negociação em tempo real acima também se aplicam aos futuros, a negociação de futuros únicos tem funções exclusivas. Antes de realizar negociações programadas de futuros de moeda digital, é necessário familiarizar-se com os manuais no site, entender os conceitos básicos, como o abertura, o equilíbrio, o total, o posicionamento, o alavancagem, o equilíbrio, os ganhos e perdas flutuantes, o valor garantido e as fórmulas de cálculo correspondentes. Os tutoriais relacionados podem ser encontrados em todas as bolsas de futuros e precisam ser aprendidos.
Os contratos de perpetuidade e de futuros são semelhantes, mas não possuem o conceito de vários espaços simultaneamente.
Se o exchange suportar simultaneamente futuros de mercado, como o OKEX e o Huobi, é necessário selecionar separadamente no interface do exchange para adicionar a caixa de futuros OKEX e a caixa de futuros Huobi, sendo o FMZ considerado como um mercado diferente do mercado de mercado.
O primeiro passo da negociação de futuros é configurar o contrato a ser negociado, como o OKEX Futures. Ao criar um disco real ou um retrospecto, selecione um par de negociações em BTC, que também precisa ser definido no código como contrato da semana, da próxima semana ou do trimestre.invalid contract type
。Diferentemente do comércio em tempo real, os contratos de futuros costumam ser negociados com moedas como o BTC como garantia, e os pacotes de negociação com adição de BTC geralmente representam o BTC_USD. Se houver um futuro com USDT como garantia, será necessário criar um par de negociações em tempo real com adição de BTC_USDT.Após a configuração do par de negociação, também é necessário definir o tipo de contrato específico, como permanente, semana, semana seguinte, etc. Após a configuração do contrato, as operações de aquisição, compra e venda podem ser realizadas.
Os contratos existentes em Bitcoin, OKEX, HuobiDM e outros em USDT precisam ser distinguidos quando se adiciona um contrato de configuração em disco real.
//OKEX期货
exchange.SetContractType("swap") // 设置为永续合约
exchange.SetContractType("this_week") // 设置为当周合约
exchange.SetContractType("next_week") // 设置为次周合约
exchange.SetContractType("quarter") // 设置为季度合约
//HuobiDM
exchange.SetContractType("this_week") // 设置为当周合约
exchange.SetContractType("next_week") // 设置为次周合约
exchange.SetContractType("quarter") // 设置为季度合约
exchange.SetContractType("swap") // 设置为永续合约
//币安期货
exchange.SetContractType("swap") // 设置为永续合约,注意币本位和USDT本位都存在永续
exchange.SetContractType("quarter") // 设置为当季合约
exchange.SetContractType("next_quarter") // 设置为次季合约
//BitMEX
exchange.SetContractType("XBTUSD") // 设置为永续合约
exchange.SetContractType("XBTM19") // 具体某个时间结算的合约,详情登录BitMEX查询各个合约代码
//GateIO
exchange.SetContractType("swap") // 设置为永续合约,不设置默认为swap永续合约。
//Deribit
exchange.SetContractType("BTC-27APR18") // 具体某个时间结算的合约,详情参看Deribit官网。
Para obter a lista de informações sobre o estoque atual, os futuros OKEX ((OKCOIN) podem ser transmitidos por um parâmetro que especifica o tipo de contrato a ser adquirido. Se não houver estoque, retorne a lista em branco[]
A informação sobre a detenção é devolvida como segue: há muita informação específica, que precisa ser combinada com a análise de transações específicas.
Tipo de dados | Nome da variável | Explicação |
---|---|---|
Objeto | Informações | A estrutura original da casa de câmbio |
Número | Nível de margem | O tamanho da alavanca, OKCoin é de 10 ou 20, o modelo de todo o estoque de futuros OK retorna a 10 fixo, porque a API nativa não suporta |
Número | Montante | Volume de estoque, OKCoin indica a quantidade de contratos (inteiro e maior que 1) |
Número | Número congelado | Quantidade de congelamento |
Número | Preço | Preço médio |
Número | Margem | Congelamento de garantias |
Número | Lucro | Futuros de commodities: ganhos e perdas no mercado de ações, moeda digital: ((Unidade de moeda digital: BTC/LTC, unidade de ações tradicionais: RMB, nota: OKCoin futures referem-se a realização de um excedente no caso de ações completas, não ganhos e perdas no mercado de ações, mas ganhos e perdas em ações) |
const | Tipo | PD_LONG para posições de várias posições (paradas com closebuy_today no CTP), PD_SHORT para posições de vazio (paradas com closeesell_today no CTP), PD_LONG_YD para posições de várias posições de ontem (paradas com closebuy no CTP), PD_SHORT_YD para posições de vazio de ontem (paradas com closeesell no CTP) |
cordel | Tipo de contrato | Futuros de mercadorias como código de contrato, ações como código de bolsa de barras _ código de ações como código de barras, tipo de entrada de parâmetros específicos SetContractType |
function main(){
exchange.SetContractType("this_week");
var position = exchange.GetPosition();
if(position.length>0){ //特别要注意引用前要先判断position长度再引用,否则会出错
Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType)
}
}
A primeira coisa que você precisa fazer é definir o tamanho da alavanca e como chamá-la:exchange.SetMarginLevel(10)
O número 10 representa 10 vezes a alavancagem, o tamanho de alavancagem especificamente suportado.Observe que a alavancagem deve ser definida em uma bolsa de valores e deve estar de acordo com a configuração da bolsa de valores no código, caso contrário, haverá erros.Também pode ser desativado, usando a alavanca padrão.
A partir daí, você pode configurar o endereço da transação e o modo de chamada:exchange.SetDirection(Direction)
, Corresponde ao equilíbrio de posições abertas, ** Diferente dos futuros, se o contrato permanente não tiver o conceito de multi-vazio simultâneo, ou seja, não permitir a detenção de um único posicionamento, fazer mais tempo aberto será automaticamente o equilíbrio de várias posições, tudo só precisa de ser definidobuy
esell
Sim. Se você tiver suporte para armazenamento bidirecional, você precisará configurarclosebuy
,closebuy
◦** Relações específicas:
Operação | Parâmetros do SetDirection | Funções subordenais |
---|---|---|
Mais do que o suficiente | troca.Configurar direcção (( |
troca.Comprar() |
Quantidade de armazéns | troca.SetDirection (( |
Troca.Venda. |
Armazém vazio | troca.SetDirection (( |
Troca.Venda. |
Armazém vazio | troca.SetDirection (( |
troca.Comprar() |
Por fim, o código de liquidação de negociação é específico, o qual varia de acordo com a quantidade de transações, como os futuros huobi por número de páginas, uma página de US $ 100; note que a revisão de futuros não suporta a lista de preços de mercado.
function main(){
exchange.SetContractType("this_week") // 举例设置 为OKEX期货 当周合约
price = exchange.GetTicker().Last
exchange.SetMarginLevel(10) //设置杠杆为10倍
exchange.SetDirection("buy") //设置下单类型为做多
exchange.Buy(price+10, 20) // 合约数量为20下单
pos = exchange.GetPosition()
Log(pos)
Log(exchange.GetOrders()) //查看是否有未成交订单
exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")
exchange.Sell(price-10, 20)
}
Abaixo, um exemplo concreto de uma estratégia de toda a parceria.
function main(){
while(true){
var pos = exchange.GetPosition()
var ticker = exchange.GetTicekr()
if(!ticker){
Log('无法获取ticker')
return
}
if(!pos || pos.length == 0 ){
Log('已无持仓')
return
}
for(var i=0;i<pos.length;i++){
if(pos[i].Type == PD_LONG){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closebuy')
exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
}
if(pos[i].Type == PD_SHORT){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closesell')
exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
}
}
var orders = exchange.Getorders()
Sleep(500)
for(var j=0;j<orders.length;j++){
if(orders[i].Status == ORDER_STATE_PENDING){
exchange.CancelOrder(orders[i].Id)
}
}
}
}
A transação é executada através de um sistema de negociação de moeda única, que é o mesmo que uma transação em dinheiro.
Utilizaçãoexchange.IO("trade_margin") muda para o modo da conta de câmbio, fazendo o pedido e obtendo o ativo da conta que acessa a interface de alavancagem da bolsa. Utilizaçãoexchange.IO("trade_normal") muda para o modo de conta normal.
As trocas suportadas:
A negociação de futuros de commodities e a negociação de futuros de moeda digital são muito diferentes. Primeiro, os futuros de commodities são de curta duração e a moeda digital é negociada 24h; o protocolo de futuros de commodities também não é a API REST comumente usada; a freqüência de negociação de futuros de commodities e o número de pedidos pendurados são limitados, enquanto as moedas digitais são amplos, etc. Por isso, os futuros de commodities de negociação têm muitas áreas que requerem atenção especial, recomendando uma ampla experiência de operação manual.https://www.fmz.com/bbs-topic/325A empresa de futuros de commodities acrescentou:https://www.fmz.com/bbs-topic/371
Os futuros de commodities e em junho de 2019 implementaram a regulação do look-through, o que permite que os futuros de usuários individuais procedem para solicitar o código de autorização (o modelo de informações requeridas para o pedido específico pode ser enviado no grupo de WeChat ou no grupo QQ), geralmente levando 4-5 dias, os passos são mais pesados. A plataforma FMZ Quantum é um provedor de negociação procedimentada que solicita o código de autorização do software para cada servidor de futuros, que os usuários podem usar diretamente sem precisar solicitar.https://www.fmz.com/bbs-topic/3860O FMZ tem uma profunda relação de parceria com alguns servidores, como o Futures da Macroprodução da Caixa Econômica Federal, que comprou a versão institucional da plataforma FMZ, que pode ser usada pelos usuários, que se tornam automaticamente VIPs e que reduzem os custos de processamento.https://www.fmz.com/bbs-topic/506 。
Devido às vantagens da arquitetura da plataforma FMZ, os usuários também podem adicionar várias contas de futuristas e realizar algumas funcionalidades que outros softwares de negociação programada de futuros de commodities não conseguem realizar, como a síntese de ticks de alta frequência.https://www.fmz.com/bbs-topic/1184
Em primeiro lugar, como não é uma transação de 24 horas e requer operações de login, é necessário determinar o status do link antes de realizar a transação.exchange.IO("status")
Paratrue
O botão de login não é sugerido. Pode ser usado após o início da política Sleep ((2000), dando um certo tempo para o login. Também é possível tentar a subscrição novamente._C(exchange.SetContractType,"MA888")
A partir daí, a tripulação começou a desembarcar.
A aquisição e o código de negociação do mercado de futuros de commodities são os mesmos que os futuros de moeda digital. Aqui serão apresentadas as diferenças e os pontos a serem considerados.
function main(){
_C(exchange.SetContractType,"MA888") //没登陆成功是无法订阅合约的,最好重试一下
while(true){
if(exchange.IO("status")){
var ticker = exchange.GetTicker()
Log("MA888 ticker:", ticker)
LogStatus(_D(), "已经连接CTP !")//_D获取事件
} else {
LogStatus(_D(), "未连接CTP !")
Sleep(1000)
}
}
}
Recomenda-se o uso de commodity futures library trading (mais abaixo), quando o código é muito simples e não precisa de detalhes pesados.https://www.fmz.com/strategy/57029
function main() {
// 使用了商品期货类库的CTA策略框架
$.CTA(Symbols, function(st) {
var r = st.records
var mp = st.position.amount
var symbol = st.symbol
/*
r为K线, mp为当前品种持仓数量, 正数指多仓, 负数指空仓, 0则不持仓, symbol指品种名称
返回值如为n:
n = 0 : 指全部平仓(不管当前持多持空)
n > 0 : 如果当前持多仓,则加n个多仓, 如果当前为空仓则平n个空仓,如果n大于当前持仓, 则反手开多仓
n < 0 : 如果当前持空仓,则加n个空仓, 如果当前为多仓则平n个多仓,如果-n大于当前持仓, 则反手开空仓
无返回值表示什么也不做
*/
if (r.length < SlowPeriod) {
return
}
var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
if (mp <= 0 && cross > ConfirmPeriod) {
Log(symbol, "金叉周期", cross, "当前持仓", mp);
return Lots * (mp < 0 ? 2 : 1)
} else if (mp >= 0 && cross < -ConfirmPeriod) {
Log(symbol, "死叉周期", cross, "当前持仓", mp);
return -Lots * (mp > 0 ? 2 : 1)
}
});
}
Os futuros de commodities usam o protocolo CTP, em que todos os mercados e transações de pedidos são notificados somente após a mudança, enquanto os pedidos de consulta, contas e detenções são consultas ativas. Portanto, adequado para políticas de alta frequência orientadas a eventos.GetTicker
、GetDepth
、GetRecords
Todos os dados são armazenados em cache para obter os dados mais recentes, e quando não há dados, eles esperam até que haja dados, então a estratégia pode não usar o sono. Quando há mudanças no mercado, os tickers, profundidades e registros são atualizados, em que qualquer interface chamada é imediatamente devolvida, o estado da interface chamada é colocado em modo de atualização de espera, e a próxima chamada da mesma interface é esperada até que novos dados sejam devolvidos.
Se você quiser ter acesso a cada transação, mesmo os dados antigos, você pode mudar para o modo de atualização instantânea do mercado.exchange.IO("mode", 0)
Nesta altura, as políticas não podem ser escritas como event-driven e é necessário adicionar um evento Sleep, evitando um ciclo morto rápido. Algumas políticas de baixa frequência podem usar esse padrão, que é simples de usar.exchange.IO("mode", 1)
O modo de cache padrão pode ser desativado.
O modo padrão pode ser usado quando um único contrato é operado. Mas se há vários contratos, é possível que um contrato não atualize o mercado, resultando em bloqueios na interface de acesso ao mercado e outros contratos não possam ser atualizados. Para resolver esse problema, o modo de atualização imediata pode ser usado, mas não é conveniente escrever uma política de alta frequência.exchange.IO("wait")
O que é raro em futuros de commodities, pode ser usado se forem adicionados vários objetos de câmbio.exchange.IO("wait_any")
O índice retornado indica o índice da bolsa retornado.
O que é que ele está a fazer?{Event:"tick", Index:交易所索引(按实盘上交易所添加顺序), Nano:事件纳秒级时间, Symbol:合约名称}
Envio de pedidos:{Event:"order", Index:交易所索引, Nano:事件纳秒级时间, Order:订单信息(与GetOrder获取一致)}
A estrutura estratégica pode ser escrita como:
function on_tick(symbol){
Log("symbol update")
exchange.SetContractType(symbol)
Log(exchange.GetTicker())
}
function on_order(order){
Log("order update", order)
}
function main(){
while(true){
if(exchange.IO("status")){ //判断链接状态
exchange.IO("mode", 0)
_C(exchange.SetContractType, "MA888")//订阅MA,只有第一次是真正的发出订阅请求,接下来都是程序切换,不耗时间。
_C(exchange.SetContractType, "rb888")//订阅rb
while(true){
var e = exchange.IO("wait")
if(e){
if(e.event == "tick"){
on_tick(e.Symbol)
}else if(e.event == "order"){
on_order(e.Order)
}
}
}
}else{
Sleep(10*1000)
}
}
}
Também é importante notar a diferença entre os futuros de commodities e os mercados de moeda digital. Como o GetDepth, que na verdade tem apenas um arquivo de profundidade (a taxa de profundidade de 5 arquivos é cara), o GetTrades também não tem acesso ao histórico de transações (todos simulados com base em variações de posições, sem registros reais de transações). Os futuros de commodities têm um limite de queda e queda, quando estão parados, o preço de venda de um pedido de venda profunda é o preço de parada, o volume de pedidos é 0, quando estão parados, o preço de compra é o preço de queda, o volume de pedidos é 0.
exchange.IO("instruments"): Retorna a lista de todos os contratos do exchange em formato dicionário {Nome do contrato: detalhes}, apenas com suporte a disco físico.exchange.IO("products"): Retorna a lista de todos os produtos da bolsa {nome do produto: detalhes} no formato do dicionário, somente com suporte ao disco físico.exchange.IO("subscribed"): retorna contratos que já foram subscritos no mercado, no mesmo formato e somente com suporte a discos reais.
Os futuros tradicionais do CTPContractType
O ID do contrato é o nome do contrato, e é separado pela letra maiúscula.exchange.SetContractType("au1506")
O contrato retorna detalhes do contrato após a configuração bem-sucedida, como quantidade de compra mínima, taxas de manutenção, tempo de entrega, etc. Quando se assinam vários contratos, somente a primeira vez é enviado o pedido de assinatura real, e depois é apenas trocado o par no nível do código, sem gastar tempo. O contrato principal é o código 888 como MA888, o contrato de índice contínuo é 000 como MA000, 888 e 000 só suportam retrospecção para transações de contratos virtuais, o disco físico só suporta a aquisição de transações.No entanto, a linguagem mac pode operar um contrato principal, o qual é automaticamente trocado, ou seja, o que significa que a posição não-principal é eliminada e uma nova posição é aberta em cima da posição principal.
Não é possível configurar o contrato sem o login, mas também é devolvido imediatamente, então você pode tentar novamente com o _C, sabendo que o login do CTP foi feito.
SetDirection
A direção pode serbuy, closebuy, sell, closesell
Quatro parâmetros, mais commodity futuresclosebuy_today
eclosesell_today
A ideia é que a maioria dos blogueiros não tenha conhecimento do assunto, mas sim do que está acontecendo.closebuy/closesell
Para o mercado de futuros, somente a variedade do período anterior pode afetar os custos, portanto, é necessário priorizar o mercado de futuros. Para os futuros tradicionais do CTP, o segundo parâmetro pode ser definido como 1 ou 2 ou 3, respectivamente, para o mercado de especulação, para o setor de lucro, para o setor de segurança, sem definir especulação por defeito.As operações específicas de compra, venda, aquisição de posições, aquisição de ordens, levantamento e aquisição de contas são as mesmas que as transações de futuros de moeda digital.
Operação | Parâmetros do SetDirection | Funções subordenais |
---|---|---|
Mais do que o suficiente | troca.Configurar direcção (( |
troca.Comprar() |
Quantidade de armazéns | troca.SetDirection (( |
Troca.Venda. |
Armazém vazio | troca.SetDirection (( |
Troca.Venda. |
Armazém vazio | troca.SetDirection (( |
troca.Comprar() |
O exemplo abaixo é uma função de liquidação específica. Note que o exemplo é muito simples, mas considere uma série de questões, como se estiver no momento da negociação, como fazer uma tentativa de reencaminhamento de um pedido incompleto, qual é o volume máximo de encomendas, se a frequência é muito alta, se o preço está deslizando ou se está liquidado.A plataforma recomendou que os operadores usem um banco de dados bem encapsulado.https://www.fmz.com/strategy/12961O artigo é muito interessante, mas não é uma boa idéia.
function Cover(contractType, amount, slide) {
for (var i = 0; i < positions.length; i++) {
if (positions[i].ContractType != contractType) {
continue;
}
var depth = _C(e.GetDepth);
if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) {
exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy");
exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "平今" : "平昨", 'Bid', depth.Bids[0]);
} else {
exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell");
exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "平今" : "平昨", 'Ask', depth.Asks[0]);
}
}
}
Os futuros de commodities suportam tipos de ordens personalizados (suportados por disco real, não suportados por retrô), especificados como subalternos, adicionados após o subalterno, por exemplo.
exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")
O que acontece é que as pessoas não querem saber.
Por padrão, os negociantes de commodities futuros são abertos pela interface CTP, que pode ser alterada para a interface Easy Transaction, se necessário. Através do FMZ, o envelope e o modo de chamada são os mesmos. A diferença é que a conta, a ordem e o armazenamento são de modo push, de modo que o administrador mantém os dados localmente e retornará imediatamente quando a interface correspondente for chamada, sem efetivamente emitir solicitações.
Os tipos de pedidos personalizados do protocolo do Ease of Doing são:
Em uma interface de disco real, um log, depois de uma string com o caracter @, a mensagem é enviada para a fila de push e é enviada diretamente depois de ser vinculada a WeChat ou Telegram.Log('推送到微信@')
A cor dos logs também pode ser personalizadaLog('这是一个红色字体的日志 #ff0000')
。#ff0000
Para a representação de 16 cores RGB
Todos os arquivos de log estão no banco de dados sqlit no disco físico do diretório onde o administrador está localizado, e podem ser baixados e abertos com o software do banco de dados, ou podem ser usados para copiar e restaurar o backup (o mesmo nome do banco de dados e o id do disco físico).
Regista os ganhos e traça uma curva de ganhos na interface do disco, que pode ser mantida após o reinicio do disco.LogProfit(1000)
Atenção.LogProfit
Os parâmetros não são necessariamente ganhos, mas podem ser qualquer número que precisa ser preenchido.
Disco físico, como o log é salvo e constantemente atualizado, pode ser usado se você precisar de uma informação que só seja exibida sem ser salva.LogStatus
Função.LogStatus
Os parâmetros são strings, que também podem ser usados para representar informações de uma tabela.
Um exemplo de uma tabela de exibição de um local de estado de disco real específico:
var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table) + '`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格)
LogStatus('第一行消息\n`' + JSON.stringify(table) + '`\n第三行消息'); // 表格信息也可以在多行中出现
LogStatus('`' + JSON.stringify([table, table]) + '`'); // 支持多个表格同时显示, 将以TAB显示到一组里
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // 上下排列显示多个表
Os parâmetros são milissegundos, comoSleep(1000)
Para um segundo de hibernação. Uma vez que a freqüência de acesso de todas as transações é limitada, a estratégia geral é incluir o tempo de hibernação no ciclo morto.
Quando o disco rígido é reiniciado, o programa é reiniciado, e se você quiser salvar alguma informação duradoura, você pode usar o botão de segurança._G
O JSON é muito fácil de usar e pode ser usado para guardar conteúdo sequenciado em JSON._G
A função está escrita emonexit()
A política é uma ferramenta que permite que o usuário tenha acesso a informações que precisam ser guardadas automaticamente quando a política é interrompida.
Se você quiser guardar mais dados de formatação, a função _G não é muito útil e pode ser escrita diretamente no banco de dados usando o Python.
function onexit(){
_G('profit', profit)
}
function main(){
_G("num", 1); // 设置一个全局变量num, 值为1 s
_G("num", "ok"); // 更改一个全局变量num, 值为字符串ok
_G("num", null); // 删除全局变量 num
_G("num"); // 返回全局变量num的值,如果不存在返回null
var profit = 0
if(_G('profit')){
profit = _G('profit')
}
}
Na hora de fazer um pedido, muitas vezes para controlar a precisão de preço e quantidade, o FMZ tem a função_N embutida, que determina os dígitos decimais a serem guardados, como:_N(4.253,2)
O resultado é 4.25.
A API de chamadas de exchanges é que não há garantia de sucesso de cada acesso. _C é uma função que tenta novamente automaticamente._C(exchange.GetTicker)
, o intervalo de reexame por padrão é de 3 segundos, pode ser chamado para controlar o intervalo de reexame com a função _CDelay, por exemplo, _CDelay ((1000), o que significa mudar o intervalo de reexame da função _C para 1 segundo, recomendado.GetTicker()
,exchange.GetDepth
,GetTrade
,GetRecords
,GetAccount
,GetOrders
, GetOrder
Todos os programas são com_C, para evitar que o acesso falhe causando interrupções.
CancelOrder
Não é possível usar a função _C, porque há várias razões para o fracasso do pedido. Se uma encomenda já foi transacionada, o pedido voltará a falhar e o uso da função _C resultará em repetidas tentativas.
A função _C também pode ser usada para passar parâmetros e também é usada para funções personalizadas.
function main(){
var ticker = _C(exchange.GetTicker)
var depth = _C(exchange.GetDepth)
var records = _C(exchange.GetRecords, PERIOD_D1) //传入参数
}
Chamadas diretas_D()
Retorna uma cadeia de tempo atual, como:2019-08-15 03:46:14
O tempo de repetição é devolvido se for chamado de repetição. O tempo pode ser determinado com a função _D, como:_D().slice(11) > '09:00:00':
_D(timestamp,fmt)
, o que transforma o cronograma do ms em uma string de tempo, como_D(1565855310002)
O parâmetro fmt é o formato do tempo, por defeito.yyyy-MM-dd hh:mm:ss
Para algumas funções de indicadores comuns, como indicadores comuns como MA\MACD\KDJ\BOLL, a plataforma FMZ é integrada diretamente e os indicadores específicos suportados podem ser consultados na documentação da API.
Antes de usar a função indicador, é melhor determinar o comprimento da linha K. Quando o comprimento da linha K anterior não atende aos ciclos necessários para o cálculo, o resultado é:null
Os primeiros 9 valores são nulos, e os seguintes são normais.
O JavaScript também suporta o Talib completo, que é suportado como uma biblioteca de terceiros, para chamadas como:talib.CCI(records)
↑ Referênciashttp://ta-lib.org/function.htmlPara o Python, é possível instalar a biblioteca talib por conta própria, mas não é possível simplesmente usar pip para instalar, pois é necessário compilar, e é possível pesquisar o modo de instalação por conta própria.
A função indicador pode ser transmitida para qualquer conjunto de arquivos, além de dados de linha K.
function main(){
var records = exchange.GetRecords(PERIOD_M30)
if (records && records.length > 9) {
var ma = TA.MA(records, 14)
Log(ma)
}
}
Aqui estão algumas das funções JavaScript mais usadas no mundo real.
Date.now()
Volte para o botão de tempo atualparseFloat()
Transformar uma linha num número, comoparseFloat("123.21")
parseInt()
Converter uma string em um número inteironum.toString()
Converte números em strings e num para variáveis numéricasJSON.parse()
Formate uma string json, comoJSON.parse(exchange.GetRawJSON())
Math.max()
,Math.abs()
A partir daí, a maioria dos usuários do Google AdWords não tem acesso ao aplicativo.https://www.w3school.com.cn/jsref/jsref_obj_math.aspEscrever uma função de estratégia de disco real é muito difícil, como comprar uma função tão simples como comprar 5 moedas, devemos considerar: o saldo atual é suficiente? qual é o preço do pedido? qual é a precisão? não é necessário dividir os pedidos para evitar o impacto do mercado? como tratar os pedidos não concluídos? etc.
A biblioteca de negociação de moedas digitais JavaScript e a biblioteca de negociação de futuros de commodities são embutidas por padrão e não precisam ser copiadas. Outras bibliotecas de modelos podem ser encontradas no Strategy Square.https://www.fmz.com/square/20/1❏ Copie e guarde o catálogo de modelos e selecione o catálogo a ser usado ao criar sua própria política.
As funções do modelo JavaScript são usadas para$
Para começar, o Python foi criado comext
A partir de agora.
O endereço do código fonte:https://www.fmz.com/strategy/10989, já está embutida, sem necessidade de cópia. As implementações de funções específicas podem ser diretamente referenciadas pelo código fonte.
Aceder a uma conta:
$.GetAccount(e)
Log($.GetAccount()); // 获取账户信息, 带容错功能
Log($.GetAcccount(exchanges[1]));
O seguinte pedido foi retirado:
$.Buy/Sell(e, amount)
$.Buy(0.3); // 主交易所买入0.3个币
$.Sell(0.2); // 主交易所卖出0.2个币
$.Sell(exchanges[1], 0.1); // 次交易所卖出0.1个币
$.CancelPendingOrders(e, orderType)
$.CancelPendingOrders(); // 取消主交易所所有委托单
$.CancelPendingOrders(ORDER_TYPE_BUY); // 取消主交易所所有的买单
$.CancelPendingOrders(exchanges[1]); // 取消第二个交易所所有订单
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // 取消第二个交易所所有的卖单
O julgamento do cruzamento:
$.Cross(periodA, periodB) / $.Cross(arr1, arr2);
var n = $.Cross(15, 30);
var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6])
如果 n 等于 0, 指刚好15周期的EMA与30周期的EMA当前价格相等
如果 n 大于 0, 比如 5, 指15周期的EMA上穿了30周期的EMA 5个周期(Bar)
如果 n 小于 0, 比如 -12, 指15周期的EMA下穿了30周期的EMA 12个周期(Bar)
如果传给Cross不是数组, 则函数自动获取K线进行均线计算
如果传给Cross的是数组, 则直接进行比较
A função $.withdraw ((e, currency, address, amount, fee, password) é:
$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")
O banco de dados de negociação de futuros de commodities é estável e recomendado.https://www.fmz.com/strategy/12961Não é necessário copiar.
Biblioteca CTA
function main() {
$.CTA("rb000,M000", function(r, mp) {
if (r.length < 20) {
return
}
var emaSlow = TA.EMA(r, 20)
var emaFast = TA.EMA(r, 5)
var cross = $.Cross(emaFast, emaSlow);
if (mp <= 0 && cross > 2) {
Log("金叉周期", cross, "当前持仓", mp);
return 1
} else if (mp >= 0 && cross < -2) {
Log("死叉周期", cross, "当前持仓", mp);
return -1
}
});
}
Exemplos de chamadas de bibliotecas
function main() {
var p = $.NewPositionManager();
p.OpenShort("MA609", 1);
p.OpenShort("MA701", 1);
Log(p.GetPosition("MA609", PD_SHORT));
Log(p.GetAccount());
Log(p.Account());
Sleep(60000 * 10);
p.CoverAll("MA609");
LogProfit(p.Profit());
Log($.IsTrading("MA609"));
// 多品种时使用交易队列来完成非阻塞的交易任务
var q = $.NewTaskQueue();
q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
Log(task.desc, ret)
})
while (true) {
// 在空闲时调用poll来完成未完成的任务
q.poll()
Sleep(1000)
}
}
Como a função gráfica original é mais complexa, será apresentada no próximo tutorial. Recomenda-se que os iniciantes usem diretamente a biblioteca de gráficos gráficos, gráficos gráficos muito simples, gráficos K, etc.; FMZ tem uma biblioteca de classes simples embutida, que pode ser vista na página de edição de políticas, se não tiverem, o usuário precisa copiá-la e salvá-la para selecionar as referências na política.
O endereço de cópia da biblioteca de gráficos do Javascript:https://www.fmz.com/strategy/27293O endereço de cópia do catálogo de linhas de Python:https://www.fmz.com/strategy/39066
Exemplos concretos:
function main() {
while (true) {
var ticker = exchange.GetTicker()
if (ticker) {
$.PlotLine('Last', ticker.Last) //可以同时画两条线,Last是这条线的名字
$.PlotLine('Buy', ticker.Buy)
}
Sleep(6000)
}
}
Abaixo do editor de políticas, há a configuração de parâmetros de política, que correspondem às variáveis globais da política, que podem ser acessadas em qualquer local do código. Os parâmetros de política podem ser modificados na interface do disco real e são efetivos após o reinicio.
O tipo de strings e o tipo de números são fáceis de entender e são os tipos mais usados. A caixa de descarregamento mostra opções na interface de parâmetros, como definir o parâmetro da caixa de descarregamento SYMBOL comoBTC|USDT|ETH
Se você selecionar o USDT na página de parâmetros, o valor do SYMBOL na política será o índice 1 do USDT. O ponto de seleção é uma caixa de seleção, ponto de seleção é true, caso contrário é false.
Há muitos outros parâmetros disponíveis para configuração.https://www.fmz.com/bbs-topic/1306
Depois de completar o trabalho de quantificação de uma estratégia, você pode testar sua estratégia com dados históricos para ver como sua estratégia ganha em dados históricos. Os resultados do retrospecto, é claro, são apenas para referência. O Javascript retrospectivamente é executado no navegador, o Python retrospectivamente é executado no host, que pode ser usado pela plataforma para fornecer um host público.
O mecanismo de retorno da onbar é baseado em uma linha K, ou seja, cada linha K gera um ponto de retorno, onde é possível obter informações sobre os preços altos e baixos da linha K atual, volume de negociação, etc., e antes desse ponto de tempo.
Gaoencheerapi
CiênciaComo implementar a política localmente? Eu escrevi uma simples declaração de saída de Log e segui a operação no final da frase. O primeiro passo é usar um notebook como servidor e executar um programa administrador. O segundo passo é escrever um simples programa test.py para exportar informações de Log (uma função de interface API para FMZ); O terceiro passo, como no final do texto, é escrever um runfile e executá-lo através do run.py, chamando test.py.
glicogênioEu comprei um curso de negociação de quantidade em nuvem, e agora eu vou ver.
MonuRajakMuitos
MonuRajak- Olá.
O meu irmão.Aprender
WqyHá um pequeno erro de texto, GetAccount obtém a conta. Na introdução, FrozenStocks deveria ser um saldo congelado e não um saldo disponível.
- O que é que se passa?getorder outtime O que fazer para obter um pedido fora do horário, a troca da okx
O que é que ele tem a dizer?A taxa de garantia de ativos não é acessível, até 0% será forçada a estabilizar a taxa de garantia de ativos
Shifeng2020Eu estou olhando para o gráfico de 1 minuto k, então o tempo de sono do ciclo morto do Python pode ser definido como 0,1s, ou seja, sleep ((100)
O Vento do Orienteexchange.SetDirection (("closebuy"); // Se for um contrato permanente, configure diretamente o exchange.SetDirection (("sell") Aqui eu experimentei o contrato permanente OKex, que se for definido para vender, fica imediatamente vazio, não é muito barato.
O Vento do Orienteexchange.SetDirection (("closebuy"); // Se for um contrato permanente, configure diretamente o exchange.SetDirection (("sell") Aqui eu experimentei o contrato permanente OKex, que se for definido para vender, fica imediatamente vazio, não é muito barato.
O Vento do OrienteHá dois erros de ortografia no código do GetOrders. Um é que a função foi escrita como fuction, e o outro como condição para o loop for.
O Vento do OrienteA culpa é minha. exchange.Buy ((-1, 0.5), o par de negociação é o ETH_BTC, o que representa a compra de ETH de 0.5BTC no preço do mercado exchange.Buy ((price, 0.5), se for esse tipo de lista de preços, representa comprar 0.5ETH no preço do preço
O Vento do Orienteexchange.Buy ((-1, 0.5), o par de negociação é ETH_BTC, representando a compra de ETH de 0.5BTC pelo preço do mercado Aqui é o que deveria ser o óleo de alumínio representando o preço de mercado para comprar o óleo de alumínio de 0,5 ETH.
glicogênioObrigado.
Ervas daninhasO curso está disponível em https://study.163.com/course/courseMain.htm?share=2&shareId=400000000602076&courseId=1006074239&_trace_c_p_k2_=c3f5d238efc3457d93c8b92c0398d2b2
Ervas daninhasAdicione o WeChat na página inicial e faça parte do grupo.
WqyPor vezes, eu tenho problemas para perguntar se temos um grupo oficial de discussão.
Ervas daninhasMudança
Ervas daninhasRecuperação
Ervas daninhasA informação original pode ser obtida usando o GetRawJSON ou através de um campo de informações
O Vento do OrienteMuito bem, muito bem, e também há respostas administrativas.
Ervas daninhasOh, corrigido, obrigado por apontar o erro.
Ervas daninhasAlguns contratos permanentes permitem a posse bidirecional e precisam de um equilíbrio.