Projeto Meta COT - Novos Horizontes para Analise do Relatório da CFTC em MetaTrader 4

Vasiliy Sokolov | 26 outubro, 2015

Introdução

O movimento de preços do mercado não é causado subjetivamente pelas ondas Elliott, linhas Gann, níveis Fibonacci ou por indicadores técnicos. Nenhum deles contêm quaisquer novos bits de informações em relação ao gráfico de preços no formato OHLCV. O movimento de preços é determinado pela lei fundamental da oferta e demanda. Não importa o quão trivial possa parecer, mas a demanda e a oferta determinam o preço.

O preço é o resultado da interação entre compradores e vendedores, muitos traders sabem desta regra, mas poucos usam isto nas suas negociações. A aplicação prática desta lei abrangente do mercado provavelmente é extremamente útil para quem já se atreve a prever os preços futuros. Este artigo é uma espécie de "condutor" de postulados teóricos da economia para a sua aplicação na negociação dos mercados futuros e de commodities.

A teoria econômica afirma sobre a possibilidade da existência de fases "sobrecompradas" e "sobrevendidas" do mercado, estas fases são críticas ao mercado. Um outro movimento ascendente dos preços na zona "sobrecomprada" está se tornando mais difícil devido a crescente concorrência da oferta. Um outro movimento ascendente dos preços na zona "sobrevendida" também está se tornando mais difícil devido a crescente concorrência da demanda. Em ambos os casos, o mercado está próximo da sua reversão no longo prazo. Estas declarações podem parecer simples e muito inútil, devido ao fato de que a teoria econômica não propõe qualquer método para determinar estas fases do mercado. No entanto, esses métodos existem verdadeiramente e foram desenvolvidos há muito tempo por traders bem sucedidos.

Este artigo é um caminho entre a teoria e a prática, tem o objetivo de inserir o leitor nos métodos de determinação das fases do mercado, com base em indicadores simples, descrito no livro "Trade Stocks and Commodities With the Insiders: Secrets of the COT Report", escrito pelo famoso trader Larry Williams, porém o livro não se tornou muito popular e o material não foi amplamente utilizado. Uma das principais razões para este fato é que todos os conceitos apresentados no livro ficaram na teoria.

Depois de ter sido traduzido ao russo a mais de dois anos, ainda não foi proposto qualquer software universal e útil para ser concebido no terminal MetaTrader4, a plataforma de negociação mais popular na Rússia. Este artigo vem preencher esta lacuna. Agora qualquer um poderá testar e usar a teoria do Larry Williams na prática, usando seu próprio terminal de cliente MetaTrader 4.

O método da análise do mercado atual usando o Relatório COT (Commitments of Traders) pode ser considerado como uma análise fundamental. Os traders não tem encontrado uma ampla aplicação da análise fundamental em si. Não é nenhum segredo que a maioria dos traders usa somente análise técnica na negociação real, isto se deve ao fato de que a análise fundamental está muitas vezes relacionada com a liberação das notícias econômicas, sendo impossível prever a reação do mercado sobre elas.

Em segundo lugar, essa análise não é parametrizada, sendo assim muito subjetiva.

Em terceiro, a análise fundamental é potencialmente infinita. Isso significa que você analisa apenas uma certa parte dos efeitos econômicos afetando o mercado, a outra parte nem sempre é considerado pelo trader, mas será considerado pelo mercado. O uso automatizado dos relatórios da CFTC eliminaria todas as fraquezas da análise fundamental, o método de Larry Williams proporciona as melhores características de análise técnica a estes relatórios em termos de tecnologia. Em primeiro lugar isto significa que todos os efeitos econômicos significativos podem ser considerados indiretamente, através da observação das ações dos três grupos participantes do mercado.

Em segundo, todas estas observações podem ser reduzidas com os indicadores técnicos simples, reduzindo a subjetividade e ambigüidade,

Sendo possível criar um Expert Advisor usando somente as regras da análisea fundamental simples para negociação. Um desses desenvolvimentos é apresentado aqui. Eu acho que ele pode ser útil para qualquer um que decida usar o relatório da CFTC para uma negociação.


A primeira parte do artigo é sobre a teoria econômica da oferta e demanda. Usando exemplos simples, o modelo de mercado é descrito, sendo que a existência das diferentes fases do mercado já está comprovadíssima. A segunda parte é sobre os métodos de análise de dados que são necessários para determinar a fase do mercado no momento presente. São incluidas as descrições de um conjunto de indicadores para analisar a interação dos compradores e vendedores. Está baseado principalmente no livro de Larry Williams, onde a utilização prática destes indicadores foi mostrada em detalhes. A terceira parte é sobre a execução técnica do Projeto Meta COT. Contém informações detalhadas sobre o uso do Expert Advisor, da utilização dos indicadores, scripts que estão incluídos no projeto e como transferir as informações necessárias. A quarta parte é a final. Vamos examinar o Expert Advisor e a eficácia do conceito apresentado no artigo. As conclusões finais são apresentados e algumas sugestões construtivas são propostas.


1. O Mercado Como Uma Função de Equilíbrio dos Preços

1.1 A lei da oferta e da procura (demanda)

O mercado é uma instituição ou mecanismo que reúne compradores ("demandas") e vendedores ("ofertas") de determinados produtos, serviços ou recursos. [3]

Não existe definição mais precisa do mercado do que o indicado na frase anterior. Na verdade a principal tarefa de qualquer abertura de mercado é juntar vendedores e compradores, as relações destes são reguladas pela lei da oferta e da procura. Esta lei fundamental fazem os preços das ações subirem ou cairem, permitindo aos traders tomares lucros ou perdas nos resultados da diferenças entre os preços futuros e os atuais. O trader deve conhecer o mecanismo da mudança no equilíbrio entre a oferta e a demanda, então vamos considerar o quadro seguinte [3]:


Oferta Total

Preço por alqueire(U.S.)

A demanda total por semana

Excedente (+) ou escassez (-)

12 000

5

2 000

+10 000

10 000

4

4 000

+6 000

7 000

3

7 000

0

4 000

2

11 000

-7 000

1 000

1

16 000

-15 000


Table 1-1. A oferta e demanda de milho (em milhares de alqueires)

Aqui é a conexão entre vendedores e compradores de milho, expressa em termos de preço e volume de entrega. Vendedores desejam vender seus produtos tão caro quanto possível e os compradores desejam comprar milho o mais barato possível, Neste caso, a um custo de $ 5 por alqueire, existem muitos vendedores que gostariam de vendê-lo. Sua oferta total será de 12 000 alqueires, mas o problema dos vendedores é que não existem tantos compradores dispostos a comprar por um preço tão alto. Existem compradores apenas para 2 000 alqueires por um preço tão alto. Os outros 10 000 alqueire (12 000 - 2 000 = 10 000) continuam na oferta , causando excedente de bens ao vendedores e escassez por parte dos compradores. Este preço é incapaz de permanecer no mercado, muitos vendedores irão cortar seus preços para se livrarem do excedente de bens e conseguir dinheiro vivo, mesmo sendo menos. Eles se juntarão a outros vendedores que desejam se antecipar a seus adversários. A concorrência entre os vendedores começará, o que irá reduzir os preços [3].

Agora, vamos considerar o caso contrário. Neste momento vamos supor que o preço do milho está muito baixo - US $ 1 por alqueire. Tal preço do milho será muito atraente aos compradores, existem muitos compradores que desejam comprar. A demanda total é de 16 000 alqueires. Mas haverá poucos vendedores querendo vender a esse preço. A quantidade (vendas) total de ofertas são apenas 1 000 alqueires, o que irá causar escassez de mercadorias entre os compradores, no valor de 15 000 alqueires, e os excedentes provenientes dos vendedores. Mais uma vez, este preço não permanecerá no mercado. Alguns dos compradores vão adquirir o milho a um preço mais elevado para obter os bens que necessitam. Estes compradores irão se juntar aos seus colegas e anteciparão ainda mais o aumento dos preços e estarão entre os primeiros que comprarão relativamente barato. A competição entre os compradores irá começar, o que vai aumentar o preço [3]

Para deixar claro, vamos chamar as funções de demanda e oferta no gráfico:



Figure 1-2. Oferta e Demanda em função do preço

Figure 1-2. Oferta e Demanda em função do preço



Foram considerados apenas os casos de distribuição extremas entre a demanda e a oferta. No primeiro caso, o preço vai cair; no segundo caso, o preço vai subir. Em ambos os casos, o ponto certo de equilíbrio será quando a demanda for igual a oferta. Neste ponto, não haverá escassez de bens entre os compradores, ou excedentes entre vendedores. Em nossa mesa, o tal ponto está localizado a 3 dólares. A esse preço, a oferta e a demanda total serão de 7 000 alqueires, quando haverá um equilíbrio cambial entre os compradores e vendedores, sem vender os bens remanescente ou nenhum déficit aparente.

Na vida real, a oferta e a demanda mudam sob a influência de muitos fatores, desde razões fundamentais a eventos aleatórios, em qualquer caso, haverá um único ponto de cruzamento da oferta e da demanda. Este ponto será o preço de mercado atual.

Considere um exemplo onde a oferta vai aumentar a uma demanda constante (ponto A-B na Figura 1-3, a). Neste caso, o preço vai cair (p1<p2), uma vez que os produtos se tornaram mais baratos e a concorrência entre os vendedores começará. Por outro lado, a quantidade de compradores que querem comprar bens a um preço melhor será maior (q3>q2).

Agora considere o caso quando as ofertas reduzem (ponto A para C na Figura 1-3a). Isto fará os preços ficarem mais elevados, pois haverá menos bens e a concorrência entre os compradores começará (p3>p2). Certamente os compradores querendo comprar a preços maiores serão bem menos.



Figura 1-3a. Alteração da oferta a uma demanda constante


O mesmo é verdadeiro quando aumenta a demanda (pontos A e B na Figura 1-3b), o preço começa a subir e haverá muitos querendo vender a um preço maior, o que resultaria em aumento da oferta total (q3>q2). No caso contrário, quando a demanda começa a cair, o preço vai cair e os vendedores querendo vender a um preço menor, portanto o número acumulado de oferta vai diminuir (q1<q2).



Figura 1-3b. Alteração da demanda a oferta constante


Agora, vamos considerar os casos onde a procura e a oferta estão mudando simultaneamente. São apenas quatro desses casos [3]:


1. A demanda diminui, a oferta aumenta. Cada um desses fatores leva separadamente aos preços mais baixos e, consequentemente, a queda do preço total será ainda maior do que se fosse causada por cada um dos fatores separadamente.

2. A demanda aumenta, a oferta aumenta. Esses fatores são mutuamente de compensação, uma vez que o crescimento da demanda leva ao aumento de preços e o crescimento da oferta leva à diminuição dos preços. De um modo geral, o movimento do preço dependerá de um fator mais forte.

3. A demanda diminui, a oferta diminui. A exemplo do caso anterior, o resultado é incerto. Com a diminuição da demanda, o preço vai cair, enquanto a diminuição de oferta leva ao aumento de preços. De um modo geral, o movimento do preço dependerá de um fator mais forte.

4. A demanda aumenta, a oferta diminui. O aumento da demanda leva ao aumento dos preços, exatamente como a diminuição da oferta leva ao aumento dos preços. Como resultado, o aumento do preço total será ainda maior do que se fosse causada por cada um dos fatores separadamente.

No mercado real, a oferta e a procura estão mudando a cada segundo e todos estes quatro casos são refletidos no valor de preço do mercado atual. Assim, o ponto de cruzamento da oferta e da demanda "caminha" no gráfico de preços e de volume, em diferentes períodos de tempo, estando em locais diferentes (veja a Figura 1-4):



Figura 1-4. A dinâmica da procura e da oferta


O mais importante, o ponto de cruzamento de oferta e demanda não pode ter grandes volumes a um baixo custo (por exemplo, localizado no quadrante superior esquerdo do gráfico), exatamente como ele não pode ter um preço alto para baixos volumes ( ou seja, localizado no quadrante inferior direito do gráfico). Para maior clareza, vamos nos voltar para a Figura 1-5:



Figura1-5. As Fases Mercado


Como já foi dito acima, os ofertantes irá se recusar a fornecer um grande volume a preços baixos (para vender muito e barato) e os compradores vão se recusar a fornecer uma alta demanda a preços elevados (para comprar um lote e caro). Logo é possível construir um modelo de qualquer mercado. A Figura 1.5 mostra um modelo. A linha pontilhada mostra o cruzamento médio da oferta e da procura. O ciclo completo de mercado podem ser dividido em três períodos ou fases:

1. Fase de Preços Baixos. É caracterizada por baixos volumes a preços reduzidos. A demanda não realizada no mercado dos compradores será alta, enquanto o mercado de ofertas será limitado. Nesta fase existe uma escassez de mercadorias entre os compradores e superávit de bens em estoque por parte dos vendedores Este momento acarretará competição entre os compradores, aumentando os preços

2. Fase de Preços Médios. Nesta fase existem preços aceitáveis com volumes suficientemente elevados. Não há falta de compradores e não há excessos por parte dos vendedores. Aqui está o ponto de equilíbrio ao preço e volume [3]. A Figura 1.5 é apresentada pelo ponto central.

3. Fase de Preços Altos. É caracterizada por preços elevados (P) com volumes elevados (Q). A oferta real dos produtores de bens será alta, enquanto a demanda de compradores será limitada. Os compradores relutam em comprar produtos e o desejo dos produtores em vender mais caro acarretará a concorrência dos produtores, baixando os preços

Em outras palavras, a lei da oferta e da procura determina o movimento de retorno e tendência do mercado. A médio prazo (na escala de tempo entre 1 até 1a6m aproximadamente), o mercado caminhará a partir da fase de preços baixos até fase dos preços mais altos, ou vice-versa, de modo que haverá uma tendência. A longo prazo ( um ano ou mais), o mercado caminhará para a fase de preços altos ou preços baixos, indo de encontro com a resistência dos compradores ou vendedores, onde contecerá uma retração, levando o mercado a caminhar lateralmente. O movimento do mercado pode ser comparado com a respiração. Depois de uma expiração completa é muito difícil de encontrar ar nos pulmões para continuar.

Contrariamente, a pressão entre o diafragma e os pulmões está no estado inferior à pressão atmosférica, assim o ar entra facilmente aos pulmões. Depois da completa a respiração, o volume dos pulmões é completamente preenchido e não há nenhuma possibilidade inspirar qualquer quantidade de ar. Nesta altura a pressão entre o diafragma e os pulmões torna-se maior do que da atmosférica, em consequência ocorre uma pressao contrária, emnpurrando o ar para fora dos pulmões, esse processo se repete de novo e de novo... processos semelhantes ocorrem no mercado. Os compradores decorrentes da concorrência (pressão negativa) forçam o mercado a aumentar os preços (inspira), enquanto os vendedores (pressão positiva) forçam o mercado a diminuir os preços (expira).

Como vimos acima, a escassez de produtos e o excesso de oferta são situações possíveis no mercado, mas também é verdade que a mesma quantidade será sempre comprada e vendida no mercado. Portanto, as conclusões de alguns analistas técnicos dizendo que o mercado é dominado pelos touros quando vêem uma tendência de alta, ou pelos ursos quando vêem uma tendência de queda, estão incorretas. O mercado sempre tem um número de contratos igual para touros (compradores) e ursos (vendedores). Se os preços estão baixos, há uma quantidade limitada de bens a venda no mercado, então a maioria dos proprietários dos bens aguarda o final destes períodos.


Em outras palavras, se o produto é o trigo, ele permanece no armazém ou no banco se for um moeda, assim os compradores são incapazes de comprar os produtos nas quantidades que eles querem. Usando a terminologia padrão, esta situação pode ser chamada de "sobrecomprada". O caso oposto, onde os preços são elevados e todo o excedente de bens por parte dos vendedores está no mercado, pode ser chamada de "sobrevendida". Então vamos ver como é o mercado sobrecomprado e sobrevendido.



1.2 O preço é a primeira variável da equação de demanda e oferta

Para ilustrar os exemplos das máximas e mínimas dos preços, vamos considerar as barras semanais de açúcar:



Figura 1-6. Açúcar, barras semanais


Sabemos que para preços relativamente baixos haverão poucos vendedores, logo o volume de bens apresentados no mercado também será relativamente pequeno. Ao contrário, preços do mercado elevados, logo o volume de bens será maior. O preço em si nos fala sobre a possibilidade do excesso de oferta ou escassez de bens. No entanto, essa suposição é muitas vezes rude e subestimada. Embora o volume de bens e preços estão correlacionados entre si, não existe uma relação linear direta entre eles.

A preços relativamente elevados, não pode haver um volume relativamente pequeno de bens, porém em volumes relativamente elevados pode haver preços relativamente baratos. Isto se deve ao fato que as ofertas e demandas raramente são lineares, quase sempre tanto estão sujeitas a elasticidade dos preços das demandas quanto a elasticidade dos preços das ofertas [5]. O segundo problema determinante aos volumes de mercado é a "relatividade" da tal abordagem dos preços. Como podemos determinar o quanto estão alto os preços e o quanto estão baixos?

Sabemos que o mercado não vai contra a tendência a longo prazo, então por que não criarmos um indicador dos estados sobrecomprados e sobrevendidos do mercado, usando-os para abrir posições vendidas quando o mercado atinge as máximas dos preços e para abrir posições compradas,quando alcança as mínimas dos preços? O resultado deve ser obtido com uma utilização simultânea de todas as propriedades do mercado - quando é a favor da tendência e quando é contra a tendência.

Muitos indicadores técnicos foram desenvolvidos durante osúltimos cinqüenta anos com a tentativa de determinar os estados sobrecomprados e sobrevendidos do mercado, porem todos eles têm um problema sério - são baseados em apenas uma variável da demanda e da oferta, esta variável é o preço. A mudança do preço é a última coisa que acontece no mercado após a mudança do equilíbrio entre oferta e demanda.

Consequentemente, na melhor das hipóteses, um trader usando qualquer indicador com base no preço será o último a acompanhar a mudança de preço, porém nunca poderá antecipá-lo. Simples testes de computador mostram a inconsistência desta abordagem.

Aqui está um gráfico de lucro com base num sistema elementar do indicador RSI:




Figura 1-7. A dinâmica de lucro do Expert Advisor, com base no indicador RSI. EURUSD, barras diárias, de 2000 a 2009.


O sistema é elementar. Se período RSI = 7 alcança 80 %, abre uma posição vendida. Se período RSI = 7 alcança 20 %, abre uma posição comprada.O período personalizado foi escolhido para abertura de mais ofertas. O stop é de 100 pontos, e a saida da posição com lucro é de 200 pontos. Os testes realizados no EURUSD, de 2000 a 2009, usando as barras diárias. O lote de negociação foi uma constante fixa igual a 0.1 em todas as operações.

As conclusões são inequívocas: usando somente os dados de preços não é o suficiente para determinar a fase do mercado. Precisamos de uma segunda variável da equação da oferta e demanda - o volume do mercado.



1.3 O Contrato em Aberto (Open Interest) é a segunda variável da equação da demanda e oferta

É surpreendente que para muitos mercados existe uma oportunidade de conhecer o seu volume até um contrato, analisando os valores dos contratos em aberto.

O "Open Interest" é o número de contratos do mercado de futuros e/ou opções e não são compensados por ofertas, entrega, etc.. O Contrato em Aberto (Open Interest) é a soma de todas as posições compradas ou vendidas [1]. Por exemplo, se a soma de todas as posições compradas no mercado é igual a 1000 contratos, isso significa que a soma de todas as posições vendidas no mesmo mercado também é igual a 1000 contratos, bem como o "Open Interest" de 1000 contratos são os mesmos. A fórmula para contratos abertos é apresentada abaixo:

O comprador e o vendedor de um contrato futuro do trigo irá colocar uma unidade para um Contrato em Aberto.

É importante entender a diferença entre o Contrato em Aberto (Open Interest) e o volume do mercado. Por exemplo, durante um dia 1 000 000 contratos podem ser negociados, mas isso não significa que existem produtos para 1 000 000 de contratos. Pode ser muito menor, apenas durante o dia os contratos passaram de mão em mão, aumentando o volume diário. No final do dia, nem todas as posições são fechadas, muitas delas são roladas no dia seguinte. O número de contratos em aberto é o Indicador "Open Interest ". Os produtores de bens estão olhando para cobrir os seus riscos através da compra de futuros a longo prazo, assim eles tem um compromisso da entrega efetiva das mercadorias. Reflete-se nos valores do "Open Interest" (contratos em aberto). Assim, em certo sentido o "Open Interest" poderia ser uma medida do volume dos bens no mercado.

Ele é calculado diariamente, no final de cada sessão em todos os mercados futuros. Esta informação está aberta e geralmente disponibilizada nos sites oficiais das bolsas de futuros. Os mesmos dados no "Open Interest" podem ser obtidos, assinando os sinais pagos como o "e-Signal". Para os usuários MetaTrader, os dados do "Open Interest" para mais de 40 mercados podem ser obtidos utilizando o indicador "Open Interest", que faz parte da projeto Meta COT apresentado aqui. Mais informações sobre a sua utilização, olhar a terceira parte do artigo.

