[TOC]

Instruções básicas

Começando

O que pode fazer a plataforma de negociação quântica FMZ?

FMZ Quant Trading é a comunidade quantitativa mais profissional no campo da negociação quantitativa. Aqui você pode aprender, escrever, compartilhar, comprar e vender estratégias quantitativas; você pode realizar backtesting on-line e usar bots de simulação para realizar negociação simulada; você também pode executar, divulgar e assistir a negociação ao vivo.

Série completa de tutoriais

Tutoriais gráficos:

Se houver algum problema, você pode postar perguntas e discutir no fórum a qualquer momento, ou enviar um ticket, ou entrar em contato com um administrador no grupo Telegram (Telegram), em geral, a pergunta será respondida rapidamente.

Apoio ao ChatGPT para a assistência ao desenvolvimento

A plataforma de negociação quantitativa da FMZ adotou o ChatGPT como uma ferramenta de assistência ao desenvolvimento, que pode ser acessada clicando em ChatGPT na barra de atalhos no Dashboard para ir para oPágina de ferramenta auxiliar do ChatGPT.

Que linguagens de programação estão disponíveis para implementar minhas estratégias?

FMZ Quant plataforma de negociação suporta para usarJavaScript, TypeScript, Python, C++, Pine MylanguageeBlockly Visualizationpara escrever e conceber estratégias.

SuportaTypeScriptlinguagem, ainda o defina paraJavaScriptestratégia quando criamos estratégias, então escrevemos// @ts-checkno início do código da estratégia ou clique no botãoTypeScriptno canto superior direito da área de edição da estratégia para mudar paraTypeScriptA plataforma reconhecerá o código comoTypeScriptautomaticamente e fornecer-lhe o apoio adequado à compilação e à verificação de tipo para:

  • Segurança do tipo:TypeScriptA função de verificação de tipo estático pode ajudá-lo a encontrar erros potenciais ao escrever código e melhorar a qualidade do código.
  • Completação automática de código:TypeScriptO sistema de tipos do Java torna mais rápido encontrar os atributos e métodos que você precisa ao escrever código, melhorando a eficiência do desenvolvimento.
  • Estrutura de código mais clara:TypeScript, pode organizar e manter melhor o seu código, tornando-o fácil de ler e compreender.
  • Funções de programação orientadas a objetos:TypeScriptfornece poderosos recursos de programação orientados a objetos, como interfaces, classes, genéricos e assim por diante, ajudando você a escrever código de estratégia mais robusto e reutilizável.

Você só precisa dominar uma dessas linguagens. Além de apoiar a maneira de projetar estratégias escrevendo código, você também pode criar estratégias usando módulos visuais (Blockly).

BlocklyTutoriais de visualização:

Configure oPythonInterpretaçãoPythonPrograma estratégico

Estratégias escritas emPython, no caso de backtesting ou de negociação ao vivo, se o ambiente do sistema docker tiver ambosPython2ePython3instalado, você pode definir oPythonA primeira linha da estratégia é a versão a lançar no tempo de execução, como#!python3e#!python2E você também pode especificar um caminho absoluto, como:#!/usr/bin/python3.

O que é Docker?

O Docker pode ser entendido como o executor de sua estratégia de negociação, responsável por solicitações de dados complexos, recepção de dados, links de rede, log postback e assim por diante. O docker é executado em seu servidor, mesmo que o site da plataforma de negociação FMZ Quant tenha uma falha de rede, isso não afetará a operação do seu docker. O docker pode ser executado emLinux, Janela, Mac OS, Android, Raspberry Pi ARM Linuxe outros sistemas.Página do Docker, Etapas de instalação e atualização do docker LinuxOs bots e registos geridos pelo docker são armazenados no diretório/logs/storageO ficheiro é umSqlitearquivo de banco de dados comdb3, que pode ser editado directamente peloSqlitepara um ficheiro com extensãodb3Na base de dados de bots real, o nome do arquivo é o bot ID.

Protocolos suportados

  • Ativos Blockchain: Mais de 50 principais trocas de ativos blockchain (criptomoeda) são agora suportadas em nossa plataforma.
  • Acesso ao Protocolo Geral:Protocolo Geral

Segurança estratégica

Quando as estratégias de negociação são desenvolvidas na plataforma de negociação Quant FMZ, o conteúdo da estratégia é visível apenas para os titulares da conta FMZ.PythonO pacote, que é carregado no código da estratégia, para que a localização do conteúdo da estratégia possa ser realizada.

A segurança dosPythonCódigo: Porque...Pythoné uma linguagem de código aberto que é extremamente fácil de descompilar, se a estratégia não é para uso pessoal, mas para aluguel, você pode executar a estratégia em seu próprio docker implantado e alugá-lo na forma de sub-conta ou gerenciamento docker completo se você estiver preocupado com o vazamento de estratégia.

