Tutorial básico para la plataforma FMZ Quant para escribir estrategias

El autor:No lo sé., Creado: 2022-03-18 09:00:46, Actualizado: 2022-04-02 11:48:15

puedes usar Python para escribir directamente en la base de datos.

function onexit(){
    _G('profit', profit)
}
function main(){
    _G("num", 1); // Set a global variable num, with a value of 1 second 
    _G("num", "ok"); // Change a global variable num, whose value is the string "ok"
    _G("num", null); // Delete the global variable num 
    _G("num"); // Return the value of the global variable num; if it does not exist, return null

    var profit = 0
    if(_G('profit')){
        profit = _G('profit')
    }
}

- ¿Qué es?

Cuando se realiza un pedido, normalmente es necesario controlar la precisión del precio y el volumen; FMZ ha incorporado la función _N para determinar los decimales a guardar; por ejemplo, el resultado de_N(4.253,2)es de 4.25.

_C

Llamar a la API de la plataforma no puede garantizar que el acceso sea exitoso cada vez, y _C es una función de reintento automático. Siempre llamará las funciones especificadas hasta que regrese con éxito (la función volverá a intentar si devuelve nulo o falso); por ejemplo,_C(exchange.GetTicker), con el intervalo de reintento predeterminado de 3 segundos, y puede llamar a la función _CDelay para controlar el intervalo de reintento, como _CDelay(1000), lo que significa cambiar el intervalo de reintento de la función _C a 1 segundo.GetTicker(), exchange.GetDepth, GetTrade, GetRecords, GetAccount, GetOrdersyGetOrderpara evitar la interrupción del programa causada por el fallo de acceso.

CancelOrderNo se puede usar la función _C, porque hay varias razones para el fracaso de cancelar una orden. Si una orden ha sido ejecutada, entonces cancelar la orden devolverá un fracaso, y el uso de la función _C resultará en volver a intentarlo todo el tiempo. La función _C también puede pasar en parámetros y también se utiliza en funciones personalizadas.

function main(){
    var ticker = _C(exchange.GetTicker)
    var depth = _C(exchange.GetDepth)
    var records = _C(exchange.GetRecords, PERIOD_D1) // Pass in the parameters
}

- ¿ Qué pasa?

Llamando_D()direct devolverá la cadena de tiempo actual, como:2019-08-15 03:46:14. Si se llama durante el backtest, se devolverá el tiempo de backtest. Puede usar la función _D para juzgar el tiempo, como:_D().slice(11) > '09:00:00':. _D(timestamp, fmt), convertirá la marca de tiempo ms en una cadena de tiempo, como_D(1565855310002). El parámetro fmt es el formato de tiempo, y el predeterminado esyyyy-MM-dd hh:mm:ss.

Funciones de los indicadores de TA

Para algunas funciones de indicadores de uso común, como MA\MACD\KDJ\BOLL y otros indicadores comunes, que han sido incorporados directamente por la plataforma FMZ, y los indicadores específicos compatibles se pueden encontrar en el documento de la API.

Antes de utilizar las funciones indicadoras, es mejor juzgar la longitud de la línea K. Cuando la longitud de la línea K anterior no puede cumplir con el período requerido para el cálculo, el resultado esnullPor ejemplo, si la longitud de la línea K de entrada es 100 y el período para calcular MA es 10, entonces los primeros 9 valores son todos nulos, y el cálculo después de los valores del formato 9 se hará normalmente.

JavaScript también admite el talib completo, como una biblioteca de terceros, con métodos de invocación comotalib.CCI(records)Por favor, consulte elhttp://ta-lib.org/function.htmlPara Python, puedes instalar la biblioteca talib por ti mismo. Debido a la necesidad de compilación, no puedes simplemente usar pip para instalar. Puedes buscar el método de instalación por ti mismo.

Las funciones de indicador no sólo pueden pasar los datos de la línea K, sino también pasar cualquier matriz

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    if (records && records.length > 9) {
        var ma = TA.MA(records, 14)
        Log(ma)
    }
}

