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')
}
}
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.
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
, GetOrders
yGetOrder
para evitar la interrupción del programa causada por el fallo de acceso.
CancelOrder
No 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
}
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
.
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 esnull
Por 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)
}
}
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())
;Math.max()
, Math.abs()
y así sucesivamente; referencia:https://www.w3school.com.cn/jsref/jsref_obj_math.asp ;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
.
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, "***")
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
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)
}
}
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.
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)
}
}
Bajo
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|ETH
en 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.
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.
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(10)
, para no quedar atrapado.
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.
GetRecords()
función; también puede especificar un parámetro de período en el código;Como mencionamos anteriormente, el uso de una interfaz API en el bot puede fallar para acceder y regresarnull
Por lo tanto, las estrategias deben funcionar bien en tolerancia a fallos.
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.
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")