¿Cómo puedo tradear derivados con Jupyter Notebook?

Publicado el 28 sept 2023Actualizado el 25 oct 2024lectura de 10 min76

Descubre cómo puedes tradear derivados de forma sencilla usando unas mismas herramientas. Usaremos para ello las completas funciones disponibles en python-okx ¡a un nivel superior!

Tipos de derivados

Hay tres tipos de trading de derivados disponibles en OKX:

  • Con vencimiento

  • Perpetuos

  • Opciones

Puedes consultar nuestro artículo Derivados de Bitcoin: futuros, swaps perpetuos y opciones para aprender sobre los distintos tipos de derivados disponibles en OKX y sus características. En este tutorial tomaremos los derivados con vencimiento como ejemplo.

Preguntas frecuentes

1. ¿Cómo puedo obtener datos de mercado usando Get market data?

Puedes reemplazar la variable instType por los valores EXPIRY y OPTION para obtener información al respecto.

Python
     import okx.MarketData as MarketData

   flag = "1"  # live trading: 0, demo trading: 1

   marketDataAPI = MarketData.MarketAPI(flag = flag)

   result = marketDataAPI.get_tickers(instType = "SWAP")
   print(result)

¿Cómo puedo conocer los pares de trading disponibles usando Get instruments?

Igual que en el caso anterior, elige el valor de insType sobre el cual deseas obtener información.

Python
import okx.PublicData as PublicData

if __name__ == '__main__':

    flag = "1"  # live trading: 0, demo trading: 1

    publicDataAPI = PublicData.PublicAPI(flag = flag)

    result = publicDataAPI.get_instruments(instType = "SWAP")
    print(result)

2.1 Cálculo del valor nocional de un contrato de derivados con los parámetros ctVal y ctMult del instrumento

Para calcular el valor nocional de un contrato de derivados (futuros, swaps perpetuos y opciones, por ejemplo) necesitas los parámetros ctVal (valor del contrato) y ctMult (multiplicador del contrato) del instrumento.

El valor nocional de un contrato de derivados puede ser calculado como ctVal * ctMult (unidad: ctValCcy).

Por ejemplo, a partir de los parámetros de instrumento mostrados más abajo podemos calcular el valor nocional de un contrato perpetuo de LTC/USD de la siguiente forma: ctVal * ctMult (unit: ctValCcy) = 10 * 1 USD = 10 USD.

JSON
        "instType":"SWAP",
        "instId":"LTC-USD-SWAP",
        "instFamily":"LTC-USD",
        "uly":"LTC-USD",
        "settleCcy":"LTC",
        "ctVal":"10",
        "ctMult":"1",
        "ctValCcy":"USD"

3. ¿Cómo puedo comprobar mi balance usando Get balance?

Python
import okx.Account as Account
flag = "1"  # live trading:0, demo trading: 1

accountAPI = Account.AccountAPI(api_key, secret_key, passphrase, False, flag)

result = accountAPI.get_account_balance()
print(result)

4. ¿Cuáles son el modo de cuenta y el modo de margen/operación elegibles para tradear derivados?

Como mencionamos en nuestro último tutorial, hay cuatro modos de cuenta:

  • Modo spot

  • Modo de spot y futuros

  • Margen multidivisa

  • Modo de margen de portafolio

Solo los tres últimos modos de margen (de spot y futuros, multimoneda y de margen de portafolio) son elegibles para el trading de derivados. Consulta nuestro artículo sobre cómo establecer el modo de cuenta para comprender las diferencias entre los cuatro modos y saber cómo pasar de uno a otro en la interfaz de usuario de nuestro sitio web.

4.1. Conoce cuál es la configuración de cuenta actual usando el parámetro acctLv en Get account configuration

Asegúrate de que estás en el modo de cuenta correcto para tradear derivados.

Python
import okx.Account as Account

flag = "1"  # live trading: 0, demo trading: 1

accountAPI = Account.AccountAPI(api_key, secret_key, passphrase, False, flag)
result = accountAPI.get_account_config()
print(result)

if result['code'] == "0":
    acctLv = result["data"][0]["acctLv"]
    if acctLv == "1":
        print("Simple mode")
    elif acctLv == "2":
        print("Single-currency margin mode")
    elif acctLv == "3":
        print("Multi-currency margin mode")
    elif acctLv == "4":
        print("Portfolio margin mode")

5. 5. ¿Cómo puedo establecer el apalancamiento usando Set account leverage?

Uno de los parámetros importantes al tradear derivados es el apalancamiento.

