Kaique Mitsuo Silva Yamamoto
Mercado financeiroAutomação de EstratégiasProfit / Nelogica NTSL

NTSL — Funções de Execução (Ordens e Posição)

Referência completa das funções de execução em NTSL: ordens a mercado, limite e stop para compra e venda, gestão de posição, resultados e consulta de estado no Profit Nelogica.

NTSL — Funções de Execução (Ordens e Posição)

As funções de execução são o núcleo dos robôs de trading (estratégias de execução) no Profit. Elas permitem enviar ordens, verificar o estado da posição e consultar resultados financeiros — tanto em backtest quanto em automação ao vivo.

Fundamentos: NTSL — Fundamentos | Automação: NTSL — Automação


Ordens de Compra

BuyAtMarket

Envia uma ordem de compra a mercado.

Função BuyAtMarket(Quantity: Float): Void;
  • Quantity [Opcional]: lotes a executar. Se omitido, usa o valor configurado na aba Execução.
  • Em automação, usa a quantidade do campo "Quantidade por Ordem".
begin
  if (Low = Low[1]) then
    BuyAtMarket;   // compra a mercado quando mínima iguala a anterior
end;

BuyLimit

Envia uma ordem de compra do tipo limite (compra se o preço cair até o nível).

Função BuyLimit(Limit: Float; Quantity: Float): Void;
begin
  if not HasPosition then
    BuyLimit(Close, 1);   // compra limite no fechamento atual
end;

BuyStop

Envia uma ordem de compra do tipo stop (executa quando o preço supera o gatilho).

Função BuyStop(Stop: Float; Limit: Float; Quantity: Float): Void;
  • Stop: preço gatilho da ordem
  • Limit [Opcional]: preço limite de execução (stop limit)
  • Quantity [Opcional]: lotes
input
  pStop(133000);
  lote(1);

begin
  if (Low <> Low[1]) then
    BuyStop(pStop, pStop, lote);   // compra stop no nível definido
end;

Ordens de Venda (Short)

SellShortAtMarket

Envia uma ordem de venda a mercado (abre posição vendida).

Função SellShortAtMarket(Quantity: Float): Void;
begin
  if (High = High[1]) then
    SellShortAtMarket;
end;

SellShortLimit

Envia uma ordem de venda limite (vende se o preço subir até o nível).

Função SellShortLimit(Limit: Float; Quantity: Float): Void;
begin
  if not HasPosition then
    SellShortLimit(Close, 1);
end;

SellShortStop

Envia uma ordem de venda stop (executa quando o preço cai abaixo do gatilho).

Função SellShortStop(Stop: Float; Limit: Float; Quantity: Float): Void;
input
  pStop(129000);
  lote(1);

begin
  if (High <> High[1]) then
    SellShortStop(pStop, pStop, lote);
end;

Fechamento de Posição Vendida (BuyToCover)

BuyToCoverAtMarket

Fecha uma posição vendida a mercado.

Função BuyToCoverAtMarket(Quantity: Float): Void;
begin
  SellShortAtMarket;
  if ((Low > Low[1]) and IsSold) then
    BuyToCoverAtMarket;   // encerra posição de venda
end;

BuyToCoverLimit

Fecha posição vendida com ordem limite.

Função BuyToCoverLimit(Limit: Float; Quantity: Float): Void;
begin
  SellShortAtMarket;
  if IsSold then
    BuyToCoverLimit(Close, 1);   // recompra limite no fechamento
end;

BuyToCoverStop

Fecha posição vendida com ordem stop (stop de compra para sair do short).

Função BuyToCoverStop(Stop: Float; Limit: Float; Quantity: Float): Void;
input
  pStop(132000);

begin
  SellShortAtMarket;
  if (Low = Low[1]) and IsSold then
    BuyToCoverStop(pStop, pStop);
end;

Fechamento de Posição Comprada (SellToCover)

SellToCoverAtMarket / SellToCoverLimit / SellToCoverStop

Funções simétricas para fechar posição comprada (equivalentes BuyToCover, mas para longs):

Função SellToCoverAtMarket(Quantity: Float): Void;
Função SellToCoverLimit(Limit: Float; Quantity: Float): Void;
Função SellToCoverStop(Stop: Float; Limit: Float; Quantity: Float): Void;
begin
  BuyAtMarket;
  if IsBought then
  begin
    SellToCoverLimit(BuyPrice + 200);   // take profit
    SellToCoverStop(BuyPrice - 100, BuyPrice - 100);   // stop loss
  end;
end;

ClosePosition

Fecha qualquer posição aberta (comprada ou vendida). Cancela todas as ordens pendentes antes de fechar.

Função ClosePosition(): Void;
begin
  if (Low = Low[1]) then
    BuyAtMarket;
  if HasPosition then
    ClosePosition;   // fecha tudo
end;

CancelPendingOrders

Cancela todas as ordens pendentes no fluxo atual de execução.

Função CancelPendingOrders(): Void;
begin
  SellShortAtMarket;
  if (Low = Low[1]) and IsSold then
    BuyToCoverStop(pStop, pStop);
  if HasPendingOrders then
    CancelPendingOrders;   // cancela pendentes se necessário
end;

Consulta de Estado da Posição

HasPosition

Retorna True se há posição aberta (comprada ou vendida).

Função HasPosition(): Boolean;

begin
  if not HasPosition then
    BuyAtMarket;
end;

IsBought

Retorna True se há posição de compra em aberto.

Função IsBought(): Boolean;

begin
  BuyAtMarket;
  if IsBought then
    PaintBar(clVerde);
