Documentación de la API cuantificada por el inventor

El autor:Un sueño pequeño., Creado: 2017-11-27 09:05:08, Actualizado: 2023-07-12 16:47:31

[TOC] ¿Qué quieres decir?

Información básica

Entra

¿Qué puede hacer FMZ?

FMZ (inventor) plataforma de comercio cuantificadoEs la comunidad de cuantificación más especializada en el campo de la negociación cuantitativa, donde se puede aprender, escribir, compartir, comprar y vender estrategias de cuantificación; retomar en línea y usar una plataforma analógica para realizar transacciones analógicas; operar, publicar y visualizar plataformas reales. Soporta casi todos los principales intercambios de moneda digital.

La serie completa de tutoriales

En el video, se puede leer:

En el video se puede leer:

Si tienes algún problema, puedes ir a cualquier momento al foro para hacer preguntas, debatir, presentar pedidos de trabajo en la plataforma, enviar un telegrama o enviar un correo electrónico.TelegramaEn general, las preguntas se responden rápidamente.

Apoyo para el desarrollo de ChatGPT

La plataforma de comercio cuantitativo FMZ tiene acceso a ChatGPT como herramienta de desarrollo auxiliar, y puede hacer clic en "ChatGPT" en el menú de acceso rápido del Centro de Control para saltar a "ChatGPT".Página de herramientas de ChatGPT

¿Qué lenguaje de programación puedo usar para implementar mi estrategia?

La plataforma de intercambio cuantitativo FMZ es compatibleJavaScriptTypeScriptPythonC++PINE麦语言Blockly可视化Escribe una estrategia de diseño.

ApoyoTypeScriptEl lenguaje, cuando se crea la estrategia, sigue siendo configurado como:JavaScriptLa estrategia, y luego escribe al principio del código de la estrategia// @ts-checkO puede cambiar a TypeScript con el botón "TypeScript" en la esquina superior derecha del área de edición de la política.TypeScriptLa plataforma reconoce automáticamente el código como:TypeScriptEn la actualidad, la mayoría de los sitios web de Google están disponibles en inglés y en inglés, y ofrecen el soporte de compilación y comprobación de tipo correspondiente:

  • Tipo de seguridad:TypeScriptLa función de comprobación de tipos estáticos puede ayudarle a detectar errores potenciales al escribir su código y mejorar la calidad del código.
  • El código se completa automáticamente:TypeScriptEl sistema de tipos de Microsoft permite encontrar las propiedades y métodos que desea más rápidamente cuando escribe código, lo que mejora la eficiencia del desarrollo.
  • Estructura de código más clara: UsarTypeScriptEn la página web de Google, puedes organizar mejor tu código y mantenerlo fácilmente legible y comprensible.
  • La aplicación tiene una gran capacidad de programación orientada a objetos:TypeScriptOfrece fuertes características de programación orientada a objetos, como interfaces, clases y tipos generales, para ayudarlo a escribir un código de estrategia más robusto y reutilizable.

La maestría en uno de estos lenguajes de diseño de estrategias es suficiente. Además de apoyar la forma de escribir el código, la estrategia de diseño también se puede usar para crear estrategias de creación de módulos visuales (Blockly). La estrategia de construcción de conjuntos de módulos visuales adopta estrategias de diseño de una manera más intuitiva, sin necesidad de codificar.

BlocklyEn la página web de la organización, se puede leer:

ConfiguraciónPythonUtilizado por el programa estratégicoPythonInterpretación

UsoPythonCuando se escribe una política, se vuelve a probar o se instala simultáneamente en el disco si el entorno del sistema en el que se encuentra el hostPython2yPython3, que se puede iniciar cuando se inicia la política en la primera línea de configuración de la política.PythonLas versiones. Por ejemplo:#!python3#!python2En este caso, el sistema busca automáticamente el intérprete. También se puede especificar un camino absoluto, por ejemplo:#!/usr/bin/python3

¿Qué es el custodio?

El administradorEs comprensible que el ejecutor de su estrategia de negociación, responsable de las complejas solicitudes de datos, recepción de datos, conexión a la red, retransmisión de registros, etc. El administrador funciona en su servidor, aunque el fallo de la red del sitio web de FMZ no afecte a su administrador.LinuxLas ventanasMac OSAndroid tambiénARM Linux, desarrollado por RaspberryEl sistema también funciona.Página de los administradoresLos pasos para instalar y actualizar el administrador de LinuxLos registros de disco real administrados por el administrador se mantienen en el directorio donde se encuentra el programa del administrador../logs/storageEn el interior, el archivo es:db3¿Qué es esto?SqliteEn el archivo de la base de datos.SqliteEl software de gestión de la edición directa para estas extensiones se llamadb3Los archivos de la base de datos en disco duro se llaman archivos de disco duro.ID

El acuerdo respaldado

  • Activos de blockchain: ahora hay más de 50 intercambios de activos de blockchain (monedas digitales) en el mercado.
  • Acceso al protocolo general:Acuerdo general

Seguridad estratégica

Desarrollar políticas en la plataforma de comercio cuantificado de FMZ, las cuales son visibles solo para los titulares de cuentas de comercio cuantificado de FMZ. Y en la plataforma de comercio cuantificado de FMZ, se puede lograr la localización completa del código de la política, por ejemplo, empaquetar la política en un paquete.PythonEl paquete se carga en el código de la política, lo que permite la localización de la política.

PythonLa seguridad del código: ¿Por qué?PythonEs un lenguaje de código abierto y muy fácil de recompilar, si las políticas no son autosuficientes sino que se alquilan, si se teme que las filtraciones de políticas permitan que las políticas se ejecuten en el administrador que se ha implementado y se alquilan en forma de administración de subcuentas o de todo el administrador.

PythonEl código de la estrategia de cifrado: En el caso de los usuarios de Twitter,PythonLa política es que los autores del código no cifran cuando lo usan ellos mismos, sino que lo cedan a otros para que lo usen.PythonLa política inicia la edición con el siguiente código, que se puede especificar para uso personal o alquiler.PythonSi la política está encriptando el código de la política cuando se ejecuta.PythonLa versión es:Python 2.7La versión es:Python 3.5La versión es:Python 3.6La versión.

  • El autor de la política, que utiliza el código de la política de cifrado para su propio uso, lo distribuye a través de su código de registro:#!pythonPara especificar la versión del intérprete de Python, se usa el punto final,Intervalos, instrucciones de cifrado de entradaencryptSi no está especificado.PythonVersión añadida directamente#!encrypt

    #!python,encrypt
    

    ¿Qué es esto?

    #!encrypt
    
  • Los autores de la política se ejecutan a sí mismos y no se utilizan el código de la política de cifrado para otros a través de los códigos de registro:

    #!python,not encrypted
    

    ¿Qué es esto?

    #!not encrypted
    

