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:

ArgumentoO que você informa?
lossA distância de perda em ticks
profitA distância de ganho em ticks
stopUm preço de stop específico
limitUm 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.

A execução de protected_strategy.py no PyneIDE; as operações também podem ser encerradas por saídas de stop ou de alvo.
Além do encerramento por cruzamento, a estratégia usa um stop e um alvo definidos em ticks.

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.