Algos

Troca Contínua

Rola continuamente uma posição de um instrumento que está vencendo para o próximo contrato, coordenando o fechamento da perna da frente e a abertura da perna seguinte para preservar a exposição durante a rolagem.

Quando usar

  • Você está rolando posições em futuros ou em termo antes do vencimento.
  • Quer uma rolagem suave e automática, em vez de uma troca abrupta.
  • Precisa de execução coordenada para não ficar descoberto durante a troca.

Início rápido

from investflex import AsyncInvestflexClient
from investflex.models.algos import TrocaContinua
from investflex.models.common import ExecutionType, SecurityExchange, Side, TimeInForce, Trigger

c = TrocaContinua(
    name="win-roll",
    init_time="09:00:00",
    end_time="23:53:00",
    time_in_force=TimeInForce.DAY,
    # gatilhos (NOTA: cont usa entry/exit triggers, não trigger_value)
    execution_type=ExecutionType.ENTRY,
    trigger=Trigger.SPREAD,                 # também: Trigger.FINANCIAL_DIFF, Trigger.FINANCIAMENTO
    entry_trigger_value=162915.0,
    exit_trigger_value=-162900.0,
    entry_trigger_type=1,                   # 1 = Pontos
    exit_trigger_type=1,
    simultaneous_trigger_mode="Y",
    start_on_exit_trigger="N",
    allow_partial_exit="Y",
    legs=[
        dict(symbol="WING25", side=Side.BUY,  quantity=1,
             alloc_account="YOUR_ACCOUNT", security_exchange=SecurityExchange.XBMF,
             resting="Y", max_clip_size=1, first_timeout=5000),
        dict(symbol="WDOH25", side=Side.SELL, quantity=1,
             alloc_account="YOUR_ACCOUNT", security_exchange=SecurityExchange.XBMF,
             resting="Y", max_clip_size=1, first_timeout=5000),
    ],
)

async with AsyncInvestflexClient.from_env() as client:
    handle = await client.algos.create(c)
    print(handle.clord_id, handle.status.name)

Parâmetros

Estratégia

Campo Tipo Obrigatório Editável Padrão Observações
name str sim não Rótulo.
init_time HH:MM:SS sim não Início da janela.
end_time HH:MM:SS sim não Fim da janela.
expire_date YYYYMMDD não não 20380101 Validade da ordem-dia.
text str não não Comentário livre.
basket_id str não não Chave opcional de agrupamento.
time_in_force enum não não DAY Veja 02-enums.md.
execution_type ExecutionType sim não ExecutionType.ENTRY, ExecutionType.GAIN_LOSS.
trigger Trigger sim não Trigger.SPREAD, Trigger.FINANCIAL_DIFF, Trigger.FINANCIAMENTO.
entry_trigger_value número sim sim Limiar de entrada (preço ou diferença financeira).
exit_trigger_value número sim sim Limiar de saída (preço ou diferença financeira).
entry_trigger_type int não não 1 Pontos (ticks), 2 Percentual.
exit_trigger_type int não não Mesmos modos para a saída.
simultaneous_trigger_mode "Y" / "N" não não Y deixa entrada e saída dispararem no mesmo evento; N exige primeiro a entrada e depois arma a saída.
start_on_exit_trigger "Y" / "N" não não Y rearma a entrada após uma execução de saída (modo contínuo).
allow_partial_exit "Y" / "N" não sim Permite que a saída execute parcialmente.
to_market_trigger_value número condicional sim Alvo de perda quando execution_type=ExecutionType.GAIN_LOSS.
to_market_trigger_value_enabled "Y" / "N" não não Y apenas quando execution_type=ExecutionType.GAIN_LOSS.

Nota: ao contrário de lgshort / spread / financ, a Troca Contínua não usa um único trigger_value — ela sempre tem entry_trigger_value e exit_trigger_value.

Pernas

Duas ou três pernas.

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 sim Quantidade total (> 0).
alloc_account str sim não Conta da corretora.
security_exchange str não não Padrão XBSP; use XBMF para derivativos B3.
resting "Y" / "N" não sim Y passiva, N agressora.
max_clip_size int não sim Maior pedaço visível por ordem filha.
first_timeout int não não Milissegundos até a primeira reavaliação.

Editando uma Troca Contínua em execução

await client.algos.edit(
    handle.clord_id,
    EntryTriggerValue=162900,
    ExitTriggerValue=-162885,
    AllowPartialExit="Y",
)

Editáveis: EntryTriggerValue, ExitTriggerValue, ToMarketTriggerValue, AllowPartialExit.

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)

Notas de comportamento

  • O gatilho é avaliado contra a diferença de preço (ou financeira) entre as pernas — o sinal importa: um exit_trigger_value negativo significa sair quando a diferença cai abaixo desse nível.
  • simultaneous_trigger_mode="Y" é típico de uma rolagem contínua: as condições de entrada e saída são monitoradas em paralelo.
  • start_on_exit_trigger="Y" mantém o algo em ciclo: cada execução de saída rearma uma nova entrada, útil para rolagens repetidas dentro da janela.
  • Variantes de 2 pernas são típicas de rolagem de futuros (frente → trás); variantes de 3 pernas adicionam um instrumento de hedge ou base.