A criptografia dePythonCódigo de estratégia: Por defeito,PythonO código de estratégia não é criptografado quando usado pelo autor e criptografado quando alugado a terceiros. Ao editar o seguinte código no início doPythonO código de programação pode ser criptografado para uso pessoal ou aluguel.PythonAs versões que suportam a criptografia dos códigos de estratégia são as seguintes:Python 2.7, Python 3.5ePython 3.6.

  • Os autores da estratégia executam-na e criptografam o código da estratégia para outros usarem através do código de registro: Especificar#!pythoncomo a versão do intérprete Python, e depois usar,para manter separado; inserir o comando de criptografiaencryptSe não especificar a versão dePython, acrescentar#!,encrypt directly.
 #!python,encrypt

Ou...

  #!encrypt
  • Não criptografará os códigos de estratégia quando os escritores de estratégia executarem para seu próprio uso e compartilharem com outros através do código de registro:
  #!python, not encrypted

Ou...

  #!not encrypted

Usar códigoos.getenv('__FMZ_ENV__')para determinar se o código de criptografia é válido; o retorno da cadeia"encrypt"É válido apenas no bot real, e o backtest não criptografará oPythonCódigos de estratégia.

#!encrypt
def main():
    ret = os.getenv('__FMZ_ENV__')
    # If the print variable ret is the string "encrypt" or ret == "encrypt" is true, that means the encryption is valid. 
    Log(ret, ret == "encrypt")

Segurança fundamental

Os dados confidenciais, como informações de conta e cadeias criptografadas em parâmetros de estratégia configurados na plataforma de negociação FMZ Quant, são criptografados no navegador da web. Todas as informações armazenadas na plataforma de negociação FMZ Quant são criptografadas (não dados de texto simples), e apenas os usuários dispositivos privados podem decifrar e usar as informações, o que melhora muito a segurança dos dados confidenciais.

  • Nossa plataforma suporta configuração localizada de informações confidenciais, tais como informações de conta de troca e chave secreta Na página onde a plataforma configura informações de troca, todos os controles de caixa de texto criptografados com máscaras suportam a maneira de configurar o caminho do arquivo para carregar o arquivo local do docker.RSA KEYmétodo de autenticação da troca como um exemplo para explicar em detalhes como configurar informações confidenciais localmente no dispositivo onde o programa docker está localizado.
  1. Criar chave pública e chave privada RSA. Por exemplo, criar chaves públicas e privadas no formato dePKCS#8, existem muitas ferramentas disponíveis para criação, tais comoopenssl.
  2. Criar umRSA KEYna troca, e carregar a chave pública criada emPasso 1durante a criação.
  3. Salvar a chave privada criada emPasso 1no mesmo diretório do docker no formato detxtarquivo, ou em outros caminhos no diretório do programa docker.
  4. Ao configurar o exchange na plataforma FMZ, preencha oRSA KEYcriado pela troca na caixa de edição da configuraçãoAccess Key.
  5. Ao configurar o exchange na plataforma FMZ, preencha o caminho dotxtarquivo colocado no mesmo diretório nível do docker noPasso 3na caixa de edição da configuraçãoSecret Key. Por exemplo, se o nome do arquivo colocado é:rsaKey.txt, e o arquivo e o docker são preenchidos no mesmo diretório de nível:file:///rsaKey.txt. Se o arquivo estiver no diretório ao lado do diretório do programa dockerrsa_key, preencha:file:///rsa_key//rsaKey.txtSe você colocarrsaKey. txtem qualquer outro lugar do seu computador ou servidor siga estas instruções de acordo, deve-se notar que este arquivo só pode ser colocado em diretórios de mesmo nível ou subdirectórios em relação ao docker.

Isto torna mais seguro para localizar e salvar a chave privada, você pode se referir aExplicação em vídeopara um processo detalhado.

Sistema de ensaio de retrocesso

O que é um sistema de backtest e para que é utilizado?

Depois de ter concluído o projeto de uma estratégia de negociação quantitativa, como você pode saber a situação básica de sua estratégia, como a lógica da estratégia e a direção dos retornos da estratégia?

Os dados do sistema de backtest são precisos e quanto à precisão dos resultados dos backtest?

A plataforma FMZ Quant Trading divide o sistema de backtest emnível de mercado realeNível de simulaçãoO nível real do mercado é para backtest completamente de acordo com os dados históricos completos; enquanto o nível de simulação backtest geratickOs dados são obtidos de acordo com os dados reais da linha K, em intervalos regulares, para efeitos de backtest.Descrição do mecanismo de ensaio de retrocesso FMZNo entanto, o backtesting é apenas o desempenho da estratégia de acordo com dados históricos. Os dados históricos não podem representar completamente o mercado futuro. O mercado histórico pode se repetir, ou também pode levar ao Cisne Negro. Portanto, os resultados do backtest devem ser tratados racionalmente e objetivamente.

