tradingview:backtesting:envio_de_ordens
Tabela de conteúdos
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