Inventor de documentação de API de quantificação

Autora:Sonhos pequenos, Criado: 2017-11-27 09:05:08, Atualizado: 2023-07-12 16:47:31

[TOC]

Informações básicas

Entrar

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:

Se 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 é suportadaJavaScriptTypeScriptPythonC++PINE麦语言Blockly可视化A partir daí, o projeto começou a ser desenvolvido.

ApoioTypeScriptA linguagem, ainda assim, é definida como uma estratégia de criação.JavaScriptA estratégia, então, é escrita no início do código da estratégia.// @ts-checkOu clique no botão "TypeScript" no canto superior direito da área de edição da política para mudar para "TypeScript".TypeScriptA plataforma reconhece automaticamente o código como:TypeScriptO 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:

  • Tipo de segurança:TypeScriptA 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.
  • O código é preenchido automaticamente:TypeScriptO 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.
  • Estrutura de código mais clara: usoTypeScriptNo entanto, você pode organizar melhor e manter seu código para torná-lo mais fácil de ler e entender.
  • O que é que ele tem a dizer?TypeScriptFornece 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.

BlocklyVisualize o tutorial:

ConfiguraçãoPythonO programa estratégico usadoPythonInterpretação

UtilizaçãoPythonQuando 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.PythonA versão.#!python3#!python2O 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.LinuxJanelaMac OSAndroidARM Linux baseado em árvoresO que você está fazendo?Página do administradorInstalaçã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/storageO documento é:db3Não.SqlitePode ser usado em documentos de banco de dados.SqliteO software de gerenciamento é editado diretamente, para essas extensões é chamadodb3O nome do arquivo é o arquivo do disco físico.ID

Acordos apoiados

  • Ativos de blockchain: atualmente, mais de 50 principais ativos de blockchain (moedas digitais) são suportados por exchanges.
  • Acesso ao Protocolo Geral:Protocolo Geral

Segurança estratégica

Desenvolver estratégias na plataforma de negociação quantitativa FMZ, visíveis apenas para os titulares de contas de negociação quantitativa FMZ.PythonO pacote é carregado no código da política, o que permite a localização da política.

PythonSeguranç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.

PythonO código de encriptação estratégica: O que é que ele está a fazer?PythonA estratégia é que os autores do código não criptografem quando usam o código e o criptografam quando o alugam para outros.PythonA estratégia de inicialização é editada com o código abaixo, que pode ser especificado para uso pessoal ou para aluguel.PythonSe o código da política é criptografado quando executado. Suporte à criptografia do código da políticaPythonA versão é:Python 2.7A versão do Twitter:Python 3.5A versão do Twitter:Python 3.6A 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:#!pythonPara especificar a versão do Python Interpreter, use vírgula,Intervalo, entrada de instruções de criptografiaencryptNão especificado.PythonAdicionar 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
    

JulgamentoPythonA 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.PythonO código estratégico.

#!encrypt
def main():
    ret = os.getenv('__FMZ_ENV__')
    # 打印变量ret为字符串encrypt或者ret == "encrypt"为真,即代表加密生效
    Log(ret, ret == "encrypt")

Segurança de chaves

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 KEYO 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#8A partir daí, o usuário pode criar uma série de ferramentas para criar suas chaves públicas e privadas, como:opensslNã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 notxtO 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 KeyO que é que você está a fazer?RSA KEYNão, não. 5. Configurar a troca no FMZSecret KeyNa caixa de edição, preencha:Terceiro passoOs dados são colocados em um diretório de nível de administradortxtO caminho do arquivo, por exemplo, é chamado de:rsaKey.txtO documento e o administrador preencherão o seguinte no mesmo catálogo:file:///rsaKey.txtO documento deve ser enviado para o próximo nível do catálogo no qual o processo de administrador está localizado.rsa_keyEm seguida, escreva:file:///rsa_key//rsaKey.txt◦ Se for colocadorsaKey.txtNoutros 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

Sistemas de detecção

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.tickOs 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.tickO 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