end;

IsSold

Retorna True se há posição de venda em aberto.

Função IsSold(): Boolean;

begin
  SellShortAtMarket;
  if IsSold then
    PaintBar(clVermelho);
end;

HasPendingOrders

Retorna True se há ordens pendentes (stop/limit aguardando execução).

Função HasPendingOrders(): Boolean;

Preços e Tamanho da Posição

BuyPrice / SellPrice

Retorna o preço médio de entrada da posição.

Função BuyPrice(): Float;
Função SellPrice(): Float;
begin
  if IsBought then
  begin
    // Stop e gain baseados no preço de entrada
    SellToCoverStop(BuyPrice - 200, BuyPrice - 200);
    SellToCoverLimit(BuyPrice + 400);
  end;
end;

BuyPosition / SellPosition

Retorna o tamanho da posição em lotes.

Função BuyPosition(): Integer;   // lotes comprados
Função SellPosition(): Integer;  // lotes vendidos

BuyPositionQty / SellPositionQty

Retorna o tamanho da posição em quantidade (contratos/ações — relevante para ativos com lote diferente de 1).

Função BuyPositionQty(): Float;
Função SellPositionQty(): Float;

Resultados Financeiros

DailyResult

Resultado diário das operações da automação em valor financeiro.

Função DailyResult(OpenResult: Boolean): Float;
  • OpenResult = True: resultado fechado + posição em aberto
  • OpenResult = False: apenas operações já encerradas no dia
var
  dResult : Float;

begin
  if not HasPosition then
    BuyAtMarket;
  dResult := DailyResult(True);
  Plot(dResult);

  // Stop por resultado diário negativo
  if (dResult <= -500) then
    ClosePosition;
end;

AutomationResult

Resultado acumulado de todas as operações da automação (desde o início).

Função AutomationResult(OpenResult: Boolean): Float;
var
  nResult : Float;

begin
  if not HasPosition then
    BuyAtMarket;
  nResult := AutomationResult(True);
  if (nResult <= -500) then
    ClosePosition;   // zera se drawdown acumulado ultrapassar R$500
end;

AvgTradeResult

Média dos resultados das operações encerradas.

Função AvgTradeResult(OpenResult: Boolean): Float;

AvgTradeResultDaily

Média diária dos resultados das operações encerradas no dia.

Função AvgTradeResultDaily(OpenResult: Boolean): Float;

LastTradeResult

Resultado da última operação encerrada.

Função LastTradeResult(): Float;
var
  nLast : Float;

begin
  if not HasPosition then
    BuyAtMarket;
  if Mod(CurrentBar, 3) = 0 then
    ClosePosition;
  nLast := LastTradeResult;
  if (nLast < 0) then
    PlotText("Última negativa", clRed);
end;

Exemplo Completo: Robô com Stop e Gain

input
  PeriodoMedia(20);
  StopPontos(200);
  GainPontos(400);

var
  sMA   : Serie;
  bSinalCompra, bSinalVenda : Boolean;

begin
  if (CurrentBar < PeriodoMedia) then exit;

  sMA := Media(PeriodoMedia, Close);

  bSinalCompra := (Close > sMA) and (Close[1] <= sMA[1]);
  bSinalVenda  := (Close < sMA) and (Close[1] >= sMA[1]);

  // Gestão de posição comprada
  if IsBought then
  begin
    SellToCoverStop(BuyPrice - StopPontos * MinPriceIncrement,
                    BuyPrice - StopPontos * MinPriceIncrement);
    SellToCoverLimit(BuyPrice + GainPontos * MinPriceIncrement);
    exit;
  end;

  // Gestão de posição vendida
  if IsSold then
  begin
    BuyToCoverStop(SellPrice + StopPontos * MinPriceIncrement,
                   SellPrice + StopPontos * MinPriceIncrement);
    BuyToCoverLimit(SellPrice - GainPontos * MinPriceIncrement);
    exit;
  end;

  // Entradas
  if (not HasPosition) then
  begin
    if bSinalCompra then
      BuyAtMarket;
    if bSinalVenda then
      SellShortAtMarket;
  end;

  // Encerramento no fim do pregão
  if (Time >= 1700) then
    ClosePosition;
end;

Referência Rápida

FunçãoRetornoDescrição
BuyAtMarketVoidCompra a mercado
BuyLimit(p)VoidCompra limite
BuyStop(s, l)VoidCompra stop
SellShortAtMarketVoidVenda a mercado
SellShortLimit(p)VoidVenda limite
SellShortStop(s, l)VoidVenda stop
BuyToCoverAtMarketVoidFecha short a mercado
BuyToCoverLimit(p)VoidFecha short limite
BuyToCoverStop(s, l)VoidFecha short stop
SellToCoverAtMarketVoidFecha long a mercado
SellToCoverLimit(p)VoidFecha long limite
SellToCoverStop(s, l)VoidFecha long stop
ClosePositionVoidFecha qualquer posição
CancelPendingOrdersVoidCancela pendentes
HasPositionBooleanPosição aberta?
IsBoughtBooleanPosição comprada?
IsSoldBooleanPosição vendida?
HasPendingOrdersBooleanOrdens pendentes?
BuyPriceFloatPreço médio compra
SellPriceFloatPreço médio venda
BuyPositionIntegerLotes comprados
SellPositionIntegerLotes vendidos
DailyResult(b)FloatP&L do dia
AutomationResult(b)FloatP&L acumulado
LastTradeResultFloatÚltimo trade

Referências

Referências externas

On this page