Infelizmente, a informação sobre "Open Interest" (bem como para todos os outros tipos de dados referidos neste artigo) não está disponível nos mercados "spot" e de ações, devido a estrutura e propriedades. No entanto, devido à forte correlação entre os os mercados "spot" e futuros, torna-se possível as negociações no mercado spot, orientadas pela dinâmica da oferta e da procura no mesmo mercado de futuros. Por exemplo, você pode analisar a dinâmica do "Open Interest" no mercado de futuros do EURO, mas negociando no mercado "spot" do EURUSD. Para uma representação mais precisa, vamos utilizar os futuros somente no gráfico.

Agora vamos olhar a dinâmica do "Open Interest" do Ouro por um longo período de tempo:



Figura 1-8. Ouro, gráfico semanal


Na Figura 1-8 vemos o gráfico de preço (superior) e o gráfico "Open Interest" (inferior) para os mercados futuros de ouro no intervalo de 2.003 a 2.009. Pode-se ver que quando os valores " Open Interest" eram relativamente elevados em comparação com os seus valores anteriores, o mercado começou a ir para baixo. Ao mesmo tempo, quando os valores em aberto eram baixos, o mercado começou a ir para cima. A visão num gráfico semanal não é boa devido ao longo período de tempo, incluindo uma recente volatilidade elevada.

O que é verdade para o ouro? A mesma verdade para qualquer outra mercadoria, a lei da oferta e da procura funciona em qualquer mercado:



Figura 1-9. Soja, gráfico semanal



Figura 1-10. Titulos do Tesouro US, gráfico semanal


Como você pode ver, os valores relativamente baixos do "Open Interest" indicam um potencial de crescimento do mercado, enquanto os valores relativamente altos do "Open Interest" indicam um potencial declínio dos preços. O mercado nem sempre reverte quando o " Open Interest" tem valores mínimos ou máximos e os valores extremos do " Open Interest" também não apontam para uma reversão imediata do mercado. O " Open Interest" não é uma magia "comutadora" do mercado, mas permite medir a segunda dimensão - o volume de mercado e estimar a fase do momento atual do mercado.


Aqui é a primeira regra, que pode ser formulada a partir da lei da oferta e da procura:

Quando " Open Interest" tem níveis extremamente altos, tente abrir posições vendidas.

Quando " Open Interest" tem níveis extremamente baixos, tente abrir posições compradas.


2. A Estrutura do Mercado

O mercado é uma instituição ou mecanismo reunindo compradores e vendedores de certos bens e serviços. Agora é hora de considerar esses grupos em detalhes.

2.1 Operadores de hedge e especuladores são partes da estrutura do mercado.

Como vimos, o mercado sempre encontra o ponto de cruzamento da oferta e da demanda. Este ponto é o preço de consenso das mercadorias, ou seja, o preço onde os vendedores estão interessados em vender um determinado volume de produtos e os compradores estão interessados em comprar esse volume de produtos a disposição. Sempre a demanda e a oferta estão mudando em função da influência de fatores fundamentalistas, políticos, aleatórios e outros. Com base na lei da oferta e da procura os preços dos bens também estão mudando. Por conseguinte, há uma certa probabilidade de que o preço futuro será maior ou menor do que o atual. Uma vez que o preço mudará ao longo do tempo, ele tem a incerteza no futuro. Essa incerteza do preço sobre o seu patamar no futuro é chamado de risco [6].

Assim, qualquer proprietário de mercadorias detém o risco da adversidade dos preços no futuro, onde a variação de preço pode ser para cima e para baixo. Se as mudanças de preços declinarem, isso significaria perdas nas vendas por um preço mais baixo no futuro, comparando com o preço do mercado atual, contrariamente ao aumento nos preços das commodities deve dar um lucro adicional ao proprietário. Geralmente os principais proprietários de bens são seus produtores.

Se o produto for o trigo, o seu proprietário pode ser a empresa General Mills, se é o ouro - o seu proprietário pode ser a Cia Barrick Gold Corp, etc. Enquanto o risco das variações de preços for alto, a renda principal dessas empresas é obtido a partir da diferença entre o custo de seus produtos e o preço da sua venda, eles estão interessados ​​em reduzir os risco que surgem em consequência das mercadorias em estoque. Para fazer isso, os fabricantes utilizam operações de hedge em commodities e nos mercados financeiros. Na verdade, os fabricantes vendem os seus riscos para outras pessoas que querem comprá-los. Comprando os riscos, os compradores têm a oportunidade de obter um lucro adicional (prêmio de risco), no caso de uma evolução favorável dos preços.

Assim, as bolsas não são apenas um lugar de mercado centralizado, são também um lugar centralizado para compra e venda de riscos e prêmios.

Os compradores de bens e dos riscos inerentes a eles são chamados especuladores. O principal objetivo de um especulador é obter um lucro a partir da diferença entre os preços atuais e futuros. Os especuladores são como uma "cola" entre o fabricante do produto e seu consumidor final. Eles fornecem uma alta liquidez do mercado, porém com uma mudança suave do preço [4].

As operações de hedge (cobertura) não têm o objetivo de redução do risco a zero, é uma maneira de encontrar o equilíbrio razoável entre o risco e lucro. Vendo mais longe, o hedge competente permite o uso de uma oportunidade à especulação. Ao monitorar posições hedge dinâmicas é possível unir-se a grupos de investimentos de grandes empresas manufatureiras que sabem quase tudo sobre o mercado em que trabalham.

Na verdade, este ponto de vista não é desprovido de significado. Estas companhias são as fornecedoras de bens diretos que são negociados na Bolsa. Quem, se não o fabricante, sabe tudo o que acontece neste campo do negócio? Esses caras têm informação oculta aos olhos e ouvidos de todos, eles sabem o que ninguém mais sabe. Ou como explicar o fato de que durante muitas décadas, eles permanecem "players" de sucesso na bolsa, realizando muitos milhões de dólares em transacões diárias!

O acompanhamento dos especuladores também não é desprovido de significado. Os níveis de compra dos especuladores indicam os momentos em que o mercado está "superaquecido", ou seja, lembrando a Parte 1 do artigo... tem a terceira fase, ou vice-versa e também os momentos em que ele é frio (primeira fase). No final, os especuladores normalmente são os principais compradores dos produtos, isto significa que quando eles colocam suas posições compradas ao máximo e eles já não têm a possibilidade de comprar e o mercado inverte a direção para baixo.


2.2 Análise do Relatório da Commodity Futures Trading Commission (CFTC)

Qualquer pessoa pode observar as posições dos operadores de hedge e especuladores, graças a uma Agência Reguladora do Governo Americano chamada "Commodity Futures Trading Commission"- CFTC. O fato é que qualquer pessoa física ou jurídica deve apresentar um relatório sobre as suas ofertas comprometidas na bolsas de commodities, com o objetivo de certificação se o volume dessas operações atinge ou excede o nível especificado pela Comissão. Uma vez por semana a comissão publica os relatórios sobre as posições combinadas dos traders.

Cada relatório é publicado no site oficial: www.cftc.gov. O relatório é gerado para cada estado e publicado na terça-feira e na sexta-feira. O relatório é apresentado em várias formas: tabela Excel, arquivo de texto no formato CSV, bem como um texto tabular simples. Também você pode baixar os registros do histórico referente a um longo período nos formatos Excel e CSV. Os relatórios são preparados para os mercados futuros e opções. Os relatórios têm uma formatação breve e uma estendida. A formatação estendida difere da breve pela existência de estatísticas e dados adicionais sobre a produção agrícola para algumas culturas. Na prática, os arquivos Excel ou CSV são utilizados para a análise do relatório da CFTC. Agora vamos olhar um relatório de fomatação breve sobre o trigo para 04 de agosto de 2009:




Tabela 2-1. O relatório de trigo de 04.08.2009 (mercados futuros)


Na parte superior do relatório existe um nome do produto, neste caso, é o Trigo (wheat) negociado na Bolsa de Chicago , tipo de relatório - apenas posições de mercados futuros, e data - 4 de agosto de 2009. A tabela é constituída por quatro colunas principais. Cada uma delas representa as posições vendidas e compradas combinadas de cada um dos três grupos de traders. O primeiro grupo de traders inclui os grandes especuladores. Estes são os chamados "traders non-commercial" (NON-COMMERCIAL). Podemos ver que, em 4 de agosto de 2009, os grandes especuladores tiveram 75 933 contratos de posições compradas, enquanto no lado das posições vendidas haviam 97 574 contratos. Isso indica que as posições totais ou líquidas foi favorável às posições vendidas no valor de -21 641 contratos. Normalmente não é uma situação típica dos especuladores.

Geralmente, mas não em todos os mercados, os "traders non-commercial" são compradores puros, ou seja, as posições compradas sempre são maiores do que as vendidas. Usando apenas um relatório para análise é impossível determinar se esta situação é típica nesse mercado ou não. Em qualquer caso, é preciso lembrar que o parâmetro mais importante aqui é o Posição líquida do grupo, não posições compradas ou vendidas separadamente. Esta posição líquida é utilizada no cálculo da maioria dos indicadores de análise dos relatórios de traders. Assim, uma vez mais: a posição total ou líquida é igual à diferença entre as posições vendidas compradas que pode ser tanto positiva como negativa, cuja fórmula é:

Onde NetPosition é uma posição líquida pura ou total dos traders, (I) é a categoria de operadores, tais como os principais "traders non-commercial" ou grandes "traders commercial".

O próximo é o número de contratos importantes para os "traders non-commercial", os que operam somente spreads ou cobertura.

Larry Williams escreve sobre eles o seguinte: "Se um "trader non-commercial" detém contratos de mercados futuros sobre o euro/dólar, 2 000 contratos de compra (long) e 1 500 contratos de venda (short), 500 contratos serão incluídos na categoria "Long" e 1 500 contratos são "cobertura" [1]. Simplesmente, a cobertura mostra o número de ambos os contratos: compra e venda (long e Short)".

É importante notar que não queremos dizer que significa um bloqueio. Por exemplo, os traders mantêm uma única e mesma commodity com posições opostas em contratos futuros para diferentes meses de entrega, ou posições opostas na mesma commodity nos mercados futuros e de opções. No relatório onde inclui posições com opções, tais casos são levados em conta.

O segundo grupo reflete a posições de operadores hedge. Eles também são chamados a operadores ou traders comercial (COMMERCIAL). Normalmente, mas não sempre, os operadores são vendedores puros, porque a maioria deles são produtores de commodities como trigo, ouro ou porcos. Traders comercial são também outros fabricantes que usam matérias primas como base para os seus produtos, por exemplo, algodão doce ou um pão. Normalmente, mas não sempre, eles são vendedores, ou seja, os seus contratos estão sempre ao lado da venda (short).

Geralmente, quando os preços caem a um nível baixo, os operadores reduzem as suas vendas ao mínimo, pois não é rentável vender seus produtos mais baratos. Ao mesmo tempo, os operadores que produzem os seus próprios produtos, ao contrário, aumentam suas posições de compra (long). Assim, a posição líquida dos operadores também pode ser de compra (long) e os indicadores baseados na posição líquida dos operadores estarão localizados na zona superior.


Vamos considerar o caso específico, usando o exemplo do nosso relatório sobre o trigo. O lado dos operadores quem compram 166 518 contratos, enquanto o lado das vendas são 130 979 contratos. A posição líquida é 35 539 contratos, ou seja, posições compradas. Muitas vezes, isso significa que o preço dos bens está a nível baixo, porque os operadores estão vendendo menos do que comprando. Em qualquer caso, para determinar a situação exata, é necessário usar um gráfico da posição líquida durante um período de tempo longo.

A coluna «Total» contém o conjunto de posições compradas e vendidas dos traders comercial e não-comercial. Não é de interesse prático.

A coluna «Nonreportable Positions» contém uma série de posições compradas e vendidas de traders não identificados. Na verdade, esta coluna reflete as posições dos pequenos especuladores, cujas posições são pequenas demais para entrar no grupos dos especuladores principais. Estas posições são calculadas pelo cálculo sintético - a partir do valor dos contratos em aberto (OI - Open Interest), o total de posições vendidas e compradas do relatório são subtraídas. No nosso caso, o OI é 322 431 contratos, enquanto as posições compradas são 279 239 contratos, isto significa que 29 194 são contratos de posições compradas de pessoas não identificadas. ​​(322 431-279 239). O mesmo cálculo podem ser executados para as posições vendidas:322 431-279 339 = 43 092 contratos.

Na parte de baixo do relatório estão as mudanças no número de contratos para cada grupo em comparação com o relatório anterior. Segue-se a participação de cada categoria nos contratos abertos (open interest), na parte inferior do número temos os traders de cada categoria. Estes dados não são utilizados na prática.

Além do relatório, como foi mencionado acima, existem relatórios que incluem a posição das Opções. Todas as posições do mercado de opções são convertidas equivalentes aos mercados futuros e adicionadas diretamente nas posições dos mercados futuros. O mesmo relatório referente ao trigo com as posições de opções e mercados futuros combinadas é o seguinte:



Tabela 2-2. O relatório resumido do trigo de 04.08.2009, mercados futuros e opções


Apesar dos diferentes números, os dois tipos de relatórios resultarão em gráficos semelhantes quanto as mudanças dinâmicas das posições. No entanto, é preferível usar relatórios que incluem informações sobre posições de opções, considerando um volume mais completo do mercado. Dê uma olhada no aumento do valor da coluna "Spreads". Agora valores desta linha são dominados pela comparação com as posições compradas (long) e vendidas (short) aos traders não-comercial, isto se deve ao fato de que os traders comerciais usam principalmente as Opções para cobrir as suas posições nos mercados futuros.


Agora vamos examinar uma forma estendida do relatório que inclui as posições dos mercados futuros e opções sobre o mesmo trigo:



Figura 2-3. O relatório completo de 04.08.2009 dos mercados futuros e opções do trigo


Como você pode ver, o relatório inclui novas estatísticas sobre as posições antigas para cada um dos três grupos de traders. Uma vez que todos estes relatórios são analisados ​​na dinâmica de um período de tempo maior , esta informação não é de interesse.


2.3 Observando posições dos grandes operadores hedge

Então, é hora de compilar as estatísticas dos compradores e vendedores de operações hedge e monitorar suas ações para um período de tempo maior. Vamos usar a tabela de preços do trigo já apresentada, com um indicador mostrando as posições vendidas e compradas dos operadores. O gráfico consiste em barras semanais e abrange o período a partir dos meados de 2001 até meados de 2009:



Figura 2-4. Trigo, posições vendidas e compradas dos operadores, barras semanais


A linha verde aqui mostra uma posição comprada dos operadores, a vermelha corresponde às posições vendidas. Todas as posições são especificadas em termos absolutos, elas não têm um sinal. É necessário assumir que a linha vermelha representa a quantidade absoluta de posições vendidas; e verde - a quantidade absoluta de posições compradas. Em geral, as posições vendidas dos operadores dominaram até a primavera de 2004 (linha vermelha acima do verde), após este período os operadores tinham mais posições compradas do que vendidas (a linha verde acima do vermelha). Tal gráfico não indica pontos chaves de rompimento. Agora vamos dar uma olhada neste mesmo gráfico, mas com um indicador de posição líquida total dos operadores:



Figura 2-5.. Posições líquidas totais para os operadores, barras semanais


Aqui você pode ver os momentos mais interessantes. Note que quando a posição líquida dos operadores foi relativamente alta, depois de algum tempo o mercado foi para cima. Ao mesmo tempo, quando a posição líquida de operadores foi relativamente baixa, após algum tempo no mercado foi para baixo. Claro, nem todas as previsões do indicador são verdadeiras, mas se isso acontecesse em pelo menos um ponto de entrada correto, seria um enorme lucro.

Vamos prestar atenção à posição líquida extremamente elevado dos operadores no final de 2005! Nunca antes ou depois, os operadores tiveram valores tão altos de posição líquida. E agora vejam o que aconteceu com o mercado posteriormente. Começou o movimento ascendente inexorável que continuaram mais de 2 anos. Como resultado, o preço aumentou em mais de 700 USD (!). Houveram alguns outros momentos, mostrando-nos uma boa oportunidade de especulação.

Por exemplo, após uma forte queda de preços no final de 2007, muitos podiam pensar que a tendência dos touros iria terminar. Aparentemente, os operadores não pensaram assim. Enquanto outros tentaram reduzir suas posições compradas (sabemos a partir dos relatórios dos traders), os operadores continuaram comprados no mercado! O aumento foi breve, um preço máximo foi atualizado e então o pânico começou. Durante esses quatro meses, os preços aumentaram mais de US $400! Os sinais de venda mostrados pelos traders não foram tão convincentes. No entanto, em muitos casos, o trader pode escapar com segurança no mercado se ele usou uma simples técnica de trailing stop. Em qualquer caso, todas as perdas poderiam ser compensadas por um bom negócio.

As palavras-chave são "brevemente depois disso". Não esqueça que este indicador não é calculado usando o preço, é completamente independente. Poderíamos remover a tabela de preços e o indicador de posições líquidas dos operadores continuaria mostrando os mesmos valores. O preço é a mudança recente do mercado, O primeiro sinal a mudar é o equilíbrio das forças da oferta e da procura, muito antes da mudança das mentes dos principais participantes no mercado. Observando que os operadores estão fazendo, nós assistimos à evolução do mercado em sua fase inicial, quando as variações de preços não apareceram ainda. Isso nos dá uma vantagem única para pegar passagem num vagão meio vazio da futura locomotiva da tendência. Quando o movimento começa, muitos virão muito tarde, mas não os operadores com base nos relatórios da Comissão!

Vamos observar ouro e prata através do prisma dos operadores:



Figura 2-6. O ouro e a posição líquida dos operadores. Barras semanais


O gráfico dos preços do ouro está cheio de oportunidades favoráveis ​​para especulação. Nem todos levam lucros excessivos, mas muitos deles podem ganhar uma renda substancial. Se um trader colocasse seus pontos de entrada com a principal tendência de alta que continuou por muitos anos, ele seria um grande vencedor. Deixe-me lembrá-lo, estamos a considerando os momentos em que a posição líquida dos operadores é alta o suficiente, esses são pontos potenciais para a compra. O mesmo se aplica às vendas: estamos procurando níveis relativamente baixos de posição líquida para vender, olhando o momento oportuno para venda.

Observe a loucura que foi o ouro no final de 2008. Após uma forte queda finalizada no início de setembro, começou um aumento inesperado. De fato, durante um dia, o preço do ouro aumentou 90 dólares! Em seguida, ele foi a um preço elevado até o final de setembro, mas com pouco espaço. Pouco depois disso, houve uma nova queda e no final de outubro o ouro é atualizado no preço mínimo do ano.

Poderíamos prever esta agitação, pelo menos parcialmente? Sim, nós poderíamos prever usando os relatórios sobre as posições dos traders. Preste atenção que não muito tempo antes da sexta-feira dos touros (dia em que o preço do ouro "de repente" aumentou em $ 90), os operadores pararam de vender o ouro.

Eles são os produtores deste mercado, em todos esses anos a compra sempre excedeu a venda. Parando as vendas, trouxe o pânico entre os touros (compradores) de ouro. Houve uma escassez do metal que moveu os preços para cima.

Embora os preços não ficaram no monte Olimpo por muito tempo, os operadores venderam alguns de seus metais aos touros de ouro, onde aconteceu o último pico de preço. Além disso, a queda do preço do ouro já havia começado, onde os operadores reduziram as suas vendas de ouro ao mínimo nos últimos quatro anos (posição líquida aumentou - ver gráfico). Também vimos o efeito da concorrência dos vendedores. A escassez de commodity começou fazer o preço subir esta poderia ser uma boa idéia para ganhar dinheiro.

Agora vamos olhar ao gráfico da prata;



Figura 2-7. A prata e a posição líquida dos operadores. Barras semanais


E mais uma vez , vemos aqui a mesma situação do ouro. Sempre que a situação líquida atingiu uma máxima relativa, o preço da prata faz um novo salto ao sol. Os níveis relativamente baixos foram indicando o recesso na tendência de alta da prata.

A conclusão é a seguinte. Os mercados de metais preciosos são em grande parte controlados por um pequeno grupo de operadores, qualquer profissional que deseja negociações rentáveis nestes mercados deve levar em conta a influência dessas forças.


2.4 Índice de uma posição líquida

Mas como sabemos qual é a posição líquida "relativamente" alta ou baixa? Como observado por Larry Williams, o chão para uma é o limite máximo da outra. Por isso, é necessário utilizar um indicador normalizado, onde claramente defina as fases da nossa posição. Existe um indicador desse tipo, ele é chamado de COT Index, é um indicador usual Estocástico calculado para os valores das nossas posições.

Deixa-me recordar a fórmula [1]:


O preço atual é comparado com a máxima do preço por três anos. O índice pode ser calculada para qualquer período de tempo e não apenas por três anos. É melhor usar um período que não seja inferior a 26 semanas, ou seja, um índice semestral. Nos negócios a longo prazo usar um índice de 156 semanas (três anos). O índice mostra a força atual relativa em percentuais, comparando com o período selecionado.


Aqui está um exemplo do cálculo do índice aos operadores listados abaixo, os dígitos no lado direito indicam o número de contratos [1]:


Valor da Semana atual