El apalancamiento permite a los traders entrar con tan solo un pequeño monto de dinero en una posición cuyo valor sea mucho mayor. Las ganancias y las pérdidas, por tanto, se magnifican enormemente.

Los traders pueden tener un apalancamiento de hasta el 125x en el trading de derivados de OKX. Puedes consultar la información sobre configuración del apalancamiento para conocer cuáles son los distintos niveles de apalancamiento permitidos para distintos niveles de posiciones.

CT-web-spottrading-howtoapi-6

A continuación te explicamos los términos mencionados en dicha información:

  • Apalancamiento máximo: número máximo de veces por el que se puede multiplicar el capital prestado para incrementar el rendimiento potencial de una inversión.

  • Ratio de margen inicial (IMR): margen requerido para el holding de las posiciones actuales.

  • Ratio de margen de mantenimiento (MMR): margen mínimo requerido para mantener las posiciones actuales. Si el capital de la cuenta cae por debajo del margen de mantenimiento, ocurrirá una liquidación.

Por ejemplo, cuando deseas operar contratos de perpetuos de 3,000 ETH/USDT puedes apalancar tu capital un máximo de 75x. IMR = 1 / 75 = 1,3 % y debes mantener un MMR del 0,8 % o superior para evitar la liquidación.

Hay 9 escenarios distintos de configuración del apalancamiento mediante las API abiertas de OKX. Puedes encontrar información sobre los distintos escenarios posibles en Set leverage scenarios.

En swaps perpetuos hay tres escenarios diferentes de configuración del apalancamiento:

  • Establecimiento del apalancamiento para instrumentos de SWAP bajo el modo de trading con margen cruzado al nivel del contrato.

  • Establecimiento del apalancamiento para instrumentos de SWAP bajo el modo de trading con margen aislado y el modo de posición comprar/vender al nivel del contrato.

  • Establecimiento del apalancamiento para instrumentos de SWAP bajo el modo de trading con margen aislado y el modo de posición long/short al nivel del contrato.

El siguiente ejemplo muestra cómo establecer el apalancamiento para un contrato único de SWAP y un único lado de posición frente a todos los contratos de SWAP para un subyacente dado.

Bash
# Set leverage to be 5x for all cross-margin BTC-USDT SWAP positions,
# by providing the SWAP instId
result = accountAPI.set_leverage(
    instId = "BTC-USDT-SWAP",
    lever = "5",
    mgnMode = "cross"
)
print(result)

# In buy/sell position mode, set leverage to be 5x 
# for all isolated-margin BTC-USDT SWAP positions
# by providing the SWAP instId
result = accountAPI.set_leverage(
    instId = "BTC-USDT-SWAP",
    lever = "5",
    mgnMode = "isolated"
)
print(result)

# In long/short position mode, set leverage to be 5x
# for an isolated-margin BTC-USDT-SWAP long position;
# This does NOT affect the leverage of the BTC-USDT-SWAP
# short positions
result = accountAPI.set_leverage(
    instId = "BTC-USDT-SWAP",
    lever = "5",
    posSide = "long",
    mgnMode = "isolated"
)
print(result)

El parámetro posSide requerido es necesario únicamente cuando el modo de margen es aislando en el modo de posición long/short (creación de orden) para los instrumentos con vencimiento/perpetuos (EXPIRY/PERPETUAL) (ver escenarios 6 y 9 en Set leverage scenarios).

6. ¿Cómo puedo crear órdenes bajo diferentes modos de posición (creación de orden): long/short y comprar/vender?

Hay dos modos de posición (creación de orden) al tradear con vencimiento (EXPIRY) y de perpetuos (PERPETUAL): long/short y comprar/vender (neto).

Puedes cambiar el modo de posición (creación de orden) de long/short a comprar/vender (neto) mediante la API Set position mode:

SQL
result = accountAPI.set_position_mode(
    posMode = "long_short_mode"
)
print(result)

También puedes hacerlo usando los Configuración en el sitio web de la siguiente forma:

CT-web-derivativestrading-howtoapi-9

En el modo comprar/vender (neto), la posición de un contrato dado es el monto neto de tus operaciones de compra y venta. Cuando creas órdenes mediante Place order, el parámetro posSide no es obligatorio. Si lo pasas, el único valor válido es net.

