Nem todos os produtos mencionados estão disponíveis em todas as jurisdições.

Como faço trading de derivados com o Jupyter Notebook?

Publicado a 28/09/2023Atualizado a 25/10/2024Leitura de 10 minutos77

Descubra como fazer negociações simples de derivados com as mesmas ferramentas. Vamos usar os recursos abrangentes disponíveis em python-okx a um nível mais alto!

Tipos de derivados

Existem três tipos de derivados disponíveis para negociar na OKX:

  • Validade

  • Perpétuo

  • Opções

Aceda a Derivados de Bitcoin explicados: futuros, swaps perpétuos e opções para saber as caraterísticas dos diferentes tipos de derivados na OKX. Neste tutorial, vamos utilizar perpétuos como exemplo.

Perguntas frequentes

1. Como posso obter os dados de mercado de Obter dados de mercado?

Também pode substituir o instType por EXPIRY ou OPTION para as suas informações.

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)

2. Como posso obter pares de trading disponíveis de instrumentos Get?

Da mesma forma, escolha o instType para o qual deseja obter informações.

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 Calcule o valor nocional de um contrato de derivados com o parâmetro do instrumento ctVal e ctMult

Para calcular o valor nocional de um contrato de derivados (isto é, futuros, swaps perpétuos e opções), precisa do ctVal (valor do contrato) e do ctMult (multiplicador do contrato) dos parâmetros do instrumento.

O valor nocional de um contrato de derivados pode ser calculado como ctVal * ctMult (unidade: ctValCcy);

Por exemplo, a partir dos parâmetros do instrumento mostrados abaixo, podemos calcular o valor nocional de um contrato perpétuo de LTC-USD como: ctVal x ctMult (unidade: ctValccy) = 10 x 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. Como posso consultar o saldo de Obter saldo?

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. O que é um modo de conta e um modo de margem/trading que se qualifica para trading de derivados?

Como mencionado no último tutorial, na conta de negociação unificada, há quatro modos de conta:

  • Modo à vista,

  • Modo à vista e de futuros,

  • Modo de margem multidivisas,

  • Modo de margem de portefólio.

Tenha em conta que apenas os três últimos modos de margem, nomeadamente à vista e futuros, margem multidivisas e margem de portefólio são elegíveis para trading de derivados. Aceda a como configurar o modo de conta para entender as diferenças entre os quatro modos e como alternar entre os mesmos através da nossa interface de utilizador da web.

4.1 Obtenha a configuração da conta atual a partir do parâmetro acctLv em Obter configuração de conta

Verifique se está no modo de conta correto para negociar 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. Como posso definir a alavancagem através de Definir alavancagem da conta?

Um parâmetro importante de definir para o trading de derivados é a alavancagem.

A alavancagem permite que os traders insiram uma posição que vale muito mais ao comprometer apenas um pequeno montante de dinheiro. Assim, os ganhos ou perdas são consideravelmente potencializados.

Os traders podem ter uma alavancagem de até 125x nos derivados da OKX. Leia as referências sobre como definir a alavancagem para diferentes níveis de alavancagem permitidos em diferentes escalões de posições.

CT-web-spottrading-howtoapi-6

Eis o que significam os glossários acima:

  • Alavancagem máx.: O múltiplo máximo de vezes do capital emprestado para aumentar o potencial retorno de um investimento.

  • Índice de margem inicial (IMR): a margem exigida para manter posições atuais.

  • Rácio de margem de manutenção (MMR): a margem mínima exigida para manter as posições atuais. Ocorrerá liquidação se o patrimônio da conta ficar abaixo da margem de manutenção.

Por exemplo, se quiser negociar 3000 contratos perpétuos de ETHUSDT, pode alavancar no máximo 75 vezes o capital que possui. IMR = 1 / 75 = 1,3%, e deve manter 0,8% ou mais de MMR para evitar a liquidação.

Há 9 cenários diferentes para definições de alavancagem com as APIs abertas da OKX. Consulte Definir cenários de alavancagem para diferentes casos.