350

Valor mínimo dos últimos 3 anos

-150

Diferença

200

O valor máximo dos últimos 3 anos

750

O valor mínimo dos últimos 3 anos

-150

Diferença

600

Index = (200/600)x100=0,33x100=33%;

Neste caso, os operadores são de baixa em vez de alta. Se o índice atinge níveis extremamente baixos, ou seja, situado numa variação inferior a 20%, o mercado tende a cair. Se o índice atinge níveis extremamente elevados, isto é, situados numa variação a 80%, o mercado tende a reverter para cima.

Para verificar isso, vamos olhar no gráfico dae prata com 156 semanas do Índice de Operadores:



Figura 2-8. Prata e 156 semanas do Índice de Operadores, barras semanais


É possível utilizar outros níveis, por exemplo 75% e 25%. O significado não será alterado, o indicador mostrará potenciais zonas sobrecompradas e sobrevendidas.

Estranhamente, mas o período do índice não muda a dinâmica das posições monitoradas. Aqui está um exemplo de vários índices com diferentes períodos médios da prata:




Figura 2-9. Gráfico de prata com períodos diferentes ao índice dos operadores da prata, barras semanais


Aqui temos utilizado (de cima para baixo) 156 semanas, 104 semanas, 52 semanas e 26 semanas em média aos índices dos operadores. Somente o índice de 26 semanas mostra uma amplitude de movimento mais frequente. Os outros períodos médios são quase semelhantes e não mudam a forma do indicador. O período médio usado depende das preferências pessoais. Por exemplo, você pode usar o período médio de 156 semanas, ele mostra a dinâmica em posições que amplamente mudam bastante, ao mesmo tempo que dá um resultado claro dos contratos às posições de alta.

O indicador COT index é usado para monitorar não só os operadores de alta, mas também os traders não-comerciais, bem como os pequenos especuladores.


2.5 A Estrutura do "Open Interest" (Contratos em Aberto)

Na primeira parte analisamos exemplos da influência do volume do commodity em seu preço. Para medir o volume de bens no mercado, a utilização do "Open Interest" (OI) é muito efetivo. A teoria econômica prevê que o mercado caracterizado por níveis relativamente elevados de Contratos em Aberto (OI) tende a reverter para baixo. A mesma regra vale para o mercado com os valores relativamente pequenos de Contratos em Aberto (OI), neste caso o preço tende a se mover para cima.

Agora é hora de investigar esta estrutura. A partir dos relatórios de ofertas dos traders sabemos que os principais "players" nos mercados futuros são os operadores de hedge, também conhecidos como operadores e traders "não-comerciais" - os que representam principalmente os grandes fundos de commodities. Também há um terceiro grupo menor de traders - cambistas ou a chamada "multidão" ( traders não identificados), devido aos pequenos volumes de negócios realizados por eles, eles não são capazes de influenciar os preços de mercado. O volume de operações dessa categoria é calculado indiretamente e representa a diferença entre as aberturas de posições do "Open Interest", da quantidade total de operadores ("commercial") e dos "traders non-commercial.

Os valores semanais do "Open Interest" são apresentados nos relatórios da CFTC. Uma vez que o OI é o número acumulado das posições abertas compradas e vendidas, o seu nível pode ser calculado de duas formas, através da contagem do total das posições compradas, ou pela contagem do total das posições vendidas.

Aqui estão as fórmulas:

OI = Noncommercial Traders Long + Noncommercial Traders Spreading + Operators Long + Nonreportable Long
(Contratos em Aberto =Traders Nãocomercial Comprados +Traders Nãocomercial de Cobertura + Operadores Comprados + Cambistas Comprados) ;
OI = Noncommercial Traders Short + Noncommercial Traders Spreading + Operators Short + Nonreportable Short
(Contratos em Aberto =Traders Nãocomercial Vendidos +Traders Nãocomercial de Cobertura + Operadores Vendidos + Cambistas Vendidos)

Agora vamos nos voltar para o relatório dos mercados futuros do euro em 04 de agosto de 2009, vamos calcular os contratos em aberto (OI) para esse mercado, usando essas duas fórmulas:



Tabela 2-10. Relatório dos mercados futuros do Euro de 04 de agosto de 2009

OI = 61 443 + 946 + 22 984 + 52 864 = 138 237;
OI = 34 337 + 946 + 72 454 + 30 500 = 138 237;

Independentemente da fórmula do cálculo do "Open Interest", o resultado é o mesmo. No entanto, se perecebe que as posições compradas (long) são realizadas principalmente pelos grandes traders não-comerciais (61 443 contratos), ao passo que os operadores preferem posições vendidas (52 864 contrato). Cálculo da quota de cada um desses três grupos no "Open Interest" seria uma continuação lógica da análise da estrutura do "Open Interest". Por exemplo, a proporção das declarações de posição vendida pelos operadores foi de 52,4% dos contratos em aberto (72 454 / 138.237 x 100%). Seu valor é apresentado na seção do relatório chamada de: «Percent of Open Interest for each category of traders».

No entanto, é interessante considerar a dinâmica de mudanças de cada um dos três grupos de traders. Se nós coletamos essas informações por um longo período de tempo, então podemos construir um gráfico correspondente, o indicador «Meta Cot: Percent Position in OI». Ele calcula esses dados para cada um dos três grupos de traders.

A figura 2-11 mostra o gráfico a longo prazo para os mercados futuros do Iene japonês. Toda vez que a quota de posições vendidas dos operadores chega aos 70% ou maior no "Open Interest", o Iene estava perto de reverter para baixo. Quase toda vez que a quota de posições vendidas dos operadores foi abaixo de 30% no "Open Interest", o mercado estava perto de sua parte inferior e frequentemente iniciou tendências altistas de longo prazo no movimento. Tais casos são representados pela linha tracejada vermelha, a recíproca é verdadeira na reversão para cima. Quando a quota de posição vendida foi abaixo de 30% no "Open Interest", o Iene estava perto de reverter para cima e se a quota dos operadores de posições vendidas foi abaixo de 30% no "Open Interest", o mercado estava perto de sua parte inferior e também frequentemente iniciou tendências altistas.



Figura 2-11. Quota de posições vendidas dos operadores no "Open Interest" . Iene Japonês, barras semanais


Larry Williams, no seu livro "Trade Stocks & Commodities with the Insiders: Secrets of the COT Report" [1], propõe combinar os valores do "Open Interest" com a posição líquida dos operadores num indicador, se a posição líquida relativa dos operadores é baixo o suficiente e ao mesmo tempo detêm uma quota significativa do mercado, pode-se supor que o mercado está perto de seu pico e logo vai virar para baixo.

Este indicador é calculado pela fórmula:

Stochastic Oscillator (Net Operators / OI);

Em outras palavras, a posição líquida dos operadores divide pelos contratos em aberto (Open Interest), os dados são recolhidos por um longo período de tempo e o indicador Estocástico faz o cálculo usando esses dados. Este indicador é chamado Williams Commercial Index, ou simplesmente WILLCO. Larry Williams recomenda usar um período de 26-semana ou uma média de seis meses, mas você pode usar outros tipos de média, como a anual (52 semanas) ou médias de três anos (156 semanas).

A sua utilização é o mesma do COT index, sempre que o seu valor for superior a 80% - espera-se que o mercado se volta para baixo, sempre que o seu valor é inferior a 20% - espera-se a reversão do mercado para cima. Na figura 2-15 é apresentado o indicador WILLCO para o Iene Japonês. As linhas pontilhadas vermelhas mostram os mesmos níveis que eram plotados por Larry Williams [1]:



Figura 2-12. A média do indicador WILLCO (26 semanas) e o Iene Japonês, barras semanais

Como podemos ver, as recomendações deste indicador não foram tão precisas. No entanto, aumentando este período de tempo, elimina este problema. Veja o gráfico dos Títulos do Tesouro dos EUA e o mesmo indicador, mas com um período médio de 156 semanas:



Figura 2-13. Média WILLCO (156 semanas) e Títulos do Tesouro dos U.S., barras semanais


Agora, temos marcado níveis extremamente baixos, bem como níveis extremamente elevados. O indicador de precisão é surpreendente, pois os seus dados não se baseiam nos dados sobre preços! Sem dúvida, as Notas do Tesouro dos EUA são muito sensíveis às ações dos operadores.


2.6 Indicador Momentum

Este indicador foi proposta por Stefan Brice, em seu livro «The Commitments of Traders Bible». Sua idéia é simples, representa a diferença entre o atual COT-index e o mesmo índice de 6 períodos atrás, a fórmula é a seguinte:

COT-Index (p) – COT-Index(p-n);

Onde P é o valor corrente do índice, "n" seria igual a um período de valor 6.

É claro que o índice delta pode ser qualquer valor, não apenas com o período igual a 6. Também o índice pode ser calculado para todos os participantes dos mercados futuros e até mesmo o próprio "Open Interest". Este indicador é chamado de Movement Index. É usado principalmente para confirmar as correções completas das tendências a longo prazo. Sua interpretação é simples. Se o Movement Index sobe acima de 40% - o movimento descendente atual está chegando ao fim, o aumento dos preços é esperado. Se o índice cai abaixo de 40% - o movimento ascendente atual está chegando ao fim, a diminuição dos preços é esperada.

Vamos tentar aplicar esse indicador no mercado futuro do Euro:



Figura 2-14. Movement Index no mercado futuro do EURO


Nos últimos anos o Euro teve uma tendência ascendente constante. As setas azuis mostram os tempos onde atravessou a barreira dos 40%. Olhe para a incrível precisão do indicador, cada vez que atravessou o nível dos 40%, a correção do preço foi concluída e o Euro continuou a sua ascensão. Os sinais de venda do indicador não foram tão precisos. No entanto, muitas vezes a correção foi iniciada após o indicador Movement Index cruzar o limite inferior a -40%. Tal reatividade do indicador deve ser levado em conta, é uma espécie de barômetro COT por impulso. Isso mostra claramente a turbulência nos mercados, a sua utilização é particularmente útil para o comércio agressivo e no curto prazo.

O próximo indicador é experimental e não tem descrição em qualquer lugar. No nono capítulo de seu livro, Larry Williams explora as mudanças do Contratos em Aberto (Open Interest) através da ação dos operadores. Não está claro exatamente como usar esta relação. Para alguns exemplos, Larry Williams mostra a divergência/convergência. Para os outros exemplos, ele conclui que o aumento de vendas ou compras do operador também aumenta o nível do "Open Interest". Uma investigação sobre o movimento do índice levou à idéia de que é possível monitorar as mudanças nas posições dos operadores através das mudanças no nível do "Open Interest".

Os modelos de interação mais interessantes são os seguintes:

1. Nível do "Open Interest" está caindo - o nível da posição líquida dos operadores está crescendo.

2. Nível do "Open Interest" está crescendo - o nível da posição líquida dos operadores está caindo.

Em outras palavras, há uma certa discrepância entre as ações de todos os participantes do mercado (Open Interest) e as ações dos operadores. Tais mudanças seriam melhor observadas com base no indicador Movement Index calculadas com o "Open Interest" e o índice dos operadores. Comparando as diferenças, podemos determinar a divergência das ações dos operadores "hedge" e dos demais participantes do mercado.

Este indicador foi nomeado Spread Movement Index, a sua fórmula é a seguinte:

Movement Index (Operators) - Movement Index (Open Interest);

No geral este indicador é tão simples quanto o Movement Index, o WILLCO e o COT Index. Os valores aproximados do nível crítico são 60% e -60%, respectivamente. Sua análise é realizada pelas mesmas regras que o indicador originário Movement Index.

Vamos considerar o comportamento do índice no exemplo dos mercados futuros do Eeuro:



Figura 2-15. Spread Movement Index do EURO


Pode-se ver que os seus valores também indicam pontos de viragem significativas e momentos completos de correção. No entanto, este indicador deve ser usado com cuidado, pois eficiência não foi comprovada.


2.7. Observando as grande posições de fundos hedge

O objetivo principal dos grandes fundos hedge são os lucros especulativos nos mercados de commodities. Os métodos de negociação usados por eles são baseados na tendência geral posterior, Uma vez que o preço excede determinada "n" semana de alta, alguns dos fundos abrem posições compradas (long), ocorrendo um movimento adicional de preços ascendentes. Talvez uma das principais razões das tendências do mercado no médio prazo são as grandes ações dos fundos de commodities.

Segundo algumas estimativas, os fundos escolhem as Máximas/Mínimas de 26 semanas com mais frequência [1]. Os fundos entram no mercado de forma gradual, utilizando a técnica de adição para as suas posições e outros fundos usam estratégias de longo prazo para a entrada no mercado. Por exemplo, se o preço atingiu 26 semanas de alta, alguns fundos abrem posições compradas. Então o preço se move ainda mais para cima e atinge 52 semanas de alta. Fundos mais cautelosos se juntam ao jogo e também abrem posições compradas juntamente com os fundos que estão posicionados, adicionando as suas posições. Finalmente, o preço chega a 156 semana de alta. Neste ponto, quem queria comprar...já comprou. Isso é tudo. Não existe compradores agora.

As estratégias de tendência de todos os fundos estão envolvidas ao máximo. O mercado tornou-se extremamente tenso, pois não há mais compradores, nós sabemos pelos relatórios dos traders, o preço em breve deverá ir para baixo... e logo acontece. O preço começa seu movimento descendente. Neste ponto, o mercado tem um número extremamente elevado de participantes, nós sabemos pelo nível de Contratos em Aberto (Open Interest), eles estão entrando em pânico.

Primeiro, os compradores que entraram no mercado mais tarde do que os outros começam a fechar as suas posições compradas. Eles ainda não conseguiram obter um nível suficiente de lucro necessário para continuarem na posição a longo prazo, isto dá uma aceleração adicional no preço e começa a cair mais rápido. Logo o pânico aumenta e mais e mais participantes estão tentando fechar suas posições compradas. Todo mundo se espremendo numa porta. O pânico cresce tanto que o preço cai num período de tempo muito curto.

Depois que a "multidão" deixou o mercado e o preço no fundo, os operadores começam o jogo e entram no mercado novamente, adicionando as suas posições compradas. A idéia é simples - os operadores que usam commodities para a produção de seus bens estão interessados ​​em comprar matéria-prima a preços baratos. Os operadores do outro lado, reduzem as suas vendas ao mínimo, não é rentável vender produtos a preços baixos. Como resultado, a posição líquida dos operadores será extremamente alta, indicadores mostram adequadamente esta realidade. A competição por demanda iniciará e o preço voltará a subir. O círculo se fecha e história se repetirá novamente.

Vamos examinar as ações dos grandes "traders non-commercial" com base nos conceitos acima, usando o índice de três anos aplicado nas posições líquidas dos "traders non-commercial":



Figura 2-16. Preço dos mercados futuros de gado e a posição líquida total dos "traders non-commercial"

Como podemos ver no exemplo dos mercados futuros de gado, as ações dos "traders non-commercial" acompanham a tendência do preço atual. Se o preço sobe, os fundos estão comprando; se ele vai para baixo, os fundos estão vendendo, é simples. Perecebe-se os fundos aumentando as suas posições até valores máximos, então o preço do gado começa o movimento para baixo. Quando a posição dos fundos está perto dos valores mínimos, o preço começou a subir.

Eu acho que o sucesso financeiro dos investidores que decidem colocar o seu dinheiro nesses fundos estão enquadrados nesta questão. As ações similares dos "traders non-commercial" são as mesmas nos outros mercados:



Figura 2-17. Gráfico de algodão e 156 semanas da posição líquida média dos "traders non-commercial"

Enquanto os topos dos índices mostram claramente a chegada da reversão do mercado, os seus valores baixos, como regra, eram prematuros. Em qualquer caso, este gráfico mostra que é melhor entrar quando os "grandes" estão comprando.


2.8 Observando as posições do pequeno especulador

De acordo com a especificação da CFTC, os pequenos especuladores são todos aqueles que têm pequenas posições em relação a qualquer um dos dois grupos acima. Os seus valores exatos não são conhecidos, embora possam assumir um número total bastante impressionante. Por exemplo, você pode verificar no relatório resumido da CFTC sobre o trigo na Bolsa de Chicago:



Tabela 2-18. A participação dos pequenos especuladores no relatório resumido sobre trigo


Como podemos ver no relatório, o número total dos principais participantes no mercado é pequeno. No lado dos vendedores - 286, lado dos compradores - 304. Os 286 dos participantes do mercado detém 91,8% de todas as posições compradas e 304 traders têm 88,5% de todas as posições vendidas. Podemos chamar esses principais participantes no mercado como multidão? Eu acho que nós não podemos. Mas existem muitos traders que não foram contados no relatório da comissão, são muitos os pequenos especuladores, criando uma multidão no mercado.

Neste caso, a multidão controla apenas 8,2% das posições compradas e 11,5% das posições vendidas. Seria bastante interessante observar o histórico das compras e vendas desta categoria de traders. Vamos olhar para o gráfico da moeda GBP durante um longo período de tempo, mas consideraremos o total das posições líquidas dos pequenos especuladores:



Figura 2-19. Posição líquida total dos pequenos especuladores nos mercados futuros GBP


Quando o total das posições líquidas da multidão atingiram seus valores relativamente altos, o preço de mercado mal começou o movimento descendente. Por outro lado, quando a multidão fica desapontada com o GBP e começam a vendê-lo, inicia-se um rali com o preço da moeda GBP. Particularmente notável foram os dois pontos finais marcados pelas linhas vermelhas. Após a grande queda da libra, os pequenos especuladores decidiram que o fundo tenha sido atingido e o movimento ascendente é inevitável. Dentro de uma semana, eles deixaram de ser vendedores líquidos para serem compradores líquidos, no entanto, o fundo ainda não foi atingido. A Libra continuou a cair cerca de dois meses, durante este tempo o humor da multidão mudou e foi novamente para as vendas e a multidão estava errada de novo. A libra mostrou um rali decente.

A regra geral para a análise das atividades de negociação dos grandes é simples. Agem contrariamente a multidão. Se a multidão ​​aumentar acentuadamente as suas vendas: tentar comprar quando ela vender e tentar vender quando ela comprar.


3. Solução Técnica

3.1 O objetivo e a estrutura do projeto MetaCOT

Até o momento nos referimos a todos os indicadores do projeto, agora é hora de examinar a estrutura. Um entendimento claro dos princípios de trabalho vai ajudar você a evitar muitos problemas com a atualização de dados e configuração.

Primeiramente consideremos os princípios do software que são os seguintes:

1. Transparência. Todo o código fonte do projeto está aberto e disponível a todos, qualquer um pode baixar e compilar essas ferramentas. Além disso, o princípio de trabalho é descrito neste artigo, por isto vai ser transparente e compreensível para qualquer um.

2. Universatilidade. O software inclui todas as ferramentas de análise de dados da CFTC descritos no livro por Larry Williams, incluindo o seu indicador WILLCO, que está ausente em outros projetos. Além disso, o software inclui scripts especiais que agrupam as informações de uma maneira especial, como resultado você pode juntar-se automaticamente as diferentes ferramentas e até mesmo criar uma nova! O projeto de arquitetura foi concebido para facilmente criar novos indicadores baseados no projecto COT. Os dados básicos do relatório COT podes ser obtidos com uma única função (para data desejada) e estes dados podem facilmente ser utilizados para calcular outro indicador.

3. Automação. Os dados CFTC são extremamente grandes, contendo informações sobre centenas de mercados, cada informação sobre o mercado está espalhada por diferentes arquivos e anos. Usando os scripts do projeto Meta COT isto não será um problema, tudo que você precisa fazer agora é baixar (uma vez por semana) o arquivo atualizado do relatório CFTC e executar o script. Todos os dados serão automaticamente extraídos, agrupados e pronto para utilizar.

4. Simplicidade. Todos os indicadores e scripts foram criados usando a linguagem de programação MQL, sem quaisquer DLLs de terceiros. Usamos os algoritmos mais simples a fim de organizar e calcular dados e a separação dos problemas. Assim, os programas baseados nos scripts foram desenvolvidos ao programa: para o grupo, para unir-se, para a produção e para a criação de novos dados. Estes dados foram utilizados para a construção dos indicadores.

5. Independência. Um dos fatores mais importantes para a obtenção da informação é o número dos transmissores de "nós", se a informação é transmitida diretamente da fonte ao destino, a possibilidade de distorção é muito menor do que alguns mediadores adicionais existindo entre a fonte e o destino. Todo o projeto é implementado de uma forma onde as informações necessárias sejam tomadas diretamente da fonte, sem fornecedores de terceiros.

O projeto inclui um conjunto de vários arquivos de programas que não são compilados, cada arquivo deve ser colocado num diretório específico e depois compilados. A tabela a seguir inclui uma lista de arquivos, a sua breve descrição e o local de instalação:

Nome do arquivo

Tipo

Destino

Descrição

Meta COT Script Build.mq4

Script

..\Meta Trader\experts\scripts\

O principal script independente para a preparação de dados. Cria um conjunto de arquivos padrão CSV disponíveis no servidor CFTC.gov. Cada arquivo inclui informações sobre um instrumento. O nome para criar o arquivo corresponde ao nome do instrumento.

Meta COT Script Concatenate.mq4

Script