Questões a serem tomadas em consideração ao backtestar diferentes estratégias de linguagem de programação:

O backtest deJavaScripteC++estratégias de negociação é conduzida no navegador, e o robô de mercado real ouWexAppEmpréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimos empréstimosWexAppemulado de câmbio da plataforma FMZ Quant Trading) é executado sem instalar qualquer outro software, bibliotecas ou módulos. O backtest dePythonA operação de mercado real e o backtest dependem ambos do sistema de avaliação de mercado.PythonSe algumas bibliotecas forem necessárias, elas devem ser instaladas manualmente (apenas bibliotecas comuns são suportadas em servidores públicos).

Dados do teste de regresso no sistema

Existem dois tipos de backtest da plataforma FMZ Quant Trading: backtest de nível de simulação e backtest de nível de mercado real.tickCada período de linha K irá gerar 12 pontos de tempo de backtesting; no entanto, o nível real do mercado recolheticksO mecanismo de backtest da FMZ permite que a estratégia de negociação seja negociada várias vezes em uma única linha K, evitando a situação em que a negociação só pode ser executada no preço de fechamento. É mais preciso, levando em conta a velocidade do backtest. Para explicações mais detalhadas, consulteo Link.

Método de estratégia DEBUG no sistema de backtesting

Backtesting de estratégia JavaScript depuração no Chrome DevTools

Intercâmbios suportados no sistema de backtesting

  • Valor criptografado (Criptomoeda)

    Nome Tipo Instruções
    Bitfinex Objeto de troca spot apoiar pares de negociação limitados, tais como:BTC_USD, ETH_USDeLTC_USD, etc. (observe que a moeda de cotação dos pares de negociação éUSDdólar)
    Binance Objeto de troca spot apoiar pares de negociação limitados, tais como:BTC_USDT, ETH_USDT, ETH_BTCeLTC_BTC, etc.
    OKX Objeto de troca spot apoiar pares de negociação limitados, tais como:BTC_USDT, ETH_USDT, ETH_BTCeLTC_BTC, etc.
    Huobi Objeto de troca spot apoiar pares de negociação limitados, tais como:BTC_USDT, ETH_USDT, ETH_BTCeLTC_BTC, etc.
    Futuros da OKX Objeto de troca de futuros apoiar pares de negociação limitados, tais como:BTC_USDeETH_USD, etc.; a moeda de cotação dos pares de negociação éUSD; após a definição do código específico do contrato (consulte a funçãoexchange.SetContractType), o contrato é um contrato cripto-marginado; os códigos de contrato suportados incluem:this_week, next_week, quartereswap
    HuobiDM Objeto de troca de futuros A HuobiDM é Huobi Futures (Huobi Contract), que suporta pares de negociação limitados, tais como:BTC_USDeETH_USD, etc.; a moeda de cotação dos pares de negociação éUSD; após a definição do código específico do contrato (consulte a funçãoexchange.SetContractType), o contrato é um contrato cripto-marginado; os códigos de contrato suportados incluem:this_week, next_week, quartereswap.
    BitMEX Objeto de troca de futuros o par de negociação éXBT_USD; após a definição do código específico do contrato (consulte a funçãoexchange.SetContractType), o contrato é um contrato cripto-marginado; o código do contrato suportado é:XBTUSD
    Binance Futures Objeto de troca de futuros apoiar pares de negociação limitados, tais como:BTC_USDTeETH_USDT, etc.; a moeda de cotação dos pares de negociação éUSD; após a definição do código específico do contrato (consulte a funçãoexchange.SetContractType), o contrato é umaUSDT- contrato com margem; o código do contrato suportado éswap
    Opções derivadas Objeto de troca de futuros Os pares de negociação são:BTC_USDeETH_USD; após a definição do código específico do contrato (consulte a funçãoexchange.SetContractType), o contrato é um contrato cripto-marginado; devem ser definidos códigos específicos dos contratos de opções

    Para os objectos de troca de futuros no sistema de backtest, a mudança de pares de negociação não é temporariamente suportada nos códigos de estratégia.

Nível de simulação

O backtest de nível de simulação é baseado nos dados de linha K subjacentes do sistema de backtest, simulação de dados de tick no quadro do preço mais alto, preço mais baixo, preço de abertura e valores de preço de fechamento de uma determinada barra de linha K subjacente de acordo com um determinado algoritmo.tickdados quando é solicitada a interface.Descrição do mecanismo de ensaio posterior de nível de simulação quântica FMZ.

