[TOC]

La plataforma de comercio cuantitativo Inventor ha pasado por 9 años de iteración tecnológica y ha sido reconstruida muchas veces, aunque como usuarios puede que no lo hayamos notado. En los últimos dos años, la plataforma ha realizado muchas optimizaciones y actualizaciones en términos de experiencia del usuario, incluida una actualización integral de la interfaz de usuario, enriqueciendo las herramientas de comercio cuantitativo comúnmente utilizadas y agregando más soporte de datos de backtesting.
Para que el diseño de la estrategia sea más conveniente, la lógica comercial más clara y más fácil para los principiantes comenzar, la plataforma actualizó la interfaz API utilizada por la estrategia. Utilice la última versión de su host para habilitar estas nuevas funciones. La plataforma sigue siendo compatible con llamadas a interfaces antiguas en la mayor medida posible. La información sobre las nuevas funciones de la interfaz API se ha actualizado en la documentación de la API de la plataforma de comercio cuantitativo de Inventor:
Ahora echemos un vistazo rápido a qué interfaces se han actualizado y qué cambios son necesarios para que las estrategias antiguas sean compatibles con la API actual.
Para diseñar estrategias multivariantes y estrategias de seguimiento completo de la situación del mercado. Esta interfaz de mercado agregada es esencial para facilitar el desarrollo de estrategias y evitar reinventar la rueda. La plataforma de comercio cuantitativo del inventor encapsula dichas API de intercambios.
Si el exchange no tiene esta interfaz (changes individuales), llameexchange.GetTickers()Se informará un mensaje de error: No compatible.
Esta función no tiene ningún parámetro y devolverá los datos del mercado en tiempo real de todas las variedades en la interfaz de mercado agregada del exchange. Se puede entender simplemente como:
exchange.GetTickers()La función esexchange.GetTicker()La versión completa de la función (la diferencia entre los dos nombres de función es el singular y el plural).
Utilizamos el entorno de simulación de puntos OKX para realizar pruebas:
function main() {
exchange.IO("simulate", true)
var tickers = exchange.GetTickers()
if (!tickers) {
throw "tickers error"
}
var tbl = {type: "table", title: "test tickers", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
for (var i in tickers) {
var ticker = tickers[i]
tbl.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return tickers.length
}

Nuevoexchange.CreateOrder()Las funciones son el foco de esta actualización.exchange.CreateOrder()La función más importante de la función es especificar directamente el tipo y la dirección de la orden en los parámetros de la función. De esta manera, ya no depende de las configuraciones actuales del sistema, como pares comerciales, códigos de contrato, direcciones comerciales, etc.
La complejidad del diseño se reduce en gran medida en escenarios de órdenes comerciales de múltiples productos y escenarios concurrentes.exchange.CreateOrder()Los cuatro parámetros de la función sonsymbol、side、price、amount。
Prueba utilizando el entorno de simulación de futuros OKX:
function main() {
exchange.IO("simulate", true)
var id1 = exchange.CreateOrder("ETH_USDT.swap", "buy", 3300, 1)
var id2 = exchange.CreateOrder("BTC_USDC.swap", "closebuy", 70000, 1)
var id3 = exchange.CreateOrder("LTC_USDT.swap", "sell", 110, 1)
Log("id1:", id1, ", id2:", id2, ", id3:", id3)
}

Esto solo me tomó 3 vecesexchange.CreateOrder()La llamada de función coloca tres órdenes de futuros de diferentes variedades y direcciones.
Nuevoexchange.GetHistoryOrders()La función se utiliza para obtener los pedidos de transacciones históricas de un determinado producto. Esta función también requiere el soporte de la interfaz de intercambio.
Para consultar pedidos históricos, las interfaces implementadas por los distintos exchanges varían enormemente:
Estas interfaces están encapsuladas con el mayor grado de compatibilidad y, en el uso real, se debe prestar atención a si cumplen los requisitos y expectativas de la estrategia.
La descripción detallada de la función no se repite aquí, puede consultar el manual de sintaxis en la documentación de la API:
https://www.fmz.com/syntax-guide#fun_exchange.gethistoryorders
Probado utilizando el entorno de trading spot de Binance:
function main() {
var orders = exchange.GetHistoryOrders("ETH_USDT")
// 写入图表
var tbl = {type: "table", title: "test GetHistoryOrders", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
LogStatus("orders.length:", orders.length, "\n", "`" + JSON.stringify(tbl) + "`")
}

La versión anterior de la función de adquisición de datos de posición es:exchange.GetPosition(). Para que coincida mejor con la semántica de nombres de funciones, esta actualización agrega una nueva función para obtener posiciones:exchange.GetPositions(). Al mismo tiempo, todavía es compatible/actualizado con la función GetPosition.
Tenga en cuenta que los dos nombres de función difieren únicamente en la s final. Debido a que GetPositions es semánticamente más correcto, se recomienda que utilice GetPositions en el futuro.
exchange.GetPositions()Hay tres formas de llamadas de función:
exchange.GetPositions() Cuando no se pasan parámetros, la corrientePares comerciales / Código de contratoSolicitar los datos de posición de todas las variedades en la dimensión actual.
exchange.GetPositions(“ETH_USDT.swap”)
Al especificar información específica del producto (el formato ETH_USDT.swap está definido por la plataforma FMZ), solicite los datos de posición del producto específico.
Ejemplo:BTC_USD.swap、ETH_USDT.swap、ETH_USDT.quarteresperar.
BTC_USD.swap: contrato perpetuo basado en la moneda BTC.
ETH_USDT.swap: contrato perpetuo basado en U de ETH.
ETH_USDC.swap: contrato perpetuo con margen USDC para ETH. (Además de USDT, también puede especificar diferentes monedas de cotización, que no se repetirán aquí)
ETH_USDT.quarter: contrato de entrega trimestral basado en U de ETH.
BTC_USD.BTC-USD-201226-24250-C: contrato de opción con margen de moneda BTC.
exchange.GetPositions(“USDT.swap”) Solicitar datos de posición para todos los símbolos según el rango de dimensión especificado. USDT.swap: rango de contrato perpetuo basado en U. USDT.futures: Gama de contratos de entrega basados en U. USDC.swap: rango de contrato perpetuo con margen del USDC. (Además de USDT, también puede especificar diferentes monedas de cotización, que no se repetirán aquí) USDC.futures: gama de contratos de futuros con margen de USDC. USD.swap: rango de contrato perpetuo basado en moneda. USD.futures: Gama de contratos de futuros basados en divisas. USDT.option: rango de contrato de opción basado en U. USD.option: Rango de contratos de opciones basados en divisas.
Algunas divisiones especiales de la dimensión del contrato de intercambio: USDT.futures_combo: combinación de CFD del mercado de futuros Deribit. USD.futures_ff: contrato de entrega de margen mixto del exchange Futures_Craken. USD.swap_pf: Futuros_Un contrato perpetuo con margen híbrido en el intercambio Kraken.
Para las dimensiones que no son compatibles con la interfaz API de intercambio, se informará un error y se devolverá un valor nulo al realizar la llamada.
Prueba utilizando el entorno de simulación de futuros OKX:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
var p1 = exchange.GetPositions()
var p2 = exchange.GetPositions("BTC_USDT.swap")
var tbls = []
for (var positions of [p1, p2]) {
var tbl = {type: "table", title: "test GetPosition/GetPositions", cols: ["Symbol", "Amount", "Price", "FrozenAmount", "Type", "Profit", "Margin", "ContractType", "MarginLevel"], rows: []}
for (var p of positions) {
tbl.rows.push([p.Symbol, p.Amount, p.Price, p.FrozenAmount, p.Type, p.Profit, p.Margin, p.ContractType, p.MarginLevel])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}

Al entrarexchange.GetPositions()Los parámetros de la función sonETH_USDT.swapCuando utiliza el contrato perpetuo basado en ETH U, puede obtener los datos de posición del contrato perpetuo basado en ETH U.
Cuando no se importaexchange.GetPositions()Cuando la función se utiliza como parámetro, se pueden obtener los datos de posición de todos los contratos perpetuos de margen U que figuran en el intercambio (debido a que el par comercial actual es BTC_USDT y el contrato es swap, la solicitud se basa en el par comercial actual y rango de dimensión del contrato). Esto equivale a llamarexchange.GetPositions("USDT.swap"), especifique un alcance de solicitud.
La función GetFundings recientemente agregada puede obtener la tasa de financiación de contratos perpetuos en bolsas de futuros. La función toma un símbolo de parámetro. La función devuelve una matriz de estructuras de financiación.
BTC_USDT.swap. Si no se pasan parámetros o se pasa un rango a la función, se mostrará un mensaje de error indicando que el parámetro de símbolo no es compatible.Función del mercadoexchange.GetTicker()Esta actualización agrega principalmente parámetros de símbolo. Esta función se puede utilizar para solicitar datos del mercado directamente de acuerdo con la información del producto especificada por los parámetros, independientemente del par comercial actual y el código del contrato. Simplifica el proceso de escritura de código. Al mismo tiempo, todavía es compatible con el método de llamada sin pasar parámetros y es compatible con las antiguas estrategias de la plataforma en la mayor medida.
parámetrosymbolPara objetos de intercambioexchangeExisten diferentes formatos para spot/futuros:
AAA_BBBAAA representa la moneda base, es decir, la moneda de transacción, y BBB representa la moneda de cotización, es decir, la moneda de fijación de precios. Los nombres de las monedas están todos en letras mayúsculas.
Por ejemplo: par de operaciones spot BTC_USDT.AAA_BBB.XXXAAA representa la moneda base, es decir, la moneda de transacción, BBB representa la moneda de cotización, es decir, la moneda de fijación de precios, y XXX representa el código del contrato, como el swap de contrato perpetuo. Los nombres de las monedas están todos en letras mayúsculas y los códigos de contrato están en letras minúsculas.
Por ejemplo: BTC_USDT.swap, contrato perpetuo basado en U de BTC.Probado utilizando el entorno en vivo de Binance Futures:
var symbols = ["BTC_USDT.swap", "BTC_USDT.quarter", "BTC_USD.swap", "BTC_USD.next_quarter", "ETH_USDT.swap"]
function main() {
exchange.SetCurrency("ETH_USD")
exchange.SetContractType("swap")
var arr = []
var t = exchange.GetTicker()
arr.push(t)
for (var symbol of symbols) {
var ticker = exchange.GetTicker(symbol)
arr.push(ticker)
}
var tbl = {type: "table", title: "test GetTicker", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
for (var ticker of arr) {
tbl.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return arr
}

Solicitar un lote de datos de mercado para un símbolo específico se ha vuelto mucho más sencillo.
Igual que la función GetTickerexchange.GetDepth()La función también agrega un parámetro de símbolo esta vez. Es posible especificar el tipo directamente al solicitar datos de profundidad.
Probado utilizando el entorno en vivo de Binance Futures:
function main() {
exchange.SetCurrency("LTC_USD")
exchange.SetContractType("swap")
Log(exchange.GetDepth())
Log(exchange.GetDepth("ETH_USDT.quarter"))
Log(exchange.GetDepth("BTC_USD.swap"))
}

Igual que la función GetTickerexchange.GetTrades()La función también agrega un parámetro de símbolo esta vez. Es posible especificar directamente el producto al solicitar datos de transacciones del mercado.
Probado utilizando el entorno en vivo de Binance Futures:
function main() {
var arr = []
var arrR = []
var symbols = ["LTC_USDT.swap", "ETH_USDT.quarter", "BTC_USD.swap"]
for (var symbol of symbols) {
var r = exchange.Go("GetTrades", symbol)
arrR.push(r)
}
for (var r of arrR) {
arr.push(r.wait())
}
var tbls = []
for (var i = 0; i < arr.length; i++) {
var trades = arr[i]
var symbol = symbols[i]
var tbl = {type: "table", title: symbol, cols: ["Time", "Amount", "Price", "Type", "Id"], rows: []}
for (var trade of trades) {
tbl.rows.push([trade.Time, trade.Amount, trade.Price, trade.Type, trade.Id])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}

Esta actualización también es compatible conexchange.Go()Cuando la función llama simultáneamente a la interfaz API de la plataforma, se pasa el parámetro de símbolo para especificar la información del producto.
La función GetRecords se ha ajustado significativamente esta vez, además de admitir el parámetro de símbolo para especificar directamente la información de tipo de los datos de la línea K solicitados. Se conserva el parámetro de período original para especificar el período de la línea K y se agrega un parámetro de límite para especificar la longitud de la línea K esperada al realizar la solicitud. También es compatible con la versión anterior de la función GetRecords que solo pasa el parámetro de período.
exchange.GetRecords()Cómo llamar a la función:
Probado utilizando el entorno en vivo de Binance Futures:
function main() {
exchange.SetCurrency("ETH_USDT")
exchange.SetContractType("swap")
var r1 = exchange.GetRecords()
var r2 = exchange.GetRecords(60 * 60)
var r3 = exchange.GetRecords("BTC_USDT.swap")
var r4 = exchange.GetRecords("BTC_USDT.swap", 60)
var r5 = exchange.GetRecords("LTC_USDT.swap", 60, 3000)
Log("r1相邻Bar时间差值:", r1[1].Time - r1[0].Time, "毫秒, Bar长度:", r1.length)
Log("r2相邻Bar时间差值:", r2[1].Time - r2[0].Time, "毫秒, Bar长度:", r2.length)
Log("r3相邻Bar时间差值:", r3[1].Time - r3[0].Time, "毫秒, Bar长度:", r3.length)
Log("r4相邻Bar时间差值:", r4[1].Time - r4[0].Time, "毫秒, Bar长度:", r4.length)
Log("r5相邻Bar时间差值:", r5[1].Time - r5[0].Time, "毫秒, Bar长度:", r5.length)
}

La función GetOrders también agregasymbolParámetros, puede especificar un producto específico y consultar los pedidos no terminados (pedidos pendientes) del producto; también puede consultar los pedidos no terminados (pedidos pendientes) de todos los productos en el rango de dimensión especificado.
exchange.GetOrders()La función se puede llamar de las siguientes maneras:
Prueba utilizando el entorno de simulación de futuros OKX:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
// 写入图表
var tbls = []
for (var symbol of ["null", "ETH_USDT.swap", "USDT.swap"]) {
var tbl = {type: "table", title: symbol, cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
var orders = null
if (symbol == "null") {
orders = exchange.GetOrders()
} else {
orders = exchange.GetOrders(symbol)
}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
ETH_USDT.swapParámetro, solicita las órdenes no completadas (órdenes pendientes) del contrato perpetuo con margen USDT de ETH."USDT.swap"Solicitar todas las órdenes pendientes (órdenes pendientes) de contratos perpetuos con margen en USDT.Todavía es compatible con la antigua denominación de la función de adquisición de posición y también agrega el parámetro de símbolo, que puede especificar el tipo de información de los datos de posición solicitados específicos. Uso de funciones yexchange.GetPositions()Totalmente consistente.
paraexchange.IO("api", ...)Se ha actualizado el método de llamada de función para admitir el paso directo de la dirección de solicitud completa para todos los objetos de intercambio.
Por ejemplo, si desea llamar a la interfaz OKX:
GET https://www.okx.com /api/v5/account/max-withdrawal ccy: BTC
Admite escritura directa a la dirección basehttps://www.okx.com, no es necesario cambiar la dirección base antes de llamar a la función IO.
Prueba utilizando el entorno de simulación de futuros OKX:
function main() {
exchange.IO("simulate", true)
return exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
}

Esta actualización afecta principalmente aexchange.GetOrder(id)Parámetros de funciónidEl parámetro id se cambia del id de la orden de intercambio original a un formato de cadena que contiene la variedad de negociación. Todos los ID de pedidos empaquetados en la plataforma FMZ están en este formato.
Por ejemplo:
123456
Antes de esta actualización, si desea llamar a la función GetOrder, el ID de pedido que se pasa es123456。BTC-USDT。
Tenga en cuenta que lo que se menciona aquí es el código del producto comercial nombrado por el intercambio, no el par comercial definido por la plataforma FMZ.Después de esta actualización,exchange.GetOrder(id)El formato del parámetro id que la función debe pasar se ajusta a:BTC-USDT,123456。
Permítanme primero explicar por qué se hace este diseño: Debido a que la función CreateOrder se ha actualizado esta vez para especificar directamente el producto sobre el cual se realizará un pedido (el producto pedido puede ser diferente del par comercial y el código de contrato configurados actualmente), si el ID del pedido devuelto no contiene la información del producto. Entonces este ID de pedido no estará disponible. Porque cuando revisas el pedido, no sabes para qué tipo (contrato) es el pedido. La mayoría de los intercambios requieren especificar parámetros que describen el código del producto al verificar y cancelar pedidos.
Cómo aprovechar este efecto: Si usa la función exchange.IO para llamar directamente a la interfaz de pedido del exchange para realizar un pedido, el valor de retorno generalmente contiene el símbolo original del exchange (código de producto) y la identificación del pedido original. Luego, al concatenar los dos con comas inglesas, obtendrá el ID de pedido definido por la plataforma FMZ. De manera similar, si utiliza la interfaz de pedido encapsulada por la plataforma FMZ para realizar un pedido, dado que el comienzo del ID de pedido es el código del producto comercial, si necesita usar el ID de pedido original, solo necesita eliminar el código del producto y coma.
Esta actualización es paraexchange.CancelOrder()El impacto de las funciones yexchange.GetOrder()Las funciones son las mismas.
Esta actualización es paraexchange.Buy()El impacto de las funciones yexchange.GetOrder()Las funciones son las mismas.exchange.Buy()El ID de orden devuelto por la función es una nueva estructura, por ejemplo, el ID devuelto al realizar una orden de futuros en la bolsa OKX:LTC-USDT-SWAP,1578360858053058560。
Esta actualización es paraexchange.Sell()El impacto de las funciones yexchange.GetOrder()Las funciones son las mismas.exchange.Sell()El ID de orden devuelto por la función es una nueva estructura, por ejemplo, el ID devuelto al realizar una orden de futuros en la bolsa OKX:ETH-USDT-SWAP,1578360832820125696。
Solo los objetos de bolsa de futuros admiten esta función. Para la función exchange.GetPosition(), que permite obtener datos de posición, se ha añadido un nuevo nombre, exchange.GetPositions(), y sus comportamientos son exactamente los mismos.
Definición anterior: función exchange.GetPosition(). Cuando se la llama sin especificar ningún parámetro, obtiene los datos de posición del contrato específico establecido por el par de negociación actual y el código de contrato.
Después de realizar los ajustes y modificaciones, la nueva definición es la siguiente: función exchange.GetPosition(). Cuando se la llama sin especificar ningún parámetro, obtiene las posiciones de todas las variedades en el rango de dimensión determinado por el par de negociación y el código de contrato actualmente establecidos.
Por ejemplo, el par comercial actual es BTC_USDT y el código del contrato es swap. En este momento llame al:
exchange.GetPosition() // 等价于调用 exchange.GetPosition("USDT.swap")
Esta función solicitará los datos de posición de los contratos perpetuos de margen U de todas las monedas.
Definición anterior: función exchange.GetOrders(). Cuando se la llama sin especificar ningún parámetro, recupera todas las órdenes pendientes para el par de operaciones actual.
Después de realizar los ajustes y modificaciones, la nueva definición es la siguiente: función exchange.GetOrders(). Cuando se la llama sin especificar ningún parámetro, obtiene las órdenes no completadas de todos los pares de operaciones al contado.
Definición anterior: función exchange.GetOrders(). Cuando se la llama sin especificar ningún parámetro, recupera todas las órdenes no completadas del contrato específico establecido por el par de operaciones actual y el código de contrato.
Después de realizar los ajustes y modificaciones, la nueva definición es la siguiente: función exchange.GetOrders(). Cuando se la llama sin especificar ningún parámetro, obtiene todos los pedidos no completados en el rango de dimensión determinado por el par de operaciones y el código de contrato establecidos actualmente.
Por ejemplo, el par comercial actual es BTC_USD y el código del contrato es trimestre. En este momento llame al:
exchange.GetOrders() // 等价于调用 exchange.GetOrders("USD.futures")
Esta función solicitará los datos de órdenes pendientes de todos los contratos de futuros con margen de monedas.
Esta actualización agrega un campo Símbolo a la estructura Ticker, que registra la información de mercado del producto de la estructura Ticker actual. El formato de este campo esexchange.GetTicker()El formato del parámetro de símbolo de la función es exactamente el mismo.
Esta actualización agrega un campo Símbolo a la estructura de Pedido. El formato de este campo es el mismo queexchange.GetTicker()El formato del parámetro de símbolo de la función es exactamente el mismo. Esta actualización también modifica el campo Id de la estructura del pedido para registrar la información del producto y la información del pedido original en el nuevo formato de ID de pedido. referirse aexchange.GetOrder()La descripción del ID del pedido en la función no se repetirá aquí.
Esta actualización agrega un campo Símbolo a la estructura de Posición. El formato de este campo es el mismo queexchange.GetTicker()El formato del parámetro de símbolo de la función es exactamente el mismo.
La función GetFundings devuelve una matriz de estructuras de financiación.
{
"Info": {...}, // 交易所资金费率接口原始应答数据
"Symbol": "BTC_USDT.swap", // FMZ平台定义的品种名称
"Interval": 28800000, // 8小时间隔,单位毫秒
"Time": 1729728000000, // 本期资金费率收取时间
"Rate": 0.0001, // 资金费率,即 0.01 %
}
Para satisfacer las necesidades de los usuarios, esta actualización primero será compatible con el mercado real y el sistema de pruebas retrospectivas se adaptará en una semana. Si los códigos de estrategia individuales se ven afectados, siga las instrucciones de este artículo para realizar cambios y adaptaciones.
De acuerdo con la actualización de la interfaz API de la estrategia de la plataforma, las interfaces API en el sistema de backtesting de la plataforma se han actualizado de manera sincrónica; además, el sistema de backtesting ha agregado soporte para:
Funciones miembro para objetos de intercambio de futurosGetAccountDevolverAccountLa estructura se ha ampliado con campos.
La función miembro SetMarginLevel del objeto de intercambio de futuros se ha actualizado para agregar el parámetro símbolo.
Ejemplo de prueba:
function main() {
exchange.SetCurrency("ETH_USDT")
exchange.SetContractType("swap")
// 当前交易对为ETH_USDT,合约代码为swap,设置杠杆值为10
exchange.SetMarginLevel(10)
// 直接指定交易对BTC_USDT,合约代码swap,设置杠杆值20
exchange.SetMarginLevel("BTC_USDT.swap", 20)
}
CtValCcyRegistre la unidad de valor de un contrato. La unidad de valor de un contrato puede ser: BTC, USD, ETH, etc.CtValRegistre el valor de un contrato de este producto comercial en la bolsa, en unidades deCtValCcyLa moneda del registro de campo. Por ejemplo:CtVales 0,01,CtValCcy“BTC” significa que un contrato vale 0,01 BTC.