El juicioPythonSi la política de cifrado de código es efectiva, usa el códigoos.getenv('__FMZ_ENV__')Retorno de la cadena"encrypt"La explicación está en vigor. Solo el disco físico es válido, el retest no está encriptado.PythonEl código estratégico.

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

Seguridad de las claves

Los datos confidenciales, como la información de la cuenta configurada en la plataforma de negociación cuantitativa de FMZ y las cadenas de cifrado en los parámetros de la política, están encriptados en el navegador. La información que se almacena en la plataforma de negociación cuantitativa de FMZ es información encriptada ("datos no expresados"). Solo se puede descifrar para su uso en el dispositivo privado del usuario, lo que mejora enormemente la seguridad de los datos confidenciales. Si la información en el código de la política, la configuración de los parámetros o la descripción de la política contiene otra información confidencial, no la publique ni venda.

  • La plataforma admite la configuración localizada de información sensible, como información relacionada con cuentas de intercambio y claves secretas.

    En la página de información de configuración de los intercambios de la plataforma, todos los controles de casilla de texto cifrado con ocultación son compatibles con el camino de configuración del archivo para cargar en el archivo local del administrador.RSA KEYEl método de verificación, por ejemplo, explica en detalle cómo configurar la información sensible localmente en el dispositivo donde se encuentra el programa del administrador.

    1, crear una clave pública o privada RSA. Por ejemplo, crear un formato comoPKCS#8La clave pública, la clave privada, hay muchas herramientas que se pueden crear, por ejemplo:openssl¿Qué es esto? 2° Creado en una bolsaRSA KEYCreado y subidoEl primer pasoLa clave pública fue creada en. ¿Qué es lo que está pasando?El primer pasoLas claves privadas creadas entxtEl formato de archivo guarda el directorio de nivel de administrador, y también puede guardar otros caminos en el directorio donde se encuentra el programa de administrador. 4. Configuración de los intercambios en FMZAccess KeyEn el cuadro de redacción de la página de inicio, el nombre de la página de inicio de la página de inicio de la página de inicio de la página de inicio de la página de inicio de la página.RSA KEY¿Qué es esto? 5. Configurar el intercambio en FMZSecret KeyEn el cuadro de edición, relleneEl tercer pasoEn la directoria de nivel de administradortxtEl camino del archivo, por ejemplo, el nombre del archivo que se coloca:rsaKey.txtEl archivo y el administrador se completan en el mismo catálogo:file:///rsaKey.txt; si el documento se encuentra en el siguiente nivel del directorio en el que se encuentra el proceso de administraciónrsa_keyEn la parte de abajo se puede leer:file:///rsa_key//rsaKey.txt◦ Si se colocarsaKey.txtEn otros caminos, el archivo se configura de esta manera, pero hay que tener en cuenta que el archivo solo admite la colocación en directorios o subdirectorios de nivel de administrador.

    Esto hace que la localización de las claves privadas sea más segura, y los detalles del proceso pueden ser consultados.Video explicativo

Sistema de detección

¿Qué es un sistema de retrospección y para qué sirve?

Una vez que hayas completado el trabajo de diseño de una estrategia de negociación cuantitativa, ¿cómo puedes saber los aspectos básicos de tu estrategia, como la lógica, la dirección de la estrategia de ganancias? Por supuesto, no podemos ir directamente al mercado para operar con oro y plata reales, podemos usar datos históricos para probar tu estrategia.

¿Son los datos del sistema de retrospección exactos y cuál es la precisión de los resultados?

La plataforma de intercambio cuantificado FMZ divide el patrón de retroevaluación en:Retrospección a nivel de discoyReevaluación a nivel analógico❖ Los retrospectivos a nivel de disco real se realizan en base a datos históricos completos; los retrospectivos a nivel analógico se generan en base a datos reales de K-line.tickLos datos para hacer retrospecciones. Ambos se basan en datos históricos reales, pero los datos de retrospección en disco real son más precisos y los resultados son más confiables.Mecanismos de retroevaluación de FMZPero los retrospectivos son sólo la actuación de la estrategia bajo los datos históricos, los datos históricos no son una representación completa de lo que sucederá en el futuro. Los mercados históricos pueden repetirse o pueden volar un cisne negro. Por lo tanto, se debe tratar los resultados de los retrospectivos de manera racional y objetiva.

Las preguntas a tener en cuenta al revisar diferentes estrategias lingüísticas:

JavaScript tambiényC++La revisión de la política se hace en el navegador, en el disco o en el ordenador.WexApp es una aplicaciónLa mayoría de las plataformas de intercambio son simuladas como si fueran plataformas reales (FMZ).WexApp es una aplicaciónLa plataforma de intercambio de simulación (SME) funciona sin necesidad de instalar ningún otro software, biblioteca o módulo.PythonLa repetición se realiza en el host, puede repetición en el servidor público cuantificado de FMZ, o puede repetición en el propio host del usuario.PythonSi se necesita utilizar algunas librerías, es necesario instalarlas personalmente (sólo se admiten librerías comunes en el servidor público).

Datos en el sistema de repetición

FMZ Quantitative Trading Platform Retesting es de dos tipos: retesting a nivel analógico y retesting a nivel de disco real, y el retesting a nivel analógico se genera de acuerdo con el ciclo de la línea K de la base.tick, generará 12 puntos de tiempo de repetición en cada ciclo de la línea K de la base, mientras que el nivel real del disco es el verdadero recogidotickLa velocidad de repetición es lenta, por lo que no se puede repetir durante un tiempo particularmente largo. El mecanismo de repetición de FMZ puede hacer que la estrategia se negocie varias veces en una línea K, evitando que solo se pueda cerrar una transacción a precio de venta, más precisa y teniendo en cuenta la velocidad de repetición.Enlaces

Modo de DEBUG de la política en el sistema de repetición

Descarga de la política de JavaScript en DevTools en el navegador Chrome