Nível de mercado real

O backtest de nível de mercado real é o realtickPara estratégias baseadas emtickO nível de dados, usando o nível real do mercado para backtest é mais próximo da realidade.tickOs dados são dados registrados reais, não simulados. Ele suporta dados de profundidade, gravação de dados de reprodução de negociações de mercado, profundidade personalizada e cada dado de negociação individual. O tamanho máximo do backtest de dados de nível de mercado real é de até um máximo de 50MB, sem limite no intervalo de tempo do backtest dentro do limite superior do conjunto de dados. Se você precisar ampliar o intervalo de tempo do backtest tanto quanto possível, você pode reduzir o valor do equipamento de configuração de profundidade e não usar cada dado de negociação individual para aumentar o intervalo de tempo do backtest.GetDepth,GetTradesNo momento em que os dados do mercado estão na linha do tempo, chamandoGetTicker,GetTrades, GetDeptheGetRecordsO tempo do backtest não será movido várias vezes quando o tempo se move na linha do tempo do backtest (o que não desencadeará um salto para o próximo momento de dados do mercado). As chamadas repetidas para uma das funções acima empurrarão o tempo do backtest para se mover na linha do tempo do backtest (salto para o próximo momento de dados do mercado). Quando o nível real do mercado é usado para backtest, não é recomendado escolher um tempo anterior. Pode não haver dados de nível real do mercado no período de tempo prematuro.

O backtest de nível de mercado real apoia actualmente:

  • Binance
  • OX (OKX Spot)
  • HuobiDM (Huobi Futures)

Optimização de parâmetros do sistema de backtesting

A função de otimização de parâmetros do sistema de backtest da plataforma FMZ Quant Trading é definir otimizações de acordo com cada opção de otimização de parâmetros durante o backtest, e as opções são mostradas da seguinte forma:

  • Valor mínimo: para limitar o valor inicial dos parâmetros.
  • Valor máximo: para limitar o valor máximo dos parâmetros após alterações incrementais.
  • Tamanho do passo: quantidade da variável incremental dos parâmetros.

Gerar combinações de parâmetros, e atravessar todas essas combinações para backtest (ou seja, backtesting cada combinação de parâmetros uma vez).NúmeroO sistema de backtesting pode ser otimizado.

Por exemplo, definir opções de otimização de parâmetros na página do backtest:

img

O backtest do modo de otimização de parâmetros:

img

Salvar configurações de teste de retorno

Na página de edição de estratégia, na paginação de Backtest (nomeadamente o sistema de backtest), você pode definir opções como configurações de backtest e parâmetros de estratégia para backtestar a estratégia. As configurações de backtest se referem ao intervalo de tempo de backtest, plataforma de troca, ponto de deslizamento e taxa de serviço, etc.; enquanto os parâmetros de estratégia são usados para definir opções de parâmetros para estratégias. Quando as configurações de estratégia estiverem todas definidas, você pode backtestar a estratégia de acordo com as configurações. Então, como você salva essas configurações configuradas para uso na próxima página de backtest (as opções definidas durante o refresco da página serão redefinidas)? Você pode clicar no botão Save Settings na página de estratégia, e todas as configurações de backtest (incluindo configurações de backtest e configurações de parâmetros) serão registradas em código fonte na página de estratégia de teste. Ao abrir a página de estratégia

img

LeveJavaScriptestratégia como um exemplo, e clique em Save Backtest Settings to Source File:

img

Há ligeiras diferenças em Save Backtest Settings to Source File entreJavaScript, Python, cppeMylanguage:

/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

Mylanguage:

(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*)

Fonte de dados personalizada

O sistema utiliza oGETmétodo para solicitar uma URL personalizada (URL acessível ao público) para obter uma fonte de dados externa para backtest. Os parâmetros de solicitação adicionais são os seguintes:

Parâmetro Significado Explicação
Símbolo Nome do símbolo como BTC_USD_OKCoin_EN
Eid Intercâmbio como OKCoin_EN
Redondo Precisão dos preços como 3, o preço nos dados devolvidos deve ser multiplicado por 1000 e arredondado
Em volta Precisão da quantidade como 2, a quantidade nos dados devolvidos deve ser multiplicada por 100 e arredondada
Período Período de barras (milissegundos) como 60.000 indicando a barra pedindo um minuto
Profundidade Níveis de profundidade 1-20
Comércio Se os dados precisam ser divididos Verdadeiro/falso
Do Horário de início carimbo de tempo unix
Para Tempo do Fim carimbo de tempo unix

Nota:

Round and V-Round are two parameters designed to avoid losing the precision of floating-point numbers during network transmission. The price data, trading volume and order amount, are all transmitted using integers.

Exemplo dos dados cosidos:

