Automação com lógica OCO nativa: entrada por cruzamento de médias móveis, saída por stop ou alvo com break-even automático e realização parcial. Ao atingir o alvo intermediário, metade da posição é realizada e o stop move para o preço de entrada, deixando o restante correr até o alvo final.
OCO significa “One Cancels the Other” — um par de ordens vinculadas onde o disparo de uma cancela automaticamente a outra.
Na prática, é a combinação de stop loss (proteção) e take profit (alvo): quando o mercado atinge um dos dois, o outro é cancelado imediatamente.
Na automação NTSL, o par OCO é gerenciado nativamente pela plataforma.
Ao enviar SellToCoverStop e SellToCoverLimit juntas, a plataforma cria o par OCO automaticamente.
Quando uma das ordens é atingida, a outra é cancelada sem nenhuma instrução adicional no código.
A cada novo candle, a plataforma atualiza os preços do par OCO conforme os valores enviados pelo código.
Breakeven é mover o stop loss para o preço de entrada após o mercado andar a favor.
Se o preço voltar, a operação fecha no zero a zero — sem lucro, sem prejuízo.
O risco original da operação é eliminado.
Realização parcial é encerrar parte da posição no lucro e deixar o restante correr.
Garante um ganho concreto enquanto mantém exposição ao movimento maior.
1️⃣ Entrada: detecta cruzamento de médias móveis (rápida acima da lenta). Se não há posição, envia BuyAtMarket com uma quantidade de contratos.
2️⃣ Fase 1 — OCO com alvo intermediário:
Com posição aberta a plataforma recebe o par OCO:
BuyPrice - StopPontos para o total de contratos e BuyPrice + AlvoIntermediario para o fechamento parcial.Se o stop for atingido primeiro, toda a posição é encerrada.
3️⃣ Fase 2 — Breakeven + alvo final:
Ao atingir o alvo intermediário, o fechamento parcial é realizado com lucro parcial.
O stop move automaticamente para BuyPrice (break-even) e o alvo passa a ser o alvo final em BuyPrice + AlvoPontos — ambos para os contrato restante.
A partir deste ponto, a operação é “de graça”: o pior cenário é sair com o lucro parcial.
4️⃣ Saída e recomeço: Os contratos restantes saem pelo alvo final (lucro máximo) ou pelo breakeven (zero a zero).
Sem posição, o código volta a monitorar cruzamento de médias para nova entrada.
Constantes (OCO e gestão de saída):
| Constante | Valor | Descricao |
|---|---|---|
| StopPontos | 800 | Distância do stop em relação ao preço de entrada, em pontos |
| AlvoPontos | 1000 | Distância do alvo final em relação ao preço de entrada, em pontos |
| AlvoIntermediario | 200 | Distância do alvo intermediário que aciona breakeven e realização parcial |
| PosicaoTotal | 3 | Tamanho total da posição |
| FechamentoParcial | 1 | Tamanho do fechamento parcial |
Parâmetros (sinal de entrada):
| Parametro | Padrao | Descricao |
|---|---|---|
| PeriodoMediaRapida | 9 | Período da média móvel rápida usada no sinal de entrada |
| PeriodoMediaLenta | 21 | Período da média móvel lenta usada no sinal de entrada |
// ========== OCO COM BREAKEVEN E REALIZAÇÃO PARCIAL ==========
// Entrada por cruzamento de médias móveis.
// Fase 1: stop + alvo intermediário. Ao atingir alvo intermediário,
// realiza fechmaneto parcial e move stop para breakeven.
// Fase 2: stop no breakeven + alvo final para a posição restante.
const
StopPontos = 800;
AlvoPontos = 1400;
AlvoIntermediario = 1000;
PosicaoTotal = 3;
FechamentoParcial = 1;
parametro
PeriodoMediaRapida(9);
PeriodoMediaLenta(21);
var
mediaRapida, mediaLenta, stopAtual : real;
breakevenAtivado, condicaoCompra : booleano;
inicio
mediaRapida := Media(PeriodoMediaRapida, Fechamento);
mediaLenta := Media(PeriodoMediaLenta, Fechamento);
condicaoCompra := (mediaRapida > mediaLenta) e (mediaRapida[1] <= mediaLenta[1]);
se nao HasPosition entao
inicio
breakevenAtivado := falso;
se condicaoCompra entao
BuyAtMarket(PosicaoTotal);
fim;
se IsBought entao
inicio
se (Fechamento >= BuyPrice + AlvoIntermediario) entao
breakevenAtivado := verdadeiro;
se breakevenAtivado entao
stopAtual := BuyPrice
senao
stopAtual := BuyPrice - StopPontos;
se (BuyPosition = PosicaoTotal) entao
inicio
SellToCoverStop(stopAtual, stopAtual, BuyPosition);
SellToCoverLimit(BuyPrice + AlvoIntermediario, FechamentoParcial);
fim
senao se (BuyPosition < PosicaoTotal) entao
inicio
SellToCoverStop(stopAtual, stopAtual, BuyPosition);
SellToCoverLimit(BuyPrice + AlvoPontos, BuyPosition);
fim;
fim;
fim;
| Situacao | Significado | |
|---|---|---|
| ✅ | BuyPosition = PosicaoTotal, stop e alvo intermediário visíveis | Fase 1 ativa — aguardando alvo intermediário ou stop |
| ✅ | Alvo intermediário atingido, BuyPosition cai | Realização parcial executada, lucro parcial garantido |
| ✅ | Stop moveu para BuyPrice, alvo final visível | Fase 2 ativa — operação “de graça” (pior caso: zero a zero) |
| ❌ | Stop atingido na Fase 1 | Perda total: 2 contratos × StopPontos |
| ✅ | Alvo final atingido na Fase 2 | Lucro máximo: parcial (intermediário) + restante (alvo final) |