Algos

OCO (novo)

A nova geração do One-Cancels-the-Other: uma entrada de uma perna (mercado, start, stop, limite ou leilão) protegida por um stop-loss e, opcionalmente, por um lado de ganho. Quando uma saída dispara, a outra é cancelada. Suporta a mesma escada de realização parcial (L1 / L2 / L3) do Flex Order.

Quando usar

  • Você quer stop-loss (e opcionalmente take-profit) anexado a uma única ordem, sem gerenciar as pernas manualmente.
  • Quer encerrar a posição em fatias, em níveis crescentes de ganho.
  • Está migrando do fluxo legado fxorder: o oco2 coloca a quantidade na perna, exige apenas stop_loss e deixa o engine assumir o resto.

Início rápido

from investflex import AsyncInvestflexClient
from investflex.models.algos import OCO2
from investflex.models.common import (
    CustomOrdType,
    Side,
    StopTypeOCO,
    TriggerEntryType,
)

oco = OCO2(
    name="petr-oco2",
    init_time="10:00:00",
    end_time="17:00:00",
    # entrada
    custom_ord_type=CustomOrdType.LIMIT,
    start_trigger_price=38.0,
    # stops
    stop_type=StopTypeOCO.GAIN_LOSS,
    trigger_entry_type=TriggerEntryType.POINTS,
    stop_loss=0.50,
    stop_gain=1.00,
    # perna
    symbol="PETR4",
    side=Side.BUY,
    quantity=1000,
    account="SUA_CONTA",
)

async with AsyncInvestflexClient.from_env() as client:
    handle = await client.algos.create(oco)
    print(handle.clord_id, handle.status.name)
import {
  InvestflexClient,
  OCO2,
  CustomOrdType,
  Side,
  StopTypeOCO,
  TriggerEntryType,
} from "@investflex/sdk";

const oco = new OCO2({
  name: "petr-oco2",
  initTime: "10:00:00",
  endTime: "17:00:00",
  // entrada
  customOrdType: CustomOrdType.LIMIT,
  startTriggerPrice: 38.0,
  // stops
  stopType: StopTypeOCO.GAIN_LOSS,
  triggerEntryType: TriggerEntryType.POINTS,
  stopLoss: 0.5,
  stopGain: 1.0,
  // perna
  symbol: "PETR4",
  side: Side.BUY,
  quantity: 1000,
  account: "SUA_CONTA",
});

const client = InvestflexClient.fromEnv();
const handle = await client.algos.create(oco);
console.log(handle.clOrdId, handle.status);

await client.close();

Parâmetros

FlexOrderStrategy. Apenas stop_loss (além da perna) é obrigatório; os demais campos são opcionais e o engine aplica seus defaults.

Estratégia — entrada

Campo Tipo Obrigatório Editável Observações
custom_ord_type CustomOrdType não não MARKET, START, STOP, LIMIT, AUCTION. Enviado como string ("1".."5").
use_auction_order "Y" / "N" não não Usa ordem de leilão na entrada.
start_trigger_price número condicional sim Preço de disparo / limite para entradas START, LIMIT e AUCTION.
entrance_exec_price número condicional não Preço de entrada para entradas STOP.

Estratégia — stops

Campo Tipo Obrigatório Editável Observações
trigger_entry_type TriggerEntryType não não POINTS (ticks) ou PERCENTAGE — unidade de todos os stops abaixo.
stop_loss número sim sim Distância de perda a partir do preço de entrada.
stop_type StopTypeOCO não não GAIN_LOSS, TRAILING, PARTIAL.
stop_gain número não sim Distância de ganho (com stop_type=GAIN_LOSS).
reversion_type ReversionType não não END_TIME_OR_CANCEL, AUCTION_OR_CANCEL, JUST_ON_GAIN_OR_LOSS, DO_NOT_REVERT.

Estratégia — níveis parciais de ganho

Usados com stop_type=StopTypeOCO.PARTIAL.

Campo Tipo Obrigatório Editável Observações
use_level3 "Y" / "N" não não Três níveis parciais ("Y") ou dois ("N").
stop_gain_l1 / l2 / l3 número não sim Distâncias de ganho crescentes.
order_quantity_l1 / l2 / l3 int não sim Quantidade encerrada em cada nível (> 0).
bypass_firewall "Y" / "N" não não Ignora o firewall pré-trade. Default "N".

Perna

Perna única, passada de forma plana. Diferente do fxorder, a quantity fica na perna.

Campo Tipo Obrigatório Editável Observações
symbol str sim não Código do instrumento.
side Side.BUY / Side.SELL sim não
quantity int sim não Quantidade total (> 0).
account str sim não Conta na corretora.
security_exchange str não não Default XBSP.

Editando um OCO em execução

await client.algos.edit(
    handle.clord_id,
    StartTriggerPrice=38.2,
    StopLoss=0.4,
    StopGain=1.2,
)
await client.algos.edit(
  handle.clOrdId,
  { StartTriggerPrice: 38.2, StopLoss: 0.4, StopGain: 1.2 },
  { strategyCode: "oco2" },
);

Comandos de ciclo de vida

await client.algos.commands.cancel(handle.clord_id)
await client.algos.commands.suspend(handle.clord_id)
await client.algos.commands.resume(handle.clord_id)
await client.commands.cancel(handle.clOrdId);
await client.commands.suspend(handle.clOrdId);
await client.commands.resume(handle.clOrdId);

Notas de comportamento

  • stop_type=StopTypeOCO.TRAILING arrasta o stop_loss atrás do melhor preço atingido.
  • stop_type=StopTypeOCO.PARTIAL encerra order_quantity_l1..l3 em stop_gain_l1..l3; use use_level3="N" para apenas dois níveis.
  • trigger_entry_type=TriggerEntryType.PERCENTAGE interpreta todos os stops como percentual em vez de ticks.
  • reversion_type=ReversionType.DO_NOT_REVERT não pode ser combinado com entrada STOP.