..\Meta Trader\experts\scripts\

Um script independente. Ele junta vários arquivos num arquivo baseado no histórico. Por exemplo, o arquivo "COT - SUGAR NO. 11 - NEW YORK QUADRO DE NEGOCIAÇÃO. CSV "(com dados referentes ao período 04.01.2005-28.08.2) e o arquivo "COT - SUGAR NO. 11 - ICE FUTURES U.S. CSV "(com dados referentes ao período 04.09.2007 a 01.09.2009) serão convertidos no arquivo"SUGAR CONCATENATE" que inclui dados de 04/01/2005 a 01/09/2009.

Meta COT Script Agregation.mq4

Script

..\Meta Trader\experts\scripts\

Um script independente. Ele junta vários arquivos num único, com base na soma de seus valores. Por exemplo os arquivos "COT - WHEAT - CHICAGO BOARD OF TRADE. CSV", "COT - WHEAT - KANSAS CITY BOARD OF TRADE. CSV", "COT - WHEAT - MINNEAPOLIS GRAIN EXCHANGE. CSV" serão convertidos no arquivo "WHEAT AGREGATION", contendo a soma dos valores de todos os três arquivos.

Meta COT Script Report.mq4

Script

..\Meta Trader\experts\scripts\

O script precisa da biblioteca "cotlib.mq4". Ele cria um arquivo CSV do relatório, incluindo um cálculo para todos os indicadores. Os períodos médios e os nomes dos instrumentos são definidos nas configurações do script. Pode ser útil na análise dos dados em outros programas.

Meta COT Absolute Position.mq4

Indicador

..\Meta Trader\experts\indicators\

O script precisa da biblioteca "cotlib.mq4". Mostra as posições absolutas dos traders em todas as categorias, incluindo os Contratos em Aberto (Open Interest).

Meta COT Net Position.mq4

Indicador

..\Meta Trader\experts\indicators\

O script precisa da biblioteca "cotlib.mq4". Mostra as posições líquidas dos traders em todas as categorias, incluindo os Contratos em Aberto (Open Interest).

Meta COT Index.mq4

Indicador

..\Meta Trader\experts\indicators\

O script precisa da biblioteca "cotlib.mq4". Ele mostra índice do relatório COT de todas as categorias de traders, incluindo os Contratos em Aberto (Open Interest). O período de cálculo é definido nas configurações de script.

Meta COT Percent Position in OI.mq4

Indicador

..\Meta Trader\experts\indicators\

O script precisa da biblioteca "cotlib.mq4". Ele mostra o resultado da divisão da posição líquida pelo "Open Interest" para cada categoria de traders.

Meta COT WILLCO.mq4

Indicador

..\Meta Trader\experts\indicators\

O script precisa da biblioteca "cotlib.mq4". Isto mostra o índice WILLCO para todas as categorias de traders. O período de cálculo é definido nas configurações de script.

Meta COT Movement Index.mq4

Indicador

..\Meta Trader\experts\indicators\

O script precisa da biblioteca "cotlib.mq4". Mostra o "Movement Index" e "Open Interest" para cada categoria de traders. Os períodos de amostragem e do momento são definidos nas configurações do script.

Meta COT Spread Movement Index.mq4

Indicador

..\Meta Trader\experts\indicators\

O indicador precisa da biblioteca "cotlib.mq4". Ele mostra a divisão do "Movement Index" pelo "Open Interest" para cada categoria de traders.

Meta COT Expert.mq4

Expert advisor

..\Meta Trader\experts\

O Expert Advisor precisa da biblioteca "cotlib.mq4". São testados os Indicadores COT nos dados históricos.

cotlib.mq4

Biblioteca

..\Meta Trader\experts\libraries\

É o "núcleo" do sistema. Ele inclui dados do relatório COT e métodos ao seu processamento. Tem um grande conjunto de arrays, definições e funções do cálculo de todos os indicadores utilizados.

ONCATENATE.ini

Arquivo com lista

..\Meta Trader\experts\files\

É uma lista de arquivos com listas a combinar pelo tempo.

COT - * CONCATENATE.ini

Listas de arquivos

..\Meta Trader\experts\files\

São arquivos com listas a combinar pelo tempo.

AGREGATION.ini

Arquivo com lista

..\Meta Trader\experts\files\

É uma lista de arquivos com listas a combinar pelo somatório.

COT - * AGREGATION.ini

Listas de arquivos

..\Meta Trader\experts\files\

São arquivos com listas de arquivos a combinar pelo somatório.

Tabela 3-1. Arquivos do projeto Meta COT com os caminhos de instalação

Você precisa instalar estes arquivos nos diretórios apropriados e então compilar. O terminal MetaTrader deve receber os indicadores personalizados, scripts e Expert Advisor em seus locais apropiados.


3.2 Carregamento de dados e criação de relatórios

Como você sabe, todos os dados dos indicadores são fornecidos por uma organização que não é comercial, a CFTC. Estes dados são publicados semanalmente no site oficial desta organização. Existem vários tipos de relatórios. O primeiro tipo é denominado «Futures Only Reports», inclui dados apenas das posições nos mercados futuros. O segundo tipo de relatório é chamado «Futures-and-Options Combined Reports», inclui os dados sobre mercados futuros e opções.

Este último fornece informações muito mais completas sobre o mercado, é preferível usá-lo. Também existe um tipo especial de relatório, chamado «Commodity Index Trader Supplement». Sua principal diferença está na flutuação limitada dos mercados agrícolas, e o mais importante, inclui uma quarta categoria de traders, os traders dos indíces de commodities (Commodity Index Traders-CIT).

Estes traders ocupam uma posição intermediária. De um lado as suas posições pertencem aos operadores hedge, eles estão incluídos nos relatórios: «Futures Only Reports» e «Futures-and-Options Combined Reports». Por outro lado - o comportamento desta classe de traders é semelhante ao comportamento dos grandes fundos hedge. Geralmente, eles são compradores líquidos em contraste com os operadores hedge clássicos, que são vendedores líquidos. Existe uma opinião de que esta categoria de traders trazem o pânico ao mercado, as quedas e subidas acentuadas são na sua maioria ações deste grupo. Eles têm potência suficiente para mover o mercado a qualquer direção para alcançarem o principal objetivo - obter um lucro especulativo. Os dados para esta categoria de traders estão disponíveis a partir de 2007, em Exel e CSV. Devido ao pequeno histórico de suas ações, o estudo do comportamento deles é uma tarefa para o futuro. Na atualidade este tipo de relatório não é suportado pelo projeto.

Os relatórios são publicados em vários formatos. Em primeiro lugar, as tabelas de negociação em si. Neste formato, existe o relatório «Commodity Index Trader Supplement» que está disponível apenas nos arquivos do Excel e CSV.

A forma dessas tabelas é familiar para você:


Figura 3-1. Parte do relatório COT no formato Exсel


Também existem tabelas normais do Excel, Elas contêm os mesmos dados que no relatório convencional, a única diferença são os dados recolhidos durante um longo período de tempo. Um fragmento desta tabela é mostrado na Figura 3-2:



Figura 3-2. Parte do relatório COT no formato Exсel


A Comissão publica os seus relatórios em CSV, Este formato representa um arquivo de texto com a extensão «txt» , os dados são separados por vírgula. Este é o único formato que o projeto Meta COT usa, de modo que este formato deve ser descrito em mais pormenores. Na figura 3.4 há uma parte deste arquivo:



Figura 3-4. Exemplo do relatório COT no formato CSV


Sua estrutura pode parece caótica, mas não é, o arquivo consiste em linhas e colunas. O número de colunas é 128, o número de linhas depende do número de instrumentos e o período do relatório, normalmente o arquivo do relatório contém dados para um ano. Por exemplo, o relatório transferido neste formato em setembro de 2009, conterá os dados de janeiro de 2009 a setembro de 2009 (a data de redação deste texto). A primeira linha é composta por 128 colunas, nomes da colunas. Os arquivos CSV são a base na construção dos dados do projeto Meta COT.

Agora vamos criar um gráfico. É conveniente considerar os dados do relatório COT para um período longo de tempo. Permite preparar os dados a partir do ano 2000 até o presente. Então, vamos para o endereço http://cftc.gov/marketreports/commitmentsoftraders/CFTC009781.html ou nas seções Home> Market Reports > Commitments of Traders do site http://cftc.gov.

Vamos ver a seguinte figura:


Figura 3-5. Arquivo de dados


Existem dois tipos de relatórios: «futures only reports» e «futures and options combined» . Queremos usar os dados de 2000, é razoável utilizar um segundo tipo de relatório sobre mercados futuros e opções (a propósito, os dados anteriores a 1995 estão disponíveis somente para relatórios dos mercados futuros), eles têm os mesmos formatos de relatórios e você pode usar qualquer um destes dois tipos. Faça o download de todos os nove arquivos de texto a partir de 2009 e que terminam no ano de 2000. Mais tarde, você também pode fazer o download de um único arquivo que inclui todos os dados de 1995 a 2008 e um arquivo em 2009, mas nesse caso haverá um grande número de instrumentos. Na Fig. 3.5, uma das referências está cercada pelo círculo vermelho. Os arquivos transferidos devem ser descompactados no diretório ...\ Meta Trader folder \ experts \ files \.

Todos os arquivos têm o mesmo nome annualof.txt, então eles devem ser renomeados. O nome do arquivo pode qualquer coisa e estes nomes de arquivos devem ser listados em names.ini, um arquivo de configuração especial do projeto. É muito simples e representa uma simples listagem dos arquivos a serem processados.

Por exemplo, se temos os arquivos chamados "2009_Futures-e-options.txt" para 2009 ", "2008_Futures-e-options.txt" para 2008 e assim por diante, a lista de arquivos processados ​​será a seguinte:



Figura 3-6. Um exemplo de lista de arquivos processados ​​ao projeto COT


Se você renomear os arquivos baixados da mesma forma que no exemplo, então você não terá que editar o names.ini arquivo, por padrão o script irá trabalhar com este conjunto de arquivos. Se você vai precisar usar outros nomes por qualquer motivo, então especifique os novos nomes de arquivos em names.ini, em vez daqueles especificados por padrão.

Assim, no diretório \files você deve ter 10 arquivos, como mostrado na Figura 3-6:



Figura 3-7. O conteúdo da pasta MetaTrader\experts\files


O conteúdo names.ini deve ser o mesmo da Figura 3-6. Note que a ordem dos nomes dos arquivos names.ini é importante, os nomes dos arquivos devem ser listados em ordem decrescente. Por exemplo, o primeiro é um arquivo de 2009, o último é de 2000.

Após os dados serem preparados, é hora de executar o script Meta COT Script Build. Ele funciona no modo automático e tem uma única opção - o nome da lista de arquivos, neste caso, o nome do arquivo é "names.ini", mas pode ser alterado. É necessário soluções flexíveis para alguns problemas.

Suponha, por exemplo, que para alguns dos instrumentos você deseja analisar somente os dados dos mercados futuros, sem dados do mercado de opções. Ao mesmo tempo, para outros instrumentos pretende utilizar relatórios mais completos sobre futuros e opções. Você pode baixar dois tipos de relatórios para o seu computador e criar as duas listas de arquivos, por exemplo names_option.ini e names_futures.ini.

Primeiramente você pode obter dados sobre futuros executando um script com o parâmetro "names_list" igual a "names_futures.ini", depois disso, estes dados devem ser salvos em outra pasta. Em seguida, os dados necessários serão obtidos novamente através da execução do script, mas desta vez com o parâmetro "names_list " igual "names_option.ini", assim os dados para os mercados futuros e opções serão gerados.

Pouco depois do script executar muitos arquivos com relatórios em formato CSV, ele será gerado na pasta "\files". Cada arquivo terá uma formato como ""COT - Market Name - Name of the exchange. CSV".

Muitos dos arquivos serão incompletos, relatórios COT em alguns mercados têm uma característica de aparecerem brevemente, em seguida desaparecem para sempre, porém existe um número suficiente de instrumentos que têm um relatórios periódicos. Mais tarde vamos considerar os instrumentos incluídos no relatório com mais detalhes, mas agora a nossa atenção são para os arquivos gerados. Considere o formato usado num deles: "COT - NEW ZEALAND DOLLAR - CHICAGO MERCANTILE EXCHANGE. CSV". É fácil adivinhar que contêm uma informação que necessitamos sobre os mercados futuros do dólar da Nova Zelândia.


Vamos abri-lo no bloco de notas e ver o texto:



Figura 3-8. Dólar da Nova Zelândia


Pode-se ver que este arquivo contém as estatísticas para um período longo de tempo no caso do dólar de Nova Zelândia. Coluna com nomes estão ausentes, este arquivo é usado para indicadores que não precisam dos nomes das colunas. No entanto, a fim de compreender o que são estes números, vamos olhar para cada coluna:

I - Nome do Instrumento;
II - Data do relatório;
III - Open Interest (Contratos em Aberto);
IV - Posições Compradas dos "traders non-commercial";
V - Posições Vendidas dos "traders non-commercial";
VI - Spread (Cobertura) dos "traders non-commercial";
VII - Posições Compradas dos Operadores;
VIII - Posições Vendidas dos Operadores;
IX - O número acumulado de posições compradas do relatório dos traders;
X - A quantidade cumulativa de posições vendidas do relatórios dos traders;
XI - Posições compradas dos traders não identificados;

XII - Posições vendidas dos traders não identificados.

Isso é tudo que você precisa para construir os indicadores COT.

Nesta fase, a informação dos mesmos mercados podem estar em arquivos diferentes. Primeiramente isto se deve ao fato de que os nomes das bolsas de valores estão mudando ao longo do tempo; em segundo lugar, a Comissão pode alterar o próprio nome do instrumento ou a possibilidade de um erro no título, a mudança de nome do instrumento, mesmo de um caractere leva a uma diferença significativa ao programa que extrai os dados.

Por exemplo, os instrumentos "COT - SUGAR NO. 11 - COFFEE SUGAR AND COCOA EXCHANGE" e "COT - SUGAR NO. 11 - COFFEESUGAR AND COCOA EXCHANGE" são completamente diferentes para o programa, e serão criados dois títulos diferentes para o arquivo dos instrumentos. Vamos dar uma olhada no exemplo do açúcar. Depois de executar o script Meta COT Script Build, o diretório \files, entre muitos arquivos, terá:

COT - SUGAR NO. 11 - COFFEE SUGAR AND COCOA EXCHANGE .csv
COT - SUGAR NO. 11 - COFFEESUGAR AND COCOA EXCHANGE .csv
COT - SUGAR NO. 11 - ICE FUTURES U.S. .csv
COT - SUGAR NO. 11 - NEW YORK BOARD OF TRADE .csv
COT - SUGAR NO. 14 - COFFEE SUGAR AND COCOA EXCHANGE .csv

O último arquivo pertence a uma outra classe de açúcar e contém muito poucos dados, então ele pode ser usado ou imediatamente removido. Como se pode ver a partir do nome, os primeiro e segundo arquivos correspondem ao mesmo instrumento, a Comissão algum tempo criou um relatório sobre instrumentos com erros gramaticais, o que influenciou a segunda criação do arquivo. As terceira e quarta posições contêm os arquivos do mesmo açúcar, mas em outras bolsas: "ICE FUTURES" e "NEW YORK BOARD OF TRADE".

Se você abrir esses arquivos, possívelmente vai identificar a cronologia das negociações do açúcar:

Nome do arquivo Açúcar

Data de início da negociação

Data de término da negociação

COT - SUGAR NO. 11 - ICE FUTURES U.S. .csv

2007.09.04

2009.09.01

COT - SUGAR NO. 11 - NEW YORK BOARD OF TRADE .csv

2005.01.04

2007.08.28

COT - SUGAR NO. 11 - COFFEE SUGAR AND COCOA EXCHANGE .csv

2003.02.25

2004.12.28

COT - SUGAR NO. 11 - COFFEESUGAR AND COCOA EXCHANGE .csv

2003.01.07

2003.02.14

Tabela 3-9. Os arquivos com relatórios sobre o açúcar

Como foi visto a partir da cronologia de negociação, todos os arquivos de dados descrevem o mesmo produto, logo é lógico combinar todos estes arquivos num arquivo de relatório contínuo. Para esse efeito, temos o script Meta COT Script Concatenate. O script precisa de um arquivo especial com as enumerações, por exemplo o SUGAR CONCATENATE.ini. Todos os arquivos referente a açúcar têm a necessidade de serem juntados numa única cronologia, assim devem ser listados. O script trabalha com os arquivos de açúcar para criar transferências de arquivos especiais, tais como o SUGAR CONCATENATE.ini. Ele lista todos os arquivos de açúcar combinados numa única seqüência cronológica.

O nome do arquivo com a lista de arquivos deve ser incluído na lista de arquivos central CONCATENATE.ini. Este arquivo contém os nomes de todos os arquivos necessário a combinar na seqüência cronológica. O Projeto MetaCOT tem arquivos correspondentes, eles têm o seguinte formato: COT - NAME TOOL CONCATENATE.ini. Estes nomes estão relacionados na lista de arquivos CONCATENATE.ini.

Depois de todas as listas de arquivos serem preparadas, você pode executar o script Meta COT Script Concatenate. Depois ele criará arquivos combinados com o mesmo nome dos arquivos, mas no formato SCV.

Para entender melhor a lógica do processamento vamos dar uma olhada na Figura 3-10. A hierarquia dos arquivos CONCATENATE.ini, SUGAR CONCATENATE.ini e alguns outros é visto como:



Figura 3-10. As listas de arquivos relacionados no arquivo concatenate.ini


3.3 Relatórios Combinados Como Uma Nova Ferramenta de Análise

Existem muitos produtos relacionados aos relatórios CFTC . Por exemplo, o preço do bezerro e boi gordo no mercado estão fortemente correlacionados. O trigo é negociado em três Bolsas nos EUA e os seus preços são muito próximos uns dos outros.

Naturalmente as ações de todos os participantes nestes mercados também serão aproximadamente as mesmas. Então por que não combinar os relatórios sobre esses mercados num relatório combinado? Por exemplo, se os operadores têm 20 100 contratos no mercado de boi gordo e 15 200 contratos no mercado de bezerro, então a posição combinada do mercado de gado é na quantidade de 35 300 contratos. Essa adição pode ser feita a todos os participantes do mercado, tanto para posições compradas como vendidas.

Podemos ir mais longe, combinar as ações de todas as partes dos mercados com uma variedade comum. Como combinar relatórios para todos os mercados futuros de moeda num único relatório e obter a nossa própria versão do índice do dólar? Ou como podemos combinar os relatórios de todos os índices de ações do S&P 500 e Dow Jones 30. O instrumento resultante conterá volumes muito maiores e irá incluir os pontos de vista dos participantes do mercado numa indústria como um todo!


Esta ideia surpreendentemente bela será realizada. Imaginem, o projeto MetaCOT tem uma ferramenta desse tipo, é chamada de Meta COT Script Agregation. Funciona como a ferramenta Meta COT Script Concatenate, com a diferença do algorítmo para os relatórios combinados. Ela precisa de uma lista de instrumentos específicos para combinar, os nomes dos arquivos destes instrumentos devem ser listados num único arquivo, o nome do arquivo deve ser adicionado na relação de arquivo com a lista de todos os arquivos semelhantes.

Vamos tentar criar um nosso próprio índice do dólar. O primeiro temos que criar o arquivo "Dollar Index Agregation.ini" e preenchê-lo com nomes dos relatórios de todos os mercados futuros de moeda:

COT - EURO FX CONCATENATE.csv
COT - BRITISH POUND STERLING CONCATENATE.csv
COT - JAPANESE YEN CONCATENETE.csv
COT - AUSTRALIAN DOLLAR CONCATENATE.csv
COT - CANADIAN DOLLAR CONCATENATE.csv
COT - SWISS FRANC CONCATENATE.csv

Veja que estes arquivos foram fundidos usando o script Meta COT Script Concatenate. Uma vez que os nomes estão listados, você pode salvar num arquivo chamado "COT - DÓLAR INDEX AGREGATION.ini" no diretório MetaTrader/expert/files, o nome pode ser qualquer coisa, mas vamos usar este. Em seguida, você deve criar um arquivo AGREGATION.ini que especifica o nome da nossa associação: COT - DÓLAR INDEX AGREGATION.ini.

Agora você pode salvar o arquivo e executar o script Meta COT Script Agregator. O script tem um único parâmetro - na verdade é o nome da lista de arquivo que necessita prosseguir, pois neste caso os nomes da lista do arquivo "AGREGATION.ini" devem ser definidos como o mesmo nome do arquivo. O script irá resumir os valores de todos os instrumentos incluídos na lista do arquivo "COT - DÓLAR INDEX AGREGATION.ini", neste caso serão usados seis arquivos com relatórios sobre todas as moedas e criará um novo arquivo com o nome "COT - DÓLAR INDEX AGREGATION.csv". Este arquivo irá conter os valores resumidos de relatórios para todos os mercados futuros de moeda.

A lista dos arquivos de relatórios que pode ser assumida é limitada apenas pela sua imaginação. Usando essa poderosa ferramenta, você pode criar novos relatórios, um novo tipo de informação! A principal vantagem é que todas as ações são realizadas automaticamente e você não tem que resumir os valores manualmente.