En el modo long/short, las posiciones long y short de un contrato dado serán independientes entre sí y necesitarán ser cerradas por separado. Cuando creas órdenes mediante Place order, el parámetro posSide es obligatorio y los valores válidos son long o short. Abajo se muestra cómo establecer el parámetroside (lado de la operación de trading) y el parámetro posSide (lado de la posición) cuando creas una orden en distintos escenarios:

  • Crear una orden de compra y abrir/aumentar una posición long: side = buy, posSide = long

  • Crear una orden de venta y abrir/aumentar una posición short: side = sell, posSide = short

  • Crear una orden de venta y cerrar/reducir una posición long: side = sell, posSide = long

  • Crear una orden de compra y cerrar/reducir una posición short: side = buy, posSide = short

    ¡Y listo! Esto es todo lo que necesitas para crear órdenes de derivados.

6.1 Crear una orden de límite usando Place order

Compra de un contrato de swap de 100 BTC/USDT al precio de 19,000 USDT.

SQL
# limit order
result = tradeAPI.place_order(
    instId = "BTC-USDT-SWAP",
    tdMode = "isolated",
    side = "buy",
    posSide = "net",
    ordType = "limit",
    px = "19000",
    sz = "100"
)
print(result)

if result["code"] == "0":
    print("Successful order request,order_id = ",result["data"][0]["ordId"])
else:
    print("Unsuccessful order request,error_code = ",result["data"][0]["sCode"], ", Error_message = ", result["data"][0]["sMsg"])

6.2 Crear una orden de mercado usando Place order

Compra de un contrato de swap de 100 BTC/USDT al precio de mercado.

SQL
# market order
result = tradeAPI.place_order(
    instId = "BTC-USDT-SWAP",
    tdMode = "isolated",
    side = "buy",
    posSide = "net",
    ordType = "market",
    sz = "100"
)
print(result)

if result["code"] == "0":
    print("Successful order request,order_id = ",result["data"][0]["ordId"])
else:
    print("Unsuccessful order request,error_code = ",result["data"][0]["sCode"], ", Error_message = ", result["data"][0]["sMsg"])

7. ¿Cómo puedo obtener los detalles o el estado de una orden concreta (consulta Get order details)?

Además de ordId, también puedes ingresar clOrdId para obtener los detalles de la orden.

SQL
result = tradeAPI.get_order(instId="BTC-USDT-SWAP", ordId="505073046126960640")
print(result)

8. ¿Cómo puedo cancelar una orden usando Cancel order?

Perl
You also use __clOrdId__ in place of __ordId__
result = tradeAPI.cancel_order(instId="BTC-USDT-SWAP", ordId="505073046126960640")
print(result)

9. ¿Cómo puedo corregir una orden usando Amend order?

También puedes usar clOrdId en lugar de ordId. En el siguiente ejemplo se muestra la modificación del tamaño de la orden.

SQL
result = tradeAPI.amend_order(
    instId = "BTC-USDT-SWAP", 
    ordId = "505073046126960640",
    newSz = "80"
)
print(result)

10. ¿Cómo puedo obtener la lista de órdenes abiertas usando Get order List?

SQL
result = tradeAPI.get_order_list()
print(result)

11. ¿Cómo puedo obtener el historial de una orden usando Get order history (últimos 7 días) and Get order history (últimos 3 meses)?

SQL
# Get order history (last 7 days)
result = tradeAPI.get_orders_history(
    instType = "SWAP"
)
print(result)

# Get order history (last 3 months)
result = tradeAPI.get_orders_history_archive(
    instType = "SWAP"
)
print(result)

12. ¿Cómo puedo obtener los detalles de una transacción usando Get transaction details (últimos 3 días) and Get transaction details (últimos 3 meses)?

SQL
# Get transaction details (last 3 days)
result = tradeAPI.get_fills()
print(result)

# Get transaction details (last 3 months)
result = tradeAPI.get_fills_history(
    instType = "SWAP"
)
print(result)

13. ¿Cómo puedo obtener las posiciones usando Get positions?

Cuando tu cuenta está en el modo net, se mostrará la posición neta de cada contrato. Cuando tu cuenta está en el modo long/short, se mostrarán de forma separada las posiciones long y short de cada contrato.

SQL
result = accountAPI.get_positions()
print(result)

Por ejemplo, puedes hacer el seguimiento de tus ganancias y pérdidas no realizadas mediante el parámetro de respuesta upl.

Más ejemplos

Puedes encontrar más ejemplos descargando aquí Jupyter Notebook al completo.

Si tienes cualquier pregunta sobre nuestras API, puedes unirte a nuestra comunidad API y preguntar en ella.