Para swaps perpétuos, há três cenários diferentes para a definição de alavancagem:

  • Defina a alavancagem para instrumentos SWAP no modo de trading de margem cruzada ao nível do contrato.

  • Defina a alavancagem para instrumentos SWAP no modo de trading de margem isolada e modo de posição de compra/venda ao nível do contrato.

  • Defina a alavancagem para instrumentos SWAP no modo de trading de margem isolada e modo de posição longa/curta ao nível do contrato e do lado da posição.

O exemplo a seguir mostra como definir a alavancagem e o lado da posição de um único contrato de SWAP, em comparação com todos os contratos de SWAP de um determinado subjacente.

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)

Tenha em conta que o parâmetro de solicitação posSide apenas é exigido quando o modo de margem é isolado no modo de posição longa/curta (colocação de ordem) para instrumentos EXPIRY/PERPETUAL (veja o cenário 6 e 9 in Definir cenários de alavancagem).

6. Como posso colocar ordens ao abrigo de diferentes modos de posição (colocação de ordens): longa/curta e compra/venda?

Existem dois modos de posição (colocação de ordens) no trading de futuros de validade e perpétuos: longa/curta e compra/venda (líquido).

Pode alterar o modo de posição (colocaçãod e ordens) entre longa/curta e compra/venda (líquido) através da API Configurar modo de posição:

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

Ou, em alternativa, pode fazê-lo através de Configurações na web, tal como abaixo:

CT-web-derivativestrading-howtoapi-9

No modo compra/venda (líquido), a posição de um determinado contrato é a quantia líquida das suas transações de compra e venda. Ao colocar ordens através de Colocar ordem, o parâmetro de solicitaçãoposSide não é obrigatório. Se passar, o único valor válido será net.

No modo longa/curta, as posições longas e curtas de um determinado contrato serão independentes uma da outra e deverão ser fechadas separadamente. Ao colocar ordens através de Colocar ordem, o parâmetro de solicitação posSide é obrigatório. Os valores válidos são long ou short. Abaixo demonstramos como definir o parâmetro lado (lado da transação) e posSide (lado da posição) ao colocar uma ordem em diferentes cenários:

  • Colocar uma ordem de compra e abrir/aumentar uma posição longa: side = buy, posSide = long

  • Colocar uma ordem de venda e abrir/aumentar uma posição curta: side = sell, posSide = short

  • Colocar uma ordem de venda e fechar/reduzir uma posição longa: side = sell, posSide = long

  • Colocar uma ordem de compra e fechar/reduzir uma posição curta: side = buy, posSide = short E está tudo pronto para colocar ordens de derivados!

6.1 Colocar uma ordem com limite através de Colocar ordem

Pode comprar 100 contratos de swap de BTC-USDT ao preço de 19000 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 Colocar uma ordem de mercado através de Colocar ordem

Pode comprar 100 contratos de swap de BTC-USDT ao preço 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. Como posso obter detalhes/estado de uma determinada ordem (consultar Obter detalhes da ordem)?

Além de ordId, também pode especificar clOrdId para obter os detalhes da ordem.

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

8. Como posso cancelar uma ordem através de Cancelar ordem?

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

9. Como posso alterar uma ordem através de Alterar ordem?

Também pode usar clOrdId em vez de ordId. Este exemplo mostra a revisão de um novo tamanho.

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

10. Como posso obter a lista de ordens abertas através de Obter lista de ordens?

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

11. Como posso obter o histórico de ordens através de Obter histórico de ordens (últimos 7 dias) e Obter histórico de ordens (ú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. Como posso obter os detalhes da transação através de Obter detalhes de transações (últimos 3 dias) e Obter detalhes de transações (ú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. Como posso obter posições através de Obter posições?

Quando a sua conta está no modo líquido, a posição líquida de cada contrato será exibida; quando a sua conta está no modo longa/curta, as posições longa ou curta de cada contrato serão exibidas separadamente.

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

Pode, por exemplo, acompanhar os lucros e perdas não realizados através do parâmetro de resposta upl.

Mais exemplos

Para obter mais exemplos, faça o download do Jupyter Notebook completo aqui.

Caso tenho dúvidas sobre as nossas APIs, pode juntar-se à nossa comunidade de API e colocar questões na comunidade.