[TOC] Este tutorial contiene un conocimiento básico de la redacción de políticas, incluyendo API introducción, revisiones, gráficos, etc. Después de aprender este tutorial básico, el usuario será capaz de ser experto en el uso de las API básicas para escribir políticas de disco duro estables.Introducción a la plataforma de cuantificación de los inventores de FMZ 。
En la página de Facebook de la organización, se puede leer:Inventor Cuantificación (FMZ.COM) Estrategias escritas completamente con el manual 2.0 (Tutorial)En este tutorial se enumeran muchos índices de publicaciones, y también se recomienda consultarlos.
La transacción programática es la conexión de un programa a través de una API y un intercambio para realizar compras, ventas u otras funciones automáticas según la intención del diseño.
En la actualidad, los intercambios de moneda digital tienen dos protocolos de interfaz principales: REST y Websocket. El protocolo REST requiere una visita por cada recopilación de datos. Por ejemplo, con la API de wex.app, abre directamente en el navegador https://api.wex.app/api/v1/public/ticker?market=BTC_USDT, obteniendo el resultado:
{"data:{"buy":"11351.73","high":"11595.77","last":"11351.85","low":"11118.45","open":"11358.74","quoteVol":"95995607137.00903936","sell":"11356.02","time":1565593489318,"vol":"3552.5153"}}
Esto permite ver el mercado más reciente de transacciones con BTC_USDT, que también cambia cada vez que se actualiza.market=
A continuación, se enfrentan los parámetros específicos de transacción, que se pueden modificar para obtener otros parámetros de transacción. Para las interfaces públicas, como el mercado, todo el mundo puede acceder, por lo que no se necesita verificación, mientras que algunas interfaces como la siguiente orden y la obtención de cuentas requieren la identificación del usuario, en este caso se requiere firmar con API-KEY.
La plataforma FMZ Quantitative Trading Platform envuelve interfaces REST de los distintos intercambios, utilizando un formato de llamada y datos uniforme para que las políticas se escriban de manera más sencilla y general. La plataforma FMZ ofrece un soporte conveniente para Websocket, que se explicará en detalle en el siguiente tutorial.
La mayoría de la documentación de la plataforma FMZ API se basa en JavaScript, pero debido al envase, los diferentes idiomas no tienen muchas diferencias, solo hay que prestar atención a los problemas de gramática. C ++ es un poco especial, y los tutoriales posteriores tendrán una introducción especializada. Se recomienda el uso de novatos debido a que Js es más simple y no tiene problemas de compatibilidad. La plataforma FMZ de cuantificación soporta Python completo, puede instalar libremente una variedad de paquetes, se recomienda un uso básico de programación.
Como hay diferentes versiones de Python, se puede especificar al principio del programa, como:#!Python2
,#!Python3
Nota: JavaScript ha actualizado recientemente la sintaxis de ES6, lo cual es interesante. A continuación se muestra el código de Python y Javascript para las mismas funciones, con solo diferencias de sintaxis, por lo que la documentación de la API solo da ejemplos de Javascript, y este tutorial también tendrá en cuenta los casos especiales de uso de Python.
#python代码
def main():
while True:
Log(exchange.GetAccount().Balance)
Sleep(2000)
#相应的Js代码
function main(){
while(true){
Log(exchange.GetAccount().Balance)
Sleep(2000)
}
}
La plataforma de cuantificación FMZ proporciona herramientas de depuración para interfaces de API de depuración.https://www.fmz.com/m/debug⇒ La herramienta de depuración solo soporta JavaScript y solo se puede ejecutar durante un tiempo, sin necesidad de crear un disco físico, se puede deshacer la interfaz del intercambio. ⇒ Los datos de retorno se devolverán como resultado, el código de la herramienta de depuración no se guardará.
Los programas de política, al igual que los programas normales, se ejecutan en orden de código, con la particularidad de que debe haber una función principal. Debido a que las políticas deben ejecutarse sin interrupción, en general, se requiere un ciclo más un tiempo de reposo. Debido a que la frecuencia de acceso a todas las API de transacciones es limitada, se requiere un tiempo de reposo ajustado.
Otras funciones con funciones especiales son:
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//在这里写策略逻辑,将会每6s调用一次
}
function main(){
while(true){
onTick()
Sleep(6000)
}
}
El ejemplo anterior indica que si un error de acceso a la red puede hacer que la política se detenga directamente, si se desea una política similar al reinicio automático que no se detenga, se puede volver a utilizar la política de disco real con try catch para permitir el ciclo de errores.
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//在这里写策略逻辑,将会每6s调用一次
}
function main(){
try{
while(true){
onTick()
Sleep(6000)
}
}catch(err){
Log(err)
}
}
Cuando se llama a cualquier API relacionada con el intercambio, se requiere que el intercambio y la pareja de transacciones sean claros.exchange
Es decir, el objeto que representa.exchange.GetTicker()
Lo que se obtiene será el ticker de mercado de esta bolsa-pareja de operaciones.
La plataforma FMZ también admite la adición simultánea de múltiples pares de intercambios, como BTC y ETH que pueden operarse simultáneamente en la misma cuenta de la misma bolsa, o BTC y ETH de una bolsa que pueden operarse simultáneamente en otra. Tenga en cuenta que también se pueden agregar diferentes cuentas de la misma bolsa al mismo tiempo, según la diferencia de etiqueta que se añade al sitio FMZ.exchanges
Los grupos representan el orden en que se crearon los discos reales.exchanges[0]
、exchanges[1]
... y así sucesivamente.BTC_USDT
La primera es BTC, la moneda de intercambio, y la segunda es USDT, la moneda de facturación.
Obviamente, si estamos operando muchos pares de transacciones, esta es una forma muy problemática, en este momento se puede usar SetCurrency para cambiar pares de transacciones, comoexchange.SetCurrency("BTC_USDT")
En este momento,exchange
La pareja de transacciones vinculadas se convierte enBTC_USDT
En el caso de las transacciones de cambio de par, el cambio de par será válido hasta la próxima vez que se realice el cambio.Tenga en cuenta que las pruebas de retroceso recientes apoyan el cambio de transacciones.Aquí hay un ejemplo concreto.
var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"]
var buyValue = 1000
function main(){
for(var i=0;i<symbols.length;i++){
exchange.SetCurrency(symbols[i])
var ticker = exchange.GetTicker()
var amount = _N(buyValue/ticker.Sell, 3)
exchange.Buy(ticker.Sell, amount)
Sleep(1000)
}
}
Como se ha mencionado anteriormente, las interfaces de mercado son generalmente interfaces públicas y accesibles para todos. Las interfaces de mercado comunes incluyen: obtener tickers de mercado, obtener profundidad de profundidad, obtener registros de línea K, obtener registros de transacciones.
En general, todas las interfaces tienenInfo
Un campo, que representa una cadena de datos original devuelta por el exchange, que puede ser usado para complementar información adicional que antes se necesitaba analizar, usando JavaScriptJSON.parse()
En Python, se utiliza la librería json.Time
Los campos indican el tiempo de la solicitud, que se puede usar para determinar el retraso.
También es posible que el acceso falle y regrese usando la interfaz API en el disco real.null
Python está de vuelta.None
El uso de los datos en él puede generar errores y causar que el disco se detenga, por lo que es muy importante tolerar errores.
Obtener información sobre la situación actual del mercado, probablemente la interfaz más utilizada, puede ver el precio de la última transacción, el precio de compra y venta, el volumen de transacción más reciente, etc.; puede determinar el precio de la transacción según la información del ticker antes de realizar el pedido; un ejemplo de retorno de disco real{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}
。
function main() {
var ticker = exchange.GetTicker()
Log(ticker) //在调试工具中 return ticker 。可以看到具体的结果。
Log('上次成交价: ',ticker.Last, '买一价: ', ticker.Buy)
}
Obtener información de la profundidad de los anuncios. Aunque GetTicker incluye un buy and sell, si se desea consultar un anuncio más profundo, se puede usar esta interfaz para generalmente encontrar los 200 anuncios superiores y inferiores. Se puede usar esta interfaz para calcular el precio de choque. A continuación se muestra un resultado de retorno real.
{
"Info":null,
"Asks":[
{"Price":5866.38,"Amount":0.068644},
{"Price":5866.39,"Amount":0.263985},
......
]
"Bids":[
{"Price":5865.13,"Amount":0.001898},
{"Price":5865,"Amount":0.085575},
......
],
"Time":1530241857399
}
Un ejemplo de compra y venta con acceso profundo:
function main() {
var depth = exchange.GetDepth()
Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price)
}
Obtener K-line, uno de los interfaces más utilizados, puede devolver información de precios de larga duración a la vez, calculando la base de una variedad de indicadores. Los ciclos de K-line indican el ciclo predeterminado que se usará cuando se agrega el disco real si no se especifica. La longitud de K-line no se puede especificar, la acumulación aumenta con el tiempo, hasta un máximo de 2000 bits, la primera llamada es de aproximadamente 200 bits (diferentes intercambios devuelven diferentes); la última K-line es la última K-line, por lo que los datos cambian constantemente a medida que se desarrolla, y la primera K-line es la más antigua.
exchange.SetMaxBarLen(Len)
Se puede configurar el número de líneas K obtenidas por primera vez (suportadas por algunos intercambios) y se establece el número máximo de líneas K.Por ejemplo:exchange.SetMaxBarLen(500)
GetRecords puede especificar ciclos: PERIOD_M1:1 minutos, PERIOD_M5:5 minutos, PERIOD_M15:15 minutos, PERIOD_M30:30 minutos, PERIOD_H1:1 horas, PERIOD_D1:1 días.exchange.GetRecords(PERIOD_M1)
Después de la actualización de los últimos administradores, el soporte de ciclos personalizados, la transmisión directa de ciclos de segundos como parámetros, la personalización a nivel de minutos se sintetizará según la línea K de 1 minuto y la línea K de menos de 1 minuto se sintetizará a través de GetTrades, los futuros de productos se sintetizarán según ticks.Tenga en cuenta que también se puede encontrar algo similar en el tutorial.PERIOD_M1
Estas variables son las variables globales por defecto de FMZ, los interesados pueden registrar sus propios valores específicos y usarlos directamente.
En el caso de los datos que se devuelven:
[
{"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432},
{"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935},
{"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361},
......
]
Ejemplo de línea K:
function main(){
var close = []
var records = exchange.GetRecords(PERIOD_H1)
Log('total bars: ', records.length)
for(var i=0;i<records.length;i++){
close.push(records[i].Close)
}
return close
}
Obtener datos de transacciones de un determinado rango de tiempo (no sus propios datos de transacciones) no es compatible con algunos intercambios.
Estas interfaces no se pueden acceder directamente, ya que están relacionadas con las cuentas, y requieren una firma API-KEY. La plataforma FMZ ha procesado la unificación automática en segundo plano y puede usarse directamente.
Obtener información de la cuenta. Uno de los interfaces más utilizados, que requiere una llamada antes de realizar el pedido para evitar un saldo insuficiente.{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}
Los valores de las acciones son el saldo disponible de la moneda de negociación de la pareja, los valores de las acciones congeladas son el saldo congelado de las órdenes pendientes, los valores de las acciones de la moneda de cotización son el saldo disponible de la moneda de cotización, y los valores de las acciones congeladas son los valores congelados.BTC_USDT
En el caso de Bitcoin, esto significa que el valor de las acciones es BTC, mientras que el valor de los balances es USDT.
Tenga en cuenta que los resultados devueltos son los resultados de los pares de transacciones especificados, la información de otras monedas en la cuenta de transacción está en el campo de información, para operar múltiples pares de transacciones sin necesidad de llamar varias veces.
Un plato impreso de las transacciones actuales por su valor total:
function main(){
while(true){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
var price = ticker.Buy
var stocks = account.Stocks + account.FrozenStocks
var balance = account.Balance + account.FrozenBalance
var value = stocks*price + balance
Log('Account value is: ', value)
LogProfit(value)
Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
//when run in debug tool, add a break here
}
}
El pago es obligatorio.exchange.Buy(Price, Amount)
¿Qué es esto?exchange.Buy(Price, Amount, Msg)
,Price es el precio,Amount es la cantidad,Msg es una cadena adicional que se puede mostrar en el registro del disco real, no es obligatorio.null
En la página web de la empresa, el usuario puede consultar el estado de los pedidos.
Si se quiere comprar a precio de mercado, el precio es -1, el monto es el valor de la compra, por ejemploexchange.Buy(-1, 0.5)
El trato es correcto.ETH_BTC
En el caso de las bolsas de divisas, el precio de compra de ETH es de 0.5 BTC. Algunas bolsas no soportan el listado de precios, ni la revisión de futuros.
Las transacciones en parte tienen requisitos de precisión de todos los precios y cantidades disponibles_N()
Las funciones de precisión para controlar. Hay otros significados para las operaciones de futuros Buy y Sell, que se presentarán por separado.
Un ejemplo de compra a un precio adecuado:
function main(){
while(true){
var ticker = exchange.GetTicker()
var price = ticker.Sell
if(price >= 7000){
exchange.Buy(_N(price+5,2), 1, 'BTC-USDT')
break
}
Sleep(3000)//Sleep 3000ms
}
Log('done')
}
Los parámetros de los listados de venta y venta. Los parámetros de los listados de venta y venta son los mismos.exchange.Sell(-1, 0.2)
El precio de venta es de 0.2 ETH.
Obtener información de los pedidos según el ID del pedido.exchange.GetOrder(OrderId)
,OrderId es el id de la orden, que se devuelve cuando se realiza el pedido.Atención al tipo de pedidoType
Los campos y el estado del pedidoStatus
Los valores reales son números y representan diferentes significados, pero no son beneficiosos para la memoria, y FMZ utiliza constantes globales para representar estos valores, como los de las órdenes pendientes.Status
Si el valor es 0, es igual aORDER_STATE_PENDING
Todos estos constantes globales se pueden ver en la documentación.El resultado es el siguiente:
{
"Id":125723661, //订单id
"Amount":0.01, //订单数量
"Price":7000, //订单价格
"DealAmount":0, //已成交数量
"AvgPrice":0, //成交均价
"Status":0, // 0:未完全成交, 1:已成交, 2:已撤单
"Type":1,// 订单类型,0:买单, 1:卖单
"ContractType":"",//合约类型,用于期货交易
"Info":{} //交易所返回原始信息
}
}
Una estrategia para comprar una cantidad determinada de monedas:
function main(){
while(true){
var amount = exchange.GetAccount().Stocks
var ticker = exchange.GetTicker()
var id = null
if(5-amount>0.01){
id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2))
}else{
Log('Job completed')
return //return the main function, bot will stop
}
Sleep(3000) //Sleep 3000ms
if(id){
var status = exchange.GetOrder(id).Status
if(status == 0){ //这里也可以用 status == ORDER_STATE_PENDING 来判断。
exchange.CancelOrder(id)
}
}
}
}
Obtiene una lista de transacciones actuales para todos los pedidos pendientes. Si no hay pedidos pendientes, devuelve una matriz vacía.
Ejemplos de cancelación de transacciones en curso para todos los pedidos:
function CancelAll(){
var orders = exchange.GetOrders()
for(var i=0;i<orders.length;i++){
exchange.CancelOrder(orders[i].Id) // cancel order by orderID
}
}
function main(){
CancelAll()
while(true){
//do something
Sleep(10000)
}
}
Los pedidos cancelados según el id de la orden.exchange.CancelOrder(OrderId)
⇒ Si el pedido se ha completado, se deshacerá.
Las operaciones de futuros de moneda digital son diferentes de las operaciones de contado. Las funciones de las operaciones de contado anteriores se aplican igualmente a los futuros, y las operaciones de futuros individuales tienen funciones propias. Antes de realizar operaciones de futuros de moneda digital programadas, conviene familiarizarse con las operaciones manuales en el sitio web y comprender los conceptos básicos, como los conceptos de apertura, cierre, cierre, cierre, apalancamiento, cierre, pérdida, ganancia flotante, garantía, y las fórmulas de cálculo correspondientes.
Los contratos permanentes y futuros son similares, pero no tienen el concepto de tener múltiples espacios al mismo tiempo.
Si el intercambio apoya simultáneamente los futuros en efectivo, como los futuros OKEX y Huobi, es necesario seleccionar separadamente en la interfaz del intercambio el parche de futuros de OKEX y el parche de futuros de Huobi, que se consideran intercambios diferentes de los futuros en efectivo en FMZ.
El primer paso en la negociación de futuros es establecer el contrato a negociar, como el futuro de OKEX, y seleccionar el par de operaciones de BTC al crear un disco real o retrospectiva. También se debe establecer en el código el contrato de la semana, la próxima semana o el trimestre. Si no se establece, se le indicará.invalid contract type
。A diferencia de las transacciones en efectivo, los contratos de futuros suelen operar con monedas de cambio como BTC como garantía, y los contratos de compra de pares de BTC_USD con BTC como garantía generalmente representan un par de transacciones BTC_USD, si existe un futuro con USDT como garantía, se necesita crear un par de transacciones de BTC_USDT en vivo.Después de establecer el par de operaciones, también se debe configurar el tipo de contrato específico, como permanente, de la misma semana, de la siguiente semana, etc. Después de establecer el contrato, se pueden realizar operaciones de compra, venta y otros.
Los contratos existentes en Bitcoin, OKEX, HuobiDM y USDT deben distinguirse cuando se agregan contratos de configuración en vivo. Las configuraciones específicas son las siguientes:
//OKEX期货
exchange.SetContractType("swap") // 设置为永续合约
exchange.SetContractType("this_week") // 设置为当周合约
exchange.SetContractType("next_week") // 设置为次周合约
exchange.SetContractType("quarter") // 设置为季度合约
//HuobiDM
exchange.SetContractType("this_week") // 设置为当周合约
exchange.SetContractType("next_week") // 设置为次周合约
exchange.SetContractType("quarter") // 设置为季度合约
exchange.SetContractType("swap") // 设置为永续合约
//币安期货
exchange.SetContractType("swap") // 设置为永续合约,注意币本位和USDT本位都存在永续
exchange.SetContractType("quarter") // 设置为当季合约
exchange.SetContractType("next_quarter") // 设置为次季合约
//BitMEX
exchange.SetContractType("XBTUSD") // 设置为永续合约
exchange.SetContractType("XBTM19") // 具体某个时间结算的合约,详情登录BitMEX查询各个合约代码
//GateIO
exchange.SetContractType("swap") // 设置为永续合约,不设置默认为swap永续合约。
//Deribit
exchange.SetContractType("BTC-27APR18") // 具体某个时间结算的合约,详情参看Deribit官网。
Obtener una lista de información sobre el mantenimiento actual, OKEX (OKCOIN) futuros pueden ser transmitidos por un parámetro que especifica el tipo de contrato a obtener. Si no hay mantenimiento, devuelve la lista en blanco[]
La información de tenencia se devuelve de la siguiente manera, con mucha información específica, que requiere un análisis específico de la transacción.
Tipo de datos | Nombre de la variable | Explicación |
---|---|---|
objetos | Información | La estructura original de los intercambios regresa |
Número | El nivel de margen | El tamaño de la palanca, OKCoin es de 10 o 20, el modelo de la bolsa completa de los futuros OK regresa a 10 fijo porque la API nativa no es compatible |
Número | Importe | Volumen de tenencia, OKCoin indica el porcentaje de contratos (número entero y mayor a 1) |
Número | Congelar cantidad | El volumen de congelación del puesto |
Número | Precio | Precio de las acciones |
Número | Margen de interés | Se congelarán las garantías |
Número | Profitos | Los futuros de commodities: ganancias en el mercado de los titulares, monedas digitales: (unidad de moneda digital: BTC/LTC, unidad de futuros tradicionales: RMB, nota: los futuros de OKCoin se refieren a la realización de un superávit en el caso de un mercado completo, no a un ganancias y pérdidas en el mercado de los titulares, se refieren a ganancias y pérdidas en el mercado de los titulares) |
Const | Tipo de producto | PD_LONG para posiciones múltiples (paradas con closebuy_today en CTP), PD_SHORT para posiciones vacías (paradas con closesell_today en CTP), PD_LONG_YD para posiciones múltiples de ayer (paradas con closebuy en CTP) y PD_SHORT_YD para posiciones vacías de ayer (paradas con closesell en CTP) |
la cuerda | Tipo de contrato | Los futuros de commodities son códigos de contratos, las acciones son códigos de bolsas de valores _ códigos de bolsas, tipo de entrada de parámetros específicos SetContractType |
function main(){
exchange.SetContractType("this_week");
var position = exchange.GetPosition();
if(position.length>0){ //特别要注意引用前要先判断position长度再引用,否则会出错
Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType)
}
}
Para empezar, hay que configurar el tamaño del apalancamiento y la forma en que se llama:exchange.SetMarginLevel(10)
En el caso de las bolsas de divisas, el valor de 10 es el valor de 10 veces el apalancamiento, y el tamaño de apalancamiento que se apoya es el valor de 10 veces.Tenga en cuenta que el apalancamiento debe estar configurado en el intercambio, y el código debe estar en línea con el intercambio, de lo contrario se producirá un error.También puede dejarlo sin ajustar, usando el palanca predeterminado.
La dirección de la transacción y el modo de llamada:exchange.SetDirection(Direction)
, que corresponde a la liquidación de la posición abierta, ** a diferencia de los futuros, si el contrato perpetuo no tiene el concepto de múltiples espacios al mismo tiempo, es decir, no se permite la tenencia de un solo artículo, hacer más tiempo abierto se llena automáticamente de múltiples posiciones, todo lo que se necesita es establecerbuy
ysell
Por supuesto. Si se admite el almacenamiento bidireccional, se debe establecerclosebuy
,closebuy
Las relaciones concretas:
Operaciones | Los parámetros de SetDirection | Función de subordinación |
---|---|---|
Muchos puestos | cambio.Configurar dirección (( |
El intercambio.Comprar() |
Hay muchas tiendas. | cambio.Configurar Dirección (( |
El intercambio.Vender. |
El almacén vacío | intercambio.Configurar Dirección (( |
El intercambio.Vender. |
Almacenamiento en blanco | cambio.SetDirection (( |
El intercambio.Comprar() |
Por último, el código de liquidación de la operación específica, el volumen de la cual varía de un intercambio a otro, por ejemplo, los futuros huobi son por número de listados, un listado de 100 dólares.
function main(){
exchange.SetContractType("this_week") // 举例设置 为OKEX期货 当周合约
price = exchange.GetTicker().Last
exchange.SetMarginLevel(10) //设置杠杆为10倍
exchange.SetDirection("buy") //设置下单类型为做多
exchange.Buy(price+10, 20) // 合约数量为20下单
pos = exchange.GetPosition()
Log(pos)
Log(exchange.GetOrders()) //查看是否有未成交订单
exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")
exchange.Sell(price-10, 20)
}
A continuación se muestra un ejemplo concreto de estrategia para todos los posicionamientos
function main(){
while(true){
var pos = exchange.GetPosition()
var ticker = exchange.GetTicekr()
if(!ticker){
Log('无法获取ticker')
return
}
if(!pos || pos.length == 0 ){
Log('已无持仓')
return
}
for(var i=0;i<pos.length;i++){
if(pos[i].Type == PD_LONG){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closebuy')
exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
}
if(pos[i].Type == PD_SHORT){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closesell')
exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
}
}
var orders = exchange.Getorders()
Sleep(500)
for(var j=0;j<orders.length;j++){
if(orders[i].Status == ORDER_STATE_PENDING){
exchange.CancelOrder(orders[i].Id)
}
}
}
}
La transacción en el código se puede cambiar a una cuenta de apalancamiento, lo que es lo mismo que una transacción en el momento.
Usoexchange.IO("trade_margin") cambia al modo de cuenta de apalancamiento, el pedido, la adquisición de activos de la cuenta accederá a la interfaz de apalancamiento del intercambio. Usoexchange.IO("trade_normal") para volver al modo normal de las cuentas.
Las bolsas que soportan:
Hay una gran diferencia entre el comercio de futuros de commodities y el comercio de futuros de moneda digital. Primero, los futuros de commodities tienen un tiempo de negociación corto, el comercio de moneda digital 24h; el protocolo de futuros de commodities tampoco es una API REST comúnmente utilizada; la frecuencia de negociación de futuros de commodities y el número de pedidos suspendidos son limitados, mientras que las monedas digitales son muy laxas, etc. Por lo tanto, el comercio de futuros de commodities tiene muchas áreas que requieren especial atención, por lo que se recomienda tener una amplia experiencia de operación manual.https://www.fmz.com/bbs-topic/325En la página de Facebook de la compañía, se puede leer lo siguiente:https://www.fmz.com/bbs-topic/371
Los futuros de productos y en junio de 2019 se implementó la regulación de los futuros personalizados, los futuros de la aplicación de código de autorización de los usuarios individuales (los modelos de información específicos que se requieren para la solicitud se pueden enviar en el grupo de WeChat o en el grupo QQ), generalmente requieren de 4-5 días, los pasos son más complicados. La plataforma FMZ Quantitative es un proveedor de operaciones programadas que solicita un código de autorización de software a cada proveedor de futuros, y los usuarios pueden usarlo directamente sin necesidad de solicitarlo.https://www.fmz.com/bbs-topic/3860; Si su corredor de futuros ya no está en la lista, solo puede solicitarlo o volver a abrir una cuenta en un corredor respaldado, que generalmente toma 2 días. ; FMZ tiene una relación de colaboración profunda con algunos proveedores, como el Corredor de Futuras de Taichung, que ha comprado la versión institucional de la plataforma FMZ, que puede ser utilizada por los usuarios, los iniciadores se convierten automáticamente en VIP y las tarifas de tramitación son mínimas.https://www.fmz.com/bbs-topic/506 。
Debido a las ventajas de la arquitectura de la plataforma FMZ, los usuarios también pueden agregar varias cuentas de futuristas y realizar algunas funciones que otros programas de software de comercio de futuros de productos no pueden realizar, como la síntesis de ticks de alta frecuencia.https://www.fmz.com/bbs-topic/1184
En primer lugar, debido a que no es una transacción de 24 horas y requiere operaciones de aterrizaje, antes de realizar la transacción, se debe determinar el estado del enlace.exchange.IO("status")
¿Por qué?true
Se dice que se conecta a la bolsa. Si no se inicia el inicio de sesión con éxito, se llama la API y no se le indica el botón de inicio de sesión. Se puede dormir después de que se inicie la política._C(exchange.SetContractType,"MA888")
En la actualidad, la mayoría de los usuarios de Twitter están usando el nombre de Facebook para describir sus actividades.
La adquisición y el código de transacción de los futuros de productos son los mismos que los futuros de monedas digitales, y aquí se presentan las diferencias y los puntos a tener en cuenta.
function main(){
_C(exchange.SetContractType,"MA888") //没登陆成功是无法订阅合约的,最好重试一下
while(true){
if(exchange.IO("status")){
var ticker = exchange.GetTicker()
Log("MA888 ticker:", ticker)
LogStatus(_D(), "已经连接CTP !")//_D获取事件
} else {
LogStatus(_D(), "未连接CTP !")
Sleep(1000)
}
}
}
Se recomienda utilizar el catálogo de comercio de futuros de productos (más adelante), en este caso, el código será muy simple y no se necesitarán detalles pesados.https://www.fmz.com/strategy/57029
function main() {
// 使用了商品期货类库的CTA策略框架
$.CTA(Symbols, function(st) {
var r = st.records
var mp = st.position.amount
var symbol = st.symbol
/*
r为K线, mp为当前品种持仓数量, 正数指多仓, 负数指空仓, 0则不持仓, symbol指品种名称
返回值如为n:
n = 0 : 指全部平仓(不管当前持多持空)
n > 0 : 如果当前持多仓,则加n个多仓, 如果当前为空仓则平n个空仓,如果n大于当前持仓, 则反手开多仓
n < 0 : 如果当前持空仓,则加n个空仓, 如果当前为多仓则平n个多仓,如果-n大于当前持仓, 则反手开空仓
无返回值表示什么也不做
*/
if (r.length < SlowPeriod) {
return
}
var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
if (mp <= 0 && cross > ConfirmPeriod) {
Log(symbol, "金叉周期", cross, "当前持仓", mp);
return Lots * (mp < 0 ? 2 : 1)
} else if (mp >= 0 && cross < -ConfirmPeriod) {
Log(symbol, "死叉周期", cross, "当前持仓", mp);
return -Lots * (mp > 0 ? 2 : 1)
}
});
}
Los futuros de productos utilizan el protocolo CTP, donde todos los mercados y transacciones de pedidos se notifican solo cuando hay cambios, mientras que los pedidos de consulta, cuentas y tenencias son consultas activas. Por lo tanto, es adecuado para escribir políticas de alta frecuencia impulsadas por eventos.GetTicker
、GetDepth
、GetRecords
La estrategia no puede utilizar Sleep. Cuando hay cambios en el mercado, los tickers, profundidades y registros se actualizan, y en este momento se devuelve inmediatamente cualquier interfaz a la que se llame, el estado de la interfaz que se ha llamado se coloca en modo de espera de actualización, la próxima vez que se llame la misma interfaz, se espera hasta que se devuelvan nuevos datos.
Si quieres acceder a los datos de cada transacción, incluso los datos antiguos, puedes cambiar a un modo de actualización instantánea de mercados.exchange.IO("mode", 0)
Las políticas no pueden ser escritas como event driven y se requiere agregar un evento Sleep para evitar un ciclo muerto rápido. Algunas políticas de baja frecuencia pueden usar este patrón, el diseño de las políticas es simple.exchange.IO("mode", 1)
Se puede cambiar el modo de caché por defecto.
Cuando se opera un solo contrato, se puede usar el modo predeterminado. Pero si son varios contratos, es posible que un contrato no tenga una actualización de mercado, lo que causa un bloqueo en la interfaz de acceso a la bolsa, y que no se puedan obtener actualizaciones de mercado de otros contratos. Para resolver este problema, se puede usar el modo de actualización inmediata, pero no es conveniente escribir una política de alta frecuencia.exchange.IO("wait")
También puede utilizarse para los futuros de commodities si se agregan varios objetos de intercambio, lo cual es raro en los futuros de commodities.exchange.IO("wait_any")
En este caso, el índice devuelto indica el índice de intercambio devuelto.
El cambio de tick fue empujado:{Event:"tick", Index:交易所索引(按实盘上交易所添加顺序), Nano:事件纳秒级时间, Symbol:合约名称}
Los pedidos se envían a:{Event:"order", Index:交易所索引, Nano:事件纳秒级时间, Order:订单信息(与GetOrder获取一致)}
La estructura de la estrategia en este momento se puede escribir como:
function on_tick(symbol){
Log("symbol update")
exchange.SetContractType(symbol)
Log(exchange.GetTicker())
}
function on_order(order){
Log("order update", order)
}
function main(){
while(true){
if(exchange.IO("status")){ //判断链接状态
exchange.IO("mode", 0)
_C(exchange.SetContractType, "MA888")//订阅MA,只有第一次是真正的发出订阅请求,接下来都是程序切换,不耗时间。
_C(exchange.SetContractType, "rb888")//订阅rb
while(true){
var e = exchange.IO("wait")
if(e){
if(e.event == "tick"){
on_tick(e.Symbol)
}else if(e.event == "order"){
on_order(e.Order)
}
}
}
}else{
Sleep(10*1000)
}
}
}
También hay que tener en cuenta la diferencia entre los futuros de productos y los intercambios de moneda digital. Como GetDepth, en realidad solo hay un archivo de profundidad (las tarifas de profundidad de 5 archivos son caras), GetTrades no obtiene la historia de transacciones (todos son simulados en función de la variación de las posiciones y no hay registros de transacciones reales). Los futuros de productos tienen un límite de caída y caída, cuando se detienen, el precio de venta profunda es el precio de caída y caída, el volumen de pedido es 0, el precio de compra es el precio de caída y el volumen de pedido es 0. Además, hay una frecuencia de consulta de futuros de productos, así como una restricción estricta de acceso a cuentas, pedidos y posiciones, generalmente de 2 s.
exchange.IO("instruments"): devuelve la lista de todos los contratos de la bolsa en formato de diccionario {nombre del contrato: detalles}, sólo soporta discos reales.exchange.IO("products"): devuelve la lista de todos los productos de la bolsa en el formato de diccionario {nombre del producto: detalles}, solo soporta discos físicos.exchange.IO("subscribed"): devuelve el contrato que ya se ha suscrito al mercado, el formato es el mismo, sólo se admite el disco real.
Los futuros tradicionales de CTPContractType
El ID de contrato es el nombre que se le da al contrato, y se distingue en mayúsculas y minúsculas.exchange.SetContractType("au1506")
Los detalles del contrato se devuelven después de la configuración del contrato, como la cantidad mínima de compra, las tarifas de mantenimiento, el tiempo de entrega, etc. Cuando se suscribe a varios contratos, solo se envía una solicitud de suscripción real la primera vez, y luego solo se cambia el par de transacciones a nivel de código, sin perder tiempo. Los contratos principales de serie son el código 888 como MA888, los contratos de índices continuos como 000 como MA000, 888 y 000 solo admiten retrospección para los contratos virtuales, y el disco físico solo admite obtener transacciones.Sin embargo, el lenguaje Mac puede operar con contratos principales, y los programas cambian de posición automáticamente, es decir, eliminan posiciones no principales y abren nuevas posiciones en las posiciones principales.
No logue el éxito de la conexión, no puede configurar el contrato, pero también regresa inmediatamente, por lo que puede volver a intentarlo con _C, sabiendo que el inicio de sesión de CTP se ha completado. Una vez que el inicio de sesión es exitoso, volver a configurar el contrato no es demasiado lento y no produce un acceso real a la red.
SetDirection
La dirección puede serbuy, closebuy, sell, closesell
Cuatro parámetros, más futuros de productos.closebuy_today
¿Qué es esto?closesell_today
En la actualidad, la mayoría de los ciudadanos de la región están en la misma situación.closebuy/closesell
Para los futuros CTP tradicionales, se puede establecer el segundo parámetro de 1 o 2 o 3 puntos, respectivamente, el parámetro de especulación, el parámetro de beneficio, el parámetro de seguridad, sin establecer la especulación por defecto.Las operaciones concretas de compra, venta, obtención de posiciones, obtención de órdenes, retiro y obtención de cuentas son las mismas que las operaciones de futuros de moneda digital, por lo que se puede consultar el capítulo anterior.
Operaciones | Los parámetros de SetDirection | Función de subordinación |
---|---|---|
Muchos puestos | cambio.Configurar dirección (( |
El intercambio.Comprar() |
Hay muchas tiendas. | cambio.Configurar Dirección (( |
El intercambio.Vender. |
El almacén vacío | intercambio.Configurar Dirección (( |
El intercambio.Vender. |
Almacenamiento en blanco | cambio.SetDirection (( |
El intercambio.Comprar() |
El siguiente ejemplo es una función de liquidación concreta, no se olvide de que el ejemplo es demasiado simple, y se consideran una serie de preguntas como si se encuentra en el momento de la transacción, cómo volver a poner una orden sin completar la transacción, cuál es el volumen máximo de pedido, si la frecuencia es demasiado alta, específicamente si el precio está deslizando o en el mercado, etc. Sólo para referencia.En el caso de las plataformas de negociación abierta, se recomienda utilizar una base de datos bien envuelta.https://www.fmz.com/strategy/12961También se recomienda aprender el código fuente de la biblioteca de clases.
function Cover(contractType, amount, slide) {
for (var i = 0; i < positions.length; i++) {
if (positions[i].ContractType != contractType) {
continue;
}
var depth = _C(e.GetDepth);
if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) {
exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy");
exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "平今" : "平昨", 'Bid', depth.Bids[0]);
} else {
exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell");
exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "平今" : "平昨", 'Ask', depth.Asks[0]);
}
}
}
Los futuros de productos soportan tipos de órdenes personalizados (suportados en disco real, no soportados en retraso) que se especifican en forma de columna y se añaden después de columna_columna, por ejemplo.
exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")
Las consecuencias concretas son:
Por defecto, en los comerciantes de futuros de mercancías, se abre la interfaz CTP, que se puede cambiar a la interfaz Easy Transaction si se requiere. A través del envase de FMZ, la forma de llamar es la misma. La diferencia es que la cuenta, la orden y el almacenamiento son todos modos de envío, por lo que el administrador mantiene estos datos localmente, y cuando se llama a la interfaz correspondiente, se devuelve inmediatamente y no se emite ninguna solicitud.
Los tipos de pedidos personalizados de los protocolos de Etsy son los siguientes:
En la interfaz de disco real, el mensaje se inserta en la cola de empuje después de que se haya agregado el signo @ a la cadena.Log('推送到微信@')
También se puede personalizar el color de los registrosLog('这是一个红色字体的日志 #ff0000')
。#ff0000
Se representa por el color RGB en el sistema 16
Todos los archivos de registro se encuentran en la base de datos sqlit en el disco físico en el directorio donde se encuentra el administrador, que se puede descargar y abrir con el software de la base de datos, o se puede usar para copiar y recuperar copias de seguridad (el nombre de la base de datos es el mismo que el id del disco físico).
Registra las ganancias, y traza una curva de ganancias en la interfaz del disco real, que se puede conservar cuando el disco real se reinicie.LogProfit(1000)
¿Qué es esto?LogProfit
Los parámetros no son necesariamente ganancias, pueden ser cualquier número que necesite ser rellenado por sí mismo.
Estado de disco real, ya que los registros de registro se guardan primero y se actualizan continuamente, se puede usar si se necesita una información que solo se muestra sin guardar.LogStatus
La función.LogStatus
Los parámetros de la tabla son una cadena y también pueden ser utilizados para representar información de la tabla.
Un ejemplo de una tabla que muestra la ubicación del estado del disco en concreto:
var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table) + '`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格)
LogStatus('第一行消息\n`' + JSON.stringify(table) + '`\n第三行消息'); // 表格信息也可以在多行中出现
LogStatus('`' + JSON.stringify([table, table]) + '`'); // 支持多个表格同时显示, 将以TAB显示到一组里
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // 上下排列显示多个表
Los parámetros son milisegundos, comoSleep(1000)
Para un segundo de reposo. Debido a la limitación de la frecuencia de acceso de todas las transacciones, la estrategia general es incluir el tiempo de reposo en el ciclo muerto.
Cuando se reinicia el disco duro, el programa se reinicia, y si se quiere guardar alguna información permanente, se puede usar el sistema de almacenamiento de datos de la unidad de almacenamiento._G
El JSON es muy fácil de usar y puede almacenar contenido secuenciado en JSON._G
La función está escrita enonexit()
En este caso, la política de bloqueo de la página web de Google se puede utilizar para bloquear la página web de Google.
Si desea guardar más datos formateados, la función _G no es muy útil y puede escribirse directamente a la base de datos con Python.
function onexit(){
_G('profit', profit)
}
function main(){
_G("num", 1); // 设置一个全局变量num, 值为1 s
_G("num", "ok"); // 更改一个全局变量num, 值为字符串ok
_G("num", null); // 删除全局变量 num
_G("num"); // 返回全局变量num的值,如果不存在返回null
var profit = 0
if(_G('profit')){
profit = _G('profit')
}
}
Cuando se realiza un pedido, a menudo para controlar el precio y la precisión de la cantidad, FMZ tiene incorporada la función_N, que determina los dígitos decimales que se guardan, como:_N(4.253,2)
El resultado es 4.25.
La API para llamar a un intercambio es que no se puede garantizar el éxito de cada acceso, _C es una función que se repite automáticamente. Siempre se llamará a la función especificada hasta que regrese con éxito (la función devuelve null o false se repite, por ejemplo)._C(exchange.GetTicker)
Por defecto, el intervalo de repetición es de 3 segundos. Se puede llamar a la función _CDelay para controlar el intervalo de repetición, por ejemplo, _CDelay ((1000), lo que indica que se recomienda cambiar el intervalo de repetición de la función _C a 1 segundo.GetTicker()
,exchange.GetDepth
,GetTrade
,GetRecords
,GetAccount
,GetOrders
, GetOrder
Todos los programas están programados con _C error tolerante, para evitar que los fallos de acceso causen la interrupción del programa.
CancelOrder
No se puede usar la función _C, ya que hay varias razones por las que el desistimiento falla. Si un paquete ya ha sido transactado, el desistimiento regresará un fracaso, y el uso de la función _C provocará un intento repetido.
La función _C también puede transmitir parámetros y también se usa para funciones personalizadas.
function main(){
var ticker = _C(exchange.GetTicker)
var depth = _C(exchange.GetDepth)
var records = _C(exchange.GetRecords, PERIOD_D1) //传入参数
}
Llamadas directas_D()
Devuelve una cadena de tiempo actual, como:2019-08-15 03:46:14
│ Si es una llamada de retraso, devuelve el tiempo de retraso. Se puede determinar el tiempo con la función _D, como:_D().slice(11) > '09:00:00':
_D(timestamp,fmt)
, que convierte el cronograma de ms en una cadena de tiempo, como_D(1565855310002)
El parámetro fmt es el formato de tiempo, por defecto.yyyy-MM-dd hh:mm:ss
Para algunas funciones de indicadores comunes, como los indicadores comunes como MA\MACD\KDJ\BOLL, la plataforma FMZ está directamente integrada, y los indicadores específicos que se apoyan se pueden consultar en la documentación de la API.
Antes de usar la función indicadora, es mejor determinar la longitud de la línea K. Cuando la longitud de la línea K anterior no puede satisfacer los ciclos requeridos para el cálculo, el resultado es:null
Si la longitud de la línea K de la entrada es 100 y el ciclo de cálculo de MA es 10, los primeros 9 valores son nulos y los siguientes se calculan normalmente.
JavaScript también es compatible con talib completo, como una biblioteca de terceros, que puede ser llamada como:talib.CCI(records)
◄ Referenciashttp://ta-lib.org/function.htmlPor otro lado, en Python, la biblioteca talib se puede instalar por sí misma, ya que se necesita compilar, no se puede instalar simplemente con pip, sino que se puede buscar por sí mismo.
Las funciones indicadoras pueden transmitirse a cualquier matriz además de los datos de la línea K.
function main(){
var records = exchange.GetRecords(PERIOD_M30)
if (records && records.length > 9) {
var ma = TA.MA(records, 14)
Log(ma)
}
}
Aquí hay algunas de las funciones de JavaScript más usadas en el mundo real.
Date.now()
Volver a la horaria actualparseFloat()
Convierte las cadenas en números, comoparseFloat("123.21")
parseInt()
Convierte la cadena en un número entero.num.toString()
Convierte números en cadenas y num en variables numéricasJSON.parse()
Formatear una cadena json, comoJSON.parse(exchange.GetRawJSON())
Math.max()
,Math.abs()
Las operaciones matemáticas más comunes, por ejemplo:https://www.w3school.com.cn/jsref/jsref_obj_math.aspHay muchas situaciones en las que hay que tener en cuenta las funciones de una estrategia de escritorio real, como una función tan simple como comprar 5 monedas, debemos tener en cuenta: ¿es suficiente el saldo actual? ¿cuál es el precio de la orden? ¿cuál es la precisión? ¿no es necesario dividir los pedidos para evitar el impacto del mercado? ¿cómo se manejan los pedidos no completados? etc. Los detalles.
Las librerías de comercio de divisas digitales y de futuros de productos de JavaScript están integradas por defecto y no necesitan ser copiadas. Otras librerías de modelos se pueden encontrar en Strategy Square.https://www.fmz.com/square/20/1Copiar y guardar la librería de clases de plantillas y seleccionar la librería que desea usar al crear su propia política.
Las funciones de plantillas de JavaScript también se usan$
En primer lugar, Python tiene unext
En el inicio.
El código fuente se encuentra en:https://www.fmz.com/strategy/10989, ya está incorporado, sin necesidad de copiar. Las implementaciones de funciones específicas pueden referirse directamente al código fuente.
Acceso a las cuentas:
$.GetAccount(e)
Log($.GetAccount()); // 获取账户信息, 带容错功能
Log($.GetAcccount(exchanges[1]));
El siguiente pedido de retirada:
$.Buy/Sell(e, amount)
$.Buy(0.3); // 主交易所买入0.3个币
$.Sell(0.2); // 主交易所卖出0.2个币
$.Sell(exchanges[1], 0.1); // 次交易所卖出0.1个币
$.CancelPendingOrders(e, orderType)
$.CancelPendingOrders(); // 取消主交易所所有委托单
$.CancelPendingOrders(ORDER_TYPE_BUY); // 取消主交易所所有的买单
$.CancelPendingOrders(exchanges[1]); // 取消第二个交易所所有订单
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // 取消第二个交易所所有的卖单
El juicio cruzado:
$.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])
如果 n 等于 0, 指刚好15周期的EMA与30周期的EMA当前价格相等
如果 n 大于 0, 比如 5, 指15周期的EMA上穿了30周期的EMA 5个周期(Bar)
如果 n 小于 0, 比如 -12, 指15周期的EMA下穿了30周期的EMA 12个周期(Bar)
如果传给Cross不是数组, 则函数自动获取K线进行均线计算
如果传给Cross的是数组, 则直接进行比较
La función $.withdraw (e, currency, address, amount, fee, password) es la siguiente:
$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")
El uso de la biblioteca de comercio de futuros de productos es estable y recomendado.https://www.fmz.com/strategy/12961También puede ser usado para hacer copias de imágenes.
El 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("金叉周期", cross, "当前持仓", mp);
return 1
} else if (mp >= 0 && cross < -2) {
Log("死叉周期", cross, "当前持仓", mp);
return -1
}
});
}
Exemplos de llamadas a bibliotecas
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"));
// 多品种时使用交易队列来完成非阻塞的交易任务
var q = $.NewTaskQueue();
q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
Log(task.desc, ret)
})
while (true) {
// 在空闲时调用poll来完成未完成的任务
q.poll()
Sleep(1000)
}
}
Debido a que las funciones de gráficos originales son más complejas, se presentarán en el siguiente tutorial, se recomienda a los principiantes utilizar directamente la librería de gráficos, gráficos gráficos muy simples, gráficos de K, etc. FMZ tiene una librería de clases sencilla, que se puede ver en la página de edición de políticas, si no está incorporada, el usuario debe copiar y guardar por sí mismo para seleccionar las referencias en la política.
La librería de gráficos de Javascript se puede copiar en:https://www.fmz.com/strategy/27293En Python, la librería de líneas gráficas se puede copiar en:https://www.fmz.com/strategy/39066
Algunos ejemplos concretos:
function main() {
while (true) {
var ticker = exchange.GetTicker()
if (ticker) {
$.PlotLine('Last', ticker.Last) //可以同时画两条线,Last是这条线的名字
$.PlotLine('Buy', ticker.Buy)
}
Sleep(6000)
}
}
Bajo la edición de la política hay la configuración de parámetros de la política, que es equivalente a las variables globales de la política, que se pueden acceder en cualquier lugar del código. Los parámetros de la política se pueden modificar en la interfaz del disco real y se hacen efectivos al reiniciar. Por lo tanto, se pueden establecer algunas variables como parámetros, y se pueden cambiar los parámetros sin modificar la política.
El tipo de cadena y el tipo numérico son fáciles de entender y son los tipos más comunes. El cuadro de despliegue muestra opciones en la interfaz de parámetros, por ejemplo, puede establecer el valor del parámetro SYMBOL del cuadro de despliegue comoBTC|USDT|ETH
Si se selecciona USDT en el guión descendente de la página de parámetros, el valor de SYMBOL en la política es el índice 1 de USDT.
Hay muchos parámetros para configurar.https://www.fmz.com/bbs-topic/1306
Una vez completado el trabajo de cuantificación de una estrategia, puede probar su estrategia con datos históricos para ver cómo su estrategia se beneficia en los datos históricos. Los resultados de la revisión, por supuesto, son solo para referencia. La plataforma de cuantificación de FMZ admite la revisión de las divisas en efectivo, futuros, productos de contratos perpetuos BitMEX y futuros, de los cuales las divisas digitales son las principales variedades de las que se benefician. La revisión de Javascript se realiza en el navegador, la revisión de Python se requiere en el servidor, que puede utilizar la plataforma para proporcionar un servidor público. La revisión de Mac necesita más parámetros para configurar, por ejemplo, la documentación de Mac.
El mecanismo de retrospección onbar está basado en la línea K, es decir, cada línea K genera un punto de retrospección en el que se obtiene información sobre los precios altos y bajos de la línea K actual, el volumen de operaciones, etc., y antes de este punto.
el gaoencheerApio
Ciencia¿Cómo implementar la política en local? He escrito una sencilla declaración de salida de Log y he seguido la operación al final de la frase. El primer paso es usar una computadora portátil como servidor y ejecutar el programa administrador. El segundo paso es escribir un programa test.py para la salida de la información de Log (la función de la interfaz API de FMZ). El tercer paso, al igual que al final del texto, es escribir un runfile que se ejecute mediante la llamada run.py a test.py.
el giso9¿Qué pasa con el curso de comercio cuantificado en la nube que compré?
¿ Qué es eso?Muchos
¿ Qué es eso?- ¿ Qué pasa?
¿Qué es eso?Aprendiendo
¿Qué es?Hay un pequeño error de texto, GetAccount tiene acceso a la cuenta. En la introducción, FrozenStocks debería ser un saldo congelado y no disponible.
¿Qué es eso?getorder outtime ¿Qué sucede cuando obtienes un pedido fuera de tiempo?
Los árboles de madera hacen trucos.La tasa de garantía de los activos no se puede obtener, hasta el 0% será obligado a liquidar la tasa de garantía de los activos
el año 2020Yo estoy viendo el operador de la k-string de 1 minuto, por lo que el tiempo de sueño del ciclo muerto de Python se puede configurar en 0.1s, es decir, sleep ((100) ¿Veo que has escrito un sleep ((10)), es decir, 0.1s no excederá el límite de API de huobi HM?
El templo del viento orientalexchange.SetDirection (("closebuy"); // si es un contrato permanente, establece directamente el exchange.SetDirection (("sell") Aquí probé el contrato perpetuo OKex, y si lo ponemos en sell, se abre directamente, no es tan barato.
El templo del viento orientalexchange.SetDirection (("closebuy"); // si es un contrato permanente, establece directamente el exchange.SetDirection (("sell") Aquí probé el contrato perpetuo OKex, y si lo ponemos en sell, se abre directamente, no es tan barato.
El templo del viento orientalHay dos errores de ortografía en el código de GetOrders. Uno es que la función se escribe como una función y el otro como una condición del ciclo for.
El templo del viento orientalEs mi culpa. exchange.Buy ((-1, 0.5), el par de transacciones es ETH_BTC, y el listado de mercado representa la compra de ETH de 0.5BTC exchange.Buy ((price, 0.5), si este es el tipo de lista de precios, representa comprar 0.5ETH con el precio de precio.
El templo del viento orientalexchange.Buy ((-1, 0.5), el par de transacciones es ETH_BTC, que representa la compra de ETH de 0.5BTC al precio del mercado Esto es lo que se supone que es el precio de compra de 0.5 ETH de aluminio.
el giso9Gracias.
Las hierbasEl curso está disponible en línea desde hace mucho tiempo.
Las hierbasAñade WeChat a la página de inicio para que te atraiga.
¿Qué es?¿Tenemos algún grupo oficial de intercambio? A veces tenemos problemas y no sabemos dónde preguntar.
Las hierbasCambiado
Las hierbasObtener otra vez
Las hierbasLa información original se puede ver en GetRawJSON o en el campo de información
El templo del viento orientalMuy bien, muy bien, también hay respuesta administrativa.
Las hierbasOh, corregido, gracias por señalar el error.
Las hierbasAlgunos contratos perpetuos permiten el mantenimiento bidireccional, por lo que se requiere establecer el equilibrio.