Ferramentas do usuário

Ferramentas do site


tradingview:backtesting:envio_de_ordens

Envio de Ordens

Comandos de Envio de Ordens

  • Todas as palavras reservadas relacionadas a estratégias começam com o prefixo strategy.
  • Os seguintes comandos são usados para enviar ordens:
  • strategy.entry
    • Este comando apenas coloca ordens de entrada.
    • Esta é afetada pela configuração pyramiding nas propriedades da estratégia ou pela função strategy.risk.allow_entry_in.
    • Se há uma posição a mercado aberta quando uma ordem na direção contrária é gerada, o número de contratos/lotes/unidades será aumentada pelo número de contratos atualmente abertos, equivalente a: strategy.position_size + quantity. Como resultado - o tamanho da posição a mercado aberto será igual ao especificado no comando strategy.entry.
  • strategy.order
    • Este comando coloca ordens de entrada e saída.
    • Este não é afetado pela configuração pyramiding nas propriedades da estratégia ou pela função strategy.risk.allow_entry_in.
    • Este permite criar ordens complexas de entrada e saída quando os comandos strategy.entry ou strategy.exit não serão suficientes.
  • strategy.exit
    • Este comendo apenas coloca ordens de saída.
    • Este permite sair de uma posição a mercado aberta ou formar múltiplas estratégias de saída usando stop loss, profit target ou trailing stop.
      • Estas fazem parte do grupo strategy.oca.reduce.
    • Uma ordem de saída não pode ser colocada se não há uma posição aberta ou se não há uma ordem de entrada ativa (uma ordem de saída está associada a uma ordem de entrada pelo seu ID).
      • Não é possível sair de uma ordem a mercado usando strategy.exit
      • Neste caso strategy.close ou strategy.close_all devem ser usadas.
    • Se o número de contratos/lotes/unidades especificado para strategy.exit for menor que o tamanho de posição atualmente aberto, a saída será parcial.
    • É possível sair de uma mesma ordem de entrada mais de uma vez usando o mesmo ID de saída.
    • Em casos onde a posição de mercado é formada por múltiplas ordens de entrada (pyramiding habilitado), cada ordem de saída deve estar associada a sua respectiva ordem de entrada.

Exemplos

  • Neste exemplo - a estratégia constantemente reverte a posição de mercado de +4 para -6 repetidamente.
//@version=4
strategy("Reversão Demo")
 
if bar_index < 100
    strategy.entry("compra", strategy.long, 4, when=strategy.position_size <= 0)
    strategy.entry("venda", strategy.short, 6, when=strategy.position_size > 0)
 
plot(strategy.equity)
  • Neste exemplo - a estratégia demonstra um caso onde a posição de mercado nunca é fechada por que usa saídas parcial e não pode ser executada mais de uma vez. Se você duplicar a linha de saída (strategy.exit) a posição será fechada.
//@version=4
strategy("Uma Saída Demo")
 
strategy.entry("compra", strategy.long, 4, when=strategy.position_size <= 0)
strategy.exit("saida", "compra",  2, profit=10, loss=10)
  • Neste código 2 níveis de saída são gerados (2 take profit e 2 stop loss). Ambos níveis são ativados ao mesmo tempo: primeiro nível para sair de 2 contratos e o segundo para sair do restante.
//@version=4
strategy("Saída Parcial Demo")
if bar_index < 100
    strategy.entry("compra", strategy.long, 4, when=strategy.position_size <= 0)
strategy.exit("bracket1", "compra", 2, profit=10, stop=10)
strategy.exit("bracket2", "compra", profit=20, stop=20)
  • As primeiras ordens take profit e stop loss (nível 1) estão em um grupo OCA.
  • As outras ordens (nível 2) estão em outro grupo OCA.
  • Isso significa que uma ordem do nível 1 é preenchida - ordens do nível 2 não são canceladas - elas se mantém ativas.

