NinjaScript, o C # API usado para estratégias de programação em NinjaTrader, Tenta stirke um equilíbrio entre fazer o processo de desenvolvimento de estratégia mais simples possível, preservando a flexibilidade nos tipos de estratégias que pode suportar. Ele lida com esses requisitos concorrentes pelas estratégias de divisão em dois tipos de métodos de ordem. Muitos programadores dentro da comunidade NinjaTrader também se referem a esses tipos como abordagens.
Abordagem Managed
A primeira e mais comum método de ordem é uma abordagem de gestão. The managed approach is also the default assumption that NinjaTrader assumes you’re using when writing a strategy.
I backtest estratégias desta maneira 90%+ do tempo. It’s way easier to write them using a managed approach once all of the variables and properties are set up. NinjaScript torna disponível um número de métodos que todos inter-relacionam. Os nomes e funcionalidade de cada um é óbvio. Digite Longo(), por exemplo, entra um longo comércio.
Todos estes métodos têm premapped relações entre cada outra. Quando a estratégia exige ExitLong(), NinjaTrader cuida dos detalhes, como saber que há muito tempo que ele precisa para sair. Isso parece bastante óbvio, mas muitas aplicações comerciais não ligar os pontos tão facilmente entre funcionalidade de negociação. MetaTrader 4 & 5 são bons exemplos deste tipo de funcionalidade simples não estar disponível.
A facilidade com que decisões de negociação são manipuladas é ideal para o desenvolvimento rápido e sujo de código para testar idéias simples. A maioria das minhas idéias de estratégia seguem o princípio KISS; mantê-lo simples, estúpido. It’s usually a very simple development process (10-20 atas) programar e testar uma idéia de negociação a partir do momento em que ele entra na minha mente. Most ideas don’t work out, mas pelo menos eu tenho a satisfação de saber a resposta rapidamente.
Eu descobri a maneira dura que a abordagem gestão faz suposições sobre a manipulação fim. Digite o limite de Longo(), por exemplo, exclui automaticamente uma ordem de limite pendente após um bar. Lembro-me de passar várias horas com uma estratégia vivo tentando descobrir por que tantos de meus pedidos digitado corretamente em cartas de carrapatos, apenas para tê-los desaparecer no próximo tick. Cuidadosamente debruçado sobre a documentação me levou a descobrir um método sobrecarregado com o parâmetro liveUntilCandelled.
It’s examples like this pre-programmed functionality that you need to watch out for. This is especially true if you have a bug that doesn’t make sense in the context of your strategy.
Abordagem não gerenciado
Uma abordagem não gerenciado tira todos os pressupostos que NinjaTrader faz enquanto a estratégia é executado em tempo real. Esta opção deixa para o codificador para armazenar o status de posição na memória e tomar decisões apropriadas.
Every strategy that we’ve written with unmanaged orders uses pending parar e limitar as ordens. Um exemplo recente envolve uma estratégia de criação de mercado na Interactive Brokers. A estratégia é 100% no mercado durante os EUA e sessões asiáticas. Nós originalmente começou com uma abordagem de gestão, mas teve problemas com as comissões e overfills.
A estratégia é apenas trading 2 lotes mini durante a fase de testes, que é o tamanho mínimo de comércio. Embora a comissão padrão de 0.2 pips por lado é bastante baixa, a comissão mínima é $2.50. That’s relatively high for such a small position size. Notei no primeiro dia que o meu cliente estava recebendo comissões cobradas para a perna entrada e saída perna, respectivamente.
O primeiro comércio entrou com 20k. Quando chegou a hora de sair, a abordagem de gestão definir um limite de saída para 20k e um limite de entrada separada para outro 20k. IB cobrado comissões duas vezes para ambas as ordens, que custo $5 por turno rodada comercial. O relatório de negociação parecia:
O BOT 20K $2.50
20k SLD $2.50
20k SLD $2.50
BOT 20k $ 2.5o
O BOT 20K $2.50
20k SLD $2.50
O BOT 20K $2.50
20k SLD $2.50
That’s effectively 4 comercializa a um custo de $20.
Agrupando os comércios em um único fim de mais ou menos cortar as comissões pela metade. I found it easier to do with an unmanaged approach because I didn’t have to worry about how the Entry() e Exit() métodos iria interagir. O relatório comércio alterado para:
O BOT 20K $2.50
40k SLD $2.50
BOT 40k $2.50
40k SLD $2.50
O BOT 20K $2.50
A mesma sequência agrupados cai o custo do 4 comércios para baixo para $12.50. A entrada inicial e o custo de saída final $2.50, mas os negócios realizados entre só paga $2.50 para a entrada e saída combinada. Quando o tamanho da ordem aumenta a lotes padrão, as economias de comissão irá melhorar dramaticamente o retorno do cliente.
A outra razão que nós mudamos para uma abordagem não gerenciado foi que NinjaTrader mata uma estratégia sempre que ocorre um transbordo. Um transbordo é quando uma estratégia solicita o cancelamento de uma ordem pendente, mas que a ordem pendente fica cheio antes da solicitação de cancelamento chega. Em seguida, sai a nova posição no mercado e desliga a estratégia.
Eu encontrei esta quase intolerável com uma estratégia de criação de mercado porque um transbordo quase certamente ocorrer pelo menos uma vez por dia. Ordens não gerenciadas tem a opção de desabilitar uma sobrecarga e lidando com isso de maneira que o comerciante julga apropriado. No meu caso, foi simplesmente aumentar a quantidade de posição que a estratégia de se tentar sair.
A principal desvantagem para encomendas não gerenciados é que tudo é controlado internamente. Se você precisa desativar uma estratégia para alterar as configurações ou perder a conexão corretor, o código provavelmente não vai interagir muito bem com as posições que já estão abertas. Quaisquer objetos de IOrder foram armazenados na memória, que é como a estratégia sabe o que as posições estão abertas, desaparecem quando a estratégia é removido a partir de um gráfico.
Estratégias não gerenciados também levar muito mais tempo para testar. A quantidade de código envolvido não difere drasticamente de ordens gerenciados. It’s larger, mas não tão grotescamente. A razão que leva mais tempo é que a interação entre os tipos de ordem não é polido, como é em ordens gerenciados. O programador deve escrever tudo do zero, que invariavelmente significa que a estratégia vai sofrer de muitas mais bugs iniciais, especialmente em um ambiente vivo.
Estratégias que dependem de ordens de mercado não precisa considerar esta abordagem na minha opinião. Isso faz com que muito mais trabalho e eu ainda tenho que encontrar uma situação em que faz sentido. Mais importante, I can’t think of a hypothetical situation where it would make sense either.
Deixar uma resposta