Funciones de uso común en JavaScript

Aquí introducimos algunas funciones de JavaScript comúnmente utilizadas en los bots.

  • Date.now()devuelve la fecha y hora actuales;
  • parseFloat()Transfiere cadenas en números, comoparseFloat("123.21");
  • parseInt()Transfiere las cadenas a números enteros;
  • num.toString()Transfiere números a cadenas, con la variable num;
  • JSON.parse()formatos de cadenas Json, tales comoJSON.parse(exchange.GetRawJSON());
  • JavaScript tiene sus propias funciones matemáticas, tales como las operaciones matemáticas comunes, incluyendoMath.max(), Math.abs()y así sucesivamente; referencia:https://www.w3school.com.cn/jsref/jsref_obj_math.asp ;
  • La biblioteca matemática de terceros utilizada por FMZ; referencia:https://mathjs.org/ ;
  • La biblioteca de subyacentes de terceros de JavaScript utilizada por FMZ, que se recomienda tener un conocimiento y que hace que las tediosas operaciones Js sean más convenientes; referencia:https://underscorejs.org/.

Modelo

Hay muchas situaciones que hay que tener en cuenta al escribir una función de estrategia de bot. Por ejemplo, una función simple como comprar 5 monedas, necesitamos considerar: ¿Es suficiente el saldo actual? ¿Cuánto es el precio del pedido? ¿Cuál es la precisión? ¿Necesitas dividir los pedidos para evitar afectar al mercado? ¿Cómo lidiar con los pedidos inacabados? Y algunos detalles como ese. En diferentes estrategias, estas funciones son las mismas, por lo que puedes hacerlas en una plantilla. Siguiendo las plantillas oficiales, los usuarios también pueden escribir sus propias estrategias de plantilla. Aquí presentaremos varias bibliotecas de clases de plantillas muy utilizadas lanzadas oficialmente por FMZ, para que los usuarios puedan escribir rápidamente sus propias estrategias.

La biblioteca de comercio de criptomonedas JavaScript y la biblioteca de comercio de futuros de productos básicos están integradas por defecto y no necesitan ser copiadas.https://www.fmz.com/square/20/1) Copie y guarde la biblioteca de plantillas, y compruebe la biblioteca a utilizar al crear su propia estrategia.

Todas las funciones de plantilla JavaScript comienzan con$, mientras que los de Python todos comienzan conext.

Librería de comercio de criptomonedas

Dirección del código fuente:https://www.fmz.com/strategy/10989, que ya ha sido incorporado, por lo que no hay necesidad de copiar.

Obtener Cuenta:

$.GetAccount(e)

Log($.GetAccount()); // Obtain the account information, with fault tolerance function 
Log($.GetAcccount(exchanges[1]));

Posicionamiento de pedidos y cancelación:

$.Buy/Sell(e, amount)
$.Buy(0.3); // The main platform buys 0.3 coin
$.Sell(0.2); // The main platform sells 0.2 coin
$.Sell(exchanges[1], 0.1); // The secondary platform sells 0.1 coin
$.CancelPendingOrders(e, orderType)

$.CancelPendingOrders(); // Cancel all entrusted orders of the main platform 
$.CancelPendingOrders(ORDER_TYPE_BUY); // Cancel all buy orders of the main platform
$.CancelPendingOrders(exchanges[1]); // Cancel all orders of the secondary platform
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // Cancel all sell orders of the secondary platforom 

Juzga a la Cruz:

$.Cross(periodA, periodB) / $.Cross(arr1, arr2);

var n = $.Cross(15, 30);
var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6])
If n = 0, it means that the current prices of exactly 15-period EMA and 30-period EMA are equal. 
If n > 0, such as 5, it means that the 15-period EMA up-crosses the 30-period EMA by 5 periods (Bar)
If n < 0, such as -12, it means that the 15-period EMA down-crosses the 30-period EMA by 12 periods (Bar)
If it is not an array passed to the Cross, the function automatically obtains the K-line for moving average calculation.
If an array is passed to Cross, compare directly.