http://customserver:80/data?symbol=BTC_USD_OKCoin_EN&eid=OKCoin_EN&round=3&vround=3&period=900000&from=1564315200&to=1567267200

O formato devolvido deve ser um dos dois seguintes formatos (que serão reconhecidos automaticamente pelo sistema):

Teste de retrocesso ordinário a nível de barra

{
    "schema":["time","open","high","low","close","vol"],
    "data":[[1564315200000,9531300,9531300,9497060,9497060,787],[1564316100000,9495160,9495160,9474260,9489460,338]]
}

Dados de backtest de nível Tick (incluindo informações sobre a profundidade do mercado, uma matriz com um formato de profundidade de [preço, volume]; pode haver vários níveis de profundidade; asks refere-se à ordem ascendente do preço e bids refere-se à ordem inversa do preço.)

{
    "schema":["time","asks", "bids","trades","close","vol"],
    "data":[[1564315200000,[[9531300,10]], [[9531300,10]],[[1564315200000,0,9531300,10]],9497060,787]]
}

Descrição

Campo Descrição
Esquema Especifica os atributos das colunas na matriz de dados, que é sensível a minúsculas e minúsculas e é limitada apenas a time, open, high, low, close, vol, asks e bids
Dados Uma matriz que armazena dados por esquema

Formato de dados

Campo Descrição
pedidos/oferta [preço, volume],...]
negócios [tempo, direcção, 0: comprar, 1: vender, preço, volume]

Fornecimento de dados sobre as taxas de financiamento:

Por exemplo, ao fazer o backtesting do Binance Futures, é necessário ter dados adicionais da taxa de financiamento, que precisam ser fornecidos por uma fonte de dados personalizada.

{
  "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],                  // The adjacent periodic interval is 8 hours
    [1626710400000, 310, 310, 310, 310, 0],                  // The funding rate of Binance updates every 8 hours, and why the data of the funding rate turns out to be 310?
    [1626739200000, 310, 310, 310, 310, 0],                  // Like the bars data, to avoid losing the precision of floating-point numbers during network transmission, the data uses integer, so the data needs to be processed according to round parameter; the data, returned to the backtest system after processing, is 310 
    [1626768000000, -41610, -41610, -41610, -41610, 0],      // The funding rate might be a negative value
    [1626796800000, -5125, -5125, -5125, -5125, 0],
        ...   
    [1627977600000, 10000, 10000, 10000, 10000, 0]
  ]
}

Exemplo da solicitação de dados do sistema de backtest:

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

Exemplo de fonte de dados personalizada:

Especificar a fonte de dados, URL:http://xxx.xx.x.xx:9090/dataPersonalize o servidor de dados, escrito em 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)
}

Estratégia de ensaio,JavaScriptExemplo:

