Saídas e tamanho da posição
Acrescente saídas por stop e alvo à estratégia e confira as distâncias definidas em ticks.
A primeira estratégia encerrava a posição apenas no cruzamento oposto. Agora também vamos usar distâncias de perda e de ganho em relação ao preço de entrada. O encerramento por cruzamento será mantido.
Três motivos diferentes de saída
Neste exemplo, três eventos podem encerrar a posição comprada:
- o preço atinge o nível da ordem de stop de perda;
- o preço atinge o nível da ordem limitada de realização de lucro;
- a média rápida cruza a lenta para baixo, e o encerramento a mercado é executado.
O stop e a ordem limitada têm condições de preço. strategy.close envia uma ordem de encerramento a mercado. Suas regras de execução podem ser diferentes; por isso, confira tanto o preço quanto o instante na tabela de operações.
Distância ou preço específico?
Na chamada de strategy.exit, você pode usar dois tipos de definição:
| Argumento | O que você informa? |
|---|---|
loss | A distância de perda em ticks |
profit | A distância de ganho em ticks |
stop | Um preço de stop específico |
limit | Um preço limite específico |
loss=100 não significa 100 por cento nem necessariamente 100 unidades monetárias. Você está solicitando uma distância de cem ticks em relação ao preço de entrada.
O tamanho do tick de DEMO é 0,01. Assim, cem ticks são 1 unidade de preço; duzentos ticks são 2 unidades. Em uma entrada comprada a 200, isso corresponde a um stop em 199 e um alvo em 202, sem os efeitos adicionais da derrapagem e das condições de execução.
O programa completo
Crie o arquivo protected_strategy.py:
"""
@pyne edge
"""
from pynecore.lib import close, color, input, plot, script, strategy, ta
@script.strategy(
"Crossing Strategy with Exits",
overlay=True,
initial_capital=10000,
default_qty_type=strategy.fixed,
default_qty_value=1,
pyramiding=1,
commission_type=strategy.commission.percent,
commission_value=0.1,
slippage=2,
)
def main(
fast_length: int = input.int(5, title="Fast length", minval=1, maxval=200),
slow_length: int = input.int(20, title="Slow length", minval=1, maxval=200),
stop_ticks: int = input.int(100, title="Stop distance (ticks)", minval=1),
target_ticks: int = input.int(200, title="Target distance (ticks)", minval=1),
):
fast_average = ta.sma(close, fast_length)
slow_average = ta.sma(close, slow_length)
crosses_up = ta.crossover(fast_average, slow_average)
crosses_down = ta.crossunder(fast_average, slow_average)
if crosses_up:
strategy.entry("Long", strategy.long)
if crosses_down:
strategy.close("Long")
strategy.exit("Bracket", "Long", loss=stop_ticks, profit=target_ticks)
plot(fast_average, "Fast average", color=color.blue, linewidth=2)
plot(slow_average, "Slow average", color=color.orange, linewidth=2)Bracket é o identificador do grupo de ordens de saída. O segundo argumento, Long, informa a qual entrada ele está associado. loss e profit usam os dois inputs definidos acima.
Executamos a chamada de saída em cada candle, com o mesmo identificador. Ela gerencia a regra de saída definida; não abre uma posição inteira nova e independente a cada chamada.
Execute o programa com os dados de demonstração. Na tela Trades, além dos encerramentos a mercado por cruzamento, também podem aparecer saídas de Bracket.

Quando a saída de proteção aparece?
O programa pode enviar a instrução de entrada e a saída associada na mesma execução. O ambiente de execução consegue relacionar a distância em ticks com o preço efetivo da entrada.
Se, em vez disso, você calculasse um preço stop específico com base no fechamento do sinal, esse nível partiria do preço do sinal. Se a próxima abertura fosse diferente, a distância até a entrada real já não seria a mesma.
Por isso, escolha a forma de definição conforme a regra desejada. loss é uma distância em ticks em relação à entrada; stop é um nível de preço específico.
Um candle não contém todos os movimentos do preço
Os dados OHLCV informam abertura, máxima, mínima e fechamento. Eles não fornecem automaticamente a ordem cronológica de todos os preços intermediários dentro do candle.
Se a máxima de um candle atingir o alvo e a mínima atingir o stop, esses quatro preços, sozinhos, não dizem qual aconteceu primeiro. Nessa situação, o simulador aplica as regras do modelo de execução. Dados de um período menor podem permitir uma análise com outra resolução.
Confira esse caso separadamente, sem escolher sempre o resultado mais favorável à mão. A hipótese do modelo faz parte do resultado.
O preço de stop também não garante o preço exato de execução. Se o próximo candle abrir além do stop, a execução poderá acontecer em um preço menos favorável que o nível ultrapassado pelo gap. A derrapagem também pode causar outra diferença de preço.
Distância e perda monetária
Em uma posição comprada de uma unidade com valor por ponto 1, uma distância de 100 ticks de tamanho 0,01 representa 1 unidade monetária de diferença de preço. Com dez unidades, o resultado de preço é dez vezes maior.
A quantidade, o tamanho do tick e o valor por ponto determinam juntos a dimensão monetária do movimento até o stop. A comissão e as condições efetivas de execução também entram no resultado.
Se você informar qty diretamente na ordem, esse será o tamanho daquela ordem. O exemplo usa a quantidade padrão, que também pode ser substituída no campo Properties → Order size.
Os valores 100 e 200 ticks usados no exercício DEMO são ilustrativos. Em outro instrumento, os mesmos números podem representar distâncias de preço e valores monetários diferentes.
Tente por conta própria
Mantenha iguais os comprimentos rápido e lento, a quantidade e os custos. Execute uma versão com distâncias de stop/alvo 100/200 e outra com 200/400. Confira o que aconteceu com o mesmo sinal de entrada.
Solução do exercício
Na tela Inputs, altere apenas Stop distance (ticks) e Target distance (ticks). Distâncias maiores podem fazer a posição encerrar em outro candle ou por outro motivo.
O encerramento por cruzamento continua nas duas versões. Por isso, um alvo mais distante não significa que a posição permanecerá necessariamente aberta até alcançá-lo. As regras de saída atuam em conjunto.
Depois de salvar os inputs, aguarde sempre o recálculo e só então leia o novo resultado. Preserve as duas exportações com nomes diferentes se quiser compará-las depois.
Identifique o motivo da saída
Escolha uma operação encerrada e confira o preço de entrada, as distâncias em ticks e os valores OHLC do candle de saída. Com base no preço e no instante da saída, determine qual regra explica a operação. Se o candle tocar vários níveis, considere também o modelo de execução.