[TOC]
O que a plataforma de negociação quantitativa FMZ pode fazer?
FMZ (inventor) plataforma de negociação quantitativaÉ a comunidade de quantificação mais especializada no campo da negociação quantitativa, onde você pode aprender, escrever, compartilhar, comprar e vender estratégias de quantificação; fazer negociações analógicas usando o analógico on-line; executar, publicar e visualizar o real; suportar quase todas as principais exchanges de moeda digital.
A série completa de tutoriais
O vídeo mostra o que aconteceu.
O vídeo do tutorial:
JavaScript
O curso é completo, incluindo tutoriais, uso da plataforma e redação de estratégias. Se você tem conhecimentos básicos de programação e negociação, você pode começar a escrever uma estratégia simples em cerca de dois dias, enquanto quem não tem conhecimentos básicos de programação só precisa de uma ou duas semanas para aprender os conhecimentos básicos de programação.bilibili
O vídeo também tem tutoriais:Inventor de plataforma de negociação quantitativa - conceito de administrador
Inventor de plataforma de negociação quantitativa - visualização do site
Inventor de plataforma de negociação quantitativa - Introdução à implementação do administrador
Inventores de plataformas de negociação quantitativa - Criando um disco real
Inventor de plataforma de negociação quantitativa - estratégias de registro, códigos de cópia
Inventor de plataforma de negociação quantitativa - estratégia completa, configuração de parâmetros, importar e exportar resumo
Inventor de plataforma de negociação quantitativa - ferramentas de depuração e recursos de edição remotaSe você tiver algum problema, pode entrar no fórum para fazer perguntas, discussões, fazer pedidos de trabalho na plataforma, enviar telegramas ou enviar um e-mail.TelegramO blogueiro e administrador do @group @administrator, em geral, as perguntas são respondidas rapidamente.
Suporte para desenvolvimento de ChatGPT
A plataforma de negociação quantitativa FMZ acessou o ChatGPT como uma ferramenta de desenvolvimento auxiliar, com o clique em "ChatGPT" na barra de atalhos do "Centre de Controle" para pular para "ChatGPT".Página de ferramentas do Chat GPT。
Qual é a linguagem que eu posso usar para implementar a minha estratégia?
A plataforma de negociação quantitativa FMZ é suportadaJavaScript
、TypeScript
、Python
、C++
、PINE
、麦语言
、Blockly可视化
A partir daí, o projeto começou a ser desenvolvido.
ApoioTypeScript
A linguagem, ainda assim, é definida como uma estratégia de criação.JavaScript
A estratégia, então, é escrita no início do código da estratégia.// @ts-check
Ou clique no botão "TypeScript" no canto superior direito da área de edição da política para mudar para "TypeScript".TypeScript
A plataforma reconhece automaticamente o código como:TypeScript
O Google Maps é um aplicativo gratuito que permite que você configure e configure as suas páginas, além de fornecer suporte para compilar e verificar tipos:
TypeScript
A função de verificação de tipo estático do Google Assistant pode ajudar você a encontrar erros potenciais ao escrever seu código e melhorar a qualidade do código.TypeScript
O sistema de tipos de Java permite que você encontre as propriedades e métodos necessários mais rapidamente ao escrever o código, aumentando a eficiência do desenvolvimento.TypeScript
No entanto, você pode organizar melhor e manter seu código para torná-lo mais fácil de ler e entender.TypeScript
Fornece recursos de programação orientados a objetos poderosos, como interfaces, classes e padrões, para ajudá-lo a escrever código estratégico mais robusto e reutilizável.Uma das estratégias de design de linguagem é suficiente. Além de apoiar o modo de escrever o código, a estratégia de design pode ser usada para criar estratégias de criação de módulos visuais (Blockly). A estratégia de construção de conjuntos de módulos visuais usa uma estratégia de design de maneira mais intuitiva, sem codificação.
Blockly
Visualize o tutorial:
Configuração
Python
O programa estratégico usadoPython
Interpretação
UtilizaçãoPython
Quando a política escrita, testada ou no disco real se instalou simultaneamente no ambiente do sistema em que o administrador estáPython2ePython3A política pode ser iniciada na primeira linha de configuração da política.Python
A versão.#!python3
,#!python2
O sistema também pode especificar um caminho absoluto, por exemplo:#!/usr/bin/python3
。
O que é um administrador?
CustódiaÉ compreensível como o executor da sua estratégia de negociação, responsável por tarefas complexas como solicitações de dados, recepção de dados, ligações de rede, retransmissão de logs, etc. O administrador funciona no seu servidor, mesmo que um mau funcionamento da rede do site da FMZ não afete o seu administrador.Linux,Janela,Mac OS,Android,ARM Linux baseado em árvoresO que você está fazendo?Página do administrador,Instalação e atualização do administrador do LinuxOs registros de disco rígido gerenciados pelo administrador são mantidos no diretório onde estão os processos do administrador../logs/storage
O documento é:db3
Não.Sqlite
Pode ser usado em documentos de banco de dados.Sqlite
O software de gerenciamento é editado diretamente, para essas extensões é chamadodb3
O nome do arquivo é o arquivo do disco físico.ID
。
Acordos apoiados
Desenvolver estratégias na plataforma de negociação quantitativa FMZ, visíveis apenas para os titulares de contas de negociação quantitativa FMZ.Python
O pacote é carregado no código da política, o que permite a localização da política.
Python
Segurança do código:
Porquê?Python
É uma linguagem de código aberto e muito fácil de recompilar, que pode ser alugada se a política não é autônoma, e pode ser alugada em uma forma de gerenciamento de sub-contas ou de todos os administradores se houver preocupação com a fuga de políticas.
Python
O código de encriptação estratégica:
O que é que ele está a fazer?Python
A estratégia é que os autores do código não criptografem quando usam o código e o criptografam quando o alugam para outros.Python
A estratégia de inicialização é editada com o código abaixo, que pode ser especificado para uso pessoal ou para aluguel.Python
Se o código da política é criptografado quando executado. Suporte à criptografia do código da políticaPython
A versão é:Python 2.7
A versão do Twitter:Python 3.5
A versão do Twitter:Python 3.6
A versão.
Os autores da política executam-na e usam o código da política de criptografia para outras pessoas através de códigos de registro:#!python
Para especificar a versão do Python Interpreter, use vírgula,
Intervalo, entrada de instruções de criptografiaencrypt
Não especificado.Python
Adicionar versões diretamente#!encrypt
。
#!python,encrypt
Ou
#!encrypt
Os autores da política executam-na por si mesmos, não criptografam o código da política para que seja usado por outras pessoas através de um código de registro:
#!python,not encrypted
Ou
#!not encrypted
JulgamentoPython
A política de código criptografado é efetiva para usar códigoos.getenv('__FMZ_ENV__')
Retornar uma string"encrypt"
A descrição já entrou em vigor.Python
O código estratégico.
#!encrypt
def main():
ret = os.getenv('__FMZ_ENV__')
# 打印变量ret为字符串encrypt或者ret == "encrypt"为真,即代表加密生效
Log(ret, ret == "encrypt")
Os dados confidenciais, como informações de conta configuradas na plataforma de negociação quantitativa da FMZ e strings de criptografia nos parâmetros da política, são criptografados no lado do navegador. Essas informações armazenadas na plataforma de negociação quantitativa da FMZ são informações criptografadas ("dados não expressos"). Somente o dispositivo privado do usuário pode ser descifrado, o que aumenta muito a segurança dos dados confidenciais. Se a informação de código de política, configuração de parâmetros e descrição de política contém outras informações confidenciais, não divulgue ou venda a política.
A plataforma suporta a configuração localizada de informações confidenciais, como informações relacionadas a contas, chaves secretas e outras.
Na página de informações de configuração de exchanges da plataforma, todos os controles de caixa de texto criptografados com um disfarce são suportados para carregar o arquivo local do administrador de forma a configurar o caminho do arquivo.RSA KEY
O método de verificação é um exemplo, explicando detalhadamente como configurar informações sensíveis no local do dispositivo onde o programa do administrador está.
1, criar chaves públicas ou privadas RSA.PKCS#8
A partir daí, o usuário pode criar uma série de ferramentas para criar suas chaves públicas e privadas, como:openssl
Não, não.
2° Criado em uma bolsaRSA KEY
, criado e carregadoO primeiro passoA chave pública foi criada em.
Três.O primeiro passoA chave privada criada notxt
O formato de arquivo guarda o catálogo de nível do administrador, mas também pode guardar outros caminhos no catálogo onde o programa do administrador está.
4 Configuração de exchanges no FMZAccess Key
O que é que você está a fazer?RSA KEY
Não, não.
5. Configurar a troca no FMZSecret Key
Na caixa de edição, preencha:Terceiro passoOs dados são colocados em um diretório de nível de administradortxt
O caminho do arquivo, por exemplo, é chamado de:rsaKey.txt
O documento e o administrador preencherão o seguinte no mesmo catálogo:file:///rsaKey.txt
O documento deve ser enviado para o próximo nível do catálogo no qual o processo de administrador está localizado.rsa_key
Em seguida, escreva:file:///rsa_key//rsaKey.txt
◦ Se for colocadorsaKey.txt
Noutros caminhos, o arquivo pode ser configurado assim, mas é importante ressaltar que o arquivo só suporta a colocação em diretórios de nível de administrador ou subdirectórios.
Assim, a localização de chaves privadas é mais segura e os procedimentos detalhados podem ser consultados.Vídeo explicativo
O que é um sistema de retrospecção e para que serve?
Como é que você pode saber o que é a lógica da sua estratégia, como é que a sua estratégia vai ganhar dinheiro? Claro que não podemos ir diretamente para o mercado para negociar ouro e prata, podemos testar a sua estratégia com dados históricos.
Os dados do sistema de retestes são precisos e o que acontece com os resultados?
A plataforma de negociação quantitativa FMZ divide o padrão de retrospecção emRevisão em disco realeRetrospecção em nível analógicoO retorno ao nível do disco real é feito exclusivamente com base nos dados históricos completos; o retorno ao nível analógico é gerado com base nos dados reais da linha K.tick
Os dados são repassados. Ambos são baseados em dados históricos reais, mas os dados repassados em disco real são mais precisos e os resultados são mais confiáveis.Mecanismo de reavaliação FMZMas o retrospecto é apenas uma representação estratégica sob dados históricos, os dados históricos não são totalmente representativos do que acontecerá no futuro. Os mercados históricos podem se repetir ou podem voar de um cisne negro. Portanto, é necessário tratar os resultados do retrospecto com racionalidade e objetividade.
As seguintes questões devem ser consideradas ao retratar diferentes estratégias linguísticas:
JavaScripteC++A revisão da política é feita no lado do navegador, no disco rígido ou no computador.WexAppA FMZ é uma plataforma de negociação quantitativa.WexAppO sistema opera sem a instalação de qualquer outro software, biblioteca ou módulo.PythonO retesting é realizado no host, pode ser retestado no servidor público FMZ quantificado, ou pode ser retestado no próprio host do usuário.PythonSe você precisa usar algumas bibliotecas, você precisa instalá-las sozinho (suporta apenas bibliotecas comuns no servidor público).
Dados no sistema de retestes
FMZ quantificação de plataforma de negociação de retomada de resumo de nível analógico e retomada de nível de disco real, dois tipos de retomada de nível analógico, baseado em um ciclo de linha K de base gerado por simulaçãotick
, 12 pontos de tempo de retrospecção serão gerados em cada ciclo da linha K da base, enquanto o nível do disco real é realmente coletado.tick
O mecanismo de reversão do FMZ permite que a estratégia seja negociada várias vezes em uma linha K, evitando situações em que só se pode fechar uma transação a preço de mercado, sendo mais precisa e tendo em conta a velocidade de reversão.Links。
Método de DEBUG da política no sistema de detecção
Revisão da política JavaScript em DevTools do Chrome。
Criptomoedas (digital currency)
Nome | Tipo | Explicação |
---|---|---|
Bitfinex | Objetos de câmbio | A plataforma permite transações limitadas para, por exemplo:BTC_USD ,ETH_USD ,LTC_USD Por exemplo, observe que as transações são feitas com a moeda.USD É em dólares. |
Binance | Objetos de câmbio | A plataforma permite transações limitadas para, por exemplo:BTC_USDT ,ETH_USDT ,ETH_BTC ,LTC_BTC E assim por diante |
OKX | Objetos de câmbio | A plataforma permite transações limitadas para, por exemplo:BTC_USDT ,ETH_USDT ,ETH_BTC ,LTC_BTC E assim por diante |
Moedas | Objetos de câmbio | A plataforma permite transações limitadas para, por exemplo:BTC_USDT ,ETH_USDT ,ETH_BTC ,LTC_BTC E assim por diante |
Futuros OKX | Objetos de câmbio de futuros | A plataforma permite transações limitadas para, por exemplo:BTC_USD ,ETH_USD A moeda é a moeda de câmbio.USD , Configure o código do contrato específico (verexchange.SetContractType O código de contrato que é suportado é:this_week 、next_week 、quarter 、swap 。 |
HuobiDM | Objetos de câmbio de futuros | O HuobiDM, que significa contrato de tokens (token futures), suporta pacotes limitados de transações, como:BTC_USD ,ETH_USD A moeda é a moeda de câmbio.USD , Configure o código do contrato específico (verexchange.SetContractType O código de contrato que é suportado é:this_week 、next_week 、quarter 、swap 。 |
BitMEX | Objetos de câmbio de futuros | Os pares de negócios são:XBT_USD , Configure o código do contrato específico (verexchange.SetContractType O código de contrato que é suportado é:XBTUSD 。 |
Futuros em Binance | Objetos de câmbio de futuros | A plataforma permite transações limitadas para, por exemplo:BTC_USDT ,ETH_USDT A moeda é a moeda de câmbio.USDT , Configure o código do contrato específico (verexchange.SetContractType A função é a função deUSDT O código do contrato é o seguinte:swap 。 |
Opções Deribit | Objetos de negociação de opções | Os pares de negócios são:BTC_USD ,ETH_USD , Configure o código do contrato específico (verexchange.SetContractType O contrato é um contrato de moeda local. É necessário definir um código de contrato de opções específico. |
Os objetos de câmbio de futuros do sistema de retrospecção não suportam temporariamente a troca de pares de transações no código de estratégia.
O retorno do nível analógico é feito com base nos dados da linha K inferior do sistema de retorno, em conformidade com um determinado algoritmo dentro de uma estrutura numérica composta por preços mais altos, mais baixos, mais baixos, mais baixos, mais baixos e mais baixos.tick
Os dados, como em tempo realtick
Os dados são devolvidos quando a interface é solicitada.Inventor de um mecanismo de ressonância de nível analógico quantificado。
A retrospecção a nível de disco real é real.tick
Os dados de nível estão na sequência de tempo de Bar.tick
Para a estratégia de dados de nível, usar o retorno ao nível do disco real é mais próximo da verdade; retorno ao nível do disco realtick
Os dados são registados de forma real e não analógica. Suporta dados de profundidade, reprodução de dados de registro de transações de mercado, profundidade personalizada, dados de pontuação. Suporta até 50 MB de dados de pontuação em nível de disco físico, sem limite de tempo de pontuação dentro do limite de dados.GetDepth
、GetTrades
Função obtém dados de transação de retorno.GetTicker
,GetTrades
,GetDepth
,GetRecords
, não se move o tempo no eixo de tempo de repassagem várias vezes ((não se dispara o salto para o próximo momento de dados de mercado)); para uma das funções acima, uma chamada repetida irá mover o tempo de repassagem no eixo de tempo de repassagem ((salta para o próximo momento de dados de mercado)); no repassamento, não é recomendado o uso de repassagem de nível de disco real para escolher um tempo prematuro, pois pode não haver dados de nível de disco real no período prematuro.
Retesting de nível de disco real atualmente suportado:
A função de ajuste de parâmetros do sistema de retestamento do FMZ é ajustar o retestamento de acordo com as opções de ajuste de cada parâmetro:
Gerar combinações de parâmetros e refazer-as (isto é, cada combinação de parâmetros é refazido uma vez); Parâmetros de estratégia. Somente os parâmetros de tipo numérico (numero) podem ser ajustados no sistema de refazer.
Por exemplo, na página de revisão, configure a opção de otimização de parâmetros:
Modelo de ajuste de parâmetros:
Na página de edição de políticas, no subpágina "Analogue Retest", é possível configurar opções como configuração de retest, parâmetros de retest; configurações de retest são usadas para configurar o intervalo de tempo de retest, o local de negociação retestado, o ponto de deslizamento de retest e as taxas de processamento; e parâmetros de estratégia são opções de parâmetros de configuração. Quando esses parâmetros de configuração são definidos, pode-se salvar essas informações de configuração de acordo com a política de retest definida.
Com oJavaScript
Por exemplo, clique em "Salvar configurações de retrospecção para o arquivo fonte":
JavaScript
/Python
/C++
/麦语言
O formato do arquivo original é um pouco diferente:
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
Língua Ma:
(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*)
Utilização do sistemaGET
O método solicita um URL customizado (WEB para obter fontes de dados externas para revisão, com o seguinte parâmetro de solicitação adicional:
Parâmetros | Significado | Explicação |
---|---|---|
símbolo | Nome da variedade | Por exemplo: BTC_USD_OKCoin_EN |
eid | Bolsa de valores | Por exemplo: OKCoin_EN |
redondo | Preço preciso | Se for 3, então o preço que você vai retornar será multiplicado por 1000. |
- Não. | Precisão numérica | Se for 2, então o número de dados que ele retorna é multiplicado por 100 e inteiro. |
período | Período de bar (millisecondes) | Por exemplo, 60000 para bares por minuto. |
profundidade | Figura de profundidade | 1-20 |
negócios | Se os dados precisam ser divididos | Verdadeiro/falso |
de | Tempo de início | Temporada Unix |
para | Tempo de término | Temporada Unix |
Atenção:
round与vround是为了避免网络传输过程中浮点数的精度丢失设计的两个参数,价格数据和成交量、订单量数据都采用整型传输。
Um exemplo de dados em conjunto:
http://customserver:80/data?symbol=BTC_USD_OKCoin_EN&eid=OKCoin_EN&round=3&vround=3&period=900000&from=1564315200&to=1567267200
O formato de retorno deve ser um dos dois seguintes formatos (auto-identificado pelo sistema):
Regular Bar nível retestado
{
"schema":["time","open","high","low","close","vol"],
"data":[[1564315200000,9531300,9531300,9497060,9497060,787],[1564316100000,9495160,9495160,9474260,9489460,338]]
}
Dados de reavaliação de nível de tick (contém informações de profundidade de lançamento, formato de profundidade é [preço, quantidade], pode haver vários níveis de profundidade, asks como escalada de preços, bids como desordem de preços)
{
"schema":["time","asks", "bids","trades","close","vol"],
"data":[[1564315200000,[[9531300,10]], [[9531300,10]],[[1564315200000,0,9531300,10]],9497060,787]]
}
Explicação
Quadro | Explicação |
---|---|
Esquema | Especifica a propriedade de uma coluna da matriz de dados, separada de letras maiúsculas, limitada a time, open, high, low, close, vol, asks, bids |
dados | Uma matriz que mostra uma coluna de dados armazenados por schema |
Formatos de dados
Quadro | Explicação |
---|---|
pedidos/oferta | [Preço, quantidade,...] |
negócios | [Tempo, direção, preço, quantidade...] |
Os dados sobre taxas de financiamento são: Por exemplo, quando um retorno de um mercado de futuros de Bitcoin é solicitado, dados adicionais de taxas de capital são necessários e uma fonte de dados personalizada é necessária. Por exemplo, a estrutura de dados de taxas de capital solicitada durante o retorno de um mercado de futuros de Bitcoin é a seguinte:
{
"detail": {},
"symbol": "futures_binance.eth_usdt.funding",
"schema": ["time", "open", "high", "low", "close", "vol"],
"data": [
[1582876800000, 25289, 25289, 25289, 25289, 0],
[1582905600000, 30522, 30522, 30522, 30522, 0],
[1582934400000, 40998, 40998, 40998, 40998, 0],
...
[1626652800000, 198, 198, 198, 198, 0],
[1626681600000, 691, 691, 691, 691, 0], // 相邻的周期间隔8小时
[1626710400000, 310, 310, 310, 310, 0], // 币安资金费率8小时更新一次,资金费率数据为什么为310?
[1626739200000, 310, 310, 310, 310, 0], // 因为和K线数据一样,为了避免网络传输过程中浮点数的精度丢,数据采用整型,所以需要根据round参数处理数据,处理后用于返回给回测系统的数据就为310
[1626768000000, -41610, -41610, -41610, -41610, 0], // 资金费率数据也可能为负值
[1626796800000, -5125, -5125, -5125, -5125, 0],
...
[1627977600000, 10000, 10000, 10000, 10000, 0]
]
}
Exemplos de solicitações de dados emitidas por sistemas de repetição são:
http://customserver:80/data?symbol=futures_binance.eth_usdt.funding&eid=Futures_Binance&round=8&vround=5&depth=20&trades=1&custom=0&period=3600000&from=1360771200&to=1628006400
Exemplos de fontes de dados personalizadas:
Especifique a fonte de dados, endereço:http://xxx.xx.x.xx:9090/data
O servidor de dados personalizado, com golang:
package main
import (
"fmt"
"net/http"
"encoding/json"
)
func Handle (w http.ResponseWriter, r *http.Request) {
// e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data
// r.URL: /data?depth=20&detail=true&eid=Binance&from=1566820800&period=900000&round=3&symbol=BTC_USDT_Binance&to=1569686400&trades=1&vround=5
// response
defer func() {
// response data
/* e.g. data
{
"schema":["time","open","high","low","close","vol"],
"data":[
[1564315200000,9531300,9531300,9497060,9497060,787],
[1564316100000,9495160,9495160,9474260,9489460,338]
]
}
*/
ret := map[string]interface{}{
"schema" : []string{"time","open","high","low","close","vol"},
"data" : []interface{}{
[]int64{1564315200000,9531300,9531300,9497060,9497060,787},
[]int64{1564316100000,9495160,9495160,9474260,9489460,338},
},
}
b, _ := json.Marshal(ret)
w.Write(b)
}()
}
func main () {
fmt.Println("listen http://localhost:9090")
http.HandleFunc("/data", Handle)
http.ListenAndServe(":9090", nil)
}
A estratégia de testes é:JavaScript
Exemplo:
/*backtest
start: 2019-07-28 00:00:00
end: 2019-07-29 00:00:00
period: 1m
exchanges: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
*/
function main() {
var ticker = exchange.GetTicker()
var records = exchange.GetRecords()
Log(ticker)
Log(records)
}
Grafos de dados personalizados em sistemas de retrospecção:
A estratégia para imprimir informações:
A plataforma de negociação quantitativa FMZ é abertaJavaScript
Línguas ePython
O motor de retorno nativo da linguagem, com suporte para configurações de retornoCiclo da linha K inferior。
Botões de atalho para a política de edição de páginas e a política de revisão de páginas
UtilizaçãoCtrl + ,
Mantenha apertado o botão, a página de revisão e a página de edição de políticasCtrl
Após a tecla, basta pressionar,
O que é isso?
O botão de atalho para salvar a política
UtilizaçãoCtrl + s
O botão, a política de conservação.
O botão de atalho para iniciar a revisão
UtilizaçãoCtrl + b
O botão para iniciar o teste de retorno.
Função nome | Explicação |
---|---|
main() |
Para funções de entrada. |
onexit() |
Para uma função de varredura de cauda de saída normal, o tempo máximo de execução é de 5 minutos, pode não ser declarado, e retornará um erro se o tempo for ultrapassadointerromperErro. |
onerror() |
A função que desencadeia a execução de uma saída de exceção tem um tempo de execução máximo de 5 minutos e pode não ser declarada.Python A língua, a linguagem, a linguagem.C++ As políticas escritas na linguagem não suportam essa função. |
init() |
Para a função de inicialização, o programa de políticas é chamado automaticamente quando é executado, mas não é declarado. |
onerror()
Função.onerror()
A função não é mais acionada.onexit()
Função.onexit()
O processo de limpeza do rabo, que dura no máximo 5 minutos, é realizado pelo usuário.
function main(){
Log("开始运行, 5秒后停止,并执行扫尾函数!")
Sleep(1000 * 5)
}
// 扫尾函数实现
function onexit(){
var beginTime = new Date().getTime()
while(true){
var nowTime = new Date().getTime()
Log("程序停止倒计时..扫尾开始,已经过去:", (nowTime - beginTime) / 1000, "秒!")
Sleep(1000)
}
}
import time
def main():
Log("开始运行, 5秒后停止,并执行扫尾函数!")
Sleep(1000 * 5)
def onexit():
beginTime = time.time() * 1000
while True:
ts = time.time() * 1000
Log("程序停止倒计时..扫尾开始,已经过去:", (ts - beginTime) / 1000, "秒!")
Sleep(1000)
void main() {
Log("开始运行, 5秒后停止,并执行扫尾函数!");
Sleep(1000 * 5);
}
void onexit() {
auto beginTime = Unix() * 1000;
while(true) {
auto ts = Unix() * 1000;
Log("程序停止倒计时..扫尾开始,已经过去:", (ts - beginTime) / 1000, "秒!");
Sleep(1000);
}
}
init()
, o usuário implementa funções de inicializaçãoinit()
A política é executada automaticamente quando é iniciada.init()
Funções, que completam tarefas de inicialização projetadas na política.
function main(){
Log("程序第一行代码执行!", "#FF0000")
Log("退出!")
}
// 初始化函数
function init(){
Log("初始化!")
}
def main():
Log("程序第一行代码执行!", "#FF0000")
Log("退出!")
def init():
Log("初始化!")
void main() {
Log("程序第一行代码执行!", "#FF0000");
Log("退出!");
}
void init() {
Log("初始化!");
}
onerror()
A partir de agora, o número de pessoas que se sentem com problemas de saúde aumentará.onerror()
Execução de função que não é suportadaPython
、C++
A estratégia da linguagem.
function main() {
var arr = []
Log(arr[6].Close)
}
function onerror() {
Log("错误")
}
# python不支持
// C++不支持
EmJavaScript
、Python
、C++
As políticas escritas na linguagem precisam ser chamadas no ciclo principal da política.Sleep()
A função. é usada para controlar a velocidade de retrocesso no retraso, e o intervalo de tempo de consulta estratégica no disco real, controlando assim a frequência de solicitações para acessar a interface API do exchange.
O exemplo de um quadro básico para uma estratégia de moeda digital:
function onTick(){
//在这里写策略逻辑,将会不断调用,例如打印行情信息
Log(exchange.GetTicker())
}
function main(){
while(true){
onTick()
// Sleep函数主要用于数字货币策略的轮询频率控制,防止访问交易所API接口过于频繁
Sleep(60000)
}
}
def onTick():
Log(exchange.GetTicker())
def main():
while True:
onTick()
Sleep(60000)
void onTick() {
Log(exchange.GetTicker());
}
void main() {
while(true) {
onTick();
Sleep(60000);
}
}
Para dar o exemplo mais simples, se eu quisesse colocar um preço de 100 em uma bolsa de valores a cada 1 segundo, o número de pagamentos de 1 poderia ser escrito assim:
function onTick(){
// 这个仅仅是例子,回测或者实盘会很快把资金全部用于下单,实盘请勿使用
exchange.Buy(100, 1)
}
function main(){
while(true){
onTick()
// 暂停多久可自定义,单位为毫秒,1秒等于1000毫秒
Sleep(1000)
}
}
def onTick():
exchange.Buy(100, 1)
def main():
while True:
onTick()
Sleep(1000)
void onTick() {
exchange.Buy(100, 1);
}
void main() {
while(true) {
onTick();
Sleep(1000);
}
}
Biblioteca de modelosÉ um módulo de código reutilizável na plataforma de negociação quantitativa FMZ e é uma categoria de código de estratégia.Biblioteca de modelosA criação de uma biblioteca de classes de modelo na biblioteca de políticas de contas que o inventor está atualmente conectado à plataforma de negociação quantitativa não permite a modificação da categoria para política geral.
JavaScript
A biblioteca de modelos de idiomas:
Python
A biblioteca de modelos de idiomas:
C++
A biblioteca de modelos de idiomas:
Exportação de funções para bibliotecas de modelos A função de exportação é uma função de interface para uma biblioteca de classe de modelo, que pode ser chamada por uma chamada de política referente a essa biblioteca de classe de modelo. A função de exportação é declarada na biblioteca de classe de modelo e o exemplo de código implementado é o seguinte:
/*
-- 策略引用该模板以后直接用 $.Test() 调用此方法
-- main 函数在策略中不会触发, 只做为模板调试的入口
*/
$.Test = function() {
Log('Test')
}
function main() {
$.Test()
}
def Test():
Log("template call")
# 导出Test函数, 主策略可以通过ext.Test()调用
ext.Test = Test
// 策略引用该模板以后直接用 ext::Test() 调用此方法
void Test() {
Log("template call");
}
Parâmetros da biblioteca de modelos Os parâmetros da biblioteca de modelos também podem ser configurados como seus próprios parâmetros de interface. Os parâmetros da biblioteca de modelos são usados como variáveis globais no código da biblioteca de modelos.
Parâmetros de configuração da biblioteca de modelos:
Código da biblioteca de modelos:
$.SetParam1 = function(p1) {
param1 = p1
}
$.GetParam1 = function() {
Log("param1:", param1)
return param1
}
def SetParam1(p1):
global param1
param1 = p1
def GetParam1():
Log("param1:", param1)
return param1
ext.SetParam1 = SetParam1
ext.GetParam1 = GetParam1
void SetParam1(float p1) {
param1 = p1;
}
float GetParam1() {
Log("param1:", param1);
return param1;
}
CitaçõesBiblioteca de modelosO código da estratégia do exemplo:
function main () {
Log("调用$.GetParam1:", $.GetParam1())
Log("调用$.SetParam1:", "#FF0000")
$.SetParam1(20)
Log("调用$.GetParam1:", $.GetParam1())
}
def main():
Log("调用ext.GetParam1:", ext.GetParam1())
Log("调用ext.SetParam1:", "#FF0000")
ext.SetParam1(20)
Log("调用ext.GetParam1:", ext.GetParam1())
void main() {
Log("调用ext::GetParam1:", ext::GetParam1());
Log("调用ext::SetParam1:", "#FF0000");
ext::SetParam1(20);
Log("调用ext::GetParam1:", ext::GetParam1());
}
Citando uma biblioteca de modelos
Depois de selecionar uma referência na barra de modelos da página de edição da política, você pode salvar a política.
exchange
Pode ser visto como um objeto de troca, o primeiro objeto de troca adicionado no parâmetro de política por defeito. Todas as interações com o exchange são realizadas através de funções dentro desse objeto.
Revisão de objetos de troca adicionados
Adicionar objetos de câmbio na página do disco real
Os objetos de troca adicionados correspondem ao código.exchange
Objeto:
function main() {
Log("实盘页面或者回测页面上,添加的第一个交易所对象名字:", exchange.GetName(), ",标签:", exchange.GetLabel())
}
def main():
Log("实盘页面或者回测页面上,添加的第一个交易所对象名字:", exchange.GetName(), ",标签:", exchange.GetLabel())
void main() {
Log("实盘页面或者回测页面上,添加的第一个交易所对象名字:", exchange.GetName(), ",标签:", exchange.GetLabel());
}
O mesmo pode ser entendido como armazenamentoexchange
O conjunto de todos os objetos de uma bolsa pode conter vários objetos de uma bolsa.exchanges[0]
Ou seja,exchange
。
Os objetos de troca adicionados correspondem ao código da políticaexchanges[0]
、exchanges[1]
、exchanges[2]
O que é que ele está a fazer?
function main() {
for(var i = 0; i < exchanges.length; i++) {
Log("添加的交易所对象索引(第一个为0以此类推):", i, "名称:", exchanges[i].GetName(), "标签:", exchanges[i].GetLabel())
}
}
def main():
for i in range(len(exchanges)):
Log("添加的交易所对象索引(第一个为0以此类推):", i, "名称:", exchanges[i].GetName(), "标签:", exchanges[i].GetLabel())
void main() {
for(int i = 0; i < exchanges.size(); i++) {
Log("添加的交易所对象索引(第一个为0以此类推):", i, "名称:", exchanges[i].GetName(), "标签:", exchanges[i].GetLabel());
}
}
Order
Na estruturaStatus
Atribuições.
Nome da constante | Definição | Valor |
---|---|---|
ORDER_STATE_PENDING | Não concluído | 0 |
ORDER_STATE_CLOSED (em inglês) | Já está feito. | 1 |
ORDER_STATE_CANCELED (Ordem_Estado_Cancelado) | Já foi cancelado | 2 |
ORDER_STATE_UNKNOWN Não é conhecido | Status desconhecido (outro status) | 3 |
ORDER_STATE_UNKNOWN Não é conhecidoEstado, pode ser chamadoexchange.GetRawJSON()
Para obter informações sobre o estado dos pedidos originais, consulte a documentação da bolsa e veja a descrição específica.
Os nomes das constantes na tabela podem ser usados diretamente no código da política eOrder
EstruturaStatus
Comparação de atributos, julgamento de equivalência para determinar o estado da encomenda.Nome da constanteCorrespondênciaValorA partir daí, o nome de uma constante não é mais descrito.
Order
Na estruturaType
Atribuições.
Nome da constante | Definição | Valor |
---|---|---|
ORDER_TYPE_BUY | Pagamento | 0 |
ORDER_TYPE_SELL | Venda | 1 |
Position
Na estruturaType
Atribuições.
Nome da constante | Definição | Explicação | Aplicável | Valor |
---|---|---|---|---|
PD_LONG | Indica posições de várias cabeças | Uso de futuros de moeda digitalexchange.SetDirection("closebuy") Configure a direção do posicionamento para estabilizar o posicionamento desse tipo |
Futuros de moeda digital | 0 |
PD_SHORT | Indica a posição do cabeçalho | Uso de futuros de moeda digitalexchange.SetDirection("closesell") Configure a direção do posicionamento para estabilizar o posicionamento desse tipo |
Futuros de moeda digital | 1 |
Order
Na estruturaOffset
Atribuições.
Nome da constante | Definição | Valor |
---|---|---|
ORDER_OFFSET_OPEN | Ordem de abertura | 0 |
ORDER_OFFSET_CLOSE (em inglês) | Encomendas para o armazém | 1 |
Os parâmetros de estratégia definidos na interface de estratégia no código de estratégia são expressos como variáveis globais.JavaScript
A linguagem permite acessar diretamente os valores dos parâmetros definidos na interface da política, ou alterá-los.Python
Usado para modificar variáveis globais em funções de políticasglobal
Palavras-chave:
Tipo de parâmetros:
Variações | Descrição | Notas | Tipo | Valor padrão | Explicação |
---|---|---|---|---|---|
Número | Tipos de valores | Notas | Tipo numérico (number) | 1 | A estratégia C++ é de tipo ponto flutuante. |
cordel | Estringência | Notas | String (string) | Olá FMZ | Os valores padrão não precisam ser entregues com aspas e são processados como uma string. |
Caixa | Caixa de desvio | Notas | Caixa de desbloqueio ((selected)) | 1|2|3 | A variável combox é um valor numérico, representando o índice de destino para a seleção do controle de barra de download. O primeiro conteúdo do controle de download é 1, cujo valor de índice é 0, e assim por diante. |
Bool | Opções de seleção | Notas | Bol (true/false) | verdade | A seleção é feita para a variável bool ser verdadeira, a não seleção é feita para a variável bool ser falsa. |
secretString | Estringência de criptografia | Notas | String de criptografia | Password | Usando o mesmo método que as strings, as strings de criptografia são enviadas de forma criptografada e não são transmitidas em texto aberto. |
number
、string
、combox
、bool
、secretString
。Os parâmetros dependem da configuração:
Pode-se definir um parâmetro para que outro parâmetro seja baseado na seleção desse parâmetro para realizar a visualização e ocultação.numberA
, é um tipo de valor numérico.numberA
A partir de um parâmetro:isShowA
A decisão falsa do tipo BoolenumberA
Mostrar e ocultar.numberA
A variável é definida nos parâmetros da interface como:numberA@isShowA
。
Isso não é selecionadoisShowA
ParâmetrosnumberA
Os parâmetros são ocultos. Para os parâmetros do tipo de controle de barra de desvio, os parâmetros dependem em parte para determinar se é igual a uma opção da barra de desvio.Valores de índiceO que é isso?isShowA
Por exemplo, quando o parâmetro é definido como uma variável, é escrito:numberA@combox==2
。numberA
Os parâmetros são baseadoscombox
Se os parâmetros são selecionados para mostrar ou ocultar a terceira opção (índice 0 corresponde à primeira opção, índice 1 corresponde à segunda opção, índice 2 corresponde à terceira opção).
Parâmetros de interface estratégica, controles interativos, funções de agrupamento de parâmetros no modelo:
Somado apenas com a descrição do parâmetro no início do agrupamento(?第一组)
A partir daí, a empresa começou a produzir produtos de alta qualidade.
A estratégia é usada para agrupar e mostrar parâmetros:
O valor padrão do parâmetro é:
Os parâmetros da política são mostrados abaixo. Se você quiser manter o valor padrão do parâmetro da política no retrospecto, clique depois de alterar o parâmetro da política.保存回测设置
O botão.
Os parâmetros da política definidos podem ser guardados em código na política:
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
'''backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
'''
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
Algumas funções recebem o original que é solicitado para retornar quando são chamadas.JSON
Os dados, o originalJSON
Os dados são armazenados em objetos de retornoInfo
Na propriedade. Não há nenhum dado retornado no retraso, uma vez que o retraso não é uma interface de acesso a uma bolsa.Info
Propriedades, abaixo estão as principais descrições de propriedades de cada estrutura de dados.
Obtenha todos os históricos de transações (exceto os seus próprios)exchange.GetTrades()
A função retorna.
{
Id : 9585306, // 交易记录ID,如果交易所接口没有提供订单ID则使用时间戳填充
Time : 1567736576000, // 时间(Unix timestamp 毫秒)
Price : 1000, // 价格
Amount : 1, // 数量
Type : 0 // 订单类型,参考常量里的订单类型,0即为ORDER_TYPE_BUY,ORDER_TYPE_BUY的值为0
}
O mercado éexchange.GetTicker()
A função retorna.
{
Info : {...}, // 请求交易所接口后,交易所接口应答的原始数据,回测时无此属性
High : 1000, // 最高价,如果交易所接口没有提供24小时最高价则使用卖一价格填充
Low : 500, // 最低价,如果交易所接口没有提供24小时最低价则使用买一价格填充
Sell : 900, // 卖一价
Buy : 899, // 买一价
Last : 900, // 最后成交价
Volume : 10000000, // 最近成交量,原则上现货成交量单位为交易币种(baseCurrency),期货成交量单位为合约张数。如果交易所接口没有提供此类数据则使用交易所接口现有的数据填充,例如可能为计价币(quoteCurrency)为单位的成交量
Time : 1567736576000 // 毫秒级别时间戳
}
padrãoOHLC
Estrutura, usada para desenhar linhas K e para análise de cálculo de indicadores.exchange.GetRecords()
A função retorna a matriz desta estrutura.Record
A estrutura representa uma coluna de linha K, ou seja, uma linha K.BAR
。Record
Entre eles:Time
O tempo de início do ciclo deste K-pilão.
{
Time : 1567736576000, // 一个时间戳,精确到毫秒,与Javascript的new Date().getTime()得到的结果格式一样
Open : 1000, // 开盘价
High : 1500, // 最高价
Low : 900, // 最低价
Close : 1200, // 收盘价
Volume : 1000000 // 交易量,原则上现货成交量单位为交易币(baseCurrency),期货成交量单位为合约张数,如果交易所接口没有提供此类数据则使用交易所接口现有的数据填充,例如可能为计价币(quoteCurrency)为单位的成交量
}
A estrutura dos pedidos pode ser definida porexchange.GetOrder()
、exchange.GetOrders()
A função retorna.exchange.GetOrders()
Retorna a matriz da estrutura, ou a matriz em branco, se não houverEncomendas pendentesDe volta.[]
, ou seja, um conjunto de matrizes vazias) ≠
{
Info : {...}, // 请求交易所接口后,交易所接口应答的原始数据,回测时无此属性
Id : 123456, // 交易单唯一标识
Price : 1000, // 下单价格,注意市价单的该属性可能为0或者-1
Amount : 10, // 下单数量,注意市价单的该属性可能为金额并非币数
DealAmount : 10, // 成交数量,如果交易所接口不提供该数据则可能使用0填充
AvgPrice : 1000, // 成交均价,注意有些交易所不提供该数据。不提供、也无法计算得出的情况该属性设置为0
Status : 1, // 订单状态,参考常量里的订单状态,例如:ORDER_STATE_CLOSED
Type : 0, // 订单类型,参考常量里的订单类型,例如:ORDER_TYPE_BUY
Offset : 0 // 数字货币期货的订单数据中订单的开平仓方向。ORDER_OFFSET_OPEN为开仓方向,ORDER_OFFSET_CLOSE为平仓方向
ContractType : "" // 现货订单中该属性为""即空字符串,期货订单该属性为具体的合约代码
}
A lista de profundidade do mercado, ouexchange.GetDepth()
A função retorna a estrutura de dadosOferta、Pergunta.Estrutura de dados dos elementos no conjunto.
{
Price : 1000, // 价格
Amount : 1 // 数量
}
A profundidade do mercado,exchange.GetDepth()
A função retorna.
{
Asks : [...], // 卖单数组,MarketOrder数组,按价格从低向高排序
Bids : [...], // 买单数组,MarketOrder数组,按价格从高向低排序
Time : 1567736576000 // 毫秒级别时间戳
}
Informações da conta, porexchange.GetAccount()
A função retorna. Os dados na estrutura que retorna estão relacionados ao par de transações atualmente definido.
{
Info : {...}, // 请求交易所接口后,交易所接口应答的原始数据,回测时无此属性
Balance : 1000, // 可用计价币数量,现货中如果交易对是BTC_USDT,Balance指的是当前可用USDT数量。U本位期货合约中Balance指的是可用保证金USDT的数量
FrozenBalance : 0, // Balance表示的资产用于挂单的冻结数量
Stocks : 1, // 可用交易币数量,现货中如果交易对是BTC_USDT,Stocks指的是当前可用BTC数量。币本位期货合约中Stocks指的是可用保证金的币(baseCurrency)的数量
FrozenStocks : 0 // Stocks表示的资产用于挂单的冻结数量
}
A informação sobre posições mantidas em negociações de futuros é fornecida por:exchange.GetPosition()
A função retorna para aqui.Position
EstruturaArquivos。
{
Info : {...}, // 请求交易所接口后,交易所接口应答的原始数据,回测时无此属性
MarginLevel : 10, // 持仓杆杠大小,如果交易所接口没有提供该数据则通过计算填充,可能会有误差
Amount : 100, // 持仓量,持仓合约张数,通常是正整数。注意每个交易所的合约乘数、价值等合约规格可能不一样,下单规则也可能不一样,例如币安合约可以0.1张下单
FrozenAmount : 0, // 仓位冻结量,用于平仓挂单时的临时冻结仓位数量
Price : 10000, // 持仓均价,原则上该属性为仓位总体的平均价格(不参与结算),如果交易所接口没有提供该数据则用交易所接口现有的持仓均价填充(参与结算)
Profit : 0, // 持仓浮动盈亏,原则上为持仓的未实现盈亏,如果交易所接口没有提供该数据则用交易所接口其它盈亏数据填充,盈亏数值的单位和当前合约保证金的单位相同
Type : 0, // PD_LONG为多头仓位,PD_SHORT为空头仓位
ContractType : "quarter", // 合约代码,具体可以参看SetContractType函数描述中传入的参数
Margin : 1 // 仓位占用的保证金,如果交易所接口没有提供该数据则使用0填充
}
A maioria dos investidores do setor de criptomoedas não tem dinheiro para pagar os futuros.exchange.GetPosition()
A função retornaPosition
Arrays estruturadas.FrozenAmount
、Profit
、Margin
Propriedades, porque os dados fornecidos pelas trocas não são uniformes e os objetos de diferentes trocas são chamadosexchange.GetPosition()
A definição dos dados retornados na interface pode ser diferente. Por exemplo, alguns exchanges possuem dados congelados sem posição nos dados de armazenamento, quando os dados de armazenamento não estão disponíveis.FrozenAmount
Para 0; se necessário, alguns dados podem ser usados para calcularInfo
Análise computacional de dados primários na propriedade.
Informações sobre o mercado das variedades negociadasexchange.GetMarkets()
A função que retorna contém isto.Market
EstruturaDicionário。
{
Symbol : "btcusdt", // 该交易品种在交易所的原始名称
BaseAsset : "BTC", // baseCurrency 交易币,统一大写
QuoteAsset : "USDT", // quoteCurrency 计价币,统一大写
TickSize : 0.01, // 价格最小变动数值
AmountSize : 0.01, // 下单量最小变动数值
PricePrecision : 2, // 价格精度,表示价格精确到2位小数
AmountPrecision : 3, // 下单量精度,表示下单量精确到3位小数
MinQty : 0.001, // 最小下单量
MaxQty : 1000, // 最大下单量
MinNotional : 5, // 最小下单金额
MaxNotional : 9999999, // 最大下单金额
CtVal : 100, // 合约价值
Info : {...} // 交易所该品种的原始数据
}
Os campos que não são suportados pelas exchanges são ignorados, uma vez que os exchanges suportam dados de informações de mercado de forma diferente. Os campos acima são obtidos a partir dos dados primários da interface da exchange.Info
O conteúdo do campo.
Version()
Retorna o número de versão atual do sistema. Retorna o valor: tipo de string.
Sleep(Millisecond)
A função de hibernação para pausar o programa por um tempo.Millisecond
Tipo de valor numérico. Parâmetros de milissegundos, por exemplo:Sleep(1000)
O que você está fazendo?
Suporta operações com um tempo de repouso inferior a 1 milissegundo, como a configuraçãoSleep(0.1)
O mínimo de parâmetros suportados é:0.000001
, sono de nível nanosegundo. 1 nanosegundo é igual a1e-6
Milissegundos.
Atenção:
Em usoPython
Quando se escreve uma política de linguagem, devem ser usadas operações de intervalo de consulta, tempo de espera.Sleep(Millisecond)
Funções. Não recomendadoPython
Não.time
O que é?time.sleep(second)
Funções. Porque são usadas em políticas.time.sleep(second)
A função faz com que o programa de política espere por alguns segundos para reverter.second
O parâmetro é o número de segundos para pausar), o que leva a uma retrospecção muito lenta da política.
IsVirtual()
, para determinar se a política atual está sendo executada para a retrospecção analógica.
Retorno do estado de repetição analógicatrue
O disco real voltou.false
。
Mail(smtpServer, smtpUsername, smtpPassword, mailTo, title, body)
, Enviar e-mails. Parâmetro de valor: todos os parâmetros são de tipo de strings. Retorno de valor: tipo Boole, envio de retorno bem sucedidotrue
。
smtpServer
Para envio de correiosmtp
Serviços,smtpUsername
O que é que ele está a fazer?smtpPassword
O código SMTP para o e-mail ((não é o código de login do e-mail))mailTo
O Facebook é um dos principais canais de mensagens de e-mails do mundo.title
O título do e-mail enviado é o seguinte:body
O conteúdo dos e-mails enviados, por exemplo:
function main(){
Mail("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
}
def main():
Mail("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
QQ89520Um problema é se a função C vai tentar novamente ou apenas uma vez.
Ai, ai!_C ((function, args...) é o padrão de 3s? Modificar o padrão para colocar diretamente _CDelay ((1000) antes de _C ((function, args...)?
lanchaiyeCluster: se você criar 1000 robôs em simultâneo, sem qualquer pressão, você pode criar vários administradores para distribuir tarefas. Há exemplos de código para criar clusters? Como criar vários administradores para descentralizar tarefas?
- O que é?Log ((talib.help (('MACD')); só pode ser usado em js, Python não tem a propriedade talib.help...
Cjz140O que é que a diferença entre a função _C (função, args...) e a função Sleep?
3263243yComo limpar o ErrorFilter após o SetErrorFilter? sem filtrar mensagens de erro.
QQ47898077Se você quiser usar uma biblioteca de terceiros, há alguma maneira de fazer isso?
QQ47898077O que deve ser preenchido pela classe pai se quisermos herdar uma nova classe definida pelo objeto da bolsa?
ethanwuHá ferramentas de depuração locais?
PenglihengO que é exange.IO (status)?
PenglihengPor que a função sell está em cinza, ou a função de representação não está disponível?
PenglihengPor que a função sell está em cinza, ou a função de representação não está disponível?
PenglihengEu não sei inglês, haha, mas gostaria de saber se o es6 é compatível.
PenglihengEu não sei inglês, haha, mas gostaria de saber se o es6 é compatível.
Don.Como escrever a linha média do volume?
ZjuturtleSe você comprar no exchange.Buy (Buy) 1000 pelo preço de mercado, o que você receberá se não for bem sucedido?
Minha filhaEssa nova fonte é linda.
hipopótamoA rede de testes da Bitmex (testnet.bitmex.com) também possui uma interface API, mas atualmente as bolsas só podem selecionar o terminal Bitmex. O endereço do documento API é https://testnet.bitmex.com/app/apiOverview. Por favor, como apoiar?
- Não, não.Var ret1 = exchanges[0].IO (("api", "future_estimated_price", "symbol=btc_usd"); Log (('ok futures estimado preço de entrega', ret1); https://dn-filebox.qbox.me/d1ed268c1e75753c5d289447d279aa9d81e41b5f.png O que é que acontece quando um usuário faz uma chamada para uma interface de outras exchanges e escreve uma mensagem de erro?
allenfrostlineA diferença entre realTicker e Ticker é que o realTicker é um software que funciona como um conjunto de ferramentas, mas que não parece ser mencionado na primeira API.
visõesOlá, como desenvolvedor de Python, o que você acha que a sua documentação API está escrevendo?
allenfrostlineGetAccount: [EAPI: Rate limit exceeded] Gostaria de saber como resolver isso?
zhjx2314Não tem suporte para StochRSI, pode ser adicionado logo?
YhfggO script está em seu próprio servidor da nuvem Ali ou no botvs cluster?
YhfggQual é a versão do Python?
FkyslyA interpretação do GetFee deve ser que o getFee retorna uma estrutura de getFee, menos um composto.
ZkwapComo usar o jss para chamar o talib?
YhfggPeça documentação Python
Wmjbs123O fundo do código para a edição de estratégias pode ser preto? Olhos pontiagudos brancos, código escrito à noite, fácil de miopia
Don.Como é que se pode configurar o sumário no bot WeChat?
Número: loucoPode-se adicionar um campo de preço igual na estrutura da ordem?
PequenoGetOrders: Retorna todos os pedidos incompletos, retorna uma estrutura de ordem de arquivo, na China Bitcoin transação ETH, retorna apenas os últimos 10 itens, aqui há uma função que retorna todos os pedidos incompletos da China Bitcoin ETH, o que significa que outras plataformas podem retornar tudo com GetOrders, só que este fantasma da China Bitcoin retorna 10 itens, o que significa que você pode usar GetOrders para retornar todos os pedidos incompletos.
YhfggA função matemática que é necessária para a probabilidade estatística, onde é que ela é usada?
JiebangQual é o significado do valor que a função $.Cross ((x, y) retorna?
A minha tia chamava-meO LogReset limpa todos os registros e pode ter um parâmetro numérico para especificar o número de registros reservados. Como é que isso elimina os últimos registos?
Edward GywA função CORRE no talib parece não ter sido transplantada ou foi perdida?
A montanha pobre de LiuyangParece que não há função de referência de indicadores!
PequenoComo é que o tempo de leitura da linha k traduz para o tempo presente?
PequenoComo escrever o número de um arquivo para removê-lo, eu acho que isso não funciona com records.remove ((records[0])
SerpenteA linha K da hora é normalmente obtida, mas como chamar ATR da linha K do dia?
SerpenteA linha K da hora é normalmente obtida, mas como chamar ATR da linha K do dia?
57278863Aprenda como os futuros tradicionais recebem preços e compras, desculpe, a base é tênue.
KirinO exemplo de negociação de futuros tradicionais!
Pequenozero, pode escrever um exemplo de negociação de futuros tradicionais?
PequenoComo imprimir o estado de armazenamento de vários blocos vazios ao mesmo tempo, como imprimir meu objeto, como obter o estado de armazenamento de vários blocos e blocos vazios, e também GetTicker, como obter o preço da semana, da próxima semana e do trimestre.
- Não, não.As bolsas de futuros podem usar o GetTicker para obter transações?
Venda em massaO StochRSI é um indicador que pode ser adicionado?
MomoxCancelOrder ((orderId) cancelar um pedido com base no número da ordem, retornar true ou false, por favor, pergunte true= a célula foi cancelada com sucesso, certo?
Momox_G(K, V) Lista de dicionários globais que podem ser salvos Este método armazena variáveis globais que podem ser usadas para compartilhar dados entre diferentes políticas?
Fluffy3dA popularidade
Zero.O registro de ganhos pode ser reiniciado com o LogProfitReset. O histórico do gráfico de ganhos anterior desaparece.
xyPode-se copiar o EA diretamente?
SJIRONMANEu sinto que a plataforma é ótima, muito boa, muito mais interação em grupo.
PequenoO que é essa língua, há material para aprender?
jxhbtcData error: uma semana sem conectar o robô.
- O quê?O banco de dados TA é apenas para calcular o preço de fechamento?
btcrobotOlá, mundo.
Sonhos pequenosA função _C tentará novamente sem pensar até obter um resultado.
Sonhos pequenosA biblioteca talib do python precisa ser instalada. https://www.botvs.com/bbs-topic/669 pode ser consultado neste post.
Sonhos pequenosSleep é o número de milissegundos em que o programa não faz nada e espera que o parâmetro seja definido, _C é a função que re-chamou o parâmetro.
Sonhos pequenosSem herança, o JS é embalado diretamente no objeto {name: "novo objeto", old_exchange : exchange[0],...... }
Sonhos pequenosO editor local, o plugin de sincronização remota, basicamente, é o editor local, o decote remoto.
Sonhos pequenosPode vir ao grupo QQ, é fácil discutir.
Sonhos pequenosEm documentos da API, o significado de cinza é que a função não tem muita explicação de expansão e mostra representados em cinza e azul.
Sonhos pequenosO ES6 está fora de suporte, ^^
Sonhos pequenosEu, descreva o problema e eu vou responder ^^
Sonhos pequenosA primeira coisa que você pode fazer é fazer um pedido de compra, mas o resultado é um erro, e você não pode fazer o pedido (ou seja, comprar, não há dinheiro suficiente!).
ZjuturtlePor exemplo, OKCoin, se o volume de compras for superior ao de empréstimos, o que será o retorno?
Sonhos pequenosA questão é: em qual bolsa eu devolveria um número de ordem no OK Futures?
Zero.Já é suportado para trocar transações em tempo de execução, sendo necessário o download do mais recente host. Suporte Bter/Poloniex API detalhada documentação Descrição da função de transação abaixo (descreva se não for possível limpar o cache do navegador e atualizar se não for possível)
Sonhos pequenosQQ, eu ajudo-te a encontrar a pergunta.
Família profissionalA lista branca precisa ser definida, e eu defino o IP do host?
Sonhos pequenosEste é o link subterrâneo Não foi criado O servidor não respondeu; O endereço IP foi configurado quando o API KEY foi solicitado?
Família profissionalIsso é embaraçoso. A política que eu poderia executar foi interrompida na era do Bitcoin, e o GetAccount não conseguiu acessar o GetAccount: Post http://api.btc38.com/v1/getMyBalance.php: read tcp 192.168.0.227:58596->211.149.148.144:80: wsarecv: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 2017-05-23 21:08:24 Era BitEras Erro GetAccount: timeout 2017-05-23 21:08:02 Era do Bitcoin Erro GetAccount: timeout 2017-05-23 21:07:40 Bit Era Erro GetAccount: timeout 2017-05-23 21:07:20 Reiniciar É o problema da lista branca de IP???
Sonhos pequenosO servidor da bolsa não respondeu e o protocolo TCP não foi estabelecido em três apertos de mão.
Família profissionalUma tentativa de conexão falhou porque a parte conectada não respondeu adequadamente depois de um período de tempo.
Sonhos pequenosOlá! A função exchange.IO ((
Família profissionalUma tentativa de ligação falhou porque a parte ligada não respondeu adequadamente após um período de tempo,
Família profissionalA era dos bitcoins não é favorável?
Sonhos pequenoshttps://dn-filebox.qbox.me/a709b30c6cc0a3565234b9e0c99b073f7ba8b454.png O que você está fazendo é errado.
Minha filhaPor exemplo, eu queria fazer uma transação em todas as moedas do poloniex, mas apenas algumas moedas são suportadas pelo BOTvs, e o exchange.IO não parece suportar a P-Net.
Sonhos pequenosO exchange.IO pode ser chamado assim.
Minha filhaE a API que precisa de autenticação de contas?
Sonhos pequenosSe as APIs que não exigem a verificação de contas podem ser usadas com httpQuery (veja mais documentação sobre BotVS), as APIs de transações reais precisam ser acessadas.
Sonhos pequenosOs parâmetros da API podem ser transmitidos usando o HttpQuery: https://www.okcoin.com/api/v1/future_estimated_price.do?symbol=btc_usd. O post: https://www.botvs.com/bbs-topic/850
visõesMuito obrigado, espero ter uma boa e perfeita documentação API.
Sonhos pequenosPor favor, onde é que a API do realTicker foi vista?
Sonhos pequenoshttps://dn-filebox.qbox.me/fe1a6f5563ed43a5357f858ecf8a50239619228e.png A documentação da API é a linguagem JavaScript. A descrição da versão em Python é publicada no topo da página de discussão da comunidade de chat chat. Se você tem alguma dúvida, é bem-vindo a escrever.
Zero.Olá, obrigado pela sugestão, a documentação da API está sendo reconstruída.
Sonhos pequenosOlá ~ mostra que a frequência de acesso ultrapassou o limite. https://dn-filebox.qbox.me/a09498920d04cac62624b7438a058d2098d8fb00.png O objetivo é controlar a frequência de acesso à API, porque algumas exchanges definem um limite máximo de acesso, um certo tempo além de um certo número de visitas será recusado o acesso, bloqueando o endereço IP.
Sonhos pequenoshttps://dn-filebox.qbox.me/c29ab7fc279e1b758355f137907cf52dc8257df6.png O que eu escrevi pessoalmente é que os indicadores do STOCHRSI, que já foram comparados com o OK, concordam que a velocidade é um pouco lenta e precisa ser otimizada, por enquanto.
Zero.Pode escolher se o botvs fornecerá o seu servidor ou o seu servidor host, versão 2.7.5.
Sonhos pequenosAgora adicionado.
Sonhos pequenosAgora você pode configurar seu próprio estilo de fundo.
Sonhos pequenosA documentação python está sendo escrita.
Sonhos pequenosO talib é um livro que pode ser lido em português.
Hzzgood48 https://www.botvs.com/bbs-topic/276
Sonhos pequenosParece que há um exemplo na Praça da Estratégia: https://www.botvs.com/strategy/15098
Zero.Acesse a propriedade AvgPrice do Order, que é suportada pelas exchanges, e as que não são suportadas serão sempre 0
YhfggComo é que a terceira parte cita?
Zero.Se o mathjs não for capaz de satisfazer as necessidades, basta procurar políticas de importação e cópia de bibliotecas de terceiros. Para facilitar a compilação, o sistema tem apenas uma pequena quantidade de bibliotecas internas.
Sonhos pequenosNão é simpático, há um problema no grupo, pode-se M-me - eu estou basicamente online.
JiebangObrigado.
Sonhos pequenosVocê pode ver a análise de código do catálogo de transações de moeda digital na versão de notas.
Zero.Não é possível excluir o mais recente, só é possível manter alguns dos mais recentes... excluindo todos os antigos.
KirinPara obter cada posicionamento com a posição [i], a posição é um conjunto
Minha filhaexchange.GetRecords ((PERIODO_D1));
KirinO meu futuro tradicional é sempre o "GetAccount: not login", "password não errado, ou login impossível".
Zero.Por padrão, o SetContractType é necessário para obter o tipo de contrato especificado.
Zero.Como você pode ver, o verdadeiro é o valor de retorno da ação de cancelar a ordem que o exchange devolveu, mas o cancelamento real não foi cancelado, dependendo de como foi processado dentro do exchange.
Momox3q
Zero.Não, não, não, não.
XuanxuanClaro que não, isso é exclusivo do MT4.
Zero.O Javascript está em toda parte na internet.
Venda em massaO seu problema resolvido?
Zero.A maior parte do tempo, os dados podem ser transmitidos diretamente como registros ou como uma matriz de preço puro.