/*backtest
start: 2019-07-28 00:00:00
end: 2019-07-29 00:00:00
period: 1m
platforms: [{"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)
}

Gráficos desenhados pelos dados personalizados no sistema de backtest:

Estratégia Imprimir Informações:

Motor de backtest local

A plataforma FMZ Quant Trading é open-source para oJavaScriptversão e oPythonversão do motor de backtest local, configuração de suportePeríodo de linha K subjacentedurante o backtesting.

Chaves de atalho de página de teste de volta

  • Tabela de atalho para alternar entre a página de estratégia Editar e a página de Backtesting

    Usa a chave.Ctrl +,para mudar de volta para a página Backtest e Edit Strategy.CtrlAperta a tecla.,.

  • Chave de atalho para estratégia de poupança

    Usa a chave.Ctrl + spara salvar estratégias.

  • atalho para iniciar estratégia backtest

    Usa a chave.Ctrl + bpara permitir o Start Backtest.

Descrição do código

Funções de entrada

Nome da função Descrição
main() É uma função de entrada.
onexit() É uma função de limpeza quando se desliga normalmente, o seu tempo máximo de execução é de 5 minutos, que pode ser deixado não declarado.interromperserá comunicado o erro.
onerror() é uma função de saída anormal, seu tempo máximo de execução é de 5 minutos, que pode ser deixado não declarado.Pythonecppnão suportam esta função.
init() é uma função de inicialização, seu programa de estratégia será chamado automaticamente quando ele começar a executar, o que pode ser deixado não declarado.
  • Descrição:
    1. O sistema de backtest não suporta a funçãoonerror().
    1. Se a funçãoonerror()é acionado no bot, a funçãoonexit()não será acionado.

- Não, não.

onexit(), processamento de trabalhos de limpeza, com um tempo máximo de execução de 5 minutos, que é realizado pelo utilizador.

function main(){
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)
}

// onexit function implementation
function onexit(){
    var beginTime = new Date().getTime()
    while(true){
        var nowTime = new Date().getTime()
        Log("The program stops counting down..The cleaning starts and has passed:", (nowTime - beginTime) / 1000, "Seconds!")
        Sleep(1000)
    }
}
import time 
def main():
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)

def onexit():
    beginTime = time.time() * 1000
    while True:
        ts = time.time() * 1000
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!")
        Sleep(1000)
void main() {
    Log("Start running, stop after 5 seconds, and execute onexit function!");
    Sleep(1000 * 5);
}

void onexit() {
    auto beginTime = Unix() * 1000;
    while(true) {
        auto ts = Unix() * 1000;
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!");
        Sleep(1000);
    }
}

Iniciação

O usuário implementa a função de inicializaçãoinit(), que executará automaticamente a funçãoinit()no início da estratégia para completar a tarefa de inicialização.

function main(){
    Log("The first line of the code executed in the program!", "#FF0000")
    Log("Exit!")
}

// Initialization Function
function init(){     
    Log("Initialization!")
}
def main():
    Log("The first line of the code is executed!", "#FF0000")
    Log("Exit!")

def init():
    Log("Initialization!")
void main() {
    Log("The first line of the code is executed!", "#FF0000");
    Log("Exit!");
}

void init() {
    Log("Initialization!");
}

Erro (a)

Execução da funçãoonerror()Esta função não suporta estratégias escritas emPythonecpp.

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

function onerror() {
    Log("error")
}
# not supported by python 
// not supported by C++ 

Quadro de estratégia clássico

As estratégias escritas emJavaScript, Pythonecpp, oSleep()No bot, ele é usado para controlar os intervalos de votação de estratégia, e também controlar a frequência de solicitação de acesso à interface API da troca.

  • Exemplos de estruturas básicas de estratégias de criptomoedas:

    function onTick(){
        //Write strategy logic here, and it will be called constantly, such as printing market information
        Log(exchange.GetTicker())
    }
    
    function main(){
        while(true){
            onTick()
            //The function "Sleep" is mainly used to control the polling frequency of cryptocurrency strategies to prevent accessing the exchange API interafce too frequently 
            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);
        }
    }
    

    Tomemos o exemplo mais simples, se eu quiser colocar uma ordem de compra com um preço de 100 e uma quantidade de 1 na bolsa a cada segundo, eu posso escrever assim:

    function onTick(){
        // It is just an example; for all the assets will be used to place orders fast during backtest or in the bot, do not implement the example in the bot
        exchange. Buy(100, 1)
    }
    
    function main(){
        while(true){
            onTick()
            // The pause period can be customized in millisecond (1 second = 1000 milliseconds)
            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

Obiblioteca de modelosé um módulo de código reutilizável na plataforma FMZ Quant Trading, funcionando como uma categoria de códigos de estratégia de negociação.Biblioteca de modelos, um modelo é adicionado na página Estratégia da conta atualmente conectada à plataforma de negociação FMZ Quant. Após a criação, não é mais possível modificar a categoria para uma estratégia normal.

Biblioteca de modelosJavaScript:

img

Biblioteca de modelosPython:

img

Biblioteca de modeloscpp:

img

  • Função de exportação da biblioteca de modelos A função de exportação é uma função de interface de Template library, e pode ser chamada pela estratégia que se refere a Template library.

    /*
    -- This method is called directly with $.Test() after the strategy refers to the template
    -- The "main" function will not be triggered in the strategy, and it is only used as the entry point for template debugging
    */
    $.Test = function() {
        Log('Test')
    }
    
    function main() {
        $.Test()
    }
    
    def Test():
        Log("template call")
    
    # Export "Test" function; the main strategy can be called by ext.Test()
    ext.Test = Test 
    
    // The strategy refers to the template and calls this method directly with ext::Test()
    void Test() {
        Log("template call");
    }
    
  • Biblioteca de modelos parâmetros A biblioteca de modelos também pode definir seus próprios parâmetros de interface, que são usados na forma de variáveis globais no código da biblioteca de modelos.

    Biblioteca de modelos configurações de parâmetros:

    img

    Códigos 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;
    }
    

    Referir-se-á ao código de estratégia noBiblioteca de modelosexemplo mencionado acima:

    function main () {
        Log("call $.GetParam1:", $.GetParam1())
        Log("call $.SetParam1:", "#FF0000")
        $.SetParam1(20)
        Log("call $.GetParam1:", $.GetParam1())
    }
    
    def main():
        Log("call ext.GetParam1:", ext.GetParam1())
        Log("call ext.SetParam1:", "#FF0000")
        ext.SetParam1(20)
        Log("call ext.GetParam1:", ext.GetParam1())
    
    void main() {
        Log("call ext::GetParam1:", ext::GetParam1());
        Log("call ext::SetParam1:", "#FF0000");
        ext::SetParam1(20);
        Log("call ext::GetParam1:", ext::GetParam1());
    }
    

    img

  • Citação Biblioteca de modelos

    Após verificar a referência na coluna de modelo da página de edição da estratégia, salve a estratégia.

    img