As trocas suportadas no sistema de retestamento

  • 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_USDPor 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_BTCE assim por diante
    OKX Objetos de câmbio A plataforma permite transações limitadas para, por exemplo:BTC_USDT,ETH_USDT,ETH_BTC,LTC_BTCE assim por diante
    Moedas Objetos de câmbio A plataforma permite transações limitadas para, por exemplo:BTC_USDT,ETH_USDT,ETH_BTC,LTC_BTCE assim por diante
    Futuros OKX Objetos de câmbio de futuros A plataforma permite transações limitadas para, por exemplo:BTC_USD,ETH_USDA moeda é a moeda de câmbio.USD, Configure o código do contrato específico (verexchange.SetContractTypeO código de contrato que é suportado é:this_weeknext_weekquarterswap
    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_USDA moeda é a moeda de câmbio.USD, Configure o código do contrato específico (verexchange.SetContractTypeO código de contrato que é suportado é:this_weeknext_weekquarterswap
    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.SetContractTypeO 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_USDTA moeda é a moeda de câmbio.USDT, Configure o código do contrato específico (verexchange.SetContractTypeA função é a função deUSDTO 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.SetContractTypeO 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.

Nível de simulação

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.tickOs dados, como em tempo realtickOs dados são devolvidos quando a interface é solicitada.Inventor de um mecanismo de ressonância de nível analógico quantificado

Nível real

A retrospecção a nível de disco real é real.tickOs dados de nível estão na sequência de tempo de Bar.tickPara 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 realtickOs 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.GetDepthGetTradesFunção obtém dados de transação de retorno.GetTickerGetTradesGetDepthGetRecords, 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

  • Binance
  • OKX ((OKX em contato)
  • HuobiDM (token de futuros)

Revisão dos parâmetros do sistema

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:

  • Valor mínimo: o valor inicial do parâmetro de limitação.
  • Valor máximo: o valor máximo após a variação incremental do parâmetro de limitação.
  • Duração: Parâmetros de variação incremental.

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:

img

Modelo de ajuste de parâmetros:

img

Salvar a configuração de retrospecção

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.

img

Com oJavaScriptPor exemplo, clique em "Salvar configurações de retrospecção para o arquivo fonte":

img

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"}]
*)

Fontes de dados personalizadas

Utilização do sistemaGETO 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/dataO 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 é:JavaScriptExemplo:

/*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:

Motor de retorno local

A plataforma de negociação quantitativa FMZ é abertaJavaScriptLínguas ePythonO motor de retorno nativo da linguagem, com suporte para configurações de retornoCiclo da linha K inferior

O botão de atalho para revisar a página

  • 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íticasCtrlApós a tecla, basta pressionar,O que é isso?

  • O botão de atalho para salvar a política

    UtilizaçãoCtrl + sO botão, a política de conservação.

  • O botão de atalho para iniciar a revisão

    UtilizaçãoCtrl + bO botão para iniciar o teste de retorno.

Descrição do código

Funções de entrada

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.PythonA 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.
  • Explicação:
    • Sistema de detecção não suportadoonerror()Função.
    • A primeira vez que o vídeo foi exibido foi no dia seguinte.onerror()A função não é mais acionada.onexit()Função.

- Não, nã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);
    }
}

Iniciação

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("初始化!");
}

Erro (a)

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 é suportadaPythonC++A estratégia da linguagem.

function main() {
    var arr = []
    Log(arr[6].Close)
}

function onerror() {
    Log("错误")
}
# python不支持
// C++不支持

Estrutura estratégica clássica

EmJavaScriptPythonC++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

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.

JavaScriptA biblioteca de modelos de idiomas:

img

PythonA biblioteca de modelos de idiomas:

img

C++A biblioteca de modelos de idiomas:

img

  • 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:

    img

    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());
    }
    

    img

  • 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.

    img

Estrutura interna

Variações globais

intercâmbio

exchangePode 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.exchangeObjeto:

function main() {
    Log("实盘页面或者回测页面上,添加的第一个交易所对象名字:", exchange.GetName(), ",标签:", exchange.GetLabel())
}
def main():
    Log("实盘页面或者回测页面上,添加的第一个交易所对象名字:", exchange.GetName(), ",标签:", exchange.GetLabel())
void main() {
    Log("实盘页面或者回测页面上,添加的第一个交易所对象名字:", exchange.GetName(), ",标签:", exchange.GetLabel());
}
intercâmbios

O mesmo pode ser entendido como armazenamentoexchangeO 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());
    }
}
Estado da encomenda

OrderNa estruturaStatusAtribuiçõ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 eOrderEstruturaStatusComparaçã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.

Tipos de pedidos

OrderNa estruturaTypeAtribuições.

Nome da constante Definição Valor
ORDER_TYPE_BUY Pagamento 0
ORDER_TYPE_SELL Venda 1
Tipo de posição

PositionNa estruturaTypeAtribuiçõ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
Direção do equilíbrio

OrderNa estruturaOffsetAtribuiçõ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
Parâmetros de estratégia

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.JavaScriptA linguagem permite acessar diretamente os valores dos parâmetros definidos na interface da política, ou alterá-los.PythonUsado para modificar variáveis globais em funções de políticasglobalPalavras-chave:

Tipo de parâmetros:

img

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.
  • Parâmetros da interface, definidos na área de parâmetros da política abaixo da área de edição de código da página de política de edição.
  • Os parâmetros de interface existem como variáveis globais no código da estratégia, ou seja, podem ser modificados no código.
  • Parâmetros de interface em nome de variável no código da estratégia: isto é, no gráfico acimanumberstringcomboxboolsecretString
  • Descrição de opções: Parâmetros de interface Nome na interface de políticas.
  • Opções de notas: Descrição detalhada dos parâmetros da interface, que será exibida quando o mouse ficar no parâmetro da interface.
  • Opções de tipo: Tipo do parâmetro da interface.
  • Opções de valor padrão: o valor padrão do parâmetro da interface.

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.numberAA partir de um parâmetro:isShowAA decisão falsa do tipo BoolenumberAMostrar e ocultar.numberAA variável é definida nos parâmetros da interface como:numberA@isShowA

img

Isso não é selecionadoisShowAParâmetrosnumberAOs 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?isShowAPor exemplo, quando o parâmetro é definido como uma variável, é escrito:numberA@combox==2numberAOs parâmetros são baseadoscomboxSe 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.

img

A estratégia é usada para agrupar e mostrar parâmetros:

img

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.

img

img

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]]
*/

Estrutura de dados

Algumas funções recebem o original que é solicitado para retornar quando são chamadas.JSONOs dados, o originalJSONOs dados são armazenados em objetos de retornoInfoNa propriedade. Não há nenhum dado retornado no retraso, uma vez que o retraso não é uma interface de acesso a uma bolsa.InfoPropriedades, abaixo estão as principais descrições de propriedades de cada estrutura de dados.

Comércio

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
}
Carrapatos

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      // 毫秒级别时间戳
}
Registo

padrãoOHLCEstrutura, usada para desenhar linhas K e para análise de cálculo de indicadores.exchange.GetRecords()A função retorna a matriz desta estrutura.RecordA estrutura representa uma coluna de linha K, ou seja, uma linha K.BARRecordEntre eles:TimeO 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)为单位的成交量
}
Ordem

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 : ""            // 现货订单中该属性为""即空字符串,期货订单该属性为具体的合约代码
}
Ordem de Mercado