No entanto, relatórios podem não conter dados para um dado período quando comparado com os outros relatórios pertencentes à lista geral de processamento. Nesta situação o programa vai identificar tal intervalo de tempo e informará a seguinte mensag: «--> Time Gap has Found: 21.04.2004» (lacuna de tempo foi encontrada). Não há nada errado, na verdade é típico e acontece regularmente. Neste cenário o programa resumirá os dados de todos os outros instrumentos e criará um relatório, incluindo a data de 21.04.2004. Além dos dados referente a datas ausentes, poderá acontecer de conter dados relativos ao período anterior mais próximo, Nesta situação, a primeira data seria processada. Por exemplo, o relatório combinada para 21/04/2004 conterá a data 14/04/2004 no caso de ausência de dados para o dia 21 de Abril.

Tome cuidado quando você combina relatórios, um grupo de instrumentos pode ter os mesmos preços dos contratos, outros grupos podem ter diferentes. Um exemplo simples: o índice S & P500 e dois contratos de mercados futuros coirmãos: E-mini S&P500 e o Full-size S&P500. Um contrato de mercado futuro eletrônico é igual ao valor de índice *5$, já o "full-size" é igual ao valor de índice *25$. Apesar do fato deste grande mercado admitir um coirmão eletrônico menor sobre a quantidade de contratos, a capitalização pode ser igual e até mesmo o Full-size S&P500 pode ser mais capitalizado. A questão no acréscimo competente de valores de vários mercados continua em aberto, no entanto esta ferramenta de adição de base já existe e pode ser aplicado com os devidos cuidado.

3.4 Indicadores

Todos os indicadores são organizados no mesmo princípio e contêm o mesmo núcleo. O núcleo do indicador carrega os dados e calcula os valores a todos os indicadores do projeto MetaCOT. O indicador mostra apenas os valores que definiram a sua tarefa e dentro de seu código contém valores para outros possíveis indicadores. Esta abordagem provou ser extremamente bem sucedida, especialmente na concepção do robô de negociação, pois a biblioteca cotlib.mq4 calcula todos os valores possíveis dos indicadores que pode ser especificada como os parâmetros de otimização!

Ou seja, a cada nova execução, o robô usará um novo indicador e seu período de cálculo, deste modo o melhor indicador e o melhor período podem ser determinados, sendo útil para encontrar o indicador mais apropriado e o grupo de traders.

Quando todos os arquivos necessários do relatório forem preparados, é necessário carregá-los nos indicadores. Todos os indicadores são semelhantes e possuem uma estrutura semelhante dos seus parâmetros.

Como exemplo, vamos considerar o indicador de Meta COT Net:


Tipo de variável

Nome da variável

Valor padrão

Descrição

intperíodo

156

Período para o cálculo do indicador. Ele é utilizado pelos indicadores que precisam de um período para o cálculo (COT Index, WILLCO, etc). Normalmente é utilizada uma média de 156 semanas.

oolShowNoncomm

false

Se for verdadeiro (true), o indicador mostrará a posição líquida total dos "traders non-commercial".

boolShowOperators

true

Se for verdadeiro (true), o indicador mostrará a posição líquida total dos operadores.

boolShowNonrep

false

Se for verdadeiro (true), o indicador mostrará a posição líquida total dos traders não identificados.

boolShowOI

true

Se for verdadeiro (true), o indicador mostra o Índice do "Open Interest " (Contratos em Aberto)

boolload_cot_file

false

Se for verdadeiro (true), o indicador carregará o arquivo de relatório preparado com o nome especificado pela variável cot_file.

stringcot_file

cot-sample.txt

A variável contém o nome do arquivo de relatório que é necessário para carregar se a variável load_cot_file for verdadeira (true).

stringsettings

settings.txt

Um arquivo de configurações da correspondência entre o indicador e o relatório. O programa encontra o nome do gráfico atual em arquivo e usa o relatório com o mesmo nome.

Figura 3-11. Variáveis ​​do indicador Meta COT Net Position


Primeiro todos os indicadores utilizam uma média, têm um período como variável externa. Por padrão, esta variável é definida como 156 (3 anos em média).

Em segundo lugar, todos os indicadores tem variáveis ​​booleanas, o que permite personalizar o desenho do indicador (por exemplo, você pode definir um grupo de participantes do mercado).

Em terceiro lugar, os indicadores tem três variáveis: load_cot_file, cot_file e settings. Vamos considerá-las em detalhes. Para todos os indicadores existe o chamado "arquivo de correspondência", por padrão ele é chamado de "settings.ini". É extremamente inconveniente selecionar manualmente cada vez que o nome do relatório for necessário, relatório este que deve ser baixado para análise do gráfico selecionado. Assim, cada instrumento tem seu próprio relatório. O arquivo settings.ini determina que tipo de relatório se deseja fazer o download no gráfico atual. Por exemplo, se a variável load_cot_file é falsa e você anexa o indicador Meta COT Posição Net no gráfico GBPUSD, o indicador irá selecionar automaticamente o relatório chamado "COT - BRITISH POUND STERLING CONCATENATE.csv" e carrega-o no gráfico. Tudo é possível graças ao arquivo simples que corresponde o nome do instrumento com o nome do relatório.

Por padrão, Meta COT já tem este arquivo, este é um típico arquivo CSV como o seguinte:

nome do arquivo do relatório; nome do indicador; o primeiro caractere significativo ao primeiro instrumento; o primeiro caractere significativo a N instrumentos.

Por exemplo, se você quiser baixar automaticamente os relatórios " COT - SWISS FRANC CONCATENATE.csv", cada vez que o indicador é anexado aos gráficos 6S e USDCHF, você precisa adicionar a seguinte linha ao arquivo
COT - SWISS FRANC CONCATENATE.csv;SWISS FRANC;6S;USDCHF

Neste caso, o símbolo «6S» é o nome coletivo para vários mercados futuros do Franco Suíço com diferentes datas de execução. Por exemplo, o Franco Suíço negociado em contratos 6S_CONT; 6SU9; 6SU9#I; 6SZ9; 6SZ9#I. O primeiro deles, 6S, será o usado para o backtesting das estratégias. Ao sistema é suficiente especificar apenas os primeiros caracteres significativos do instrumento (neste caso, 6S), a fim de utilizar todos os mercados futuros do Franco Suiço aos indicadores no mesmo relatório. A última linha é uma espécie de "capa". Se todos os conteúdos do arquivo foram explorados e os relatórios necessários não foram encontrados, o indicador mostra o nome do último relatório. Neste caso, em vez do nome do relatório usado, haverá uma mensagem de aviso: "REPORT FOR THE INSTRUMENT WASN'T FOUND!" (Relatório do instrumento não foi encontrado). Será transferido um relatório cujo nome é definido pela variável cot_file, independente da variável load_cot_file.

Observa-se que o ponto e vírgula no final da linha está ausente. Neste caso, o indicador irá fazer o download do relatório COT - SWISS FRANC CONCATENATE.csv e o nome do indicador mudará para: Meta COT Index (156): SWISS FRANC. O nome "SWISS FRANC" (Franco Suiço) é tomado a partir da segunda linha da coluna, o período médio é definido pela variável "period", especificada entre parênteses. O conteúdo completo do arquivo setting.ini, configurado para funcionar com uma corretora específica pode ser visto na Figura 3-8. Observe que os instrumentos da sua corretora podem ser diferentes a partir destes nomes. Você precisa encontrar os nomes correspondentes nos instrumentos da sua corretora e adicioná-los num arquivo settings.ini, de acordo com as regras descritas acima.

Existe alguns casos onde a análise do instrumento precisa baixar um arquivo específico com o nome do relatório que não corresponde aos valores padrão. Neste caso, você deve definir a variável load_cot_file como "verdadeira" (true) e então especificar o nome do arquivo de relatório exigido na variável cot_file. O indicador carregará o arquivo exigido num relatório independente do nome desta ferramenta.



Figura 3-8. Um exemplo do arquivo settings.ini


Para muitas tarefas, você pode usar um programa de terceiros, como o Microsoft Excel para a análise de dados. Nestes casos, pode-se utilizar os valores calculados pelo Meta COT no instrumento especificado e então baixar os valores do indicador num programa de terceiros. Para estes casos, um script especial Meta COT Script Report foi criado. Ela precisa da biblioteca cotlib.mq4 para o seu trabalho. Ele tem os mesmos parâmetros que os indicadores: período de cálculo (períod) e o índice de movimento (movement_index). Após a sua execução no instumento atual, ele criará o arquivo Meta COT Report REPORT TITLE.csv no diretório \files directory. Este arquivo conterá os valores de todos os indicadores, com os valores de base para o atual instrumento.

Quando todos os indicadores estão configurados e funcionando, então se exclue todos os relatórios. Meta COT não atualiza os dados e cada vez que criar um novo conjunto será a partir do zero ou acrescenta os dados aos já existentes. Isso significa que, antes de executar scripts, os dados antigos devem ser removidos. Infelizmente MetaTrader não tem uma função para apagar os arquivos e nós temos de fazê-lo manualmente. A maneira mais conveniente de fazer isso é criar comandos de arquivo em lotes ou um arquivo "bat".

Este arquivo já existe, é chamado de erase_cot.bat. Ele contém apenas uma linha:

erase COT*.csv

Depois da execução vai exluir todos os arquivos cujos nomes começam com COT e extensão CSV.

Depois da exclusão, o procedimento para criação do arquivo pode ser repetida novamente.


3.5 Código fonte

Nós desenvolvemos um projeto modificado facilmente gerenciável e que pode ser facilmente adaptado a qualquer sistema de negociação mecânica.

O mecanismo da obtenção de dados do relatório SCV da Comissão é implementado num programa independente, o Meta COT Script Build. O algoritmo do programa é muito simples, garantindo um alto grau de capacidade para gerenciamento e modificação adicional. Inicialmente o programa abre uma lista de nomes de arquivos que ele precisa para ser processado. Os nomes dos arquivos será contido num arquivo especificado num único parâmetro (names.ini, nome padrão). Quando for lido o nome do primeiro arquivo, o script tenta abrir o arquivo com o mesmo nome no diretório. Se o arquivo existir, o programa inicia a leitura do arquivo SCV, coluna a coluna, o final da linha reseta o contador de colunas. Quando o contador de coluna está referenciando a coluna necessária (verifica pela função especial), o seu valor imediatamente será gravado no arquivo de destino e depois ele escreve um ponto e vírgula.

É necessário descrever o processo do final do arquivo criado em detalhe. Se o contador de colunas especifica que neste momento o programa processa a primeira coluna (nome do instrumento), então lerá este nome e tentará abrir o arquivo com o mesmo nome. Se o arquivo ainda não existir, o programa criará, do contrário anexa os dados no fim do arquivo. Por isso é necessário excluir os arquivos existentes antes de cada atualização de dados. Os valores das colunas posteriores serão carregados e adicionados a este arquivo. depois o contador de colunas é anulado e o programa fecha o arquivo de saída atual. Após o arquivo do relatório da comissão ser processado, o programa tenta abrir o próximo arquivo especificado numa lista de arquivos.

Acontece que o programa não sabe nada sobre o nome dos mercados futuros ou a ordem de seus agrupamento. Em princípio, os nomes de todos os instrumentos podem ser colocadas em ordem aleatórias e podem estar em diferentes arquivos. O resultado final será sempre o mesmo: um instrumento - um arquivo de relatório.

O código fonte do Meta COT Script Build é o seguinte:

#property copyright "Copyright © 2009, C-4, All Rights Reserved."
#property link      "vs-box@mail.ru"
#property show_inputs
// Definições
#define Market_and_Exchange_Names 1
#define As_of_Date_in_Form_YYMMDD 2
#define As_of_Date_in_Form_YYYY_MM_DD 3
#define CFTC_Contract_Market_Code 4
#define CFTC_Market_Code_in_Initials 5
#define CFTC_Region_Code 6
#define CFTC_Commodity_Code 7
#define Open_Interest_All 8
#define Nonc_Positions_Long_All 9
#define Nonc_Positions_Short_All 10
#define Nonc_Positions_Spreading_All 11
#define Commercial_Positions_Long_All 12
#define Commercial_Positions_Short_All 13
#define Total_Reportable_Pos_Long 14
#define Total_Reportable_Pos_Short 15
#define Nonrep_Positions_Long_All 16
#define Nonrep_Positions_Short_All 17

extern string name_list="names.ini";
//string normalize_name;
int a;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int CFileNames,
   cot_file,
   tools_data;

   int column,
   column_now,
   column_string;
   int cot;
   bool IsOldInfo=true;
   string name_cotfile;
   string data,data2,
   normalize_name,
   string_cot;

   CFileNames=FileOpen(name_list,FILE_READ|FILE_CSV);
   if(TrueFileName(CFileNames,name_list)==false)return(1);
   Print("The file list: ",CFileNames);
//  Abrir uma lista de arquivos com relatórios
   while(FileIsEnding(CFileNames)==false)
     {
      cot++;
      name_cotfile=FileReadString(CFileNames);
      cot_file=FileOpen(name_cotfile,FILE_READ|FILE_CSV,",");
      if(TrueFileName(cot_file,name_cotfile)==false)return(1);
      else Print("File not found");

      // Pule primeira string
      while(FileIsLineEnding(cot_file)==false)
        {
         column++;
         FileReadString(cot_file);
        }

      while(FileIsEnding(cot_file)==false)
        {
         data=FileReadString(cot_file);
         column_string++;
         if(FileIsLineEnding(cot_file)==true || FileIsEnding(cot_file)==true)
           {
            column_string=0;
            FileWrite(tools_data,string_cot);
            FileClose(tools_data);
            string_cot="";
           }
         else
           {
            if(TrueDataNew(column_string)==true)
              {// verificar a vírgula no nome do instrumento
               data=NormalizeData(data);
               if(column_string==Market_and_Exchange_Names)
                 {

                  data2=FileReadString(cot_file);        // ver comment1!
                  if(CheckValidColumn(data2)==true)      //
                     data=data+NormalizeColumn(data2);   //
                  else column_string++;
                  //dados=NormalizeNames (dados);
                  tools_data=FileOpen("COT - "+data+".csv",FILE_READ|FILE_WRITE|FILE_CSV);
                  TrueFileName(tools_data,data);
                  FileSeek(tools_data,0,SEEK_END);
                  string_cot=string_cot+data;
                 }
               else
                 {
                  if(column_string==As_of_Date_in_Form_YYYY_MM_DD)data=ConvertData(data);
                  string_cot=string_cot+";"+data;
                 }
              }
           }
        }
      Print("Total lines: ",column);
     }
   Print(a);
   return(0);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string ConvertData(string data)
  {
   string c_data="";
   int strlen=StringLen(data);
   int char;
   for(int i=0;i<strlen;i++)
     {
      char=StringGetChar(data,i);
      if(char=='-')c_data=c_data+".";
      else c_data=StringConcatenate(c_data,CharToStr(char));
     }
   return(c_data);
  }