Estrutura integrada

Variaveis globais

Intercâmbio

ExchangePor padrão, é considerado como o primeiro objeto de troca adicionado nos parâmetros da estratégia.

  • Adicionar objetos de troca em Backtest

  • Adicionar objetos de troca na página Bot

Os objetos de troca adicionados correspondem aoexchangeObjetos do código:

function main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
}
def main():
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
void main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel());
}
Intercâmbio

Pode ser entendido como uma matriz que armazena todos os objetos de troca comoexchangeObjetos de troca, que podem conter múltiplos objetos de troca;exchanges[0]éexchange.

Os objetos de troca adicionados correspondem a:exchanges[0], exchanges[1], exchanges[2]... e assim por diante no código de estratégia.

function main() {
    for(var i = 0; i < exchanges.length; i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
    }
}
def main():
    for i in range(len(exchanges)):
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
void main() {
    for(int i = 0; i < exchanges.size(); i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel());
    }
}
Estado da encomenda

O atributoStatusemOrder structure.

Nome constante Definição Valor
ORDER_STATE_PENDING Incompleto 0
ORDER_STATE_CLOSED (em inglês) terminado 1
ORDER_STATE_CANCELED (Ordem_Estado_Cancelado) cancelado 2
ORDER_STATE_UNKNOWN Não é conhecido estado desconhecido (outros estados) 3

ORDER_STATE_UNKNOWN Não é conhecidostatus pode chamarexchange.GetRawJSON()para obter as informações de estado do pedido original, consultar o ficheiro de troca e ver a descrição específica. Os nomes constantes no formulário podem ser utilizados diretamente no código de estratégia para comparar com o atributoStatusemOrderImprimir estes nomes constantes irá mostrar o status da ordem.nomes constantese seus correspondentesvalores, e outros nomes constantes abaixo funcionam da mesma forma, por isso não haverá descrições mais detalhadas sobre eles.

Tipo de operação de ordem

O atributoTypeemOrder structure.

Nome constante Definição Valor
ORDER_TYPE_BUY Ordem de compra 0
ORDER_TYPE_SELL Ordem de venda 1
Tipo de posição

O atributoTypeemPosition structure.

Nome constante Definição Descrição Aplicável Valor
PD_LONG Posição longa Utilização de futuros de criptomoedasexchange.SetDirection("closebuy")para definir a direção da posição de fechamento e fechar este tipo de posições Futuros de criptomoedas 0
PD_SHORT Posição curta Utilização de futuros de criptomoedasexchange.SetDirection("closesell")para definir a direção da posição de fechamento e fechar este tipo de posições Futuros de criptomoedas 1
Orientações de abertura e fechamento de posições de futuros

O atributoOffsetemOrder structure.

Nome constante Definição Valor
ORDER_OFFSET_OPEN Ordens de posição aberta 0
ORDER_OFFSET_CLOSE (em inglês) Ordens de posições fechadas 1
Parâmetros da estratégia

Nos códigos de estratégia de negociação, os parâmetros de estratégia definidos na interface de estratégia são refletidos sob a forma de variáveis globais.JavaScriptA linguagem pode aceder directamente aos valores dos parâmetros definidos ou modificados na interface de estratégia; enquanto nas funções dePythonestratégias, a palavra-chaveglobalA evolução da política de emprego é necessária para modificar as variáveis globais da estratégia.

Tipos de parâmetros:

img

Variavel Descrição Observações Tipo Valor padrão Descrição
Número Tipo numérico Observações Número (número) 1 C ++ estratégia é um tipo de ponto flutuante
Corda cordel Observações Coroa (coroa) Olá FMZ O valor padrão não precisa ser citado. A entrada é tratada como uma cadeia
Caixa ComboBox Observações ComboBox (selecionado) 1|2|3 A variável combox em si é um valor numérico, que representa o índice da coluna selecionada pelo controle Combobox.
Bool Opções de verificação Observações Boolean (verdadeiro/falso) verdade Se verificado, a variável bool é verdadeira; se não verificado, a variável bool é falsa
SecretString Corda criptografada Observações Estringência criptografada Senha Com o mesmo uso de uma cadeia, a cadeia criptografada será enviada por criptografia e não será transmitida em texto simples
  • Os parâmetros de interface são definidos na secção de parâmetros de estratégia abaixo da secção de edição de código da página de edição de estratégia.
  • Os parâmetros de interface existem como variáveis globais no código de estratégia, ou seja, os parâmetros de interface podem ser modificados no código.
  • Os nomes das variáveis dos parâmetros da interface no código de estratégia (visto no formulário acima):number, string, combox, bool, secretString.
  • Opção de descrição: os nomes dos parâmetros da interface na interface de estratégia.
  • Opção de observação: a descrição pormenorizada dos parâmetros da interface; a descrição será exibida quando o mouse estiver sobre os parâmetros da interface.
  • Opção de tipo: o tipo dos parâmetros da interface.
  • Opção de valor por defeito: os valores por defeito dos parâmetros da interface.