.retiro (e, moneda, dirección, importe, tarifa, contraseña) función:

$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")

Biblioteca de operaciones de futuros de materias primas

Para el uso de la biblioteca de comercio de futuros de materias primas es muy estable, se recomienda.https://www.fmz.com/strategy/12961, que ya ha sido incorporado, por lo que no hay necesidad de copiar.

Biblioteca de la CTA

  • El bot asignará automáticamente el índice al contrato principal continuo;
  • se encargará automáticamente del movimiento;
  • puede especificar la asignación para backtest, como rb000/rb888, que es asignar la línea k del índice rb para negociar el contrato continuo principal;
  • También se puede asignar a otros contratos; por ejemplo, rb000/MA888 es mirar la línea K del índice rb para negociar el contrato principal continuo MA.
function main() {
    $.CTA("rb000,M000", function(r, mp) {
        if (r.length < 20) {
            return
        }
        var emaSlow = TA.EMA(r, 20)
        var emaFast = TA.EMA(r, 5)
        var cross = $.Cross(emaFast, emaSlow);
        if (mp <= 0 && cross > 2) {
            Log("Golden cross period", cross, "the moment position", mp);
            return 1
        } else if (mp >= 0 && cross < -2) {
            Log("Death cross period", cross, "the moment position", mp);
            return -1
        }
    });
}

Invocación Ejemplo de biblioteca

function main() {
    var p = $.NewPositionManager();
    p.OpenShort("MA609", 1);
    p.OpenShort("MA701", 1);
    Log(p.GetPosition("MA609", PD_SHORT));
    Log(p.GetAccount());
    Log(p.Account());
    Sleep(60000 * 10);
    p.CoverAll("MA609");
    LogProfit(p.Profit());
    Log($.IsTrading("MA609"));
    // Multiple varieties use the trading queue to complete the non-blocking trading task
    var q = $.NewTaskQueue();
    q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
        Log(task.desc, ret)
    })
    while (true) {
        // Call "poll" to execute the unfinished tasks in the spare time
        q.poll()
        Sleep(1000)
    }
}

Biblioteca de dibujos

Para las funciones en bruto para el dibujo son muy complicadas, que se introducirá en el siguiente tutorial, recomendamos a los principiantes a utilizar la biblioteca de dibujo, para dibujar gráficos de líneas muy simples y gráficos de líneas k, etc. La biblioteca de dibujo simple se ha construido en FMZ, que se puede ver en la página de edición de la estrategia; si la biblioteca no está integrada todavía, los usuarios necesitan copiar y guardar, para comprobar y utilizar la biblioteca en la estrategia.

img

Dirección de copia de la biblioteca de dibujos de la versión de Javascript:https://www.fmz.com/strategy/27293Dirección de copia de la biblioteca de dibujos de la versión de Python:https://www.fmz.com/strategy/39066

Ejemplo específico:

function main() {
    while (true) {
        var ticker = exchange.GetTicker()
        if (ticker) {
            $.PlotLine('Last', ticker.Last) // You can draw two lines at the samw time, "Last" is the name of the line
            $.PlotLine('Buy', ticker.Buy)
        }
        Sleep(6000)
    }
}

Configuración de parámetros de estrategia

Bajo Edit Strategy, hay configuraciones de parámetros de estrategia, que son iguales a las variables globales de la estrategia, y se pueden acceder en cualquier lugar del código. Los parámetros de estrategia se pueden modificar en la página del bot, y serán válidos después del reinicio. Por lo tanto, algunas variables se pueden establecer en los parámetros, y los parámetros se pueden modificar sin modificar la estrategia.
img

  • Nombre de la variable: es decir, el número, la cadena y el combox, etc. de la imagen anterior, que pueden utilizarse directamente en el grupo de estrategia.
  • Descripción: el nombre de un parámetro en la interfaz de estrategia, más conveniente para los usuarios para entender el significado del parámetro.
  • No obstante,: la explicación detallada de un parámetro, que se mostrará en consecuencia cuando el ratón esté sobre el parámetro.
  • Tipo de producto: el tipo de un parámetro, que se presentará en detalle más adelante.
  • Esparcimiento de tiempo: el valor predeterminado del parámetro a.

