En la carga de los recursos... Cargando...

Comercio cuantitativo de criptomonedas para principiantes: acercándote a la criptomoneda cuantitativa (2)

El autor:FMZ~Lydia, Creado: 2022-07-27 16:34:41, Actualizado: 2023-09-24 19:31:16

img

Comercio cuantitativo de criptomonedas para principiantes: acercándote a la criptomoneda cuantitativa (2)

En el último artículo, hablamos sobre scripts de trading programáticos. De hecho, la estrategia de trading es un programa de script de trading. El artículo habla principalmente sobre la necesidad de un portador de hardware para el programa de script de trading (donde se ejecuta el programa), y el programa de trading de script puede escribirse en qué tipo de lenguaje de programación informática (se enumeran tres lenguajes de programación utilizados en la plataforma de trading FMZ Quant. Por supuesto, puede usar cualquier lenguaje de programación para implementar estrategias para el trading programático). En este artículo, continuamos discutiendo la cuantificación de la criptomoneda y aprendemos sobre ella.

Escritura de negociación programática

  • Tipos de estrategia de negociación Los principiantes en el comercio programado y el comercio cuantitativo pueden confundirse con términos como estrategias de tendencia, estrategias de arbitraje, estrategias de alta frecuencia, estrategias de red, etc. De hecho, los tipos comunes de estrategias en el comercio programado y el comercio cuantitativo son simplemente varias direcciones.

    • Estrategia de cobertura de arbitraje En pocas palabras, una estrategia que mantiene una posición larga mientras mantiene una posición corta puede clasificarse básicamente como una estrategia de arbitraje.
    • Estrategia de tendencia En pocas palabras, es la estrategia de seguimiento de la tendencia para realizar órdenes y mantener posiciones, como la media móvil doble, el MACD y otras estrategias.
    • Estrategia de regresión Por ejemplo, la estrategia de red, haciendo ganancias de las fluctuaciones de precios en mercados volátiles.
    • Estrategia de alta frecuencia En pocas palabras, es una estrategia para el comercio de alta frecuencia a través de algunos algoritmos para descubrir microestructuras de mercado, patrones, oportunidades, etc.

    Lo anterior se divide desde la perspectiva de las estrategias de negociación. Desde la perspectiva del diseño de estrategias en la plataforma de negociación FMZ Quant, las estrategias también se pueden dividir en:

    • Estrategia de una sola variedad Es decir, esta estrategia opera solo en una especie, como el comercio de BTC o el comercio de ETH.
    • Estrategia para varias especies En pocas palabras, es operar varias especies según una lógica estratégica.
    • Estrategia de cuentas múltiples En pocas palabras, múltiples objetos de intercambio se configuran en un bot real (el concepto de intercambio se ha introducido en el artículo anterior, y un objeto de intercambio con una clave API configurada representa una cuenta de intercambio). Por ejemplo, para algunas estrategias de seguimiento de la orden, varias cuentas siguen la operación juntas (puede ser el mismo intercambio o intercambios diferentes). En resumen, múltiples objetos de intercambio (cuentas) se gestionan en un bot real.
    • Estrategia de lógica múltiple Por ejemplo, la estrategia MACD, la estrategia de media móvil, la estrategia de cuadrícula, etc. se diseñan al mismo tiempo en un bot real (por supuesto, es para operar diferentes objetos de intercambio, y el funcionamiento del mismo objeto de intercambio depende de si la estrategia específica es conflictiva lógicamente)
  • Interfaz de la API de Exchange ¿Cómo opera el programa de comercio de escritura de la cuenta de intercambio? Entonces, ¿qué tipo de interfaces están abiertas a los intercambios? En el artículo anterior, hablamos sobre el intercambio tiene interfaces REST y Websocket generalmente en la sección Exchange. Aquí agregamos algunos conceptos desde el nivel de procedimientos de estrategia. Las interfaces de intercambio se dividen en si están validadas o no (tanto REST como Websocket), hay verificación y no verificación.

    • Interfaces que no requieren verificación Este tipo de interfaz, generalmente conocida como interfaz pública, no requiere la verificación deAPI KEYEste tipo de interfaz es una interfaz de mercado en general, como consultar precios de mercado en profundidad, consultar datos de la línea K, consultar tasas de financiación, consultar información sobre variedades comerciales, consultar sellos de tiempo del servidor de intercambio, etc. En pocas palabras, la interfaz que no está relacionada con su cuenta se puede determinar aproximadamente como una interfaz pública (no se requiere verificación)
      En la Plataforma de Comercio Cuántico FMZ, al llamar a una función API no verificada (encapsula la interfaz no verificada del intercambio, interfaz pública), incluso si la configuración de la clave API es incorrecta, los datos devueltos por la interfaz se pueden obtener normalmente (debido a la no verificación).

    • Interfaces que requieren verificación En pocas palabras, es la interfaz que necesita ser verificada (a través de API KEY), este tipo de interfaz se llama interfaz privada. Por lo general, está relacionada con algunas operaciones o información de su cuenta, como consultar activos de la cuenta, consultar posiciones de la cuenta, consultar órdenes pendientes, consultar transferencias, transferir moneda, ajustar apalancamiento, establecer el modo de posición, etc. Todas estas operaciones deben ser verificadas. En la plataforma de negociación de FMZ Quant, al llamar a la función API que debe verificarse (la interfaz que debe verificarse para el intercambio encapsulado, interfaz privada), si la clave API está configurada incorrectamente, se informará de un error cuando se llame a la interfaz y se devolverá un valor nulo.

    Entonces, ¿cómo se utilizan estas interfaces en la Plataforma de Comercio Cuántico FMZ?

    La plataforma de negociación FMZ Quant encapsula el comportamiento de intercambio y las interfaces con definiciones consistentes (como la interfaz de línea K, la interfaz de mercado en profundidad, la interfaz de consulta de activos actuales, la interfaz de órdenes, la interfaz de cancelación de órdenes, etc.), estas interfaces se llaman funciones de la API de la plataforma de negociación FMZ Quant en la plataforma de negociación FMZ Quant, y se puede acceder a ella desde la documentación de la API (https://www.fmz.com/api).

    Entonces, ¿cómo se utilizan algunas de las interfaces de intercambio con diferentes comportamientos y definiciones en la Plataforma de Comercio Cuántico FMZ?

    Estas interfaces de intercambio incluyen: transferencia de activos, orden condicional, colocación de órdenes por lotes, cancelación de órdenes por lotes, modificación de órdenes, etc. Algunos intercambios tienen estas interfaces, otros no, y sus funciones y detalles de uso pueden ser muy diferentes, por lo que estas interfaces se pueden acceder a través de laexchange.IOFunción en la plataforma de negociación cuántica FMZ (para más detalles, consulte la documentación de la API de la plataforma de negociación cuántica FMZ:https://www.fmz.com/api#exchange.io..También hay algunas estrategias prácticas de ejemplo de IO en el cuadrado de estrategia de la Plataforma de Comercio Cuántico FMZ.

    ¿Todas las funciones de la API del documento de la API de la Plataforma de Comercio Cuántico FMZ generan solicitudes de red?

    En primer lugar, la interfaz API del intercambio tiene restricciones de frecuencia de acceso (como 5 veces por segundo), y el acceso no puede ser demasiado frecuente, de lo contrario informará un error http 429, y se denegará el acceso (la mayoría de los intercambios informan 429). No todas las funciones API de la plataforma de negociación FMZ Quant generarán solicitudes de red. Algunas de ellas solo modifican algunas configuraciones locales, como establecer el par de negociación actual, establecer el código del contrato, la función de cálculo del indicador y obtener el nombre del objeto de intercambio, etc. En general, se puede juzgar si una solicitud de red se produce a partir del propósito de la función.

    • Hablemos de algunos problemas y experiencias comunes al usar las funciones de API en la plataforma de comercio de FMZ Quant

      • Tolerancia a errores Este es el error más común, que ha preocupado a innumerables principiantes. Todo de la estrategia backtesting es a menudo normal, ¿por qué el bot real se ejecuta por un tiempo (puede ser activado en cualquier momento) y luego falla?

        img

        Al escribir una estrategia, todos necesitamos juzgar y verificar los datos devueltos por la interfaz. Por ejemplo, la línea de código de precio de mercado para obtener en la plataforma de negociación FMZ Quant (lo mismo que escribir un programa para acceder a la interfaz de intercambio directamente por ti mismo):var ticker = exchange. GetTicker(), si necesitamos utilizar elLast(precio final)tickervariable (consulte la estructura devuelta por la función GetTicker), necesitamos usarvar newPrice = ticker.LastPara obtener datos como este (¿qué es newPrice? new: latest, Price: price, sí! todos juntos!)GetTicker()función vuelve a los datos normales, está bien, pero si hay un tiempo de espera de la solicitud, error de red, el intercambio tira del cable de red, el cable se corta, el niño tira del interruptor eléctrico, etc...GetTicker()función para regresar anullEn este momento, el valor detickeresnull, y si voy a acceder a suLast, se producirá una excepción del programa y el programa de estrategia se detendrá. Parece que el fracaso de la llamada de interfaz (la llamada GetTicker falla y devuelve null) no es la razón directa de la parada de la estrategias bot real (la razón directa es que un atributo de unnullEl informe de error de fallo de llamada de interfaz no causará la parada real del bot (énfasis). Entonces, ¿qué podemos hacer para evitar la parada anormal del robot real? La respuesta es realizar un procesamiento tolerante a fallas en los datos devueltos por la interfaz.null(un ejemplo de lenguaje JavaScript, otros idiomas son generalmente los mismos) Escriba un breve segmento de código para la descripción (esto es sólo una descripción, no se puede ejecutar directamente!)

        var ticker = exchange.GetTicker()
        if (ticker) {
            var newPrice = ticker.Last
            Log("Print the latest price:", newPrice)
        } else {
            // The data is null, there will be no problem if no operation is performed
        }
        

        No sólo elGetTickerLa interfaz debe ser tolerante a fallos, pero la interfaz con las solicitudes de red debe ser tolerante a fallos para el valor de retorno (si utiliza el valor de retorno de la función) Hay muchos métodos tolerantes a fallos, se puede utilizar el_C()función (consulte la documentación de la API FMZ) para escribir una función tolerante a fallas y diseñar el mecanismo y la lógica tolerantes a fallas por su cuenta. En cuanto al uso de la_C()En el caso de los sistemas de control de velocidad, el parámetro de velocidad de la función es el parámetro de velocidad de la función, que muchos principiantes usan incorrectamente._C()Función es una referencia de función, no una llamada de función._C(funcName, param1, param2), la llamada es correcta, funcName está sin paréntesis, y param1 y param2 son los parámetros a pasar a la función funcName._C(funcName(param1, param2)), la llamada es incorrecta, generalmente escrita por principiantes que no leen seriamente la documentación de la API FMZ.

      • La cantidad de orden de la orden de compra del mercado al contado La cantidad de orden de la orden de compra del mercado al contado también es fácil de cometer errores por parte de los principiantes, como se mencionó en el artículo anterior, la cantidad de orden de la orden de compra del mercado al contado es generalmente el monto (muy pocos intercambios pueden ser otras configuraciones, en general, estas configuraciones especiales de intercambio en FMZ se explicarán en el documento FMZ API), por ejemplo, uso OKEX V5 demo para probar: El par de operaciones se establece como:LTC_USDT

        function main() {
            exchange.IO("simulate", true)   // Switch to the demo of OKEX exchange
            exchange.Buy(-1, 1)             // The price is -1, indicating that the order placed is a market order, and the quantity is 1, indicating that the order amount is 1USDT
        }
        

        Dado que los intercambios generalmente tienen un límite en el monto del pedido, los pedidos menores que el límite no se colocarán (por ejemplo, Binance Spot requiere que cada pedido sea mayor de 5USDT antes de que pueda colocarse con éxito).Por lo tanto, informará un error si realiza un pedido como este:

        Error	Buy(-1, 1): map[code:1 data:[map[clOrdId: ordId: sCode:51020 sMsg:Order amount should be greater than the min available amount. tag:]] msg:]
        
      • Orientación para la realización de pedidos futuros Al hacer estrategias de futuros, la dirección de la colocación de órdenes a menudo se comete errores por parte de los principiantes, lo que conduce a problemas. Veamos primero la descripción en la documentación de la API:https://www.fmz.com/api#exchange.setdirection...

        img

        Como la función de orden es sóloBuy, SellSin embargo, los futuros (por supuesto, no hay problema con el spot, el spot sólo se compra y se vende) tienen las direcciones de apertura larga, cierre largo, apertura corta y cierre corto, por lo que es obvio que Buy/Sell no puede expresar operaciones en tantas direcciones.exchange.SetDirection(), que establece la dirección de las operaciones de futuros. En FMZ,exchange.SetDirection("buy")(establecer la dirección primero) se utiliza junto conexchange.Buy, significa que la orden puesta es una orden para abrir una posición larga. Y así sucesivamente:exchange.SetDirection("sell")se utiliza junto conexchange.Sell, significa que la orden puesta es una orden para abrir una posición corta.exchange.SetDirection("closebuy")se utiliza junto conexchange.Sell, significa que la orden puesta es una orden para cerrar una posición larga.exchange.SetDirection("closesell")se utiliza junto conexchange.Buy, significa que la orden puesta es una orden para cerrar una posición corta. Los principiantes suelen usarexchange.SetDirection("sell")en conjunción conexchange.BuyEntonces se reporta un error (las pruebas de retroceso pueden no reportar un error, pero esto es obviamente un error lógico, el trastorno obsesivo-compulsivo no puede tolerar...). Otro error común cometido por los principiantes

        function main() {
            exchange.SetContractType("quarter")   // Set the current contract as a quarterly contract
            exchange.SetDirection("sell")
            var id = exchange.Sell(-1, 1)    
            Log("See my market order is placed and the transaction is completed, there is a position", exchange.GetPosition())    
            exchange.SetDirection("closebuy")   // closebuy is used in conjunction with Sell, yes~
            exchange.Sell(-1, 1)
        }
        

        img
        Aquí puede preguntar: ¿Por qué tengo una posición y closebuy y Sell también se utilizan juntos, por qué obtengo un error y no puedo cerrar la posición? Yo respondería: Has cerrado la dirección equivocada! Una de las situaciones posibles en el informe de error anterior es: la dirección de cierre se establece correctamente, la función de orden se utiliza correctamente y la posición en esta dirección también se mantiene, pero el error sigue siendo reportado. La razón es que su programa puede haber realizado varias órdenes, pero la orden inicial no se ha cumplido, y la orden de cierre está pendiente en el mercado. En este momento, el programa continúa cerrando la posición, y se le pedirá un error de exceder la posición de cierre.

      • Producción del registro, visualización de la información de la transacción El diseño de estrategias comerciales programadas y cuantitativas es inseparable del diseño de la interacción hombre-computadora, como la visualización de datos y la salida del registro de operaciones. Por ejemplo: uso de pythonprint¿ Qué pasa? uso de javascriptconsole.log- ¿ Por qué? Uso de Golangfmt.Println()¿ Qué pasa? Uso de C++cout

        Hablemos de la visualización de información en la plataforma FMZ, en la plataforma de comercio de FMZ Quant, hay dos lugares principales donde se muestra la información.

        • Columna de estado Después de que el bot real se ejecuta, la página de bot real es como se muestra en la figura:

          img

          La parte de visualización es la información de la columna de estado. La columna de estado se utiliza principalmente para mostrar algunos datos cambiantes en tiempo real (ya que los cambios en tiempo real deben observarse en tiempo real, y no se puede imprimir como un registro cada vez, este tipo de datos se pueden mostrar en la columna de estado. El registro repetirá muchos datos duplicados e insignificantes, lo que afectará la consulta si se imprime cada registro). Los datos que se muestran en la columna de estado utilizan elLogStatusPara más detalles, consulte la documentación de la API de la FMZ.

        • Columna de registro También disalyed en la página del bot real, como se muestra en la figura:

          img

          La parte de visualización es la columna de registro. La columna de registro se utiliza principalmente para registrar ciertos datos en un momento determinado de forma permanente, o registrar una operación de una determinada estrategia en un momento determinado. Hay varios tipos de troncos:

          1. Registro común, las estrategias en FMZ adoptan la función Log para emitirla e imprimirla en el registro de estrategia.

            img

          2. Registro de pedidos, usoexchange.Sell/exchange.Buyen la estrategia de FMZ se registrará en la salida de registro automáticamente.

            img

          3. Registro de cancelacionesexchange.CancelOrderse utiliza en la estrategia de FMZ, que emitirá el registro de cancelación en el registro automáticamente.

            img

          4. Registro de errores, cuando se está ejecutando la estrategia en FMZ, se produce un error de llamada en la interfaz que realiza una solicitud de red, se lanza una excepción (como una declaración de lanzamiento), el registro de errores se emite en el registro automáticamente.

            img

        Las funciones de API en FMZ, funciones que pueden generar salida de registro como Log ((...), exchange.Buy ((Price, Amount), exchange.CancelOrder ((Id), etc., todas ellas pueden ser seguidas por algunos parámetros de salida adicionales después de los parámetros necesarios, como: exchange. CancelOrder ((orders[j].Id, orders[j]), esto es para emitir la información del pedido cuando se cancela el orden de pedidos[j].

        function main() {
            Log("data1", "data2", "data3", "...")
            var data2 = 200
            var id = exchange.Sell(100000, 0.1, "Attached data1", data2, "...")
            exchange.CancelOrder(id, "Attached data1", data2, "...")
            LogProfit(100, "Attached data1", data2, "...")
        }
        
      • Uso de las funciones de indicadores Antes de hablar sobre la función del indicador, primero entendamos qué es un indicador. P: ¿De dónde provienen estos indicadores? R: Por supuesto que está calculado. P: ¿Cuál es la base del cálculo? R: Cálculo basado en datos de la línea K. P: ¿Damos un ejemplo? R: Tomando como ejemplo el indicador de promedio móvil más simple, si usamos los datos diarios de la línea K (es decir, una línea positiva o negativa representa un día) como fuente de datos para el cálculo del indicador. P: ¿Se puede calcular el indicador de la media móvil si el número de BAR de la línea K es inferior a 10? R: No sólo el indicador de la media móvil no se puede calcular, sino que cualquier indicador no puede calcular el valor del índice efectivo cuando el número de datos BAR de la línea K no cumple con el parámetro del período del indicador, y la posición correspondiente de la matriz calculada se llenará con valores vacíos, por ejemplo,JavaScriptLa estrategia de lenguaje se mostraránullal imprimir los datos del indicador calculado.

        Sucede que hay un ejemplo de tutorial en el cuadrado de estrategia:https://www.fmz.com/strategy/125770Backtest la estrategia ejemplo tutorial, podemos ver el gráfico generado por el sistema de backtesting y el promedio móvil de 10 períodos:

        img

        Estrategia dibujo personalizado, K-línea dibujada, así como gráficos de media móvil.

        img

        P: ¿Y si quiero una media móvil de 10 horas? R: Usar datos de línea K con los datos de línea K del período horario estará bien.

        En términos simples, la línea K que vemos es una matriz después de que la digitalizamos (puedes preguntar a Baidu si no entiendes el concepto de matriz), cada elemento de la cual es una columna de línea K, que está dispuesta en orden, el primer elemento de la matriz es el más lejano del tiempo actual, y el último elemento de la matriz es el más cercano al tiempo actual. Por lo general, la última barra de los datos de la línea K es la barra del período actual, que cambia en tiempo real y no está completa (puedes observar los cambios ingresando a una página de intercambio y observar la línea K). Los indicadores calculados también están en correspondencia con las barras de la línea K. En el ejemplo anterior, podemos ver que un valor de indicador corresponde a una barra de la línea K. Tenga en cuenta que la última barra de la línea K cambia en tiempo real, y el indicador calculado también cambiará con el cambio de la barra de la línea K.

        En la plataforma de comercio de FMZ Quant, podemos usar la biblioteca TA (la biblioteca implementada por la plataforma FMZ, integrada en el docker, y varios idiomas se pueden usar directamente) o la biblioteca talib (la antigua biblioteca de indicadores talib, JS, integración C ++, Python necesita ser instalado por usted mismo). Por ejemplo, para calcular la media móvil en el ejemplo anterior: Utilice la biblioteca de TA:

        function main() {
            var records = exchange.GetRecords()
            var ma = TA.MA(records, 10)
            Log(ma)       // print moving average
        }
        

        Usa la biblioteca de los talibán:

        function main() {
            var records = exchange.GetRecords()
            var ma = talib.MA(records, 10)
            Log(ma)       // print moving average
        }      
        

        El indicador calculado de datos ma es una matriz, y cada elemento corresponde a la matriz de línea K (registros) uno a uno, es decir,ma[ma.length -1]corresponde arecords[records.length - 1], y así sucesivamente.

        Lo mismo ocurre con otros indicadores complejos, y debemos prestar atención a indicadores como el MACD.

        var macd = TA.MACD(records)   // In this way, only the K-line data is passed in, not the indicator parameters. The indicator parameters use the default values, and the same goes for other indicator functions.
        

        En este momento, la variable macd es una matriz bidimensional (puedes preguntar a Baidu si no entiendes el concepto). P: ¿Por qué los datos del indicador MACD son una matriz bidimensional? R: Porque el indicador macd está compuesto por dos líneas (línea dif, línea dea) y un conjunto de barras de volumen (barra de volumen macd, de hecho, estos datos de barra de volumen también se pueden considerar como una línea).

        var dif = macd[0]
        var dea = macd[1]
        var macdColumn = macd[2]
        

        Aquí también hay un ejemplo de tutorial listo, si está interesado, puede estudiar en:https://www.fmz.com/strategy/151972

        img


Relacionados

Más.