[TOC]
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
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
Mylanguage
eBlockly Visualization
para escrever e conceber estratégias.
SuportaTypeScript
linguagem, ainda o defina paraJavaScript
estratégia quando criamos estratégias, então escrevemos// @ts-check
no início do código da estratégia ou clique no botãoTypeScript
no canto superior direito da área de edição da estratégia para mudar paraTypeScript
A plataforma reconhecerá o código comoTypeScript
automaticamente e fornecer-lhe o apoio adequado à compilação e à verificação de tipo para:
TypeScript
A 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.TypeScript
O 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.TypeScript
, pode organizar e manter melhor o seu código, tornando-o fácil de ler e compreender.TypeScript
fornece 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).
Blockly
Tutoriais de visualização:
Configure o
Python
InterpretaçãoPython
Programa 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 oPython
A primeira linha da estratégia é a versão a lançar no tempo de execução, como#!python3
e#!python2
E 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/storage
O ficheiro é umSqlite
arquivo de banco de dados comdb3
, que pode ser editado directamente peloSqlite
para um ficheiro com extensãodb3
Na base de dados de bots real, o nome do arquivo é o bot ID.
Protocolos suportados
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.Python
O 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 dosPython
Có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 dePython
Código de estratégia:
Por defeito,Python
O 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 doPython
O código de programação pode ser criptografado para uso pessoal ou aluguel.Python
As versões que suportam a criptografia dos códigos de estratégia são as seguintes:Python 2.7
, Python 3.5
ePython 3.6
.
#!python
como a versão do intérprete Python, e depois usar,
para manter separado; inserir o comando de criptografiaencrypt
Se não especificar a versão dePython
, acrescentar#!,encrypt
directly. #!python,encrypt
Ou...
#!encrypt
#!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á oPython
Có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")
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
RSA KEY
mé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.PKCS#8
, existem muitas ferramentas disponíveis para criação, tais comoopenssl
.RSA KEY
na troca, e carregar a chave pública criada emPasso 1durante a criação.txt
arquivo, ou em outros caminhos no diretório do programa docker.RSA KEY
criado pela troca na caixa de edição da configuraçãoAccess Key
.txt
arquivo 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.txt
Se você colocarrsaKey. txt
em 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.
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 geratick
Os 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.tick
Cada período de linha K irá gerar 12 pontos de tempo de backtesting; no entanto, o nível real do mercado recolheticks
O 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
Valor criptografado (Criptomoeda)
Nome | Tipo | Instruções |
---|---|---|
Bitfinex | Objeto de troca spot | apoiar pares de negociação limitados, tais como:BTC_USD , ETH_USD eLTC_USD , etc. (observe que a moeda de cotação dos pares de negociação éUSD dólar) |
Binance | Objeto de troca spot | apoiar pares de negociação limitados, tais como:BTC_USDT , ETH_USDT , ETH_BTC eLTC_BTC , etc. |
OKX | Objeto de troca spot | apoiar pares de negociação limitados, tais como:BTC_USDT , ETH_USDT , ETH_BTC eLTC_BTC , etc. |
Huobi | Objeto de troca spot | apoiar pares de negociação limitados, tais como:BTC_USDT , ETH_USDT , ETH_BTC eLTC_BTC , etc. |
Futuros da OKX | Objeto de troca de futuros | apoiar pares de negociação limitados, tais como:BTC_USD eETH_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 , quarter eswap |
HuobiDM | Objeto de troca de futuros | A HuobiDM é Huobi Futures (Huobi Contract), que suporta pares de negociação limitados, tais como:BTC_USD eETH_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 , quarter eswap . |
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_USDT eETH_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_USD eETH_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.
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.tick
dados quando é solicitada a interface.Descrição do mecanismo de ensaio posterior de nível de simulação quântica FMZ.
O backtest de nível de mercado real é o realtick
Para estratégias baseadas emtick
O nível de dados, usando o nível real do mercado para backtest é mais próximo da realidade.tick
Os 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
,GetTrades
No momento em que os dados do mercado estão na linha do tempo, chamandoGetTicker
,GetTrades
, GetDepth
eGetRecords
O 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:
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:
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:
O backtest do modo de otimização de parâmetros:
Na página de edição de estratégia, na paginação de
LeveJavaScript
estratégia como um exemplo, e clique em
Há ligeiras diferenças em JavaScript
, Python
, cpp
eMylanguage
:
/*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"}]
*)
O sistema utiliza oGET
mé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 |
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/data
Personalize 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,JavaScript
Exemplo:
/*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:
A plataforma FMZ Quant Trading é open-source para oJavaScript
versão e oPython
versão do motor de backtest local, configuração de suportePeríodo de linha K subjacentedurante o backtesting.
Tabela de atalho para alternar entre a página de estratégia
Usa a chave.Ctrl +,
para mudar de volta para a página Ctrl
Aperta a tecla.,
.
Chave de atalho para estratégia de poupança
Usa a chave.Ctrl + s
para salvar estratégias.
atalho para iniciar estratégia backtest
Usa a chave.Ctrl + b
para permitir o
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.Python ecpp nã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. |
onerror()
.onerror()
é acionado no bot, a funçãoonexit()
não será acionado.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);
}
}
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!");
}
Execução da funçãoonerror()
Esta função não suporta estratégias escritas emPython
ecpp
.
function main() {
var arr = []
Log(arr[6].Close)
}
function onerror() {
Log("error")
}
# not supported by python
// not supported by C++
As estratégias escritas emJavaScript
, Python
ecpp
, 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);
}
}
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
JavaScript
:
Python
:
cpp
:
Função de exportação da biblioteca de modelos
A função de exportação é uma função de interface de
/*
-- 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");
}
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());
}
Citação
Após verificar a referência na coluna de modelo da página de edição da estratégia, salve a estratégia.
Exchange
Por padrão, é considerado como o primeiro objeto de troca adicionado nos parâmetros da estratégia.
Adicionar objetos de troca em
Adicionar objetos de troca na página
Os objetos de troca adicionados correspondem aoexchange
Objetos 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());
}
Pode ser entendido como uma matriz que armazena todos os objetos de troca comoexchange
Objetos 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());
}
}
O atributoStatus
emOrder
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 atributoStatus
emOrder
Imprimir 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.
O atributoType
emOrder
structure.
Nome constante | Definição | Valor |
---|---|---|
ORDER_TYPE_BUY | Ordem de compra | 0 |
ORDER_TYPE_SELL | Ordem de venda | 1 |
O atributoType
emPosition
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 |
O atributoOffset
emOrder
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 |
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.JavaScript
A linguagem pode aceder directamente aos valores dos parâmetros definidos ou modificados na interface de estratégia; enquanto nas funções dePython
estratégias, a palavra-chaveglobal
A evolução da política de emprego é necessária para modificar as variáveis globais da estratégia.
Tipos de parâmetros:
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 |
number
, string
, combox
, bool
, secretString
.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.numberA
ser exibido ou ocultado com base no parâmetroisShowA
(tipo booleano) é verdadeiro ou falso.numberA
nos parâmetros da interface:numberA@isShowA
.
Desta forma, se o parâmetroisShowA
não é verificado, o parâmetronumberA
Para 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âmetroisShowA
Quando definir as variáveis nos parâmetros, escrever:numberA@combox==2
O parâmetronumberA
irá exibir ou ocultar, com base em se o parâmetrocombox
será 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 (?First group)
No início da descrição do parâmetro que inicia o agrupamento, conforme mostrado na figura seguinte:
Quando se utiliza a estratégia, os parâmetros são apresentados em grupos:
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 settings
Após a modificação dos parâmetros da estratégia.
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]]
*/
Algumas funções serão acompanhadas do originalJSON
Os dados solicitados durante a chamada.JSON
Os dados são armazenados no atributoInfo
Uma vez que o backtest não é para acessar uma interface de plataforma, os dados retornados durante o backtest não tem nenhum atributoInfo
A seguir está apresentada uma descrição dos principais atributos de cada estrutura de dados.
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
}
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
}
A normaOHLC
A 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.Record
estrutura representa uma barra de linha k, ou seja, uma linha kBAR
. OTime
emRecord
é 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
}
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