Es muy fácil entender el tipo de cadena y el tipo de número. que son tipos muy utilizados. El cuadro de combinación mostrará las opciones en el cuadro en la interfaz de parámetros. Por ejemplo, puede establecer el parámetro SYMBOL comoBTC|USDT|ETHen la casilla de combinación; si selecciona USDT en la casilla de la página, el valor de SYMBOL en la estrategia es el índice USDT 1.

Hay más parámetros para la configuración; referene:https://www.fmz.com/api.

Estrategia de prueba de retroceso

Cuando la cuantización de una estrategia esté terminada, puede probarla por los datos del historial, para verificar la situación de ganancias de la estrategia en la fecha del historial. Por supuesto, el resultado de la prueba de retroceso es solo para referencia. El backtest de Javascript se ejecuta en el navegador; el backtest de Python está en el docker, y nuestra plataforma proporciona dockers públicos para los usuarios.

Mecanismo Baktest

El mecanismo de backtest de la barra se basa en la línea K, es decir, cada línea K generará un punto en el tiempo para backtest. En el punto en el tiempo, puede obtener la información, incluidos los precios abiertos, cerrados, más altos y más bajos y el volumen de negociación de la línea K actual, así como la información de la línea K anterior al punto. La deficiencia de este tipo de mecanismo es muy obvia: solo se puede generar una compra en una línea K; generalmente el precio referido es el precio cerrado de la línea K. Además, una línea K solo puede obtener cuatro precios, a saber, los precios cerrados, abiertos, más altos y más bajos; la información, incluida la forma en que cambian los precios en una línea K y si el precio más alto o el precio más bajo cambia primero, no se puede obtener. Tome como ejemplo el bot de prueba de la línea K de una hora.

La prueba de retroceso en FMZ contiene dos tipos, a saber, la prueba de retroceso a nivel de simulación y la prueba de retroceso a nivel de mercado real.Sin embargo, la prueba de retroceso de nivel de mercado real en realidad recogerá tick, cada varios segundos, y ahora es compatible con la profundidad real (incluyendo 20 niveles), y la ejecución real de comercio por tarde.El volumen de fecha es bastante enorme, y la velocidad de backtest es muy lenta, por lo que la backtest no se puede ejecutar en un largo tiempo.https://www.fmz.com/bbs-topic/9126.

El marco de backtest y bot son los mismos, ambos un bucle infinito. Debido a que el backtest es saltar a diferentes puntos de backtest, el backtest se puede ejecutar sin usar Sleep, y saltará automáticamente al siguiente punto de tiempo cuando termine un bucle. Sin embargo, Python, debido al mecanismo del programa, necesita una restricción deSleep(10), para no quedar atrapado.

Compatibilidad de las pruebas de retroceso

El motor de backtest coincidirá con el precio de la orden colocado por el usuario y el precio de mercado en el momento de la backtest. Si el precio de compra es mayor que el de venta, se ejecutará el de venta. Si la negociación no puede ejecutarse, se generará una orden pendiente. Se debe agregar deslizamiento para garantizar la negociación. Si la posición no se puede abrir o cerrar durante la backtest, compruebe si la posición está congelada debido a órdenes inacabadas.

Configuración de la página de prueba posterior