A lista de profundidade do mercado, ouexchange.GetDepth()A função retorna a estrutura de dadosOfertaPergunta.Estrutura de dados dos elementos no conjunto.

{
    Price   : 1000,              // 价格
    Amount  : 1                  // 数量
}
Profundidade

A profundidade do mercado,exchange.GetDepth()A função retorna.

{
    Asks    : [...],             // 卖单数组,MarketOrder数组,按价格从低向高排序
    Bids    : [...],             // 买单数组,MarketOrder数组,按价格从高向低排序
    Time    : 1567736576000      // 毫秒级别时间戳
}
Conta

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表示的资产用于挂单的冻结数量
}
Posição

A informação sobre posições mantidas em negociações de futuros é fornecida por:exchange.GetPosition()A função retorna para aqui.PositionEstruturaArquivos

{
    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 retornaPositionArrays estruturadas.FrozenAmountProfitMarginPropriedades, 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.FrozenAmountPara 0; se necessário, alguns dados podem ser usados para calcularInfoAnálise computacional de dados primários na propriedade.

Mercado

Informações sobre o mercado das variedades negociadasexchange.GetMarkets()A função que retorna contém isto.MarketEstruturaDicioná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.InfoO conteúdo do campo.

Funções globais

Versão (((

Version()Retorna o número de versão atual do sistema. Retorna o valor: tipo de string.

Durma (milissegundos)

Sleep(Millisecond)A função de hibernação para pausar o programa por um tempo.MillisecondTipo 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-6Milissegundos.

Atenção: Em usoPythonQuando 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 recomendadoPythonNão.timeO 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.secondO parâmetro é o número de segundos para pausar), o que leva a uma retrospecção muito lenta da política.

É Virtual?

IsVirtual(), para determinar se a política atual está sendo executada para a retrospecção analógica. Retorno do estado de repetição analógicatrueO disco real voltou.false

Correio...

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 sucedidotruesmtpServerPara envio de correiosmtpServiços,smtpUsernameO que é que ele está a fazer?smtpPasswordO código SMTP para o e-mail ((não é o código de login do e-mail))mailToO Facebook é um dos principais canais de mensagens de e-mails do mundo.titleO título do e-mail enviado é o seguinte:bodyO 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")

Mais.

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 ((api, ApiName, Args) não é suportada, veja https://www.botvs.com/bbs-topic/812

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.