Los intercambios que soportan el sistema de retrospección

  • Criptomonedas (en inglés)

    Nombre Tipo de trabajo Explicación
    Bitfinex Objetos de las bolsas El sistema de transferencia de dinero en efectivo también es compatible con las transacciones limitadas, como:BTC_USD,ETH_USD,LTC_USDPor ejemplo, note que las transacciones con monedas son:USDEs en dólares.
    El dinero Objetos de las bolsas El sistema de transferencia de dinero en efectivo también es compatible con las transacciones limitadas, como:BTC_USDT,ETH_USDT,ETH_BTC,LTC_BTCEso es.
    No hay problema. Objetos de las bolsas El sistema de transferencia de dinero en efectivo también es compatible con las transacciones limitadas, como:BTC_USDT,ETH_USDT,ETH_BTC,LTC_BTCEso es.
    Monedas Objetos de las bolsas El sistema de transferencia de dinero en efectivo también es compatible con las transacciones limitadas, como:BTC_USDT,ETH_USDT,ETH_BTC,LTC_BTCEso es.
    Los futuros de OKX Objetos de las bolsas de futuros El sistema de transferencia de dinero en efectivo también es compatible con las transacciones limitadas, como:BTC_USD,ETH_USDPor ejemplo, las transacciones se realizan en monedas.USD, para establecer el código de contrato específico (verexchange.SetContractTypeEl código de contrato soportado es el siguiente:this_weeknext_weekquarterswap
    - ¿ Qué es eso? Objetos de las bolsas de futuros HuobiDM es el nombre de un contrato de tokens, que permite un número limitado de transacciones, por ejemplo:BTC_USD,ETH_USDPor ejemplo, las transacciones se realizan en monedas.USD, para establecer el código de contrato específico (verexchange.SetContractTypeEl código de contrato soportado es el siguiente:this_weeknext_weekquarterswap
    BitMEX Objetos de las bolsas de futuros Las transacciones son:XBT_USD, para establecer el código de contrato específico (verexchange.SetContractTypeEl código de contrato soportado es el siguiente:XBTUSD
    Los futuros de los binan Objetos de las bolsas de futuros El sistema de transferencia de dinero en efectivo también es compatible con las transacciones limitadas, como:BTC_USDT,ETH_USDTPor ejemplo, las transacciones se realizan en monedas.USDT, para establecer el código de contrato específico (verexchange.SetContractTypeEntonces el contrato es:USDTLos códigos de los contratos apoyados por este sitio web son:swap
    Opciones de Deribit Objetos de las bolsas de opciones Las transacciones son:BTC_USD,ETH_USD, para establecer el código de contrato específico (verexchange.SetContractTypeDespués, el contrato es el contrato de la moneda local.

    Los objetos de los mercados futuros del sistema de retrospección no admiten temporalmente el cambio de pares de transacciones en el código de la estrategia.

El nivel de simulación

La retroalimentación de nivel analógico se simula en función de los datos de la línea K inferior del sistema de retroalimentación, de acuerdo con un determinado algoritmo dentro de un marco numerico compuesto por el precio más alto, el precio más bajo, el precio de apertura y el precio de cierre de la línea K Bar inferior dada.tickLos datos, en tiempo realtickLos datos se devuelven cuando se solicita un interfaz.El inventor describe el mecanismo de retrospección a nivel de analogía cuantificada

Niveles de disco real

Las pruebas de nivel real son reales.tickLos datos de nivel están en la secuencia de tiempo de Bar.tickLa estrategia para los datos de nivel es usar la retroalimentación a nivel de disco real más cercana a la verdad.tickSe trata de datos de registro real, no de generación analógica. Soporta profundidad de datos, reproducción de datos de registro de transacciones en el mercado, soporte de profundidad personalizada, soporte de datos de puntuación. Los datos de puntuación a nivel de disco físico soportan hasta 50 MB, sin límite de tiempo de puntuación dentro del límite de datos.GetDepthGetTradesLa función obtiene datos de transacción de retorno.GetTickerGetTradesGetDepthGetRecords, no se moverá el tiempo en el eje de tiempo de la revisión varias veces ((no se activará el salto al siguiente momento de datos de mercado)); para una de las funciones anteriores, la llamada repetida impulsará el tiempo de revisión en el eje de tiempo de revisión ((salta al siguiente momento de datos de mercado)); no se debe elegir un tiempo prematuro con la revisión a nivel de disco real cuando se realiza la revisión, ya que es posible que no haya datos de nivel de disco real en el período de tiempo prematuro.

Prueba de retraso a nivel de disco real actualmente compatible

  • El dinero
  • OKX ((OKX en efectivo)
  • HuobiDM (futuros de tokens)

Optimización de los parámetros del sistema de repetición

La función de ajuste de parámetros del sistema de retrospección de la plataforma de negociación cuantitativa FMZ es ajustar los parámetros según las opciones de ajuste de cada parámetro en el retrospección, como sigue:

  • El valor mínimo: el valor inicial del parámetro de limitación.
  • Valor máximo: el valor máximo después de la variación progresiva del parámetro de limitación.
  • El paso: el parámetro incrementa la variabilidad.

Se generan combinaciones de parámetros y se repiten a través de ellas (es decir, cada combinación de parámetros se repite una vez).

Por ejemplo, en la página de repetición se puede configurar la opción de optimización de parámetros:

img

El patrón de ajuste de parámetros es el siguiente:

img

Guardar las opciones de revisión

En la página de edición de la política, en la sección "Análogo de revisión" (es decir, el sistema de revisión) se puede configurar la configuración de revisión, los parámetros de la política y otras opciones para realizar la revisión de la política. La configuración de revisión se utiliza para configurar el rango de tiempo de revisión, el lugar de negociación de revisión, el punto de deslizamiento de revisión, las tarifas, etc. Los parámetros de la política son las opciones de configuración de la política. Cuando estos parámetros de configuración están bien configurados, se puede guardar la información de configuración según la política de revisión establecida.

img

¿Qué es esto?JavaScriptPor ejemplo, si tienes una política, haz clic en "Guardar la configuración de retrospección al archivo fuente":

img

JavaScript/Python/C++/麦语言La configuración de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo de archivo.

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

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

Fuentes de datos personalizadas

Uso del sistemaGETEl método solicita una URL personalizada (una dirección web accesible públicamente) para obtener fuentes de datos externas para su repetición, con los siguientes parámetros de solicitud adicionales:

Parámetros Significado Explicación
el símbolo Nombre de la variedad Por ejemplo: BTC_USD_OKCoin_EN
el día Las bolsas Por ejemplo: OKCoin_EN
redondo Precisión de precios Si es 3, entonces el precio en el dato que se devuelve debe ser multiplicado por 1000.
- ¿ Qué? Precisión numérica Si es 2, entonces el número de datos que se devuelven es igual a 100.
el período Período de bar (millisegundos) Por ejemplo, 60000 bares por minuto para una solicitud.
profundidad Grados de profundidad 1-20
las operaciones ¿Es necesario dividir los datos? verdadero/falso
desde Tiempo de inicio Tiempo en unix
En el Tiempo final Tiempo en unix

No hay que olvidarlo.

round与vround是为了避免网络传输过程中浮点数的精度丢失设计的两个参数,价格数据和成交量、订单量数据都采用整型传输。

Un ejemplo de datos enlazados:

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

El formato que se devuelve debe ser uno de los dos formatos siguientes:

La normalidad del nivel de Bar

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

Datos de repetición a nivel de tick (contiene información de profundidad de la cuenta, el formato de profundidad es [precio, cantidad], puede haber varios niveles de profundidad, asks como escalación de precios, bids como reordenación de precios)

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

Explicación

El campo Explicación
Esquema Especifica las propiedades de las columnas de la matriz de datos, que se distinguen en mayúsculas y se limitan a time, open, high, low, close, vol, asks, bids
datos Una matriz que indica una columna de datos guardados por el esquema

Formatos de datos

El campo Explicación
solicitudes/ofertas [Precio, cantidad,...]
las operaciones [Tiempo, dirección: 0: comprar, 1: vender], precio, cantidad...]

Los datos de las tasas de financiación: Por ejemplo, en el caso de la revisión de los futuros de Bitcoin, también se requieren datos adicionales de la tasa de capital, que requieren una fuente de datos personalizada. Por ejemplo, la estructura de datos de la tasa de capital solicitada en la revisión de los futuros de Bitcoin es la siguiente.

{
	"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]
	]
}

Algunos ejemplos de solicitudes de datos emitidas por sistemas de retrospección son:

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

Un ejemplo de fuente de datos personalizada:

Especifique el origen de los datos, dirección:http://xxx.xx.x.xx:9090/dataEl servidor de datos personalizado, escrito en 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)
}

La estrategia de las pruebas,JavaScriptEjemplo:

/*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)
}

Un gráfico de datos personalizados dibujados en el sistema de retrospección:

La estrategia para imprimir información:

El motor de retrospección local

La plataforma de intercambio cuantitativo FMZ está abiertaJavaScriptLenguaje yPythonEl motor de repetición nativo de la lengua, con soporte para configurar el tiempo de repeticiónCiclo de la línea K inferior

Técnica de acceso a la página de revisión

  • Botón de acceso para cambiar la página de edición de la política y la página de revisión de la política

    UsoCtrl + ,Presione el botón, la página de revisión de cambios y la página de edición de políticas.CtrlDespués del botón, pulsa,No hay nada que hacer.

  • Aplicación de teclas de acceso rápido para guardar la política

    UsoCtrl + sLa clave, la política de conservación.

  • El botón de acceso para iniciar la revisión

    UsoCtrl + bEl botón para comenzar la revisión.

Descripción del código

Función de entrada

Nombre de la función Explicación
main() Para las funciones de entrada.
onexit() Para una función de barrido de tiempo de salida normal, el tiempo máximo de ejecución es de 5 minutos, puede no declararse, si el tiempo de salida es superior se informará de un errorinterrumpirEl error.
onerror() Las funciones que se ejecutan para activar una salida de excepción tienen un tiempo de ejecución máximo de 5 minutos y pueden no declararse.PythonLa lengua, el lenguaje.C++Las políticas escritas en el lenguaje no soportan esta función.
init() Para las funciones de inicialización, los programas de política se llaman automáticamente primero al inicio de su ejecución, pero no se declaran.
  • ¿Qué es esto?
    • El sistema de detección no es compatible.onerror()La función.
    • La película fue lanzada en vivo.onerror()La función no se activará más.onexit()La función.

Un exito

onexit()El proceso de limpieza de la cola, que dura hasta 5 minutos, es realizado por el usuario.

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

En el caso de los

init(), el usuario realiza la función de inicializacióninit()La política se ejecuta automáticamente cuando se inicia.init()Función que completa tareas de inicialización diseñadas en la 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("初始化!");
}

¿Qué pasa?

onerror()La mayoría de las personas que se encuentran en este tipo de situaciones no son conscientes de lo que ocurre.onerror()Ejecutar una función que no es compatiblePythonC++Las estrategias del lenguaje.

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

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

El marco estratégico clásico

En elJavaScriptPythonC++Las políticas escritas en el lenguaje requieren ser llamadas en el ciclo principal de las políticas.Sleep()Función: ========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

  • El ejemplo de un marco básico para la estrategia de la moneda 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 el ejemplo más sencillo, si quisiera publicar un precio de 100 en el mercado cada 1 segundo, y el número de pagos es 1, podría escribirse así:

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

Librería de modelos

Librería de modelosEs un módulo de código reutilizable en la plataforma de negociación cuantitativa FMZ y es una categoría de código de la política.Librería de modelosSi se crea una librería de clases de plantilla en la librería de políticas de cuentas en la que el inventor está actualmente conectado a la plataforma de comercio cuantitativo, una vez creada, no se puede modificar la categoría a política general.

JavaScriptLa biblioteca de modelos de lenguaje:

img

PythonLa biblioteca de modelos de lenguaje:

img

C++La biblioteca de modelos de lenguaje:

img

  • Función de exportación de una librería de clases de plantillas La función de exportación es una función de interfaz de una biblioteca de clases de plantillas, que puede ser llamada con referencia a la biblioteca de clases de plantillas. La función de exportación se declara en la biblioteca de clases de plantillas y el ejemplo de código implementado es el siguiente:

    /*
    -- 策略引用该模板以后直接用 $.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 de las librerías de modelos Los parámetros de las librerías de modelos también se pueden configurar con sus propios parámetros de interfaz.

    Los parámetros para la biblioteca de clases de plantillas:

    img

    El código de la biblioteca de clases de plantillas:

    $.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;
    }
    

    Citado más arribaLibrería de modelosEl código de la estrategia del ejemplo:

    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

  • Se refiere a la librería de modelos

    Después de seleccionar una referencia en la barra de plantillas de la página de edición de la política, puede guardar la política.

    img

Estructura interna

Variables globales

cambio

exchangeSe puede ver como un objeto de intercambio, el primer objeto de intercambio que se agrega por defecto en los parámetros de la política. Todas las interacciones con el intercambio se realizan a través de funciones dentro de este objeto.

  • Reevalúa la adición de objetos de intercambio

  • Añadir objetos de intercambio a la página de disco real

Los objetos de intercambio añadidos corresponden a los objetos de código.exchangeObjeto:

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

Se puede entender como el mismo almacenamiento.exchangeLa matriz de todos los objetos de un intercambio puede contener varios objetos de un intercambio.exchanges[0]Es decir,exchange

Los objetos de intercambio añadidos corresponden al código de la política.exchanges[0]exchanges[1]exchanges[2]¿Por qué no lo hace?

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 de las órdenes

OrderEn la estructuraStatusLos atributos.

Nombre de la constante Definición Valor
El estado de la orden está pendiente No terminado 0
Se ha cerrado el proceso de entrega. Ya está hecho. 1
El estado de la orden está cancelado. Se ha cancelado 2
El estado de la orden es desconocido. Estado desconocido (otros estados) 3

El estado de la orden es desconocido.Estado, puede ser llamadoexchange.GetRawJSON()Para obtener información sobre el estado de los pedidos originales, consulta la documentación de los intercambios para ver la descripción específica. Los nombres de las variables en la tabla pueden ser usados directamente en el código de la política yOrderLa estructuraStatusComparación de propiedades, determinación de la equivalencia para determinar el estado del pedido. Imprimir estos nombres de constantes mostrará estosNombre de la constanteEl correspondienteValorLos otros homólogos de nombre de las constantes siguientes ya no se describen.

Tipo de pedido

OrderEn la estructuraTypeLos atributos.

Nombre de la constante Definición Valor
El valor de las operaciones de compra y venta El pago 0
El valor de las operaciones de transferencia Las ofertas 1
Tipo de posición

PositionEn la estructuraTypeLos atributos.

Nombre de la constante Definición Explicación Aplicable Valor
Se trata de un sistema de gestión de datos. Indica la posición de las cabezas Uso de futuros de moneda digitalexchange.SetDirection("closebuy")Configurar la dirección del posicionamiento para aplanar el tipo de posicionamiento Los futuros de la moneda digital 0
PD_SHORT Indica el emplazamiento de la cabecera Uso de futuros de moneda digitalexchange.SetDirection("closesell")Configurar la dirección del posicionamiento para aplanar el tipo de posicionamiento Los futuros de la moneda digital 1
Futures abiertos hacia el equilibrio

OrderEn la estructuraOffsetLos atributos.

Nombre de la constante Definición Valor
Se puede utilizar el código de código de la aplicación. Las órdenes de apertura 0
Se puede utilizar el código de código de la aplicación. Las órdenes de la plataforma 1
Parámetros de la estrategia

Los parámetros de la estrategia establecidos en la interfaz de la estrategia en el código de la estrategia se expresan en forma de variables globales.JavaScriptEn el lenguaje, se puede acceder directamente a los valores de los parámetros establecidos en la interfaz de la política o modificarlos.PythonPara modificar las variables globales en las funciones de la política.globalLas palabras clave.

Tipo de parámetros:

img

Variables Descripción Nota: el nombre de la ciudad es Tipo de trabajo Valores por defecto Explicación
Número Tipo de valor Nota: el nombre de la ciudad es Tipo de número 1 Las políticas de C++ son de tipo flotación.
la cuerda Las cadenas Nota: el nombre de la ciudad es La línea de cuerdas. Hola FMZ Los valores por defecto no requieren de comillas para su entrada, y se procesan como una cadena.
En el cuadro Cuadro de bajada Nota: el nombre de la ciudad es Cuadro de despliegue (seleccionado) 1|2|3 La variable combox es en sí misma un valor numérico, que representa el índice de destino del control de la ventana descendente. El primer contenido de la ventana descendente es 1, su valor de índice es 0, y así sucesivamente.
Bool también Selección de puntos Nota: el nombre de la ciudad es El tipo Bull (true/false) Es cierto Cuando se selecciona, la variable bool es verdadera, cuando no se selecciona, la variable bool es falsa.
secretString Cuadrantes de cifrado Nota: el nombre de la ciudad es Es una cadena de cifrado. contraseña Al igual que con las cadenas, las cadenas de cifrado se envían encriptadas y no se transmiten en texto claro.
  • Los parámetros de la interfaz, en la sección de parámetros de la política de la página de edición de código de la página de edición de la política de abajo.
  • Los parámetros de interfaz están presentes en el código de la política en forma de variables globales, es decir, se pueden modificar los parámetros de interfaz en el código.
  • Parámetros de interfaz en el nombre de la variable en el código de la política: es decir, en el gráfico anteriornumberstringcomboxboolsecretString
  • Descripción de la opción: Parámetros de interfaz en el nombre de la interfaz de la política.
  • Opciones de notas: descripción detallada de los parámetros de la interfaz que se muestran cuando el ratón permanece en los parámetros de la interfaz.
  • Opciones de tipo: el tipo de parámetro de la interfaz.
  • Opciones de valor predeterminado: el valor predeterminado de los parámetros de la interfaz.

Los parámetros dependen de la configuración: Se puede configurar un parámetro para que otro parámetro basado en la selección de ese parámetro se muestre y oculte. Por ejemplo, podemos configurar parámetrosnumberA, es un tipo de valor numérico.numberAEl resultado de la investigación es que la mayoría de las personas no tienen acceso a la información.isShowALa verdadera decisión del tipo BullnumberAMuestra y oculta.numberALas variables se establecen en los parámetros de la interfaz como:numberA@isShowA

img

Así no se seleccionaisShowALos parámetrosnumberALos parámetros están ocultos. Para los parámetros del tipo de control del cuadro descendente, los parámetros dependen en parte para determinar si es igual a una opción del cuadro descendente.Valores del índice¿Qué es lo que está sucediendo?isShowAPara los parámetros, cuando los parámetros se establecen como variables, se escribe:numberA@combox==2numberALos parámetros se basan encomboxSi el parámetro se selecciona para mostrar o ocultar la tercera opción ((índice 0 corresponde a la primera opción, índice 1 corresponde a la segunda opción, índice 2 corresponde a la tercera opción) ).

La política de parámetros de la interfaz, los controles de interacción, la función de agrupación de parámetros en las plantillas: Se suma con sólo el principio de la descripción de los parámetros en el inicio del grupo.(?第一组)En la actualidad, la mayoría de las personas que viven en la ciudad de Nueva York no tienen acceso a internet.

img

Cuando se usa la estrategia, se agrupa para mostrar los parámetros:

img

El valor predeterminado del parámetro se guarda: Los parámetros de la política se muestran en la imagen. Si desea guardar el valor predeterminado de los parámetros de la política durante la revisión, puede hacer clic después de modificarlos.保存回测设置El botón.

img

img

Los parámetros de la política que se establecen pueden guardarse en la política en 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]]
*/

Estructura de datos

Algunas funciones vienen con el nombre original que se requiere cuando se llama.JSONLos datos, el originalJSONLos objetos que se almacenan en los datos se devuelvenInfoEn el atributo. No hay datos devueltos en el retorno debido a que no se visita la interfaz de un intercambio.InfoPropiedades, a continuación se describen las principales propiedades de cada estructura de datos.

Comercio

Obtener el historial de todas las transacciones (excepto las suyas)exchange.GetTrades()La función regresa.

{
    Id      : 9585306,          // 交易记录ID,如果交易所接口没有提供订单ID则使用时间戳填充
    Time    : 1567736576000,    // 时间(Unix timestamp 毫秒)
    Price   : 1000,             // 价格
    Amount  : 1,                // 数量
    Type    : 0                 // 订单类型,参考常量里的订单类型,0即为ORDER_TYPE_BUY,ORDER_TYPE_BUY的值为0
}
El tick

El mercado esexchange.GetTicker()La función regresa.

{
    Info    : {...},             // 请求交易所接口后,交易所接口应答的原始数据,回测时无此属性
    High    : 1000,              // 最高价,如果交易所接口没有提供24小时最高价则使用卖一价格填充
    Low     : 500,               // 最低价,如果交易所接口没有提供24小时最低价则使用买一价格填充
    Sell    : 900,               // 卖一价
    Buy     : 899,               // 买一价
    Last    : 900,               // 最后成交价
    Volume  : 10000000,          // 最近成交量,原则上现货成交量单位为交易币种(baseCurrency),期货成交量单位为合约张数。如果交易所接口没有提供此类数据则使用交易所接口现有的数据填充,例如可能为计价币(quoteCurrency)为单位的成交量
    Time    : 1567736576000      // 毫秒级别时间戳
}
Registro

El estándarOHLCEstructura para dibujar líneas K y análisis de cálculo de indicadores.exchange.GetRecords()La función devuelve la matriz de esta estructura.RecordLa estructura representa un pilar de K, es decir, una línea K.BARRecord¿Qué es esto?TimeEl tiempo de inicio de este ciclo de K-columnas.

{
    Time    : 1567736576000,     // 一个时间戳,精确到毫秒,与Javascript的new Date().getTime()得到的结果格式一样
    Open    : 1000,              // 开盘价
    High    : 1500,              // 最高价
    Low     : 900,               // 最低价
    Close   : 1200,              // 收盘价
    Volume  : 1000000            // 交易量,原则上现货成交量单位为交易币(baseCurrency),期货成交量单位为合约张数,如果交易所接口没有提供此类数据则使用交易所接口现有的数据填充,例如可能为计价币(quoteCurrency)为单位的成交量
}
El orden

La estructura de los pedidos puede ser:exchange.GetOrder()exchange.GetOrders()La función regresa.exchange.GetOrders()Devolveremos el conjunto de la estructura o el conjunto de los números vacíos (si no existe).Pedidos pendientes¿Qué es esto?[], es decir, el conjunto de números vacíos) ‖

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

La profundidad del mercado, esexchange.GetDepth()Las funciones regresan a la estructura de datosLas ofertasMe preguntaLa estructura de datos de los elementos en el conjunto.

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

La profundidad del mercado,exchange.GetDepth()La función regresa.

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

Información de la cuenta, publicada porexchange.GetAccount()Función de retorno. Los datos de la estructura de retorno están relacionados con el par de transacciones actualmente configurado.

{
    Info            : {...},     // 请求交易所接口后,交易所接口应答的原始数据,回测时无此属性
    Balance         : 1000,      // 可用计价币数量,现货中如果交易对是BTC_USDT,Balance指的是当前可用USDT数量。U本位期货合约中Balance指的是可用保证金USDT的数量
    FrozenBalance   : 0,         // Balance表示的资产用于挂单的冻结数量
    Stocks          : 1,         // 可用交易币数量,现货中如果交易对是BTC_USDT,Stocks指的是当前可用BTC数量。币本位期货合约中Stocks指的是可用保证金的币(baseCurrency)的数量
    FrozenStocks    : 0          // Stocks表示的资产用于挂单的冻结数量
}
Posición

La información de posiciones que se mantiene en el comercio de futuros se puede obtener de:exchange.GetPosition()La función regresa aquí.PositionLa estructuraLos conjuntos

{
    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填充
}

En el caso de los futuros de monedas digitales, hay que tener cuidado.exchange.GetPosition()La función regresaPositionArrays estructuradas.FrozenAmountProfitMarginPropiedades, ya que los datos proporcionados por los intercambios no son uniformes y los objetos de los diferentes intercambios se llamanexchange.GetPosition()La definición de los datos devueltos en la interfaz puede ser diferente. Por ejemplo, algunos intercambios tienen datos congelados sin posiciones en los datos de almacenamiento.FrozenAmount0; puede usarse si se necesita calcular algunos datosInfoAnálisis de cálculo de datos primitivos en las propiedades.

Mercado

La información del mercado de las variedades de comercio,exchange.GetMarkets()La función devuelve esto.MarketLa estructuraDiccionario

{
    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            : {...}            // 交易所该品种的原始数据
}

Debido a que los intercambios varían en el grado de soporte de los datos de información de mercado, los campos que no son compatibles con los intercambios se ignoran. Los campos anteriores se toman de los datos de los interfaces de los intercambios.InfoEl contenido del campo.

Función global

Versión

Version(), devuelve el número de versión actual del sistema.

El sueño (millisegundo)

Sleep(Millisecond), función de reposo, para que el programa se detenga por un tiempo.MillisecondPara el tipo de valor. Los parámetros son milisegundos, por ejemplo:Sleep(1000)¿Qué es lo que está sucediendo? Soporta operaciones con un tiempo de reposo de menos de 1 ms, como establecerSleep(0.1)El mínimo de parámetros que soporta es:0.000001, el sueño en nanosegundos. 1 nanosegundo es igual a1e-6¿Qué es lo que está sucediendo?

No hay que olvidarse de esto. En usoPythonCuando se escribe una política de lenguaje, se deben utilizar las operaciones de intervalo de consulta, espera de tiempo.Sleep(Millisecond)Función. No recomendado.Python¿Qué es esto?timeLa cajatime.sleep(second)Función. Porque se usa en la política.time.sleep(second)La función hace que el programa de política espere ciertos segundos en el retrospecto.secondEl parámetro es el número de segundos en que se establece la pausa), lo que hace que la repetición de la política sea muy lenta.

¿Es Virtual?

IsVirtual(), para determinar si la política actual se ejecuta para la repetición de la analogía. El valor de retorno: tipo Boole. Retorno de estado de repetición analógicatrueEl disco real vuelve.false

El correo...

Mail(smtpServer, smtpUsername, smtpPassword, mailTo, title, body), Envíe correo función↑ valor de parámetro: todos los parámetros son de tipo de cadena↑ valor de retorno: tipo bul, envío exitoso retornotruesmtpServerPara enviar el correosmtpLos serviciossmtpUsernameLa gente está en contra de la ley.smtpPasswordEl código SMTP para el correo electrónico (no el código de inicio de sesión del correo electrónico)mailToEn el caso de los mensajes de correo electrónico, los usuarios pueden acceder a los mensajes de correo electrónico en línea.titleEl título de los correos enviados es el siguiente:bodyEl contenido de los correos enviados, por ejemplo:

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")

Más.

¿Qué es esto?Hay un problema con la función_C. ¿Trabajará siempre o solo una vez?

¡Qué bien!_C ((function, args...) ¿Es este el 3s por defecto? ¿Se puede cambiar por defecto para poner directamente _CDelay ((1000) antes de _C ((function, args...)? ¿Se puede establecer una vez?

- ¿ Qué es eso?Cluster: Si creas 1000 robots simultáneamente y sin estrés, puedes crear varios administradores para distribuir las tareas. ¿Hay ejemplos de código para construir un cluster? ¿Cómo construir varios administradores para distribuir las tareas?

- ¿Qué quieres?Log ((talib.help (('MACD')); sólo se puede usar en js, Python no tiene la propiedad talib.help...

Cjz140¿Cuál es la diferencia entre _C (función, args...) y la función de sueño, que creo que significa esperar para volver a intentarlo?

3263243y¿Cómo borrar ErrorFilter después de SetErrorFilter? sin filtrar el mensaje de error.

¿Qué quiere decir?¿Hay alguna manera de usar una biblioteca de terceros?

¿Qué quiere decir?¿Qué debe rellenar la clase padre si se quiere heredar una nueva clase definida por un objeto de intercambio?

yhanwu¿Hay herramientas de depuración locales?

el pingüino¿Qué pasa con el exange.IO?

el pingüino¿Por qué la función sell está en gris, es que la función de representación ya no está disponible?

el pingüino¿Por qué la función sell está en gris, es que la función de representación ya no está disponible?

el pingüinoNo entiendo el lenguaje de los js.

el pingüinoNo entiendo el lenguaje de los js.

Don.¿Cómo se escribe la línea media del volumen?

la tortuga¿Qué se devuelve si no se consigue?

El hombre de NingEsta nueva tipografía es hermosa.

hipopótamoLa red de pruebas de Bitmex (testnet.bitmex.com) también tiene una interfaz API, pero actualmente las bolsas solo pueden elegir la base de Bitmex, y la dirección del archivo de API es https://testnet.bitmex.com/app/apiOverview. ¿Cómo apoyar?

- ¿Qué quieres decir?var ret1 = exchanges[0].IO (("api", "future_estimated_price", "symbol=btc_usd"); Log (('ok futuros precio de entrega estimado', ret1); https://dn-filebox.qbox.me/d1ed268c1e75753c5d289447d279aa9d81e41b5f.png ¿Por qué llamar a las interfaces de otras bolsas y escribir este error?

todosfrostline¿Cuál es la diferencia entre realTicker y Ticker? Recientemente se ha reescrito la estrategia de los paquetes, y ambos aparecen al mismo tiempo, pero parece que no se menciona en la primera API.

las visionesHola, como desarrollador de Python, ¿qué crees que escribe tu documentación API? Algunas interfaces de función de campo parecen extrañas, ¿puedes escribir un documento como githubpage y readdocs?

todosfrostlineGetAccount: [EAPI: Rate limit exceeded] ¿Quieren saber cómo se resuelve esto?

Zjx2314No soporta StochRSI, ¿se puede añadir pronto?

Yhfgg¿El guión está en su propio servidor en la nube Ali o en el botvs cluster?

Yhfgg¿Qué versión de python usas?

muy bien.La explicación de GetFee debería ser que regrese una estructura de Fee, con una estructura menos.

¿Qué quieres decir?¿Puedo llamar a talib con js?

YhfggBuscar documentación en python

- ¿Qué quieres decir?¿Puede el fondo de código de la estrategia de edición tener un negro? ojos blancos, escribir código en la noche, fácil de miopía.

Don.¿Cómo configurar el resumen en el bot WeChat?

El número de locos¿Se puede añadir un campo de precio de transacción en la estructura de la orden?

El pequeño.GetOrders: Obtener todos los pedidos incompletos, devolver una estructura de orden de la matriz, en el comercio de Bitcoin en China ETH, sólo devuelve los últimos 10 artículos, aquí hay una función que devuelve todos los pedidos incompletos de Bitcoin en China ETH, lo que significa que otras plataformas pueden devolver todo con GetOrders, sólo que este fantasma de China Bitcoin devuelve 10 artículos.

Yhfgg¿Cuál es la función matemática que se necesita para la teoría de probabilidades estadísticas?

- ¿ Qué?¿Qué significa el valor que devuelve la función $.Cross ((x, y)?

Mi abuela dice:El LogReset puede borrar todos los registros con un parámetro numérico para especificar los registros reservados. ¿Cómo se borran los últimos registros?

- ¿Qué quieres?¿La función CORRE en talib parece no haber sido trasladada o se perdió?

El pueblo pobre.¡Parece que no hay una función de referencia de indicadores!

Pequeño¿Cómo se traduce el tiempo de la línea k de lectura en el tiempo actual oh, no entiendo, demasiado largo uno, resuelto, gracias

Pequeño¿Cómo se escribe para eliminar números de las matrices, me parece que no funciona con records.remove ((records[0])

el serpiente¿Cómo llamar ATR a la línea K de día?

el serpiente¿Cómo llamar ATR a la línea K de día?

57278863Aprenda cómo obtener precios y pedidos de futuros tradicionales, lo siento, sus raíces son muy finas.

el mismo¡El ejemplo de los futuros tradicionales!

Pequeño¿Puedes escribir un ejemplo de comercio de futuros tradicionales?

Pequeño¿Cómo imprimir el estado de la posesión de varios ordenes en el mismo tiempo, cómo imprimir mi [object object], cómo obtener el estado de la posesión de varios ordenes y ordenes en el mismo tiempo, y GetTicker ((), cómo obtener la semana, la próxima semana y el trimestre de la semana en el precio, la semana, la próxima semana y el trimestre en paréntesis que escribí.

- ¿Qué quieres decir?¿Pueden los mercados de futuros obtener transacciones con GetTicker (??), y devuelven el tipo de mercado de contrato (?? de la semana, de la semana siguiente...)?

Vender mucho¿Qué indicador del StochRSI se puede añadir?

el momoxCancelOrder ((orderId) para cancelar un pedido basado en el número de la orden, devuelve true o false, pregunta true= la celda fue cancelada con éxito, ¿verdad?

el momox_G(K, V) Se puede guardar una lista de dicionarios globales ¿Puede este método guardar variables globales para compartir datos entre diferentes políticas?

¿Qué quieres decir?La popularidad

No hay nadaLos registros de ganancias se pueden restablecer con LogProfitReset. El historial de los gráficos de ganancias anteriores desaparece.

- ¿ Qué?¿Se puede copiar directamente la EA para usarla?

El hombre de los cielosSiento que esta plataforma es genial, más interacción en el grupo.

Pequeño¿Qué idioma es este? ¿Hay material para aprender?

JxhbtcError de datos Una semana sin conectar el robot, ¿cómo resolverlo?

¿Qué quieres decir?¿Es el índice TA sólo un cálculo del precio de cierre?

¿ Qué pasa?Hola, mundo.

Un sueño pequeño.La función _C intentará repetidamente sin pensarlo hasta que obtenga un resultado exitoso.

Un sueño pequeño.La biblioteca talib de python requiere una instalación. https://www.botvs.com/bbs-topic/669 puede verse en este post.

Un sueño pequeño.Sleep es el número de milisegundos en que el programa no hace nada y espera que el parámetro se establezca, _C es la función que vuelve a llamar el parámetro.

Un sueño pequeño.Sin necesidad de herencia, JS se envuelve directamente en el objeto {name: "nuevo objeto", old_exchange: exchange[0],...... }

Un sueño pequeño.Los editores locales, los complementos de sincronización remota, basicamente, son editores locales, desinstalación remota.

Un sueño pequeño.¿Por qué no vienes al grupo de QQ para hablar?

Un sueño pequeño.En la documentación de la API, gris significa que la función no tiene demasiadas explicaciones de despliegue, se muestra en gris, los representantes de azul tienen más explicaciones, eso es todo.

Un sueño pequeño.ES6 está fuera de soporte.

Un sueño pequeño.¿Puedes ir al grupo de QQ? Yo, describe el problema, yo voy a responder ^^

Un sueño pequeño.En la actualidad, la mayoría de las aplicaciones de Google no están disponibles para los usuarios, pero en la actualidad, la mayoría de las aplicaciones están disponibles para los usuarios de Google.

la tortugaPor ejemplo, OKCoin, si la cantidad comprada es mayor que la cantidad de monedas que se tienen, ¿qué se devuelve?

Un sueño pequeño.En concreto, en qué bolsa de valores voy a devolver un número de orden en OK Futures?

No hay nadaYa se admite el cambio de transacciones en ejecución, se requiere la descarga del último administrador. Se admite Bter/Poloniex Detalles API Documentación Descripción de la función de transacción en la barra de abajo ((Limpiar la caché del navegador y actualizar si no se ve)

Un sueño pequeño.QQ, me voy a ayudar a encontrar la pregunta. 359706687

Familias de criadores profesionales¿Cómo puedo configurar una lista blanca? ¿Cómo configuro la dirección IP del host?

Un sueño pequeño.Este es el enlace subyacente No se ha creado El servidor no responde. ¿Se ha configurado la dirección IP cuando se solicita la API KEY?

Familias de criadores profesionalesEsto es embarazoso. La política que podía ejecutarse cambió a la era de los bites, y GetAccount no puede acceder a 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 de los Bites Error en el registro de GetAccount: timeout 2017-05-23 21:08:02 Era de los Bitcoins Error en el GetAccount: tiempo de espera 2017-05-23 21:07:40 Era bit error GetAccount: tiempo de espera 2017-05-23 21:07:20 Reinicio del proyecto ¿Es el problema de la lista blanca de IP???

Un sueño pequeño.Los servidores de la bolsa no respondieron, el protocolo TCP no se estableció ni se estrechó la mano tres veces.

Familias de criadores profesionalesA connection attempt failed because the connected party did not properly respond after a period of time (Un intento de conexión fracasó porque la parte conectada no respondió adecuadamente después de un período de tiempo)

Un sueño pequeño.Hola! Hablo de la función exchange.IO ((api, ApiName, Args) que no es compatible, por favor vea https://www.botvs.com/bbs-topic/812

Familias de criadores profesionalesUn intento de conexión falló porque la parte conectada no respondió adecuadamente después de un período de tiempo,

Familias de criadores profesionales¿No es compatible con la era de los bitcoins?

Un sueño pequeño.https://dn-filebox.qbox.me/a709b30c6cc0a3565234b9e0c99b073f7ba8b454.png ¿Cómo se puede hacer eso?

El hombre de NingPor ejemplo, quiero hacer un intercambio de todas las monedas de poloniex, pero solo hay unas pocas monedas compatibles con BOTvs, y exchange.IO parece no admitir la red P.

Un sueño pequeño.Se puede llamar exchange.IO.

El hombre de Ning¿Qué pasa con las API que requieren la verificación de cuentas?

Un sueño pequeño.Si la API no requiere la verificación de la cuenta, puede utilizar httpQuery (ver documentación BotVS para más información), la API de transacción real requiere acceso.

Un sueño pequeño.Los parámetros de la API HttpQuery se pueden transmitir a través de: https://www.okcoin.com/api/v1/future_estimated_price.do?symbol=btc_usd. Esto es suficiente. En la página de Facebook del botvs.com se puede leer:

las visionesGracias, espero que haya una excelente documentación de la API.

Un sueño pequeño.¿Dónde se puede ver la API realTicker?

Un sueño pequeño.En la actualidad, la mayoría de los archivos están en manos de personas que no son miembros de la comunidad. La documentación de la API es el lenguaje JavaScript. Descrito en la versión de python. Descrito en la parte superior de la página de la comunidad de chat de chat.

No hay nadaHola, gracias por la sugerencia, la documentación de la API está siendo reconstruida.

Un sueño pequeño.Bienvenido ~ muestra que la frecuencia de acceso está fuera de la limitación. En la actualidad, la mayoría de los archivos de la red social están en manos de personas que no son miembros de la comunidad. ¿Utilizan la función Sleep (?1000) en la política?, Este 1000 es para que el programa se detenga un segundo por ronda, que se puede configurar por sí mismo, el objetivo es controlar la frecuencia de acceso del programa a la API, ya que algunos intercambios establecen un límite máximo de acceso, un cierto tiempo más de un cierto número de visitas se negará el acceso, bloqueando la dirección IP.

Un sueño pequeño.https://dn-filebox.qbox.me/c29ab7fc279e1b758355f137907cf52dc8257df6.png Lo que yo personalmente he escrito sobre los indicadores de STOCHRSI que ya se han comparado con OK, es que la velocidad es un poco lenta y debe ser optimizada, por el momento.

No hay nadaSe puede elegir si se reanudará en el servidor proporcionado por botvs o en el servidor de su propio administrador, la versión es 2.7.5

Un sueño pequeño.Ahora añadido.

Un sueño pequeño.Ahora puedes configurar tu propio estilo de fondo.

Un sueño pequeño.El archivo de python está siendo escrito.

Un sueño pequeño.También puede acceder a la biblioteca talib.

¿Qué quieres decir? https://www.botvs.com/bbs-topic/276

Un sueño pequeño.Parece que hay un ejemplo en Strategy Square, https://www.botvs.com/strategy/15098

No hay nadaEl acceso a las propiedades de Orders de AvgPrice, que los intercambios pueden apoyar, los intercambios que no lo hacen siempre tendrán la propiedad 0.

Yhfgg¿Cómo se cita una fuente de terceros?

No hay nadaSi mathjs no puede hacerlo, solo puede buscar una política de copia e importación de una biblioteca de terceros. Para compiler más rápido, el sistema solo tiene una pequeña cantidad de bibliotecas integradas.

Un sueño pequeño.No soy muy amable, hay problemas en el grupo, ¿puedes decirme que estoy en línea?

- ¿ Qué?Gracias.

Un sueño pequeño.¿En el grupo? Puedes ver el análisis de código de la biblioteca de transacciones de monedas digitales en la versión de comentarios, donde hay comentarios sobre la función $.Cross.

No hay nadaNo se puede borrar lo más reciente, solo se pueden guardar los últimos artículos... se borran todos los viejos.

el mismoPara obtener cada posición con la posición [i], la posición es un conjunto.

El hombre de NingEn el caso de los registros de datos, el número de datos de los registros de datos es el número de datos de los registros.

el mismoMis futuros tradicionales siempre me han dicho: "GetAccount: no login", "No hay error de contraseña, no puedo iniciar sesión".

No hay nadaPor defecto es semana, para obtener el tipo de contrato especificado se necesita SetContractType primero.

No hay nadaComo se ha visto, este true es el valor de retorno de la acción de cancelar la orden que el intercambio devuelve, pero la cancelación real no se cancela, dependiendo de cómo se trate dentro del intercambio.

el momox3q

No hay nada¡No! ¡Está separado!

- ¿ Qué?Por supuesto que no, eso es exclusivo de MT4.

No hay nadaLa información de JavaScript está en todas partes en la red.

Vender mucho¿Está resuelto su problema?

No hay nadaLa mayoría de las veces, los datos que se envían pueden ser directamente registros o un conjunto de precios puros.