img

  • 1.elegir la página de Backtest, en la izquierda de la cual se encuentra la página Edición de la Estrategia;
  • 2.la hora de inicio y la hora de finalización del backtest; en caso de que los datos puedan estar incompletos, el backtest puede comenzar directamente desde el momento en que los datos existen;
  • 3.el período de impago de las pruebas de retrocesoGetRecords()función; también puede especificar un parámetro de período en el código;
  • 4.elección del mecanismo de pruebas de retroceso;
  • 5.Mostrar o ocultar más ajustes de las pruebas de retroceso;
  • 6.los máximos de los elementos del registro, los elementos del registro de beneficios y los elementos del registro de gráficos, para evitar que el explorador se vea afectado por una gran cantidad de datos;
  • 7.el período generado por el tick de la capa inferior de acuerdo con la línea K;
  • 8. punto de deslizamiento del tren;
  • 9.tolerancia a fallos, que simula la situación en la que la solicitud de API es errónea y prueba la capacidad de tolerancia a fallos de la estrategia;
  • 10.si se debe dibujar el gráfico de mercado; si se utiliza una función de indicador de TA en la prueba de retroceso, la función se mostrará automáticamente en el gráfico y también se marcarán las compras y ventas;
  • 11.fijación de las tasas de servicio;
  • 12.Plataformas agregadas - pares de operaciones y activos;
  • 13.configuración de los parámetros de backtest; si los parámetros son números y también admiten la optimización de una sola tecla, los parámetros se recorrerán automáticamente en un cierto rango en el backtest.

Diferencias entre Bot y Backtest

  • 1.las únicas cotizaciones de mercado válidas en el backtest son solo de GetTicker y GetRecords; otras como GetDepth y GetTrades no son reales (el volumen de datos es enorme y, aunque el backtest a nivel de mercado real ya soporta los datos, solo soporta los datos más recientes);
  • 2.las plataformas añadidas en la prueba de retroceso son todas cuentas segregadas; no se admite el derecho de cambiar de par de operaciones; por lo tanto, no se pueden operar dos pares de operaciones en una cuenta;
  • 3.la solicitud de redwrok no puede utilizarse en el backtest;
  • 4.IOla extensión no podrá utilizarse en el backtest y sólo podrán utilizarse las API básicas;
  • 5.sólo se pueden obtener datos estándar en el backtest, y los datos, como el Info que está relacionado con el bot, no existen;
  • 6.el retraso podría no ejecutarse en la prueba de retroceso, y prestar atención a la situación de los pedidos congelados;
  • 7.inel backtest de los futuros de materias primas, el orden de mercado no es compatible.

Estrategia Tolerancia a fallas y errores comunes

Como mencionamos anteriormente, el uso de una interfaz API en el bot puede fallar para acceder y regresarnullPor lo tanto, las estrategias deben funcionar bien en tolerancia a fallos.

Maneras comunes de tolerar el error

Causas comunes:

  • Error de red de acceso a la API; el tiempo límite de acceso a la interfaz devuelve nunll y se informará de un error.

  • Error de limitación de la plataforma, como limitación de IP, precisión de orden, frecuencia de acceso, error de parámetro, deficiencia de activos, fallo de la negociación en el mercado, cancelación de órdenes ejecutadas, etc.; los detalles se pueden consultar en el documento de la API de acuerdo con los códigos incorrectos.

  • Error de devolución de datos de la plataforma; a veces ocurre, como devolver profundidad nula, información de cuenta retrasada y estado de pedido retrasado, etc.

  • Error de lógica del programa.

Antes de usar los datos devueltos de API, debe juzgar si los datos son nulos, y los métodos comunes se introducen de la siguiente manera:

//1.judge the data is null and handle 
var ticker = exchange.GetTicker();
while(ticker == null){
     Log('ticker obtain error');
     ticker = exchange.GetTicker();
 }
 Log(ticker.Last);
 // 2. judge the data is not null, and use 
 var ticker = exchange.GetTicker();
 if(!ticker){
     Log(ticker.Last);
 }
 // 3.retry _C() function 
 var ticker = _C(exchange.GetTicker);
 Log(ticker.Last);
 // 4.try cache fault tolerance
 try{
     var ticker = exchange.GetTicker();
     Log(ticker.Last);
 }
 catch(err){
     Log('ticker obtain error');
 } 