Configurações de dependência de parâmetros: Um parâmetro pode ser definido para permitir que outro parâmetro para ser exibido e escondido com base na seleção do parâmetro.numberA, que é um tipo numérico.numberAser exibido ou ocultado com base no parâmetroisShowA(tipo booleano) é verdadeiro ou falso.numberAnos parâmetros da interface:numberA@isShowA.

img

Desta forma, se o parâmetroisShowAnão é verificado, o parâmetronumberAPara os parâmetros do tipo de comando ComboBox, a parte dependente dos parâmetros é julgar se o valor do parâmetro é igual aovalor do índiceDa mesma forma, tomar parâmetroisShowAQuando definir as variáveis nos parâmetros, escrever:numberA@combox==2O parâmetronumberAirá exibir ou ocultar, com base em se o parâmetrocomboxserá verificada como a terceira opção (onde o índice 0 corresponde à primeira opção, o índice 1 corresponde à segunda e o índice 2 corresponde à terceira).

Parâmetros de interface de estratégia, controles interativos e função de agrupamento de parâmetros no Template: Basta adicionar(?First group)No início da descrição do parâmetro que inicia o agrupamento, conforme mostrado na figura seguinte:

img

Quando se utiliza a estratégia, os parâmetros são apresentados em grupos:

img

Salvar valor padrão do parâmetro: Os parâmetros da estratégia são mostrados na figura. Durante o backtest, se você quiser salvar os valores padrão dos parâmetros da estratégia, você pode clicar noSave settingsApós a modificação dos parâmetros da estratégia.

img

img

Você pode salvar as configurações do parâmetro de estratégia em forma de código:

/*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 serão acompanhadas do originalJSONOs dados solicitados durante a chamada.JSONOs dados são armazenados no atributoInfoUma vez que o backtest não é para acessar uma interface de plataforma, os dados retornados durante o backtest não tem nenhum atributoInfoA seguir está apresentada uma descrição dos principais atributos de cada estrutura de dados.

Comércio

Obter todo o histórico de negociações (não o próprio), devolvido pela funçãoexchange.GetTrades().

{
    Id      : 9585306,          // Trading record ID; if the exchange interface does not provide order ID, use the timestamp to fill in 
    Time    : 1567736576000,    // Time (Unix timestamp milliseconds)
    Price   : 1000,             // Price
    Amount  : 1,                // Volume
    Type    : 0                 // Order Type; refer to the order type in the constants; 0 is ORDER_TYPE_BUY, meaning the value of ORDER_TYPE_BUY is 0
}
Carrapatos

As cotações de mercado são devolvidas pela funçãoexchange.GetTicker().

{
    Info    : {...},             // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    High    : 1000,              // Highest price; if the platform interface does not provide the 24-hour highest price, use sell price 1 to fill in 
    Low     : 500,               // Lowest price; if the platform interface does not provide the 24-hour lowest price, use buy price 1 to fill in 
    Sell    : 900,               // Sell price 1
    Buy     : 899,               // Buy price 1 
    Last    : 900,               // Last executed price
    Volume  : 10000000,          // Recent trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency  
    Time    : 1567736576000      // Millisecond-level timestamp
}
Registo

A normaOHLCA função é utilizada para desenhar linhas K e para o cálculo e análise de indicadores de processo.exchange.GetRecords()retorna a matriz de estrutura.Recordestrutura representa uma barra de linha k, ou seja, uma linha kBAR. OTimeemRecordé a hora de início do período de barra da linha K.

{
    Time    : 1567736576000,     // A timestamp, accurate to millisecond, in the same format as the result obtained by Javascript's newDate().GetTime()
    Open    : 1000,              // Open price
    High    : 1500,              // Highest price
    Low     : 900,               // Lowest price
    Close   : 1200,              // Close price 
    Volume  : 1000000            // Trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
}
Ordem

A estrutura de ordem pode ser devolvida por funções, incluindoexchange.GetOrder()eexchange.GetOrders(). A funçãoexchange.GetOrders()retorna a matriz ou uma matriz vazia da estrutura (se não houverordem atual inacabada, retornar[], ou seja, uma matriz vazia).

{
    Info        : {...},         // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    Id          : 123456,        // Unique ide