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 ordemLimit[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 vendidosBuyPositionQty / 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 abertoOpenResult = 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ção | Retorno | Descrição |
|---|---|---|
BuyAtMarket | Void | Compra a mercado |
BuyLimit(p) | Void | Compra limite |
BuyStop(s, l) | Void | Compra stop |
SellShortAtMarket | Void | Venda a mercado |
SellShortLimit(p) | Void | Venda limite |
SellShortStop(s, l) | Void | Venda stop |
BuyToCoverAtMarket | Void | Fecha short a mercado |
BuyToCoverLimit(p) | Void | Fecha short limite |
BuyToCoverStop(s, l) | Void | Fecha short stop |
SellToCoverAtMarket | Void | Fecha long a mercado |
SellToCoverLimit(p) | Void | Fecha long limite |
SellToCoverStop(s, l) | Void | Fecha long stop |
ClosePosition | Void | Fecha qualquer posição |
CancelPendingOrders | Void | Cancela pendentes |
HasPosition | Boolean | Posição aberta? |
IsBought | Boolean | Posição comprada? |
IsSold | Boolean | Posição vendida? |
HasPendingOrders | Boolean | Ordens pendentes? |
BuyPrice | Float | Preço médio compra |
SellPrice | Float | Preço médio venda |
BuyPosition | Integer | Lotes comprados |
SellPosition | Integer | Lotes vendidos |
DailyResult(b) | Float | P&L do dia |
AutomationResult(b) | Float | P&L acumulado |
LastTradeResult | Float | Último trade |
Referências
Referências externas
NTSL — Análise Multi-Ativo com Asset()
Como usar a função Asset() em NTSL para correlacionar múltiplos ativos, comparar séries de preço entre diferentes mercados e construir estratégias com filtros externos no Profit.
NTSL — Módulo de Automação e Execução ao Vivo
Como configurar e usar o Módulo de Automação do Profit: modos de execução, horários de operação, limites de risco, controles de segurança, XRay, ConsoleLog e estratégias OCO.