Si desea obtener la información de los errores, puede utilizarGetLastError(), y las cadenas de la última vez la información de error será devuelta, y los errores se pueden procesar por diferencias.

Preguntas frecuentes

Resumen de errores comunes en las entradas superiores de los foros:https://www.fmz.com/bbs-topic/9158Aquí lo presentamos brevemente; puedes usar ctrl+F para buscar, cuando tengas problemas.

¿Cómo desplegar el docker?

Hay una introducción detallada al respecto en la sección de añadir un docker.

¿Puedo pedirle a alguien que escriba estrategias fantasmas para mí?

En elhttps://www.fmz.com/markets, hay algunas personas que prestan servicios de redacción de estrategias para otros, o usted puede preguntar en los grupos de chat; tenga en cuenta que ese tipo de servicios deben ser contactados por usted mismo, y usted debe ser consciente de que el riesgo también debe ser soportado por usted mismo.

Todas las interfaces piden tiempo de espera cuando se accede

se refiere al tiempo de espera de la interfaz de plataforma a la que se accede; si el tiempo de espera ocurre ocasionalmente, no es un problema; si el tiempo de espera se solicita todo el tiempo, significa que no se puede acceder a todas las redes y se necesita un servidor en el extranjero.

En el caso de los datos de los datos de los Estados miembros, se utilizará el formulario de identificación de los datos.

Si la prueba de retroceso informa de un error, generalmente se trata de un error de escritura; cuando intenta colocar una orden para cerrar una posición, cuando no hay posición o el volumen de posición no es suficiente, se informará de un error.

Símbolo no establecido

No hay un contrato establecido en el código, durante las pruebas de retroceso de las plataformas de futuros.

BITMEX 429error,{error:{message:Rate limit exceeded re-try in 1 seconds......}}

La frecuencia de acceso de la interfaz de la plataforma es demasiado alta.

El estado está fuera de alcance.

La marca de tiempo del servidor excede el intervalo de tiempo de actualización del servidor, y el tiempo superado no puede ser demasiado largo.

GetOrder ((455284455)): Error: ID de pedido no válido o orden cancelada.

Si se cancela el pedido de una plataforma, la plataforma ya no mantendrá la información del pedido, por lo que no se puede obtener la información.

Obtener órdenes: 400: {código:-1121, msg: símbolo no válido. }

Pareja comercial no válida; compruebe si la configuración del par comercial es incorrecta.

El descifrado de la clave secreta falló.

El análisis de APIKEY falla. Si la contraseña de FMZ ha sido modificada después de la configuración de APIKEY, intente agregar una página de plataforma en FMZ y reconfigure la plataforma APIKEY.

Firma no válida: hora de presentación no válida o formato de hora incorrecto

sugiero que utilice el servidor Linux, o instale el software de sincronización de tiempo en estos sistemas Windows donde ocurre este problema.

¿Por qué el docker todavía no puede acceder a la API de la plataforma cuando un proxy global está configurado?

El proxy global no tiene un puerto de red proxy docker. Debido al problema de retraso, es mejor implementar el docker de un servidor extranjero.

¿Cómo guardar una estrategia localmente, no para subir a FMZ?

Usando Python, y se puede importar archivos locales, guardar la estrategia normalmente escrito por FMZ API como un archivo y ponerlo en la ruta de ejecución en su propio servidor, y usted puede leer directamente y ejecutarlo.

#!python2.7

def run(runfile):
      with open(runfile,"r") as f:
            exec(f.read())
            
def main():
    run('my.py')

¿Cómo a la red de pruebas de una plataforma o cómo cambiar la dirección de la base de API?

Utilice exchange.SetBase() para cambiar directamente a la dirección de base de la API correspondiente. Por ejemplo:

exchange.SetBase("https://www.okex.me")

Más.