IDs de Ordens

  • Cada comando que envia uma ordem tem um ID (um valor string) que é um identificador único de uma ordem. Se uma ordem com o mesmo ID está colocada porém ainda não foi preenchida - o último comando irá modificar a ordem existente.
    • Se a modificação não for possível (coversão de compra para venda) - a ordem antiga é cancelada e uma nova ordem é enviada.
    • strategy.entry e strategy.order trabalham com os mesmos IDs (podem modificar as mesmas entradas de ordens).
    • strategy.exit trabalha com IDs de outras ordens (é possível ter uma ordem de entrada e de saía com o mesmo ID).
    • Para cancelar uma ordem específica usando seu ID, o comando é strategy.cancel(string ID)
    • Para cancelar todas as ordens pendentes o comando é strategy.cancel_all()

Envio vs Execução

  • Ordens de estratégias são enviadas assim que as condições definidas sejam satisfeitas e o comando chamado no código.
  • O emulador do TradingView não executa a ordem antes antes do próximo tick acontecer enquanto em mercados reais isso pode acontecer antes.
  • Quando uma ordem a mercado é gerada no fechamento da barra atual, o emulador apenas executa a ordem na abertura do preço da próxima barra.
//@version=4
strategy("Execução Próxima Barra Demo")
if bar_index < 100
    strategy.order("compra", strategy.long, when=strategy.position_size == 0)
    strategy.order("venda", strategy.short, when=strategy.position_size != 0)
  • Com o código acima todas as ordens são preenchidas na abertura de cada barra.
  • Condições para envio da ordem (when, pyramiding, strategy.risk) são testadas quando o script é calculado.
    • Se todas as condições são satisfeitas a ordem é enviada.
    • Se qualquer condição não for satisfeita a ordem não é enviada.
    • É importante cancelar ordens enviadas a preço (ordens limite, stop, stop-limite)
//@version=4
strategy("Entrada no Preço Demo")
var c = 0
if year >= 2018
    c := c + 1
if c == 1
    strategy.order("C1", strategy.long, 2, stop = high + 35 * syminfo.mintick)
    strategy.order("C2", strategy.long, 2, stop = high + 5 * syminfo.mintick)
  • Mesmo que pyramiding esteja desabilitado, ambas ordens serão preenchidas no backtesting porque quando são geradas não há posições de compra abertas no mercado.
  • Ambas ordens são enviadas e quando o preço satifaz a condição de execução, ambas são executadas.
  • É recomendado colocar as ordens em grupos OCA usando strategy.oca.cancel.
  • Desta forma apenas 1 ordem é executada e a outra é cancelada.
  • Código modificado:
//@version=4
strategy("Entrada no Preço Demo v2")
var c = 0
if year > 2020
    c := c + 1
if c == 1
    strategy.order("C1", strategy.long, 2, stop = high + 35 * syminfo.mintick, oca_type = strategy.oca.cancel, oca_name = "COMPRAS")
    strategy.entry("C2", strategy.long, 2, stop = high + 5 * syminfo.mintick, oca_type = strategy.oca.cancel, oca_name = "COMPRAS")
  • Se, por algum motivo, as condições de envio de ordens não são satisfeitas ao executar o comando - a entrada não é enviada. Por exemplo, se configurações de pyramiding estão definidas em 2, a posição existente já contém 2 entradas e a estratégia tenta uma terceira, isso não acontecerá.
  • As condições de entrada são testadas no estágio da geração da ordem e não no estágio da execução.
  • Portanto, se você enviar 2 entradas no preço com pyramiding desabilitado, assim que uma delas seja executada a outra não será cancelada automaticamente.
  • Para evitar problemas recomendamos usar grupos strategy.oca.cancel para entradas para que quando uma entrada seja preenchida a outra seja cancelada.
  • O mesmo é válido para ordens de saída no preço, ordens serão enviadas uma vez que suas condições sejam satisfeitas uma ordem de entrada com um ID equivalente é preenchida.


tradingview/backtesting/envio_de_ordens.txt · Última modificação: 05/04/2023 08:25 por 127.0.0.1