// Se a célula atual é necessária para um relatório COT combinado, retorna verdadeiro,
// Caso contrário, retorna falso. A lista das células utilizadas são configuradas como definidas
bool TrueDataNew(int column_string)
  {
   switch(column_string)
     {
      case Market_and_Exchange_Names:
      case As_of_Date_in_Form_YYYY_MM_DD:
      case Open_Interest_All:
      case Nonc_Positions_Long_All:
      case Nonc_Positions_Short_All:
      case Nonc_Positions_Spreading_All:
      case Commercial_Positions_Long_All:
      case Commercial_Positions_Short_All:
      case Total_Reportable_Pos_Long:
      case Total_Reportable_Pos_Short:
      case Nonrep_Positions_Long_All:
      case Nonrep_Positions_Short_All:
         return(true);
      padrão:
         return(false);
     }
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string NormalizeData(string file_name)
  {

   int char;
   int strlen;
   string normalize_name="";
   string normalize_name_p="";
   strlen=StringLen(file_name);
   for(int i=0;i<strlen;i++)
     {
      char=StringGetChar(file_name,i);
      switch(char)
        {
         case '/':
         case '\\':
         case ':':
         case '*':
         case '\"':
         case '<':
         case '>':
         case '|':
         case ';':
            break;
         padrão:
            // Se o último símbolo da string é espaço, excluí-lo.
            // Se (char==" "&&i==strlen-1), então quebrar;
            normalize_name=StringConcatenate(normalize_name,CharToStr(char));
        }
     }
   return(normalize_name);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string NormalizeNames(string data)
  {
   int strlen=StringLen(data);
   string n_data;
   data=StringTrimRight(data);
   if(CharToStr(StringGetChar(data,strlen-1))==".")StringSetChar(data,strlen-1,"");
   return(data);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool TrueFileName(int handle,string filename)
  {
   if(handle==-1)
     {
      Print("Can't open the file: ",filename," Last Error: ",GetLastError());
      return(false);
     }
   else return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CheckValidColumn(string column_name)
  {
   int strlen=StringLen(column_name);
   if(StringFind(column_name,"\"")!=-1){a++;return(true);}
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string NormalizeColumn(string column)
  {
   string n_column;
   int char;
   int strlen=StringLen(column);
   for(int i=0;i<strlen;i++)
     {
      char=StringGetChar(column,i);
      if(char=='\"')continue;
      else n_column=StringConcatenate(n_column,CharToStr(char));
     }
   return(n_column);
  }
//+------------------------------------------------------------------+

O trabalho do indicador é mais difícil. Todos os indicadores são na sua maioria constituídos pelo mesmo código - a biblioteca cotlib.mq4. A sua estrutura pode ser dividida em várias partes:

1. Definição - Descrição das constantes de pré-processamento, tabelas de dados (conjunto de arrays);

2. Inicialização - Calcula o tamanho dos dados baixados e a redistribuição do tamanho dos arrays (função init_data ());

3. Carregamento de dados do arquivo do relatório (função load_data ());

4. O cálculo dos valores do indicador usando os dados do relatório (função count_data ());

Para acessar ao valor do indicador, a função get_data (tipo int, int bar) é usada. Ela tem dois parâmetros: o número de valores do indicador que deve ser retornado e o índice da barra que você deseja obter o valor do indicador. Por exemplo, se você deseja obter os valores do indicador WILLCO dos operadores para a barra atual (bar = 0), então a chamada de função deve ser: get_data (WILLCO_OPERATORS, 0); "WILLCO_OPERATORS" aqui é a definição de um número inteiro constante, especificado para o pré-processador chamado.

O período médio para todos os indicadores calculados são iguais e devem ser escolhidos antes da inicialização do indicador (após a mudança dos parâmetros de entrada, a inicialização do indicador ocorre automaticamente). O arquivo necessário para leitura é determinado automaticamente pela função settings_load void (void). Abre o arquivo de configuração (settings.ini, nome padrão) e tenta encontrar o atual instrumento (Symbol ()) na lista de instrumentos dos relatórios exigidos. Se um relatório corresponde ao nome deste instrumento, a função vai baixá-lo, se não houver nenhum relatório para o instumento atual - ele carrega o instrumento pelo padrão (nome do parâmetro).


#property copyright "Copyright © 2009, C-4, All Rights Reserved."
#property link      "vs-box@mail.ru"
// Possível "tipo" de valores dos parâmetros para a função get_data()
#define OI                    0
#define NONCOMM_LONG          1
#define NONCOMM_SHORT         2
#define OPERATORS_LONG        3
#define OPERATORS_SHORT       4
#define NONREP_LONG           5
#define NONREP_SHORT          6
#define NET_NONCOMM           7
#define NET_OPERATORS         8
#define NET_NONREP            9
#define OI_NONCOMM_LONG       10
#define OI_NONCOMM_SHORT      11
#define OI_OPERATORS_LONG     12
#define OI_OPERATORS_SHORT    13
#define OI_NONREP_LONG        14
#define OI_NONREP_SHORT       15
#define WILLCO_NONCOMM        16
#define WILLCO_OPERATORS      17
#define WILLCO_NONREP         18
#define INDEX_OI              19
#define INDEX_NONCOMM         20
#define INDEX_OPERATORS       21
#define INDEX_NONREP          22
#define MOVEMENT_NONCOMM      23
#define MOVEMENT_OPERATORS    24
#define MOVEMENT_NONREP       25
#define MOVEMENT_OI           26
#define OI_NET_NONCOMM        27
#define OI_NET_OPERATORS      28
#define OI_NET_NONREP         29


extern bool   load_cot_file=false;
extern string cot_file="COT - U.S. DOLLAR CONCATENATE.csv";
extern string settings="settings.ini";
string name;
bool error=false;
int column;
bool DrawData=true;
bool LoadData=true;


//**********************************************************************************************************
//                                     DADOS DA TABELA COT
int n_str;                    // número de strings

                              // Array com datas
datetime realize_data[];
// Arrays com posições absolutas
double open_interest[];       // Valor do Open Interest
double noncomm_long[];        // As posições compradas dos "traders non-commercial"
double noncomm_short[];       // As  posições vendidas dos "traders non-commercial" 
double noncomm_spread[];      // Spread dos "traders non-commercial" 
double operators_long[];      // Posições compradas dos operadores
double operators_short[];     // Posições vendidas dos operadores
double nonrep_long[];         // Posições compradas dos traders não identificados (multidão)
double nonrep_short[];        // Posições vendidas dos traders não não identificados (multidão)

                              // Alguns arrays contêm o resultado da divisão da posição comprada absoluta 
                              // pela posição vendida para cada uma das categorias de traders

double oi_noncomm_long[];     // Open Interest / Posições compradas dos "traders non-commercial"
double oi_noncomm_short[];    // Open Interest / Posições  vendidas dos "traders non-commercial"
double oi_operators_long[];   // Open Interest/ Posições compradas "traders commercial" (operadores)
double oi_operators_short[];  // Open Interest / Posições  vendidas dos "traders commercial" (operadores)
double oi_nonrep_long[];      // Open Interest / Posições compradas dos traders não identificados (multidão)
double oi_nonrep_short[];     // Open Interest / Posições vendidas dos traders não identificados (multidão)

                              // Alguns arrays  contêm o resultado da divisão da posição líquida total pelo Open Interest
                              // Para cada uma das categorias de traders, é utilizado no cálculo WILLCO
double oi_net_noncomm[];
double oi_net_operators[];
double oi_net_nonrep[];

// Arrays com posições líquidas de vários grupos de traders
double net_noncomm[];         // Posição líquida de "traders noncommercial"
double net_operators[];       // Posição líquida de "traders commercial"
double net_nonrep[];          // Posição líquida dos traders não identificados

double index_oi[];            // Índice do Open Interest
double index_ncomm[];         // Índice de "traders noncommercial"
double index_operators[];     // Índice de "traders commercial" (operadores)
double index_nonrep[];        // Índice de traders não identificados (multidão)

                              // Arrays com Stochastic, calculados com a divisão do
                              // Open Interest pela posição líquida Total para cada categoria de traders 
                              // Estocástico (OI/NET_POSITION)
double willco_ncomm[];        // 
double willco_operators[];    //
double willco_nonrep[];       //

                              //MOVEMENT INDEX
double movement_oi[];
double movement_ncomm[];
double movement_operators[];
double movement_nonrep[];
//**********************************************************************************************************
//
bool init_data()
  {
   string data;
   int handle_cotfile;
   int str;
   settings_load();
   handle_cotfile=FileOpen(cot_file,FILE_READ|FILE_CSV);
//handle_cotfile=FileOpen("COT - U.S. DOLLAR CONCATENATE.csv",FILE_READ|FILE_CSV);
   if(handle_cotfile==-1)
     {
      Print("Can't load file. The further work is not possible ",cot_file);
      Print(GetLastError());
      return(false);
     }
   while(FileIsEnding(handle_cotfile)==false)
     {
      data=FileReadString(handle_cotfile);
      if(FileIsLineEnding(handle_cotfile) && data!="")str++;
     }
   ArrayResize(realize_data,str);

   ArrayResize(open_interest,str);
   ArrayResize(noncomm_long,str);
   ArrayResize(noncomm_short,str);
   ArrayResize(noncomm_spread,str);
   ArrayResize(operators_long,str);
   ArrayResize(operators_short,str);
   ArrayResize(nonrep_long,str);
   ArrayResize(nonrep_short,str);

   ArrayResize(oi_noncomm_long,str);
   ArrayResize(oi_noncomm_short,str);
   ArrayResize(oi_operators_long,str);
   ArrayResize(oi_operators_short,str);
   ArrayResize(oi_nonrep_long,str);
   ArrayResize(oi_nonrep_short,str);

   ArrayResize(oi_net_noncomm,str);
   ArrayResize(oi_net_operators,str);
   ArrayResize(oi_net_nonrep,str);

   ArrayResize(net_noncomm,str);
   ArrayResize(net_operators,str);
   ArrayResize(net_nonrep,str);

   ArrayResize(index_oi,str);
   ArrayResize(index_ncomm,str);
   ArrayResize(index_operators,str);
   ArrayResize(index_nonrep,str);

   ArrayResize(willco_ncomm,str);
   ArrayResize(willco_operators,str);
   ArrayResize(willco_nonrep,str);

   ArrayResize(movement_oi,str);
   ArrayResize(movement_ncomm,str);
   ArrayResize(movement_operators,str);
   ArrayResize(movement_nonrep,str);

   FileClose(handle_cotfile);
   return(true);
  }

void settings_load()
  {
   int h_set,_column;
   string set,sname;
   if(load_cot_file==true)return;
   h_set=FileOpen(settings,FILE_READ|FILE_CSV,";");
//FileOpen("\Temp\Cot_file.txt",FILE_WRITE,FILE_CSV);
   if(h_set==-1)return;
   while(FileIsEnding(h_set)==false)
     {
      set=FileReadString(h_set);
      _column++;
      if(set==Symbol() && _column!=1){cot_file=sname;return;}
      if(_column==2 && set!="")name=set;    // A segunda coluna é o nome do indicador desejado
      if(FileIsLineEnding(h_set)==true)_column=0;
      if(_column==1)sname=set;

     }
   FileClose(h_set);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void load_data()
  {
   datetime data_realize;
   int handle_cotfile;
   string data;
   handle_cotfile=FileOpen(cot_file,FILE_READ|FILE_CSV,";");
   Print("Файл найден");
   while(FileIsEnding(handle_cotfile)==false)
     {
      data=FileReadString(handle_cotfile);
      column++;
      if(FileIsLineEnding(handle_cotfile)==true || FileIsEnding(handle_cotfile)==true)
        {//column=12 -  caso especial
         if(column==12)
            nonrep_short[n_str]=StrToDouble(data);
         column=0;
         if(data!="")n_str++;
        }
      else
        {
         switch(column)
           {
            case 2:
               realize_data[n_str]=StrToTime(data);
               break;
            case 3:
               open_interest[n_str]=StrToDouble(data);
               // Imprimir (open_interest[n_str]);
               break;
            case 4:
               noncomm_long[n_str]=StrToDouble(data);
               break;
            case 5:
               noncomm_short[n_str]=StrToDouble(data);
               break;
            case 6:
               noncomm_spread[n_str]=StrToDouble(data);
               break;
            case 7:
               operators_long[n_str]=StrToDouble(data);
               break;
            case 8:
               operators_short[n_str]=StrToDouble(data);
               break;
            case 11:
               nonrep_long[n_str]=StrToDouble(data);
               break;
           }
        }
     }
   FileClose(handle_cotfile);
   Print("Fil loaded");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void count_data()
  {
   int    max,
   min;
   double delta;

   for(int i=0;i<n_str;i++)
     {
      index_oi[i]=EMPTY_VALUE;
      index_ncomm[i]=EMPTY_VALUE;
      index_operators[i]=EMPTY_VALUE;
      index_nonrep[i]=EMPTY_VALUE;
      willco_ncomm[i]=EMPTY_VALUE;
      willco_operators[i]=EMPTY_VALUE;
      willco_nonrep[i]=EMPTY_VALUE;
      movement_ncomm[i]=EMPTY_VALUE;
      movement_operators[i]=EMPTY_VALUE;
      movement_nonrep[i]=EMPTY_VALUE;
     }
   for(i=0;i<n_str;i++)
     {
      if(open_interest[i]==0)
        {
         oi_noncomm_long[i]=0;
         oi_noncomm_short[i]=0;
         oi_operators_long[i]=0;
         oi_operators_short[i]=0;
         oi_nonrep_long[i]=0;
         oi_nonrep_short[i]=0;
        }
      else
        {
         oi_noncomm_long[i]=noncomm_long[i]/open_interest[i];
         oi_noncomm_short[i]=noncomm_short[i]/open_interest[i];
         oi_operators_long[i]=operators_long[i]/open_interest[i];
         oi_operators_short[i]=operators_short[i]/open_interest[i];
         oi_nonrep_long[i]=nonrep_long[i]/open_interest[i];
         oi_nonrep_short[i]=nonrep_short[i]/open_interest[i];
        }

      net_noncomm[i]=noncomm_long[i]-noncomm_short[i];
      net_operators[i]=operators_long[i]-operators_short[i];
      net_nonrep[i]=nonrep_long[i]-nonrep_short[i];

      if(open_interest[i]==0)
        {
         oi_net_noncomm[i]=0;
         oi_net_operators[i]=0;
         oi_net_nonrep[i]=0;
        }
      else
        {
         oi_net_noncomm[i]=net_noncomm[i]/open_interest[i];
         oi_net_operators[i]=net_operators[i]/open_interest[i];
         oi_net_nonrep[i]=net_nonrep[i]/open_interest[i];
        }
     }

   for(i=0;i<n_str-period;i++)
     {

      max=ArrayMaximum(open_interest,period,i);
      min=ArrayMinimum(open_interest,period,i);
      delta=open_interest[max]-open_interest[min];
      if(delta==0)delta=1;
      index_oi[i]=(open_interest[i]-open_interest[min])/delta*100;

      max=ArrayMaximum(net_noncomm,period,i);
      min=ArrayMinimum(net_noncomm,period,i);
      delta=net_noncomm[max]-net_noncomm[min];
      if(delta==0)delta=1;
      index_ncomm[i]=(net_noncomm[i]-net_noncomm[min])/delta*100;

      max=ArrayMaximum(net_operators,period,i);
      min=ArrayMinimum(net_operators,period,i);
      delta=net_operators[max]-net_operators[min];
      if(delta==0)delta=1;
      index_operators[i]=(net_operators[i]-net_operators[min])/delta*100;

      max=ArrayMaximum(net_nonrep,period,i);
      min=ArrayMinimum(net_nonrep,period,i);
      delta=net_nonrep[max]-net_nonrep[min];
      if(delta==0)delta=1;
      index_nonrep[i]=(net_nonrep[i]-net_nonrep[min])/delta*100;

      max=ArrayMaximum(oi_net_noncomm,period,i);
      min=ArrayMinimum(oi_net_noncomm,period,i);
      delta=oi_net_noncomm[max]-oi_net_noncomm[min];
      if(delta==0)delta=1;
      willco_ncomm[i]=(oi_net_noncomm[i]-oi_net_noncomm[min])/delta*100;

      max=ArrayMaximum(oi_net_operators,period,i);
      min=ArrayMinimum(oi_net_operators,period,i);
      delta=oi_net_operators[max]-oi_net_operators[min];
      if(delta==0)delta=1;
      willco_operators[i]=(oi_net_operators[i]-oi_net_operators[min])/delta*100;

      max=ArrayMaximum(oi_net_nonrep,period,i);
      min=ArrayMinimum(oi_net_nonrep,period,i);
      delta=oi_net_nonrep[max]-oi_net_nonrep[min];
      if(delta==0)delta=1;
      willco_nonrep[i]=(oi_net_nonrep[i]-oi_net_nonrep[min])/delta*100;
     }
   for(i=0;i<n_str-period-movement_index;i++)
     {
      movement_oi[i]=index_oi[i]-index_oi[i-movement_index];
      movement_ncomm[i]=index_ncomm[i]-index_ncomm[i-movement_index];
      movement_operators[i]=index_operators[i]-index_operators[i-movement_index];
      movement_nonrep[i]=index_nonrep[i]-index_nonrep[i-movement_index];
     }
  }
// Retorna um dos valores da tabela COT
// definido pela variável "type"  e a barra definida pela variável "bar"
double get_data(int type,int bar)
  {
   double data;
   int i_data=get_cot(bar);
   if(i_data==EMPTY_VALUE)return(EMPTY_VALUE);
   switch(type)
     {
      case OI:
         return(open_interest[i_data]);
      case NONCOMM_LONG:
         return(noncomm_long[i_data]+noncomm_spread[i_data]);
         // retorna (noncomm_long[i_data]);
      case NONCOMM_SHORT:
         return(noncomm_short[i_data]+noncomm_spread[i_data]);
         // retorna (noncomm_short[i_data]);
      case OPERATORS_LONG:
         return(operators_long[i_data]);
      case OPERATORS_SHORT:
         return(operators_short[i_data]);
      case NONREP_LONG:
         return(nonrep_long[i_data]);
      case NONREP_SHORT:
         return(nonrep_short[i_data]);
      case NET_NONCOMM:
         return(net_noncomm[i_data]);
      case NET_OPERATORS:
         return(net_operators[i_data]);
      case NET_NONREP:
         return(net_nonrep[i_data]);
      case INDEX_OI:
         return(index_oi[i_data]);
      case INDEX_NONCOMM:
         return(index_ncomm[i_data]);
      case INDEX_OPERATORS:
         return(index_operators[i_data]);
      case INDEX_NONREP:
         return(index_nonrep[i_data]);
      case OI_NONCOMM_LONG:
         return(oi_noncomm_long[i_data]);
      case OI_NONCOMM_SHORT:
         return(oi_noncomm_short[i_data]);
      case OI_OPERATORS_LONG:
         return(oi_operators_long[i_data]);
      case OI_OPERATORS_SHORT:
         return(oi_operators_short[i_data]);
      case OI_NONREP_LONG:
         return(oi_nonrep_long[i_data]);
      case OI_NONREP_SHORT:
         return(oi_nonrep_short[i_data]);
      case WILLCO_NONCOMM:
         return(willco_ncomm[i_data]);
      case WILLCO_OPERATORS:
         return(willco_operators[i_data]);
      case WILLCO_NONREP:
         return(willco_nonrep[i_data]);
      case OI_NET_NONCOMM:
         return(oi_net_nonrep[i_data]);
      case OI_NET_OPERATORS:
         return(oi_net_operators[i_data]);
      case OI_NET_NONREP:
         return(oi_net_nonrep[i_data]);
      case MOVEMENT_NONCOMM:
         return(movement_ncomm[i_data]);
      case MOVEMENT_OPERATORS:
         return(movement_operators[i_data]);
      case MOVEMENT_NONREP:
         return(movement_nonrep[i_data]);
      case MOVEMENT_OI:
         return(movement_oi[i_data]);
     }
   return(EMPTY_VALUE);
  }
// Retorna o número de células no array
// Ele retorna um EMPTY_VALUE, se a barra não for encontrada
int get_cot(int i)
  {
   datetime tbar=iTime(Symbol(),0,i);
   for(int k=0;k<n_str;k++)
      if(realize_data[k]<tbar)return(k);
   return(EMPTY_VALUE);
  }
// Retorna barras com os últimos dados existentes do relatório COT 
int get_lastdata()
  {
   return(iBarShift(Symbol(),0,realize_data[n_str-1],false));
  }
// Retorna uma string sem extensão e 6 primeiros símbolos
// (antes era "COT - filename.csv", tornou-se "filename")
string str_trim(string fname)
  {
   int strlen=StringLen(fname)-1;
   int char;
   string str;
   for(int i=strlen;i>0;i--)
     {
      char=StringGetChar(fname,i);
      if(char=='.')
        {
         for(int b=6;b<i;b++) // Muda para b=0, se não for necessário 
                              // para eliminar o primeiro dos 6 símbolos
            str=str+CharToStr(StringGetChar(fname,b));
         return(str);
        }
     }
   return(fname);
  }
//+------------------------------------------------------------------+

O código dos indicadores em si é trivial e difere somente pelo número de buffers inicializados e o primeiro parâmetro da função get_data(). Todos os valores são calculados com antecedência na fase de inicialização, assim eles não usam a função IndicatorCounted(). No início, durante a inicialização, as funções básicas da biblioteca cotlib.mq4 são chamadas, ela configura alguns gráficos, então inicia a função start() e é executada de uma só vez a função build_data (), esta função exibe os dados na janela de indicador para o período de tempo dos dados do relatório.

Como exemplo, aqui está o código-fonte do indicador WILLCO:

#property copyright "Copyright © 2009, C-4, All Rights Reserved."
#property link      "vs-box@mail.ru"

#property indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Green
#property  indicator_color2  Red
#property  indicator_color3  Blue

extern int  period=52;
int movement_index=6;
extern bool Show_iNoncomm=false;
extern bool Show_iOperators=true;
extern bool Show_iNonrep=false;

double i_willco_noncomm[];
double i_willco_operators[];
double i_willco_nonrep[];

#include <cotlib.mq4>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   if(init_data()==false)error=true;
   if(error==false)load_data();
   if(error==false)count_data();
//if(error==false)count_index(period);
   SetParam();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   if(error==true)Print("Can't load data. The further work is impossible");
   if(DrawData==true)build_data();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetParam()
  {
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   IndicatorDigits(2);
   SetIndexEmptyValue(0,EMPTY_VALUE);
   SetIndexEmptyValue(1,EMPTY_VALUE);
   SetIndexEmptyValue(2,EMPTY_VALUE);
   SetLevelValue(0,0.0);
   SetLevelValue(1,20.0);
   SetLevelValue(2,80.0);
   SetLevelValue(3,100.0);
   if(load_cot_file==true)IndicatorShortName(StringConcatenate("Meta COT WILLCO (",period,"): ",str_trim(cot_file)));
   else IndicatorShortName(StringConcatenate("Meta COT WILLCO (",period,"): ",name));
   if(Show_iNoncomm==true)
     {
      SetIndexBuffer(0,i_willco_noncomm);
      SetIndexLabel(0,"WILLCO: Noncommercial Traders");
     }
   if(Show_iOperators==true)
     {
      SetIndexBuffer(1,i_willco_operators);
      SetIndexLabel(1,"WILLCO: Operators Traders");
     }
   if(Show_iNonrep==true)
     {
      SetIndexBuffer(2,i_willco_nonrep);
      SetIndexLabel(2,"WILLCO: Nonrep Traders");
     }
  }

void build_data()
  {
   int end_data=get_lastdata();
   for(int i=0;i<end_data;i++)
     {
      if(Show_iNoncomm)
        {
         i_willco_noncomm[i]=get_data(WILLCO_NONCOMM,i);
         if(Show_iOperators)i_willco_operators[i]=get_data(WILLCO_OPERATORS,i);
         if(Show_iNonrep)i_willco_nonrep[i]=get_data(WILLCO_NONREP,i);
        }
      DrawData=false;
     }
//+------------------------------------------------------------------+

A parte mais difícil do programa era criar o script do somatório de dados num relatório. Existiam muitos problemas algorítmicos para serem resolvidos. O programa foi escrito no velho estilo C. É constituída uma única unidade, sem chamadas de função. Tal abordagem pode parecer ineficiente ou mesmo incorreto, mas neste caso foi a melhor solução para resolver o problema imediatamente, sem dividir em diferentes "subtarefas".

No início, o programa abre a lista de arquivo, lê os nomes dos arquivos para combinar e abrirá um por um. Cada um dos arquivos tem uma lista de relatórios que devem ser combinados. O programa abre todos estes relatórios de uma vez, lê os valores e tratará linha por linha (no formato SCV a linha é uma coluna). Então ele adiciona esses valores juntos caso tenham datas idênticas (os valores da segunda coluna). A soma dos valores é registrada no arquivo final que tem o mesmo nome de arquivo para combinar e a extensão CSV.


#property copyright "Copyright © 2009, C-4, All Rights Reserved."
#property link      "vs-box@mail.ru"

#define EQU_NO           0
#define EQU_YES          1

#define DATA            1
#define OI              2
#define NONCOMM_LONG    3
#define NONCOMM_SHORT   4
#define SPREADING       5
#define OPERATORS_LONG  6
#define OPERATORS_SHORT 7
#define ALL_LONG        8
#define ALL_SHORT       9
#define NONREP_LONG     10
#define NONREP_SHORT    11

extern string s_list="AGREGATION.ini";
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int      h_list;                    // Descritor de lista de arquivo
                                       // (que contém uma lista de arquivos)
                                       // string   s_list;                    // File name

   int      h_enumeration;             // Descritor do arquivo da enumeração
   string   s_enumeration;             // Nome do arquivo da enumeração

   int      h_rezult;                  // Descrição do arquivo de saída
   string   s_rezult;                  // Nome do arquivo de saída

   int      h_temp;                    // Descritor temporário (um por todos)
                                       // usado para a contagem de arquivo
   string   s_temp;                    // String temporária (uma por todos), 
                                       // Usado para a contagem de arquivo

   int      h_file[];                  // Array dos descritores aos arquivos de saída 
   string   s_file[];                  // Array com os nomes dos arquivos de saída

   datetime data[],data_all;
   int      oi[],oi_all,
   noncomm_long[],noncomm_long_all,
   noncomm_short[],noncomm_short_all,
   spreading[],spreading_all,
   operators_long[],operators_long_all,
   operators_short[],operators_short_all,
   all_long[],all_long_all,
   all_short[],all_short_all,
   nonrep_long[],nonrep_long_all,
   nonrep_short[],nonrep_short_all;

   int      str;                       // Contagem dos arquivos resultantes
   int      n;                         // O índice atual dos arquivos resultantes
   int      column;                    // Número de coluna
   int      frnz_str[];                // Descrições congeladas
   double   count;                     // String para contar o arquivo resultante
   string   tmp;                       // Uma string de texto para o arquivo resultantes

   h_list=FileOpen(s_list,FILE_READ|FILE_CSV);                    // Uma lista de arquivos
   if(h_list==-1){Print("File list not found");return(0);}
   while(FileIsEnding(h_list)==false)
     {                            // Leitura de string pela string
      s_enumeration=FileReadString(h_list);                       // Cada string tem um nome de arquivo
      Print("---------------<<",s_enumeration,">>---------------");
      h_enumeration=FileOpen(s_enumeration,FILE_READ|FILE_CSV);   // Tentar abrir lista de arquivo da enumeração
      if(h_enumeration==-1)
        {
         Print("The enumeration file not found ",s_enumeration);
         continue;                                                // Se não existir, ignorar
        }

      s_rezult=StringConcatenate(ConvertName(s_enumeration),".csv");
      h_rezult=FileOpen(s_rezult,FILE_WRITE|FILE_CSV);
      if(h_rezult==-1)
        {
         Print("Can't create a result file: ",s_rezult,"; ",GetLastError());
         continue;
        }
      while(FileIsEnding(h_enumeration)==false)
        {
         s_temp=FileReadString(h_enumeration);                  // Leitura de string por string do arquivo da enumeração
                                                                // Cada string é o nome do arquivo final
         h_temp=FileOpen(s_temp,FILE_READ|FILE_CSV);            // Tentar abrir o arquivo resultante
         if(h_temp==-1)continue;        // Se o arquivo resultante não existe, ignorar
         str++;                                                 // Do contrário nós aumentamos em 1 a contagem dos arquivos processados.
                                                                // Imprimir("--> ",s_temp);
         while(FileIsEnding(h_temp)==false)
           {
            tmp=FileReadString(h_temp);
            if(tmp!="")count++;
           }
         Print("--> ",s_temp," ",count/12);
         count=0;
         FileClose(h_temp);                                    // Fechamento do arquivo resultante
        }//Fim While (contando os arquivos com enumerações)
      FileSeek(h_enumeration,0,SEEK_SET);

      ArrayResize(h_file,str);
      ArrayResize(s_file,str);
      ArrayResize(data,str);
      ArrayResize(oi,str);
      ArrayResize(noncomm_long,str);
      ArrayResize(noncomm_short,str);
      ArrayResize(spreading,str);
      ArrayResize(operators_long,str);
      ArrayResize(operators_short,str);
      ArrayResize(all_long,str);
      ArrayResize(all_short,str);
      ArrayResize(nonrep_long,str);
      ArrayResize(nonrep_short,str);
      ArrayResize(frnz_str,str);
      while(FileIsEnding(h_enumeration)==false)
        {
         s_file[n]=FileReadString(h_enumeration);              // Leitura de arquivo da enumeração string por string 
                                                               // Cada string é o nome do arquivo final
                                                               // Imprimir(str,"; ",s_file[n]);
         h_file[n]=FileOpen(s_file[n],FILE_READ|FILE_CSV);     // Tentar abrir o arquivo final
         if(h_file[n]==-1){Print("File not found");continue;}  // Se não existe, ignorar
         n++;
        }// Fim While (abrir arquivo das enumerações)   
      //para(n=0;n<str;n++){
      //   imprimir(n,"; ",s_file[n]);
      //}
      // Neste momento nós temos a lista dos arquivos resultantes(s_file[]) 
      // e seus descritores (h_file[]) que estão
      // no arquivo único das enumerações. Agora vamos combinar esses arquivos num único arquivo:
      while(FileIsEnding(h_file[0])==false)
        {
                                 // Como um sinal do fim do arquivo, existe uma extremidade do primeiro arquivo
                                 // (Assumimos que os arquivos são os mesmos)

         for(int i=0;i<str;i++)
           {                     // Leitura coluna por coluna para cada um dos arquivos incluídos no arquivo das enumerações.
            if(frnz_str[i]==1)continue;
            tmp=FileReadString(h_file[i]);
            switch(column)
              {
               case DATA:            data[i]=StrToTime(tmp);
               case OI:              oi[i]=StrToInteger(tmp);
               case NONCOMM_LONG:    noncomm_long[i]=StrToInteger(tmp);
               case NONCOMM_SHORT:   noncomm_short[i]=StrToInteger(tmp);
               case SPREADING:       spreading[i]=StrToInteger(tmp);
               case OPERATORS_LONG:  operators_long[i]=StrToInteger(tmp);
               case OPERATORS_SHORT: operators_short[i]=StrToInteger(tmp);
               case ALL_LONG:        all_long[i]=StrToInteger(tmp);
               case ALL_SHORT:       all_short[i]=StrToInteger(tmp);
               case NONREP_LONG:     nonrep_long[i]=StrToInteger(tmp);
               case NONREP_SHORT:    nonrep_short[i]=StrToInteger(tmp);
              }
           }// Fim For()
         //Imprimir(h_file[0], ";  ",s_file[0]);
         column++;
         if(FileIsLineEnding(h_file[0])==true || FileIsEnding(h_file[0])==true)
           {   // Se a string foi finalizada - comparar as datas de todos os arquivos, se eles são iguais, combiná-los
            column=0;
            if(tmp=="")continue;
            for(int k=0;k<str;k++)
              {
               if(data[0]>data[k])
                  frnz_str[k]=1;
               if(data[0]<data[k])
                  frnz_str[0]=1;
               if(data[0]==data[k])frnz_str[k]=0;
               if(data[0]!=data[k])
                 {
                  Print("Time Gap was found: ",TimeToStr(data[0],TIME_DATE),"; ",TimeToStr(data[k],TIME_DATE));
                  continue;
                 }
              }

            for(k=0;k<str;k++)
              {
               data_all=data[0];
               oi_all+=oi[k];
               noncomm_long_all+=noncomm_long[k];
               noncomm_short_all+=noncomm_short[k];
               spreading_all+=spreading[k];
               operators_long_all+=operators_long[k];
               operators_short_all+=operators_short[k];
               all_long_all+=all_long[k];
               all_short_all+=all_short[k];
               nonrep_long_all+=nonrep_long[k];
               nonrep_short_all+=nonrep_short[k];
              }
            FileWrite(h_rezult,ConvertName(s_enumeration),
                      TimeToStr(data_all,TIME_DATE),
                      oi_all,
                      noncomm_long_all,
                      noncomm_short_all,
                      spreading_all,
                      operators_long_all,
                      operators_short_all,
                      all_long_all,
                      all_short_all,
                      nonrep_long_all,
                      nonrep_short_all);
            //Imprimir(TimeToStr(data_all,TIME_DATE),";  ",oi_all);
            data_all=0;
            oi_all=0;
            noncomm_long_all=0;
            noncomm_short_all=0;
            spreading_all=0;
            operators_long_all=0;
            operators_short_all=0;
            all_long_all=0;
            all_short_all=0;
            nonrep_long_all=0;
            nonrep_short_all=0;
           }

        }// Fim While(somatório)

      // Resultados Zeros
      FileClose(h_enumeration);
      FileClose(h_rezult);
/*for(int j=0;j<str;j++){
         FileClose(h_file[j]);
         noncomm_long[j]=0;
         noncomm_short[j]=0;
         spreading[j]=0;
         operators_long[j]=0;
         operators_short[j]=0;
         all_long[j]=0;
         all_short[j]=0;
         nonrep_long[j]=0;
         nonrep_short[j]=0;
      }*/

      n=0;str=0;
     } //Fim While (arquivo da lista da enumeração)

  }// Fim do Programa   
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string ConvertName(string str)
  {
   string str_cnv;
   int strlen=StringLen(str);
   int char;
   for(int i=0;i<strlen-4;i++)
     {
      char=StringGetChar(str,i);
      str_cnv=StringConcatenate(str_cnv,CharToStr(char));
     }
   return(str_cnv);
  }
//+------------------------------------------------------------------+

O programa que combina os relatórios por datas Meta COT Script Concatena usa uma forma semelhante, mas o seu algoritmo é simples.



4. Da Teoria à Prática!

4.1 Um minuto e o trader de commodities está pronto para trabalhar

Então é hora de generalizar tudo isso. Os mercados futuros tem três principais grupos de participantes: operadores hedge, grandes fundos de commodities e a multidão. Os dois primeiros grupos são os mais capitalizados. A multidão controla apenas uma pequena parte do mercado, geralmente inferior a 10%, assim suas ações não podem afetar o preço de mercado. Os dois grupos restantes são poucos, porém mais poderosos e são quem define a interação da lei da oferta e da procura.

Traders não comercais e operadores são opostos por natureza. As ações de um grupo será quase uma imagem espelhada do outro. A primeira aplicação possível do relatório da CTFC é: regra do equilíbrio entre estes dois grupos com base na lei da oferta e da procura.

Os operadores hedge são os participantes mais bem informados do mercado do que qualquer outra pessoa. Eles estão mais próximos da produção de bens, porantos eles conhecem as tendências do mercado oculto muito mais cedo do que todos os outros. Eles são os especialistas em relação a outros participantes do mercado. Esta informação oculta do mercado permite a eles ajustarem seus níveis de hedge, refletindo nos relatórios da CFTC. A segunda aplicação possível é observar as rápidas mudanças nas posições dos operadores hedge.

A multidão é considerada a menos informada de todas as categorias de operadores, ou seja, as ações da multidão são causadas por rumores ridículos, psicologia das massas, ganância e medo. As mudanças bruscas da posição líquida da multidão frequentemente ocorrem em virtude do clima mudar drasticamente sob a ação de todos esses fatores, logo é melhor estar pronto para o desenvolvimento oposto da situação. Uma terceira aplicação possível é observar as mudanças rápidas das posições da multidão.

Os relatórios da CFTC em si não podem apontar as entradas ou saídas específicas do mercado, esta propriedade é comum dos indicadores fundamentalistas. Você tem de usar métodos eficazes na análise técnica para determinar os pontos de entrada e saída mais precisos.


Aqui estão algumas propriedades que os sistemas de negociações devem ter para o uso efetivo da informação publicada pela CFTC:

1. Deve ser rentável, ou pelo menos neutra, mesmo sem o uso dos filtros CFTC.

2. O sistema não deve ter parâmetros, a otimização é que muda o comportamento e o lucro final do sistema de negociação. A principal função do sistema deve ser a confirmação dos sinais de negociação, a otimização de unidade auxiliar não deve ser prioridade na estratégia de desenvolvimento.

3. O sistema deve ser totalmente reversível. Os sinais de venda devem ser um espelho dos sinais de compra.

4. A técnica deve ter uma contra-tendência em relação a tendência que está em vigo. Os sinais da CFTC para venda aparecerão numa tendência longa de alta ou pelo menos com uma forte reversão do movimento principal. Os sinais de compra também será opostos à tendência de baixa.

5. A técnica deve garantir a captura da inversão de tendência. Todos os pontos de retração devem ser considerados pelo sistema como um ponto de entrada no mercado. Esta é a condição mais difícil, mas ao mesmo tempo é a mais importante para o sistema de negociação. Os sinais da CFTC aparece muito raramente, alguns dos indicadores geram um sinal, não mais do que 1-2 vezes por ano. Se a técnica não vai dar um sinal para entrar no mercado nestes momentos, a utilização de relatórios da CFTC não terão sem sentido.

6. Quando o relatório da CFTC reporta as informações, o lucro principal será obtido a partir de vários negócios com um longo tempo de negociação, até vários meses. Consequentemente, a estratégia de negociação deverá permitir uma corrida de posições para um longo tempo.

7. O sistema não deve explorar as propriedades de um mercado em particular, Os relatórios da CFTC estão disponíveis para muitos mercados, de modo que o sistema deve ser igualmente bem aplicado a todos os mercados aos quais os relatórios são criados.

O uso mais promissor da tecnologia é visto como filtros. Neste caso, o número de negócios e de rebaixamento máximo diminuirá rapidamente, enquanto deve aumentar a expectativa dos ganhos e lucros resultantes.

Agora vamos considerar os sinais mais importantes para nos concentrarmos. Há dois desses sinais: os contratos em aberto (open interest) a posição líquida de uma das três categorias. Nós reduzimos todas as informações do relatório para estes dois parâmetros, expressa por meio de um índice de 3 anos.

Isso elimina a subjetividade e torna a análise de mercados muito mais fácil. Assim, uma situação favorável para a compra será um mercado frio com poucas vendas dos operadores. O mercado frio significa que o nível do "Open Interest" no momento é extremamente pequeno e, portanto, existe potencial de crescimento. Vamos também olhar para a situação de contraste à venda: o mercado deve ser bem aquecido (um nível muito elevado do OI), enquanto os operadores demonstram um nível muito alto de vendas.

Vamos olhar novamente os indicadores do JPY para identificar estes momentos:



Figura 4-1. "Open Interest" e índice dos operadores dos mercados futuros do JPY

As linhas azuis mostra os momentos favoráveis para vender, as linhas laranja - para comprar. Quando os Contratos em Aberto (Open Interest) são grande o suficiente (a linha verde acima), e os operadores são os ursos (linha vermelha abaixo), são condições favoráveis para vender Ienes. O mesmo pode ser aplicado para comprar: quando os Contratos em Aberto (Open Interest) são relativamente pequenos (linha verde abaixo) e os operadores são os touros (linha vermelha acima) são condições favoráveis para comprar Ienes. Estes dados podem ser utilizados para a análise inicial do mercado, o nível de preço não é necessário. Após encontrar um momento favorável para a especulação, pode-se encontrar um ponto mais adequado para entrar no mercado usando a análise técnica. O gráfico seguinte mostra o mesmo indicador, mas com o preço do mercado:



Figura 4-2. Índice do operador e "Open Interest" com gráfico de preços parao Iene

Como você pode ver, nem todos os sinais de venda ou compra tiveram grandes lucros. Muitos poderiam até mesmo levar a perdas graves. No entanto, paradas de segurança (Stop Loss) rígidas devem ser utilizadas em qualquer sistema e aqui não é exceção.

Há um sinal no gráfico onde alguns valores não atingiram os níveis 20% e 80%. Estes níveis não são impecáveis. Cada mercado tem seus próprios níveis ideais, o mesmo vale para os indicadores, não há valores universais de nível que serão ótimos a todos os mercados.

Agora vamos examinar mais detalhadamente como os mercados são registros de transações dos traders. Deve-se notar que existem muitos mercados com relatórios regulares. Existem alguns mercados com relatórios que aparecem dentro de um determinado período (mês ou ano) e então desaparecem para sempre. Existem alguns mercados que a negociação tem sido ausente por muito tempo, mas a sua informação está presente nos dados históricos. Entre estes podem ser identificados cerca de 60 mercados com relatórios que somem claramente e regularmente. Aqui estão os mercados com os relatórios mais completos (nomes dos arquivos de dados, especificados sem a extensão CSV):


INSTRUMENTOS

ARQUIVOS DE DADOS CSV

Commodities
1LEAN HOGSCOT - LEAN HOGS - CHICAGO MERCANTILE EXCHANGE
2FEEDER CATTLECOT - FEEDER CATTLE - CHICAGO MERCANTILE EXCHANGE
3LIVE CATTLECOT - LIVE CATTLE - CHICAGO MERCANTILE EXCHANGE
4MILK CONCATENATECOT - MILK CONCATENATE
5WHEAT - CHICAGO BOARD OF TRADECOT - WHEAT - CHICAGO BOARD OF TRADE
6WHEAT - KANSAS CITY BOARD OF TRADECOT - WHEAT - KANSAS CITY BOARD OF TRADE
7WHEAT - MINNEAPOLIS GRAIN EXCHANGECOT - WHEAT - MINNEAPOLIS GRAIN EXCHANGE
8OATS - CHICAGO BOARD OF TRADECOT - OATS - CHICAGO BOARD OF TRADE
9ROUGH RICECOT - ROUGH RICE - CHICAGO BOARD OF TRADE
10SUGAR COT - SUGAR CONCATENATE
11COFFEE COT - COFFEE CONCATENATE
12COCOA COT - COCOA CONCATENATE
13COTTON №2 COT - COTTON 2 CONCATENATE
14SOYBEAN MEALCOT - SOYBEAN MEAL - CHICAGO BOARD OF TRADE
15MINI SOYBEANSCOT - MINI SOYBEANS - CHICAGO BOARD OF TRADE
16SOYBEAN OILCOT - SOYBEAN OIL - CHICAGO BOARD OF TRADE
17SOYBEANSCOT - SOYBEANS - CHICAGO BOARD OF TRADE
18BUTTER (CASH SETTLED)COT - BUTTER (CASH SETTLED) - CHICAGO MERCANTILE EXCHANGE
19FRZN CONCENTRATED ORANGE JUICE COT - FRZN CONCENTRATED ORANGE JUICE CONCATENATE
20LUMBER COT - LUMBER CONCATENATE
Metais
21COPPER-GRADE #1COT - COPPER-GRADE #1 - COMMODITY EXCHANGE INC.
22SILVERCOT - SILVER - COMMODITY EXCHANGE INC.
23GOLDCOT - GOLD - COMMODITY EXCHANGE INC.
24PLATINUMCOT - PLATINUM - NEW YORK MERCANTILE EXCHANGE
25PALLADIUM COT - PALLADIUM - NEW YORK MERCANTILE EXCHANGE
Moedas
26AUSTRALIAN DOLLARCOT - AUSTRALIAN DOLLAR CONCATENATE
27CANADIAN DOLLARCOT - CANADIAN DOLLAR CONCATENATE
28BRITISH POUND STERLINGCOT - BRITISH POUND STERLING CONCATENATE
29EURO FXCOT - EURO FX CONCATENATE
30APANESE YENCOT - JAPANESE YEN CONCATENETE
31MEXICAN PESOCOT - MEXICAN PESO CONCATENATE
32 NEW ZEALAND DOLLARCOT - NEW ZEALAND DOLLAR - CHICAGO MERCANTILE EXCHANGE
33SWISS FRANC CONCATENATECOT - SWISS FRANC CONCATENATE
34 RUSSIAN RUBLECOT - RUSSIAN RUBLE - CHICAGO MERCANTILE EXCHANGE
35U.S. DOLLAR INDEXCOT - U.S. DOLLAR CONCATENATE
Índices
36DOW JONES INDUSTRIALCOT - DOW JONES INDUSTRIAL AVERAGE - CHICAGO BOARD OF TRADE
37DOW JONES INDUSTRIAL x5$COT - DOW JONES INDUSTRIAL AVG- x $5 - CHICAGO BOARD OF TRADE
38E-MINI S&P400COT - E-MINI S&P 400 STOCK INDEX - CHICAGO MERCANTILE EXCHANGE
39E-MINI S&P500COT - E-MINI S&P500 CONCATENATE
40S&P500 STOCK INDEXCOT - S&P500 STOCK INDEX CONCATENATE
41S&P400 MIDCAP STOCK INDEXCOT - S&P400 MIDCAP STOCK INDEX CONCATENATE
42NASDAQ-100COT - NASDAQ-100 STOCK INDEX CONCATENATE
43NASDAQ-100 MINICOT - NASDAQ-100 INDEX (MINI) CONCATENATE
44NIKKEY INDEXCOT - NIKKEI STOCK AVERAGE CONCATENATE
45RUSSELL-2000 E-MINICOT - RUSSELL 2000 CONCATENATE
Instrumentos de dívidas
46INTEREST RATE SWAPS 10YRCOT - INTEREST RATE SWAPS 10YR CONCATENATE
47INTEREST RATE SWAPS 5YRCOT - INTEREST RATE SWAPS 5YR CONCATENATE
48U.S. TREASURY BONDSCOT - U.S. TREASURY BONDS - CHICAGO BOARD OF TRADE
4910-YEAR U.S. TREASURY NOTESCOT - 10-YEAR U.S. TREASURY NOTES - CHICAGO BOARD OF TRADE
505-YEAR U.S. TREASURY NOTES COT - 5-YEAR U.S. TREASURY NOTES - CHICAGO BOARD OF TRADE
512-YEAR U.S. TREASURY NOTESCOT - 2-YEAR U.S. TREASURY NOTES - CHICAGO BOARD OF TRADE
521-MONTH LIBOR RATECOT - 1-MONTH LIBOR RATE CONCATENATE
5330-DAY FEDERAL FUNDSCOT - 30-DAY FEDERAL FUNDS - CHICAGO BOARD OF TRADE
543-MONTH EUROYENCOT - 3-MONTH EUROYEN TIBOR CONCATENATE
553-MONTH EURODOLLARSCOT - 3-MONTH EURODOLLARS CONCATENATE
Energia
56CRUDE OIL LIGHT SWEETCOT - CRUDE OIL LIGHT SWEET - NEW YORK MERCANTILE EXCHANGE
57NATURAL GASCOT - NATURAL GAS - NEW YORK MERCANTILE EXCHANGE
58NO. 2 HEATING OIL N.Y. HARBORCOT - NO. 2 HEATING OIL N.Y. HARBOR - NEW YORK MERCANTILE EXCHANGE
Índices de volatilidade
59ISO NEW ENGLAND LMP SWAPCOT - ISO NEW ENGLAND LMP SWAP - NEW YORK MERCANTILE EXCHANGE

Tabela 4-3. Lista de instrumentos com os relatórios regulares disponíveis por um longo tempo


Pode-se ver que a Comissão recolhe os dados num amplo espectro: agricultura, moeda, financeiro e outros mercados. Todos os arquivos descritos na tabela serão recebidos após a execução dos scripts de Meta COT Script Build e Meta COT Script Concatenate.


4.2 Criando robôs de pesquisa


O relatório da CFTC demonstra que a eficácia do estudo é uma tarefa difícil, exige desenvolvimentos reais e eficazes no domínio da análise técnica, bem como na otimização multi instrumental. Muitos dos traders experientes tem o seu próprio "know-how" e estão fechados. A análise técnica é um campo largo que vai além do artigo, portanto nos limitaremos a indicadores técnicos acessíveis e métodos primitivos, mas com técnicas bem conhecidas de análise de mercado.

Vamos criar um simples robô de pesquisa com tomada de decisões para entrar no mercado com base na análise dos relatórios dos traders. Se você é desenvolvedor MQL4, você pode facilmente usar os dados da CFTC como um filtro adicional na sua estratégia de negociação com base na análise técnica. Se você não for um desenvolvedor, mas está interessado nesta tecnologia, a disponibilidade de tal robô também será inestimável.

Usando o otimizador estratégia é possível escolher o indicador e seu período médio ideal. A prática mostra que para diferentes mercados, os indicadores mais rentáveis e precisos são os indicadores de base sobre a dinâmica dos diferentes grupos de traders. Talvez, para alguns mercados a utilização da posição líquida total dos traders não identificados (multidão) será eficiente, para outros mercados as ações dos operadores são mais eficazes.

Então, neste início vamos nos voltar a análise técnica com o objetivo de encontrar os momentos de entrada mais precisos ao mercado. Larry Williams em seu livro sugere usar a análise técnica clássica com base em médias móveis. Nós vamos fazer o mesmo e conduzir o trabalho com duas médias móveis simples, uma das quais será com base na tendência a longo prazo, a outra - no curto prazo. A média móvel a longo prazo, aplicamos as barras semanais, de curto prazo - barras diárias. O período médio lento é igual ao cálculo do indicador, o rápido - é uma constante e igual a 5 dias.

Se um valor atual da média lenta é maior do que seu valor há duas semanas, tendência de longo prazo é para cima, se valor e menor do que - tendência para baixo. Da mesma forma aplicamos para analisar período da média móvel de 5 dias: se o valor atual é maior do que dois dias atrás, espera-se uma tendência de alta no curto prazo, se menor do que - provavelmente teremos uma tendência de baixa no curto prazo. Uma vez que a tendência de curto prazo coincide com o longo prazo, vamos ficar no seu caminho. Usaremos um dos indicadores Meta COT como um filtro. A posição será aberta apenas se o indicador for localizado na variação de valores favoráveis no momento presente.

Dê uma olhada na Figura abaixo:



Figura 4-4. Sinais de análise técnica para a posição aberta

Na Figura 4.4 um gráfico diário do EURUSD é apresentado. O canto superior esquerdo mostra uma parte do gráfico da carta EURUSD semanal para o mesmo período. A média simples de longo prazo (linha azul) tem o mesmo período que o indicador Meta COT Operators Index, neste caso é igual a 26 semanas. A média de curto prazo (linha vermelha) é sempre período igual a 5. Vemos que em 15 de outubro de 2006, o valor médio da linha vermelha (MA1) foi maior do que dois dias (MA2), enquanto ao mesmo tempo, o valor médio a longo prazo era maior do que a duas semanas. Tendências são as mesmas, o nível do indicador Meta COT Operators Index foi de 100%, uma oportunidade favorável para comprar (ou estritamente falando, esta condição combinada no dia anterior, temos esta combinação numa ilustração gráfica).

O robô executa operações usando valores de Stop Loss e Take Profit (únicas possibilidades de pontos de saída). O tamanho dos níveis depende do indicador do período, o período maior é correspondente aos valores mais elevados de Stop Loss e Take Profit. Para cada 26 períodos do indicador, há 100 pontos de perda e 300 pontos de lucro. Por exemplo, no caso para 156 períodos de média semanal, vamos utilizar os valores Stop Loss iguais a 600 pontos e Take Profit de 1800 pontos (é uma estimativa simples). O Take Profit especificado e os níveis de Stop Loss são os únicos caminhos para sair da posição, então podemos assumir que o sistema de negociação está totalmente concluído.

O tamanho da posição é fixa e lote igual a 0.1 do contrato do instrumento.

O sistema não é perfeito, se não dizer primitivo. No geral é uma boa maneira de perder, mas as coisas podem mudar se for usado com filtros Meta COT.

Agora nos voltamos para o código-fonte do robô. O seu funcionamento é muito semelhante ao indicador. O robô nada mais é do que um indicador que sabe como colocar uma ordem. Durante a inicialização, o robô carrega os dados ao gráfico vigente (biblioteca cotlib.mq4 ), então calcula os valores para todos os indicadores e obtém o valor de um deles. O indicador escolhido dependerá do variável "integer" indicator_type, se definir com o valor 17, isso significa que se vai utilizar o indicador WILLCO para os operadores, se for igual a 22 será o índice dos operadores não identificados (multidão).

É simples encontrar o número de indicador, estão listados no início da biblioteca cotlib.mq4. Para definir o período médio, é necessário configurar o valor de período do indicador. O escolha dos indicadores e os seus períodos foram organizados para serem usados no Testador de Estratégia. Os valores de ambos são marcados como valores para otimizar. O valor do período começa a partir de 26, com passo igual a 26 e o valor final igual a 156. O valor do indicator_type começa a partir de 16, com o passo igual a 1 e o valor final igaul a 26. Então vamos tentar todos os indicadores e diferentes períodos da média:



Figura 4-4. Janela de parâmetros de entrada do expert


Alguns indicadores não foram incluídos no "backtesting" do histórico. Este indicadores não têm níveis claros, como posição líquida ou absoluta dos operadores, bem como indicadores dos valores aos quais devem ser escolhidos em função do mercado, por exemplo: a posição comprada dos operadores divididos pelos Contratos em Aberto (OI). Em qualquer caso, os indicadores neste robô são mais do que suficiente para estimar a eficácia. A estratégia é considerada muito longe de ser perfeita na construção de um robô de negociaçao real. No entanto, este exemplo irá ajudá-lo a navegar na massa de informações fornecidas neste artigo do projeto e encontrar entre os métodos propostos os mais eficazes. A tabela 4.5 apresenta os melhores resultados dos testes com os indicadores que são utilizados.

Os resultados estão listados na tabela a seguir e são bastante aproximados, a principal finalidade dos testes foi para encontrar o indicador mais apropriado, em vez de maximizar os lucros. Perceba que o melhor resultado não significa o mais rentável. O melhor resultado foi determinado pelo número de negócios (mais - melhor), pelo rebaixamento máximo (menos - melhor)e o lucro final.

Você pode executar o backtesting em seu computador. A tabela inclui backtesting para o seguinte conjunto de instrumentos:


Instrumento

Indicador

Período de cálculo

Ofertas totais

Fator de lucro

Matemática Expectativa

Rebaixamento %

Lucro $

EURO

Index Operators

26

77

1.79

62.31

12.57

4798

BRITISH POUND

WILLCO Noncomm

26

140

1.44

18.64

7.12

2600

JAPANESE YEN

Index Nonrep

52

35

1.37

63.29

14.85

2200

SWISS FRANK

Movement Index Operators

26

21

3.96

159.71

4.63

3354

AUSTRALIAN DOLLAR

Index Nonrep

26

59

1.98

57.50

5.67

3392

NEW ZEARLAND DOLLAR

Index Noncomm

26

20

1.97

59.00

4.13

1180

US DOLLAR INDEX

Movement Nonrep

26

144

1.20

1.50

1.98

216

GOLD

Index Nonrep

26

81

1.84

52.09

5.70

4219

SILVER

WILLCO Operators

26

165

1.85

26.58

4.76

4385

PLATINUM

Index Nonrep

26

233

1.77

24.54

6.73

5717

PALLADIUM

Index Noncomm

26

142

1.23

8.15

10.61

1158

SUGAR

WILLCO Operators

26

18

1.89

61.22

6.67

1102

COCOA

Index Operators

26

29

1.96

56.59

6.08

1641

COFFEE

Index Operators

52

113

1.38

19.58

7.59

2212

OATS

Index Operators

26

15

2.24

83.50

8.25

1252

WHEAT

Index OI

26

53

1.66

53.25

8.91

2822

SOYBEANS

Index Noncomm

26

66

2.88

118.72

6.46

7965

ORANGE JUICE

Index Operators

26

29

2.75

68.83

2.73

1996

LIGHT SWEET OIL

Index Operators

26

194

1.23

16.53

12.68

3206

E-MINI S&P

Movement Operators

26

32

2.01

75.21

6.66

2406

Tabela 4-5. Os melhores resultados do backtesting do histórico usando filtro COT com lote fixo 0.1


Os resultados dos testes dos indicadores é muito interessante. Existe um claro deslocamento à zona rentável nos indicadores Index Nonrep e WILLCO. O comportamento dos indicadores Movement Index é mais incerto. Para alguns dos instrumentos que tiveram lucros máximos para determinados valores do mesmo indicador, tiveram também grandes perdas (geralmente um indicador calculado para os operadores). A utilização do Movement Index pelos traders não comerciais tiveram as perdas máximas no conjunto de instrumentos (ponto №43 na Fig. 4-6). Talvez um estudo mais aprofundado deste fenômeno permitirá usar os seus sinais.

O gráfico de otimização pode ser representado da seguinte forma:




Figura 4-6. O esquema geral da eficácia dos testes do indicadores e seus parâmetros

A linha vermelha corresponde ao nível zero da rentabilidade. A partir da execução 43, os lucros tornam-se menos estáveis.

Em geral, o lucro máximo foi conseguido com grandes períodos da média nos indicadores (104-156 semanas), mas devido ao pequeno número de ofertas, não foram incluídos no relatório. Os indicadores com grande período médio são muito precisos, o uso deles é uma forma muito eficaz, especialmente em dezenas de mercados simultaneamente. Apesar da semelhança dos traders operadores e não comerciais, em alguns mercados é preferível utilizar a posição dos operadores em vez da posição dos traders não comerciais. As ações da multidão também são interessantes.

Vale ressaltar que seguindo o oposto das ações da multidão traz mais lucro do que seguir os operadores no mercado de ouro.

Embora o indicador WILLCO incluindo o "Open Interest" é altamente eficaz, o "Open Interest" em si não é tão eficaz. Na melhor das hipóteses, sua utilização proporciona menos lucros. A aplicação do OI é considerada mais como um sinal adicional e não como a fonte principal.

Em geral, os indicadores têm provado serem eficazes e sem dúvida vão trazer um lucro mais substancial, sujeitos à integração num bom sistema de negociação.

O gráfico de otimização típico do EURO é apresentado a seguir:




Como se vê, há um deslocamento evidente na zona positiva (acima da linha vermelha). Nem todos os gráficos têm tal deslocamento eficaz, muitos deles não podiam ser testados adequadamente devido a uma série de razões técnicas.

Agora vamos comparar a eficácia dos próprios filtros. Para este efeito, vamos testá-lo no gráfico de preços sem os filtros COT. Como instrumento vamos usar os mercados futuros do EURO.

O resultado da negociação sem uso de filtros COT é apresentado na Figura 4.8:



Figura 4-8. Os resultados das negociações sem filtros COT


Como você pode ver, o lucro final foi de 1,897 USD, o que é aproximadamente equivalente ao mesmo número de pontos utilizando o volume igual 0.1, lote fixo. O rebaixamento máximo foi de 30%, é sem dúvida muito grande. Vamos dar uma olhada na Figura 4-9.

A mesma estratégia, mas filtrada com os valores de índice de operadores para 26 semanas:



Figura 4-9. Os resultados de negociaçao usando filtros COT.


Como podemos ver, o número de operações cairam drasticamente, a esperança matemática de ganhar aumentou. O lucro final não é muito maior do que no primeiro teste, mas a maior mudança ocorreu com o nível máximo de rebaixamento. Agora foi de 8.6%, muito menor do que na versão anterior. Sem dúvida, filtros COT são suficientemente eficazes, permitindo melhorar uma estratégia.

Para determinar a máxima eficiência do uso de informações da CFTC é necessário executar investigações detalhadas, não é possível fazê-las neste artigo. A tarefa principal do artigo - ilustrar os princípios básicos e utilizar exemplos simples para mostrar que a utilização dos dados da CFTC pode ser eficaz.

Se você vai seguir este método para uma negociação real ou não, depende de você.


4.3 Um epílogo com continuação

Se você ainda não tem dúvidas sobre o assunto, pode significar que não tenha lido o artigo com atenção ou não tenha interesse no conceito proposto. Sinceramente eu espero que você tenha um monte de perguntas, algumas das respostas podem ser encontradas abaixo. Na verdade, é uma pequena FAQ, poderá ajudá-lo a resolver muitos problemas no uso do conceito.


1. Devo aplicar na prática a lógica da abertura da posição do expert descrito?

Claro que não. Facilmente você pode encontrar uma técnica mais adequada para determinar os pontos precisos de entrada no mercado. Talvez você já tem sua própria experiência no campo da análise técnica. Tente aplicar os filtros CFTC na sua estratégia de negociação. Você pode adicionar sua própria posição com gerenciamento técnico pelo robô de pesquisa Meta COT.

2. Qual dos grupos de traders é melhor observar e seguir?

Não há uma resposta definitiva. Usando Expert Meta COT você pode descobrir qual grupo é mais eficaz num mercado específico. Tente usar todos os três grupos de traders para cada mercado e selecione o que dá as previsões mais precisas.

3. Qual o melhor indicador para usar?

Não há uma resposta definitiva. Os testes preliminares mostram que uma boa escolha seria WILLCO ou o Index Movement. Em qualquer caso, um robô de pesquisa deve determinar o indicador mais adequado ao sistema de negociação pela lógica de programação.

4. Qual o melhor período médio para escolher?

Não há uma resposta definitiva. Talvez a melhor opção para os traders de curto prazo seria o período médio igual a 26. Para o traders que desejam manter sua posição, os indicadores mais adequados devem ter um grande período de cálculo, diferente do outro cálculo de 26 períodos. Maiores períodos não diferem entre si. Além disso, não use um período de cálculo inferior a 26 semanas. Mesmo os indicadores semestrais são altamente voláteis e com turbulência excessiva. Os melhores períodos de tempo podem variar de mercado para mercado, o melhor período de cálculo pode ser facilmente descoberto através do robô de pesquisa na força bruta.

5. Quais os níveis de indicadores são considerados críticos?

Em seu livro, Larry Williams mostra gráficos com diferentes níveis. Alguns dos gráfico têm os níveis de 25 - 75%, os outros têm 20 - 80%. Talvez em alguns dos mercados os níveis eficazes sejam mais amplos, em outros mais estreitos. Em qualquer caso, as doses eficientes estarão na variação de 0 - 30% e 70 - 100%. Você pode usar o robô de pesquisa para determinar os níveis ideais. Crie duas variáveis com valores de nível inferior e superior e defina estas variáveis para otimizar. Tente mudar seus valores para encontrar os melhores resultados.

6. Por que em alguns mercados os operadores têm um comportamento incomum (fundos de hedge, multidão)?

Uma possível razão para o comportamento incomum de um grupo de traders pode ser a sua estrutura interna e os problemas que eles resolvem utilizando a negociação nos mercados de commodities. Por exemplo, a estrutura e as funções dos operadores hedge no mercado de ouro pode ser muito diferente de suas tarefas cambiais. Em qualquer caso, você deve usar o grupo mais eficaz de traders (ver pergunta 2).

7. Eu quero combinar vários instrumentos num único usando o Meta COT Aggregation, mas não estou certo de que a união será correta. Como verificar corretamente se eu combinei certo os instrumentos?

Primeiro, você precisa baixar o arquivo resultante para algum indicador e determinar visualmente os valores dos pontos de reversão do mercado. O princípio geral deve ser mantido: os operadores devem ter o mais alto nível de vendas antes do mercado movimentar para baixo, os outros ao contrário, devem ter uma possível compra neste momento. O espelho da situação deve estar na parte inferior do mercado. Se a verificação visual mostra os valores corretos, então estes valores podem ser testados num robô de pesquisa. Se o resultado for positivo e exceder o resultado obtido a partir da utilização de relatório padrão, a combinação pode ser considerada confiável e incluí-la na negociação.

8. Os relatórios não funcionam em alguns mercados. Todos os indicadores têm resultados negativos.

Nesses mercados, tentar utilizar um sistema de negociação sem filtros CFTC. Compare os resultados. Se o sistema sem filtros tem resultados pior do que com eles, talvez o próprio sistema seja o problema. Neste caso, você precisa melhorar seu sistema de negociação, pelo menos ter um resultado neutro, depois adiciona os filtros CFTC e teste novamente. Tentar, testar e otimizar - esta é a abordagem comum para a identificação e resolução de problemas.

9. Não consigo encontrar o relatório para o mercado.

Os relatórios não são para todos os mercados. Talvez o mercado que você tenha escolhido não tenha os relatórios coletados. Tente encontrar o mercado desejado na tabela apresentada na 4ª parte do artigo. Se não estiver na tabela, então o mais provável é que o relatório simplesmente não exista, ou não está completo, de modo que não pode ser usado. Se o mercado está definido na tabela, olhar no relatório o nome do arquivo correspondente a ele. Carregar manualmente este arquivo para o indicador.

10. O indicador (script, o expert) não funciona. O que eu devo fazer?

Você deve ler com mais cuidado a terceira parte do artigo. Provavelmente, você esqueceu de algo na execução ou fez incorretamente. Por favor, leia com atenção e tente resolver o problema sozinho.

11. O indicador não é exibido.

A principal razão é a ausência do arquivo no relatório. Verifique se o arquivo do relatório já foi baixado. Para fazer isto baixe o indicador novamente, se o indicador não encontrou o arquivo de relatório, você receberá uma mensagem de aviso: "Error downloading the file File_name.scv. Further work is impossible.", vá para o diretório \files de seu terminal e verifique a existência dos arquivos necessários. Se o arquivo não existir, excluir todos os registros usando o programa erase_cot.bat, então tente novamente criar os arquivos, o arquivo necessário deve aparecer.

12. Indicador é exibido, mas não como foi especificado. Em vez do nome indicador surge a mensagem "INSTRUMENT NOT FOUND!".

Provavelmente, o nome da ferramenta atual não corresponde a nenhum outro nos relatórios. Abra o arquivo settings.ini e encontre o relatório que deve ser carregado automaticamente. Se você ainda não encontrou o relatório, crie um ajuste você mesmo (ver seção 3.4). Adicione o nome instumento na lista de arquivos. Reinicie o indicador, ele deverá funcionar.

13. O Expert não negocia.

Uma possível razão é que os arquivos necessários para o trabalho do expert não foram copiados para o diretório \tester\files. O Testador de Estratégias usa esse catálogo, por isso precisa de arquivos para trabalhar nesse local. Copie todos os arquivos, incluindo arquivo da configuração para o diretório \tester\ files. O expert deverá funcionar.

14. É possível criar meu próprio indicador com base no prjeto Meta COT?

Claro. A principal função que você vai precisar é a get_data (tipo int, int bar). Ela retorna o valor do indicador especificado pelo tipo do parâmetro. A terceira parte do artigo tem mais informações sobre o código principal e exemplos.

15. Como criar um portfolio do expert?

Nós não fornecemos uma negociação multi-instrumental. Você tem de desenvolver o seu próprio método para fazer o download de dados. Como alternativa, você pode aplicar um carregamento de arquivo ordenado, neste caso os dados podem ser armazenados numa seção separada para cada instrumento. Mas tudo isto exige um maior desenvolvimento.

16. Os scripts são executado sem a possibilidade de configuração/ Sempre antes de iniciar os scripts, é mostrado uma janela de configurações, embora isso não seja necessário.

Existe uma directiva #property que define a chamada das configurações. Se você não precisar alterar as configurações, basta comentá-la. Se você precisa personalizar as configurações, remover o comentário e então basta recompilar o script.

17. Mesmo depois de ler o artigo, eu ainda tenho muitas perguntas...

Você pode ler e reler várias vezes o livro de Larry Williams: "Trade Stocks & Commodities with the Insiders: Secrets of the COT Report". Os relatórios CTFC são um grande tópico para análise.


Referências

1. Larry Williams, Trade Stocks & Commodities with the Insiders: Secrets of the COT Report (Wiley Trading)

2. Stephen Briese. The Commitments of Traders Bible.

3. Campbell R. McConnell, Stanley L. Brue. Economics: Principles, Problems, and Policies, 16th edition

4. Todd Lofton, Getting Started in Futures

5. http://www.procapital.ru/forumdisplay.php?f=267 - Tópico sobre aplicação analítica do relatório da CFTC (em russo).

6. http://www.aup.ru/articles/finance/1.htm - O conceito de risco no artigo sobre atividade econômica por Valery Romanov.

7. http://www.timingcharts.com - Site com gráficos COT.

8. http://www.ireallytrade.com - Site de Larry Williams. Contém informações atualizadas sobre os relatórios da CFTC. Na página principal, Larry Williams dá conselhos úteis sobre as oportunidades recentes de negociações.

9. http://commitmentsoftraders.org - Site de Steve Briese. É principalmente sobre seu livro. Contém uma análise e indicadores úteis adicionais, basicamente em PDF.

10. http://cftc.gov - U.S.- Site Commodity Futures Trading Commission. Mostra dados atualizados sobre as posições dos traders, principal fonte de informações sobre a análise COT.