MQL5: Анализ и обработка отчетов Commodity Futures Trading Commission (CFTC) в MetaTrader 5

Aleksey Sergan | 17 марта, 2010


Введение

Торговый терминал MetaTrader 5, разработанный MetaQuotes Software Corp., содержит в себе в качестве одного из инструментов трейдера язык программирования MQL5, поддерживающий объектно-ориентированное программирование.  С одной стороны, MQL5 не совместим снизу вверх с прежней версией – MQL4, с другой – содержит множество новых возможностей, присущих полноценному объектно-ориентированному языку. Таким образом, перед трейдерами, владеющими навыками программирования на MQL4, стоит задача по освоению фактически нового языка, их и считаю целевой аудиторией.

В данной статье покажу пример решения задачи, которая заключается в следующем: разработка инструмента трейдера, который бы позволял получать и проводить анализ различных показателей отчетов CFTC. Данная тема уже освещалась в статье Проект Meta COT - новые горизонты анализа отчетов CFTC в терминале MetaTrader 4, буду считать, что читатель уже знаком с базовыми моментами и акцентировать внимание лишь на информации, не рассмотренной в данной ссылке.

Концепция, в которой реализован инструмент, заключается в следующем: разработать один индикатор, который позволял бы получать показатели отчетов непосредственно из файлов данных, предоставляемых комиссией без промежуточных обработок и преобразований. В дальнейшем, трейдер использует его в своей работе в различных целях: непосредственно, чтобы визуально получить показатели; в других индикаторах, как источник данных; в скриптах, производящих различный автоматизированный анализ; в советниках, при разработке торговых стратегий. 


1. Типы отчетов COT

Существует три вида отчетов: Традиционный отчет (COT), Отчет индексных трейдеров (CIT), Детализированный отчет (DCOT), отличия которых представлены в таблице 1.

Описание
Традиционный отчет Отчет индексных трейдеров
Детализированный отчет
Краткое наименование COT CIT DCOT
 Подзаголовок ссылки
Current Legacy Reports
Supplemental Commodity Index
Current Disaggregated Reports
Ссылка на скачивание последнего файла данных

deacot2010.zip

dea_cit_txt_2010.zip

fut_disagg_txt_2010.zip

Группы трейдеров, представленных в отчете
(англоязычное наименование)
Спекулянты (Noncommercial)
Хеджеры (Commercial)
Неотчетные (Nonreportable)
Спекулянты (Noncommercial)
Хеджеры (Commercial)
Неотчетные (Nonreportable)
Индексные (Index Traders)
Производственники (Producer/Merchant/Processor/User)
Своп дилеры (Swap Dealers)
Управляющие (Managed Money)
Прочие отчетные (Other Reportables)
Неотчетные (Nonreportable)

Таблица 1. Виды отчетов Commitments of Traders 

О том, на кого возлагаются обязательства о публикации сведений об их позициях на фьючерсных рынках, о принципах разделения трейдеров на группы, о периодичности выхода отчетов можно узнать в книге «Секреты торговли на фьючерсном рынке. Действуйте вместе с инсайдерами» и статье Проект Meta COT - новые горизонты анализа отчетов CFTC в терминале MetaTrader 4.

Чуть подробнее расскажу о двух отчетах, которые не упоминаются в этих источниках.

Аббревиатура CIT расшифровывается как Commitments of Index Traders – обязательства индексных трейдеров. Отчет публикуется, начиная с 2007 г. С его web-представлением можно ознакомиться по ссылке https://cftc.gov/dea/options/deaviewcit.htm. Эти трейдеры выделены в отдельную группу из состава как хеджеров, так и спекулянтов.

Здесь я оперирую, возможно, несколько непривычной терминологией, но она удобна. В книге «Секреты торговли на фьючерсном рынке. Действуйте вместе с инсайдерами» для группы commercial используется перевод "операторы", я их называю хеджеры, noncommercial – "крупные трейдеры", я – спекулянты. Описание Supplemental Report (дополнительный), так еще называют отчет CIT, доступно на странице https://www.cftc.gov/MarketReports/CommitmentsofTraders/AbouttheCOTReports/index.htm

Частичный перевод данной ссылки:

Supplemental Report основывается на информации, содержащейся в комбинированном отчете "фьючерсы-и-опционы", короткий формат, отражает дополнительную категорию "Индексные трейдеры" на определенных сельскохозяйственных рынках.  Категория спекулянтов включает позиции управляющих фондов, пенсионных фондов и других инвесторов. Категория хеджеров включает позиции в основном тех, кто хеджирует свои транзакции на нерегулируемых рынках, к примеру, своп дилеры, удерживающие длинные позиции для хеджирования коротких товарных против институциональных трейдеров, таких, как пенсионные фонды.

Все эти трейдеры, взятые как из группы хеджеров, так и спекулянтов, выделяются в индексные, обычно занимают длинные позиции на рынках и роллируют их с контракта на контракт.

С 2009г. комиссия публикует детализированный отчет Disaggregated Commitments of Traders Report. История в файлах .csv доступна с 2006 г. Подробное описание здесь.

Перевод части текста:

Детализированный отчет увеличивает прозрачность традиционного COT отчета посредством разделения трейдеров на следующие группы: производственники, своп дилеры, управляющие, прочие отчетные.

Классификация:

  • Производственники – это те, кто в первую очередь вовлечен в производство, обработку, хранение физических товаров и использует фьючерсные рынки для управления и хеджирования своими рисками, связанными с их основной деятельностью;
  • Своп дилеры – обычно имеют дело со свопами на товарных рынках и используют их для управления или хеджирования рисками, связанными с их транзакциями. Контрагентами своп дилеров могут быть спекулятивные трейдеры, такие, как хеджевые фонды, традиционные коммерческие клиенты, управляющие своими рисками на физических товаров посредством дилеров;
  • Управляющие. В целях этого отчета – это зарегистрированные товарные торговые советники (CTA), зарегистрированные пул операторы (CPO), незарегистрированные фонды, идентифицированные комиссией. Эти трейдеры обычно вовлечены в управление и связывают организованную фьючерсную торговлю и своих клиентов;
  • Прочие отчетные. Крупные трейдеры, не отнесенные ни к одной из вышеперечисленных категорий.

В Приложении 2 приведен полный список инструментов, по которым представляются отчеты, там же приведена расшифровка, отражается ли конкретный инструмент в отчетах CIT и DCOT.


2. Написание индикатора COT, использующего внешние данные, находящиеся в файлах формата CSV

Индикатор будет работать следующим образом. Во входных параметрах задается вид отчета из перечисленных в таблице 1, показатель отчета, группа трейдеров. Показатель отчета может быть следующий: чистые лонги,  доля чистых лонгов в открытом интересе, индекс Вильямса, рассчитанный для чистых лонгов, открытый интерес. Список далеко не полный и с легкостью может быть в дальнейшем увеличен, он включает в себя самые необходимые показатели, используемые мной в повседневной работе.

Непосредственно из файлов данных (скачанных и распакованных в порядке, который будет указан ниже), для текущего инструмента на графике будут получаться данные и отражаться на графике в отдельном окне индикатора. За загрузку данных из файлов и доступ к ним будет отвечать класс CCFTCReport.

Структура индикатора следующая:

2.1. Константы

Для определения констант используется перечисляемый тип данных enum. Типы отчетов, поддерживаемые индикатором:

enum cot_type_report  // тип отчета
{ 
  COT, DCOT, CIT
};

Группы трейдеров:

enum cot_type_traders // типы трейдеров
{
  noncommercial,      // Спекулянты 
  commercial,         // Хеджеры
  nonreportable,      // Неотчетные
  index,              // Индексные
  producer,           // Производственники
  swapdealers,        // Свопдилеры
  managedmoney,       // Управлящие
  otherreportables    // Прочие отчетные 
};

Показатели отчетов, используемые в индикаторе:

enum cot_type_data    // тип отражаемого показателя
{   
  netlongs,           // Чистые лонги
  netlongsrate,       // Доля чистых лонгов в открытом интересе
  willams_index,      // Индекс Вильямса
  openinterest        // Открытый интерес
}; 

2.2. Классы

Для хранения разнородных объектов внутри одной переменной возможно использование структур и классов. Одним из ограничений структур является запрет на присвоение переменной структурного типа, если внутри содержатся динамические массивы или переменные типа string, поэтому для хранения записи отчета COT был создан класс, а не структура, а для операции присвоения - метод, выполняющий это действие:

class cot_record                                // строка данных из отчета соt
  {
public:
   datetime          COT_DATE;                  //дата 
   double            COT_OPENINTEREST;          //открытый интерес 
   double            COT_LONGNONCOM;            //лонги некоммерческих
   double            COT_SHORTNONCOM;           //шорты некоммерческих 
   double            COT_LONGCOM;               //лонги коммерческих трейдеров
   double            COT_SHORTCOM;              //шорты коммерческих трейдеров 
   double            COT_LONGNONREPORTABLE;     //лонги прочих
   double            COT_SHORTNONREPORTABLE;    //шорты прочих
   double            COT_LONGINDEX;             //лонги индексных
   double            COT_SHORTINDEX;            //шорты индексных трейдеров
   double            COT_LONGPRODUCER;          //Producer/Merchant/Processor/User
   double            COT_SHORTPRODUCER;
   double            COT_LONGSWAPDEALERS;       //Swap Dealers
   double            COT_SHORTSWAPDEALERS;
   double            COT_LONGMANAGEDMONEY;      //Managed Money
   double            COT_SHORTMANAGEDMONEY;
   double            COT_LONGOTHERREPORTABLES;  //Other Reportables
   double            COT_SHORTOTHERREPORTABLES;
   string            COT_ID;                    //идентификатор инструмента
   string            COT_NAME;                  //имя инструмента 

   void copyvar(const cot_record &from)         //копирование содержимого одного экземпляра класса в другой
     {
      COT_ID                    = from.COT_ID;
      COT_NAME                  = from.COT_NAME;
      COT_DATE                  = from.COT_DATE;
      COT_OPENINTEREST          = from.COT_OPENINTEREST;
      COT_LONGNONCOM            = from.COT_LONGNONCOM;
      COT_SHORTNONCOM           = from.COT_SHORTNONCOM;
      COT_LONGCOM               = from.COT_LONGCOM;
      COT_SHORTCOM              = from.COT_SHORTCOM;
      COT_LONGNONREPORTABLE     = from.COT_LONGNONREPORTABLE;
      COT_SHORTNONREPORTABLE    = from.COT_SHORTNONREPORTABLE;
      COT_LONGINDEX             = from.COT_LONGINDEX;
      COT_SHORTINDEX            = from.COT_SHORTINDEX;
      COT_LONGPRODUCER          = from.COT_LONGPRODUCER;
      COT_SHORTPRODUCER         = from.COT_SHORTPRODUCER;
      COT_LONGSWAPDEALERS       = from.COT_LONGSWAPDEALERS;
      COT_SHORTSWAPDEALERS      = from.COT_SHORTSWAPDEALERS;
      COT_LONGMANAGEDMONEY      = from.COT_LONGMANAGEDMONEY;
      COT_SHORTMANAGEDMONEY     = from.COT_SHORTMANAGEDMONEY;
      COT_LONGOTHERREPORTABLES  = from.COT_LONGOTHERREPORTABLES;
      COT_SHORTOTHERREPORTABLES =  from.COT_SHORTOTHERREPORTABLES;
     };
  };

Здесь и далее буду считать, что читатель знаком с материалами,  в частности с форматом хранения данных отчетов в файлах csv можно познакомится в статье Проект Meta COT - новые горизонты анализа отчетов CFTC в терминале MetaTrader 4. Экземпляр описанного выше класса будет хранить данные из одной строки отчета, массив экземпляров позволит обеспечить хранение отчета в памяти и удобный доступ к его полям. Для хранения отчета и доступа к его показателям был разработан класс CCFTCReport:

class CCFTCReport                    //отчет cot
  {
private:
   cot_type_report   type;           //тип текущего отчета 
   cot_record        data[];         //загруженный отчет сот
   int               sizedata;       //количество записей текущего отчета
   string            idsymbol;       //идентификатор инструмента в отчете сот, поле "CFTC Contract Market Code"
   string            terminalsymbol; //символьное представление инструмента в терминале
public:
   void ~CCFTCReport(){ sizedata=0; };
   bool              Init( cot_type_report passedtype, string sym="" ); //инициализация экземпляра класса
   bool              LoadFile( string filename );                       //загрузка данных из внешнего файла
   string            Name();                                            //возвращает краткое наименование отчета    
   bool              Type(cot_type_report passedtype);                  //устанавливает тип отчета
   cot_type_report   Type(){return(type);};                             //возвращает тип отчета
   bool              TestGroup( cot_type_traders type_trader );         //проверка на наличие типа группы трейдеров в отчете
   bool              DefineIdSymbol();                                  //определение идентификатора в отчете сот
   bool              GetString( int handle, cot_record& arr );          //получить запись csv из файла   
   string            GetFieldCommaDelimited(string &str );              //получить поле из csv строки
   double            At(datetime time,cot_type_traders type_trader,cot_type_data typedata=netlongs); //получить данные из отчета
  };
Экземпляр класса CCFTCReport хранит в себе полный отчет по одному инструменту, тип которого может быть COT, CIT или DCOT.

Описание перечислений и классов находится в include файле "cot.mqh".

2.3. Входные параметры

Входные параметры описываются input переменными и позволяют задать соответственно группу трейдеров, отображаемый показатель и вид отчета, из которого производится выборка данных:

input cot_type_traders type_trader = noncommercial;  //Тип трейдеров
input cot_type_data    type_data   = netlongs;       //Тип индикатора
input cot_type_report  type_report = COT;            //Тип исходного отчета

2.4. Функция OnInit

Индикатор в своем теле содержит функцию OnInit, в которой производятся следующие действия: загрузка данных из файла отчета, проверка входных параметров на корректность, связывание индикаторных буферов.

Буфер, инициализирующийся свойством INDICATOR_DATA, содержит данные, отражаемые на графике, свойством INDICATOR_CALCULATIONS - промежуточные вычисления:

SetIndexBuffer    ( 0, BufferData, INDICATOR_DATA );
IndicatorSetString(INDICATOR_SHORTNAME,indname);
SetIndexBuffer( 1, BufferCalculations, INDICATOR_CALCULATIONS );

2.5. Функция OnCalculate

Эта функция отвечает за выборку, расчет затребованных показателей и их отрисовку.

Опишу построчно ее работу. Используется вторая форма вызова:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &Time[],
                const double &Open[],
                const double &High[],
                const double &Low[],
                const double &Close[],
                const long &TickVolume[],
                const long &Volume[],
                const int &Spread[]){

Определение баров, для которых производится расчет и отображение данных:

int pos=rates_total-prev_calculated-1;
if( pos >= rates_total-1 )pos--;

Определения порядка индексации массивов:

ArraySetAsSeries(Time, true);
ArraySetAsSeries(BufferData, true);
ArraySetAsSeries(BufferCalculations, true);

После длительных экспериментов я пришел к следующему решению: для всех массивов, которые связаны с индикаторными буферами, а также передаваемых в параметрах функции OnCalculate, использовать обращение как к таймсерии, т.е. последний элемент имеет индекс 0.

Цикл выборки данных для расчета:

for(int i=pos;i>=0;i--)
  {
   cot_type_data passed=type_data;
   if(type_data==netlongs || type_data==netlongsrate || type_data==willams_index)
     {
      // для типов отражаемых данных: Чистые лонги, Доля чистых лонгов в открытом интересе,  Индекс Вильямса возвращаются 
      // чистые лонги, на основе которых и производится расчет этих данных
      passed=netlongs;
     }
   double res=Report.At(Time[i],type_trader,type_data); //получить данные из отчета
   BufferCalculations[i] = res;
   BufferData[i]         = CalcData( type_data, i, Time );
  }
Массив BufferCalculations используется для хранения первичных показателей, которые берутся из отчета COT.

Массив BufferData содержит готовые данные для отображения на графике, это могут быть как цифры, непосредственно существующие в отчете (чистые лонги, открытый интерес), так и получаемые расчетным путем (доли лонгов, индекс Вильямса). Отмечу следующий момент, для которого я пока не нашел красивого решения. Параметры-массивы, передаваемые в OnCalculate, могут понадобиться на последующих уровнях вызываемых функций, и доступ к ним возможен, только если их передавать в этих вызовах, что с моей точки зрения загромождает код.

Вызов CalcData:

BufferData[i]         = CalcData( type_data, i, Time );

Далее в CalcData вызов CalcIndex:

double CalcData( cot_type_data type_data, int i, const datetime& Time[] )
{
  // доля в открытом интересе
  if( type_data == netlongsrate ) return( BufferCalculations[ i ] / Report.At( Time[i], type_trader, openinterest ));
  // индекс Вильямса
  if( type_data == willams_index )return( CalcIndex( i, Time, BufferCalculations ) );

  return(BufferCalculations[i]);        
}

Мне потребовался доступ к массиву Time в функции CalcIndex, и я был вынужден передавать его по иерархии вызовов вниз. Можно предположить, как будет выглядеть код, если мне понадобятся все восемь параметров-массивов где-то далеко внизу.


3. Загрузка файлов данных

Файлы находятся по ссылкам, приведенным в таблице 1. На каждый год создается отдельный файл, который присутствует в его имени. К примеру, https://www.cftc.gov/sites/default/files/files/dea/history/deacot2010.zip - содержит отчет за 2010 год, https://www.cftc.gov/sites/default/files/files/dea/history/deacot2009.zip - за 2009 год, остальные - по аналогии.

Каждый файл необходимо скачать браузером или другим доступным способом и распаковать в папку \MQL5\files\, в которую установлен торговый терминал. Для каждого года, для которого раскрывается отчет, необходимо создать свою папку с именем deacotXXXX, где XXXX соответствует году. В итоге должна получится следующая структура папок:

Рис.1. Структура папок для отчетов

Процедура по подготовке данных может быть упрощена. Все эти операции (проверка наличия обновлений на сайте, скачивание, распаковка данных по соответствующим папкам) выполняет скрипт "Cotdownloader". Ядро этого скрипта (загрузка данных из интернет) выполнен на основе WININET_TEST. Также при его написании были использованы класс CProgressBar, предложенный в статье Инструмент «Ценовая гистограмма» (Рыночный профиль) и его реализация на MQL5, и функционал Windows API для вызова на исполнение внешних приложений, описанный в статье Автоматическая оптимизация торгового робота в процессе реальной торговли.

Для использования скрипта достаточно перетащить на любой график. В процессе его работы, процесс загрузки отражается в окне графика в виде прогресс-бара, текстовые сообщения и результатz выполнения – на вкладке «Эксперты» панели инструментов: 

Рис.2. Процесс загрузки данных


4. Пример использования

Для запуска индикатора необходимо перетащить его на окно с графиком требуемого инструмента и задать параметры:

Рис.3. Параметры индикатора COT

Обращаю ваше внимание на то, что сейчас вместо имен переменных и значений для перечисляемых типов данных можно задавать удобное для пользователя представление. Делается это следующим образом: для замены имени переменной, необходимо указать комментарий при объявлении input переменной:

input cot_type_traders type_trader = noncommercial;  //Тип трейдеров
input cot_type_data    type_data   = netlongs;       //Тип индикатора
input cot_type_report  type_report = COT;            //Тип исходного отчета

Для замены значения, необходимо указать комментарий при описании перечисления:

enum cot_type_data    // тип отражаемого показателя
{   
  netlongs,           // Чистые лонги
  netlongsrate,       // Доля чистых лонгов в открытом интересе
  willams_index,      // Индекс Вильямса
  openinterest        // Открытый интерес
};

Если параметры заданы корректно, файлы распакованы верно, то индикатор будет отражен в отдельном окне:

Рис.4. Индикатор COT

При возникновении ошибок, они отражаются в окне «Инструменты», вкладка «Эксперты»:

Рис.5. Сообщение об ошибке


5. Примечание к релизу

Индикатор не позиционируется как многофункциональный законченный продукт. Это пример того, как, написав относительно короткий код, уже можно получить некоторый результат, который можно использовать в дальнейшей работе.  К примеру, я не стал разрабатывать модуль, который бы позволял производить гибкую настройку связи символа в терминале конкретного брокера с инструментом в отчете COT. Реализация связки сделана непосредственно в коде функции DefineIdSymbol, первые несколько ее строк: 

bool CCFTCReport::DefineIdSymbol()
  {
   idsymbol="";
   if(terminalsymbol=="USDLFX" || terminalsymbol=="DX_CONT" || StringFind(terminalsymbol,"DX")==0)idsymbol="098662";
   //U.S. DOLLAR INDEX - CE FUTURES U.S.
   if( terminalsymbol == "FC_CONT" || StringFind( terminalsymbol, "FC")== 0)idsymbol = "061641";  //FEEDER CATTLE 
   if( terminalsymbol == "LC_CONT" || StringFind( terminalsymbol, "LC")== 0)idsymbol = "057642";  //LIVE CATTLE 
   if( terminalsymbol == "QM_CONT" || StringFind( terminalsymbol, "QM")== 0)idsymbol = "067651";
   //CRUDE OIL, LIGHT SWEET - NEW YORK MERCANTILE EXCHANGE
Если вам необходимо привязать символ из отчета к конкретному символу в терминале, то это нужно сделать самостоятельно, модифицировав код. Настройки, сделанные в настоящий момент, перенесены из терминала BrocoTrader4.  Для примеров, приведенных в статье, использованы демо-счета, открытые на серверах Metaquotes-Demo, Alpari-Demo. Для проверки работы отчета DCOT доступно всего два инструмента: XAUUSD (золото), XAGUSD (серебро). 

Поддержки отчета CIT пока нет, т.к. на указанных серверах нет инструментов, для которых он составляется. Когда они будут доступны, то функционал просто включается раскомментированием и модификацией нескольких строк в коде. В Приложении 2 в табличном виде указано соответствие биржевых названий инструментов, биржевых идентификаторов и их связь с символьным представлением в терминале.


6. Использование функции iCustom, как инструмента получения данных из индикатора COT

В своей работе я не применяю индикатор в том виде, который был приведен на рис.3. В MQL5 существует механизм повторного использования пользовательских индикаторов посредством функции iCustom.

6.1. Конструируем новый индикатор

Для визуального анализа отчетов COT существует много вариантов, один из них – в виде гистограммы, на которой отражены разными цветами позиции различных групп трейдеров. 

Сформулируем постановку задачи: написать индикатор COTnet, отражающий в виде гистограммы позиции различных двух групп трейдеров: спекулянтов и хеджеров в отчетах COT. Пользователю должна быть предоставлена возможность выбора способа расчета показателя: чистые лонги, доля в открытом интересе, индекс Вильямса. 

Значительно ускорить процесс поможет мастер, использование которого описано в статье Как написать индикатор в MQL5. Код полученного индикатора (описание вида отображения графиков, который создан мастером) выглядит следующим образом:

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//---- plot Noncommercial
#property indicator_label1  "Noncommercial"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  Blue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  5
//---- plot Commercial
#property indicator_label2  "Commercial"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  Red
#property indicator_style2  STYLE_SOLID
#property indicator_width2  5
//--- indicator buffers
Input переменные, глобальные переменные, подключение библиотеки классов:
#include <cot.mqh>
input cot_type_data    type_data   = netlongs;  // Вид индикатора
double         NoncommercialBuffer[];
double         CommercialBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int handlecomm, handlenoncomm;

Тело функции OnInit:

int OnInit()
{
  SetIndexBuffer(0,NoncommercialBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,CommercialBuffer,INDICATOR_DATA);
   cot_type_traders td = commercial;
   cot_type_report  tr = COT; 
   handlecomm = iCustom(NULL, 0, "cot", td, type_data, tr );
   td = noncommercial;
   handlenoncomm = iCustom(NULL, 0, "cot", td, type_data, tr );
   return(0);
}

Механизм использования пользовательских индикаторов следующий (на примере хеджеров, первый вызов iCustom) - в функцию iCustom передаются параметры, необходимы для инициализации нужного нам отчета:

На выходе имеем хэндл, который в дальнейшем используется для получения данных. 

В функции OnCalculate производится получение данных из пользовательских индикаторов:

if(BarsCalculated(handlecomm)<rates_total || BarsCalculated(handlenoncomm)<rates_total) return(0);
int to_copy=clctocopy(rates_total,prev_calculated);
if(!copycotbuf(handlecomm,CommercialBuffer,to_copy))
  {
   Print("Ошибка получения данных хеджеров");
   return(0);
  }
if(!copycotbuf(handlenoncomm,NoncommercialBuffer,to_copy))
  {
   Print("Ошибка получения данных хеджеров");
   return(0);
  }
return(rates_total);

Потрачено немного времени, короткий код и результат:

Рис.6. Результат работы индикатора

6.2. iCustom также можно использовать и в скриптах

Постановка задачи: разработать скрипт cotsignals для получения статистических оценок.

Проверим, какое статистическое преимущество мы будем иметь, опираясь на различные значения показателей COT. Самое простое – сделать оценку вероятности правильного определения цвета недельной свечи. Проверим следующие гипотезы: 

Данные будем брать из отчета COT. На основании приведенных примеров вы сможете самостоятельно запрограммировать другие варианты интерпретации показателей отчетов и сделать выводы об их практической пользе. Проверку будем делать на истории в 150 недельных баров, что соответствует периоду примерно три года. Перед написанием тела скрипта разрабатываются необходимые типы данных и классы:

Тип данных, отвечающий за виды возможных статистик:

enum cot_type_statistics   //виды собираемых статистик
{  
  speculantsign,           //знак чистых лонгов спекулянтов
  speculantchange,         //изменение объема лонгов спекулянтов
  willamszones             //зоны перекупленности/перепроданности индекса Вильямса
};

Для получения статистики по определенному инструменту разрабатывается класс:

class CCOTStatistic
{
  private:
    
    int bars ;                            // число баров истории w1, на которой собирается статистика
    string symbol;                        // символ в терминале
    double netlongsspeculantsdata[];      // данные по чистым лонгам спекулянтов
    double willamsindexspeculantsdata[];  // данные по индексу Вильямса на чистых лонгах спекулянтов  
    cot_type_statistics liststatistic[];  // список видов собираемых статистик
  public:
    //Инициализация и первичная настройка
    void Init( string symbol_passed, cot_type_statistics& listpassed[] );
    //Получение прогноза по показаниям индикатора 
    int GetCotSignalDirection( int ibar, cot_type_statistics type_stat   );
    bool Get( double& probably[] );        //получить статистику
};

Затребованная статистика получается методом Get, опишу подробнее принцип его работы. Сначала формируются необходимые массивы данных с использованием механизма доступа к пользовательским индикаторам. Нам необходимы значения чистых лонгов спекулянтов и значения индекса Вильямса:

if (!LoadDataFromCOTIndicator(symbol, PERIOD_W1, noncommercial, netlongs, COT, netlongsspeculantsdata, bars))
   return(false);
  // получены данные - чистые лонги спекулянтов
if (!LoadDataFromCOTIndicator(symbol, PERIOD_W1, noncommercial, willams_index, COT, willamsindexspeculantsdata, bars))
   return(false);
  // получены данные - индекс Вильямса спекулянтов

Код расчета самого статистического показателя (а он у нас один!) – это вероятность правильного определения цвета недельной свечи:

for( int istat = 0; istat < ArraySize(liststatistic ); istat++ )
  {
   int cntsignals = 0;
   int cntsucsess = 0;
   for(int i=bars-1; i>=0; i--)
     {
      double colorcandle=iClose(symbol,PERIOD_W1,i)-iOpen(symbol,PERIOD_W1,i);
      if(symbol=="USDCHF" || symbol=="USDCAD" || symbol=="USDJPY") colorcandle=-colorcandle;
      double cotdirection=GetCotSignalDirection(i,liststatistic[istat]);
      if(cotdirection==0)continue;                 //нет сигнала
      cntsignals++;
      if(cotdirection*colorcandle>0) cntsucsess++; //цвет свечи и направление сигнала совпадают
     }
   if(cntsignals!=0) probably[istat]=1.*cntsucsess/cntsignals;
   Print("сбор завершен для",symbol,GetStringTypeStatistic(liststatistic[istat]),"prob=",DoubleToString(probably[istat],2));
   Print("Кол-во сигналов:",cntsignals,"успех:",cntsucsess);
  }

Функция LoadDataFromCOTIndicator сложна, т.к. чтобы получить данные из пользовательского индикатора, необходимо выполнить многочисленные проверки, поэтому построчно:

bool LoadDataFromCOTIndicator( string           symbol,       //символ в терминале
                              ENUM_TIMEFRAMES  timeframe,     //таймфрейм
                              cot_type_traders type_trader,   //тип группы трейдеров
                              cot_type_data    type_data  ,   //вид индикатора
                              cot_type_report  type_report,   //тип отчета
                              double&          loadto[],      //массив выходных данных
                              int              nbars   )      //количество запрашиваемых баров
  {     

   int cothandle;
   nbars+=10; //для запаса
   cothandle=iCustom(symbol,timeframe,"cot",type_trader,type_data,type_report);
Последняя строка получает хэндл пользовательского индикатора, используя которые можно получать данные из буферов. 

Проверка на то, что индикатор успешно создан:

  if( cothandle == INVALID_HANDLE )
  {
    Print("Ошибка создания индикатора cot для символа ", symbol );
    return(false);
  }

Проверим наличие необходимых исторических данных:

int n = BarsSinh( symbol, timeframe );
  if(  n < nbars    )
{ 

Если история недостаточна, то произведем ее загрузку:

Print("Загрузка истории для", symbol ); //, " начало ", loadtm  
    CheckLoadHistory( symbol ,timeframe,   loadtm );
    n = BarsSinh( symbol, timeframe );
    if( n < nbars ){
      Print("Недостаточно истории для"+symbol, "всего", n, "баров");
      return(false);
    }
  }

Основой для функций BarsSinh (количество доступных баров на требуемом таймфрейме) и CheckLoadHistory (загрузка истории) является код скрипта, приведенный в справке.

Перед тем, как выполнить обращение к буферу индикатора, нужно удостоверится, что он подготовил необходимые данные, т.к. наличие хэндла индикатора не гарантирует, что расчет закончен.

Следующий вызов производит необходимую проверку и дожидается окончания расчета:

if( !WaitForCalculcateIndicator( cothandle ) )
  {
    Print("Таймаут ожидания расчета индикатора cot");
    return(false);
  }

Данные готовы, выполняем запрос на их получение:

int res = CopyBuffer(cothandle, 0, 0, nbars, loadto );

Очередная проверка на то, что запрос прошел успешно:

if( res != nbars )
  {
    Print("Ошибка получения данных , ", MyErrorDescription(_LastError) );
    return(false);
  }

И, наконец:

return(true);

данные получены, возвращаются в массиве, передающемся в параметрах функции.

Получаемая статистика будет выводиться в файл формата CSV, для работы с ним разрабатывается класс: 

class CCOTOutFile
{
  private:
   string  filename;
   int     handle; 
  public:
    bool Init( string passedname );
    void PutString( string symbol, double& probably[] );
    void PutHeader( cot_type_statistics& arrheaders[] ) ;
    void ~CCOTOutFile(){       FileClose(handle);    }
};

Его задачами являются такие действия как: создание файла выходных данных, запись строки в формате CSV, формирование строки заголовка, корректное закрытие файла при удалении экземпляра класса из памяти.

Тело скрипта будет коротким, так как все необходимые библиотеки уже написаны.

Входные параметры, подключение библиотек:

input int      NBars =150; //Глубина истории W1
#include <common.mqh>
#include <cot.mqh>

Список инструментов, для которых выполняется анализ:

string listsymbols[] = { "EURUSD", "GBPUSD", "USDCHF", "USDCAD", "USDJPY", "AUDUSD", "XAUUSD"};

Инициализация объекта, отвечающего за выходной файл данных:

void OnStart()
{
  CCOTOutFile outfile;  //файл с результатами
  if( !outfile.Init("cotw1signals.csv") )return;

Формирование списка видов собираемых статистик:

  cot_type_statistics list_statistic[]= // список видов собираемой статистики
  { speculantsign, speculantchange, willamszones };
Формирование заголовка CSV файла:
outfile.PutHeader( list_statistic ); //вывести заголовок CSV файла

В основном цикле по каждому инструменту получаем статистику по списку сигналов, результаты выводятся в файл:

  for( int i = 0; i < ArraySize(listsymbols); i++  ) //по всем анализируемым символам
{  
    Print( "Анализ"+listsymbols[i] );
    CCOTStatistic stat;
    stat.Init( listsymbols[i ], list_statistic );
    double probably[];                               //вероятности правильности сигналов
    if( !stat.Get( probably ) ){
      Print( "Ошибка сбора статистики по символу", listsymbols[i] );
      return;
    }  
    outfile.PutString( listsymbols[i], probably );  //вывести строку CSV файла
  }
  Print("Обработка закончена");
}

Тесты данного скрипта выполнялись на сервере Alpari-Demo, при запуске на MetaQuotes-Demo будет выдаваться сообщение "Ошибка сбора статистики по символу XAUUSD", так как он на данный момент отсутствует в списке доступных.

В результате выполнения скрипта получим следующий файл данных:

Рис.7. Файл данных

Для того, чтобы произвести более наглядный анализ, загружаем файл в Excel, рассчитаем среднее по столбцам, построим диаграмму:


 Рис.8. Гистограммы вероятностей прогноза

По всем инструментам качественный результат выполнения прогнозов примерно одинаковый.  Усредненное значение вероятности правильного прогноза в разрезе видов сигналов следующее:

Таким образом, лучший прогноз среди полученных сигналов дает знак чистых лонгов спекулянтов. Наихудший – индекс Вильямса, 0.48 означает, что с вероятностью 0.52 свечи будут белыми, даже если индекс находится в зоне перекупленности, и черными - в зоне перепроданности. Таким образом, его использование в том виде, который предлагает Вильямс, нерационально. Возможно, лучших результатов можно достигнуть, если использовать его в большей временной перспективе: месяц, может быть, более. Список инструментов, для которых выполнен анализ – весь, по которым есть данные в отчетах СОТ и списке доступных символов демосерверов.


Заключение

MQL5 является инструментом, который позволяет запрограммировать весь цикл работ, которые выполняет трейдер при разработке торговых систем:

Преимущества:

Недостатки:

Основной сложностью для меня оказалась организация доступа к исторически данным:

Отладчик присутствует, но функционала мало: нет отладки индикаторов, возможности просмотра сложных объектов (массивов и экземпляров классов) отсутствуют.

Перечисленные преимущества и недостатки не являются полным перечнем: я коснулся тех, с которыми пришлось столкнуться при работе с материалами статьи.


Приложение 1. Список используемых файлов

Все файлы расположены в папке клиентского терминала. Прилагаемый архивный файл с данными файлами, создан с сохранением относительных путей.

 №Имя файла
Описание
 1 MQL5\Files\unzip.exe
 Приложение Windows, выполняющее распаковку zip архивов
 2 MQL5\Include\Cdownloader.mqh
 Содержит библиотеку классов, осуществляющих загрузку данных из интернет
 3 MQL5\Include\ClassProgressBar.mqh
 Описание класса CProgressBar, отображает прогресс-бар в окне графика
 4 MQL5\Include\common.mqh
 Содержит функции и объявления констант общего назначения, которые используются во всех индикаторах и скриптах
 5 MQL5\Include\cot.mqh
 Описание класса CCFTCReport. Обеспечивает выборку данных из файлов отчетов COT
 6 MQL5\Include\ErrorDescription.mqh
 Библиотека обработки ошибок
 7 MQL5\Indicators\cot.mq5
 Индикатор COT, базовый индикатор
 8 MQL5\Indicators\cotnet.mq5
 Индикатор COTnet, пример индикатора, использующего cot.mq5 в качестве пользовательского
 9 MQL5\Scripts\cotdownloader.mq5
 Скрипт COTdownloader, загрузка файлов отчетов из интернет
 10 MQL5\Scripts\cotsignals.mq5
 Скрипт COTsignals, пример скрипта, осуществляющего статистический анализ показателей отчетов COT


Таблица 2. Список используемых файлов


Приложение 2. Список инструментов, по которым представляются отчеты COT


Биржевое наименование
Идентификатор
 на бирже
Идентификатор в терминале Наличие в CIT Наличие в DCOT
 1 WHEAT - CHICAGO BOARD OF TRADE  001602 ZW x x
 2 WHEAT - KANSAS CITY BOARD OF TRADE  001612   x x
 3 WHEAT - MINNEAPOLIS GRAIN EXCHANGE  001626     x
 4 CORN - CHICAGO BOARD OF TRADE  002602 ZC x x
 5 OATS - CHICAGO BOARD OF TRADE 004603 ZO   x
 6 SOYBEANS - CHICAGO BOARD OF TRADE  005602 ZS x x
 7 MINI SOYBEANS - CHICAGO BOARD OF TRADE  005603     x
 8 SULFUR FINANCIAL INSTRUMENT - CHICAGO CLIMATE FUTURES EXCHANGE  006261     x
 9 CARBON FINANCIAL INSTRUMENT - CHICAGO CLIMATE FUTURES EXCHANGE  006268     x
 10 RGGI CO2 ALLOWANCE 2009 - CHICAGO CLIMATE FUTURES EXCHANGE  00626U      x
 11 SOYBEAN OIL - CHICAGO BOARD OF TRADE  007601 ZL x x
 12 U.S. TREASURY BONDS - CHICAGO BOARD OF TRADE  020601 ZB    
 13 LONG-TERM U.S. TREASURY BONDS - CHICAGO BOARD OF TRADE  020604      
 14 GULF # 6 FUEL 3.0% SULFUR SWAP - NEW YORK MERCANTILE EXCHANGE  02165A      x
 15 NY RES FUEL 1.0% SULFUR SWAP - NEW YORK MERCANTILE EXCHANGE  02165B      x
 16 EUR 1% FUEL OIL NWE CAL SWAP - NEW YORK MERCANTILE EXCHANGE  02165C      x
 17 EUR 3.5% FUEL OIL RTD CAL SWAP - NEW YORK MERCANTILE EXCHANGE  02165E      x
 18 SING FUEL OIL 180 CAL SWAP - NEW YORK MERCANTILE EXCHANGE  02165G      x
 19 EAST WEST FUEL OIL SPR SWAP - NEW YORK MERCANTILE EXCHANGE  02165I      x
 20 NY 1% V GULF 3% FUEL OIL SPR - NEW YORK MERCANTILE EXCHANGE  02165T      x
 21 NO. 2 HEATING OIL 022651     x
 22 SING GASOIL SWAP - NEW YORK MERCANTILE EXCHANGE  02265J      x
 23 SING GASOIL/RDAM GASOIL SWAP - NEW YORK MERCANTILE EXCHANGE  02265T      x
 24 NYMEX HEATING OIL/RDAM GASOIL - NEW YORK MERCANTILE EXCHANGE  02265U      x
 25 GASOIL (ICE) SWAP - NEW YORK MERCANTILE EXCHANGE  02265V      x
 26 UP DOWN GC ULSD VS HO SPR SWAP - NEW YORK MERCANTILE EXCHANGE  022A13      x
 27 SING GASOIL BALMO SWAP - NEW YORK MERCANTILE EXCHANGE  022A22      x
 28 NATURAL GAS ICE HENRY HUB - ICE OTC  023391     x
 29 NATURAL GAS - NEW YORK MERCANTILE EXCHANGE  023651 QG   x
 30 MICHCON BASIS SWAP - NEW YORK MERCANTILE EXCHANGE  02365A      x
 31 M-3 BASIS SWAP - NEW YORK MERCANTILE EXCHANGE  02365C      x
 32 TCO BASIS SWAP - NEW YORK MERCANTILE EXCHANGE  02365D       
 33 NGPL TEXOK BASIS SWAP - NEW YORK MERCANTILE EXCHANGE  02365G      x
 34 NGPL MIDCON BASIS SWAP - NEW YORK MERCANTILE EXCHANGE  02365K      x
 35 WAHA BASIS SWAP - NEW YORK MERCANTILE EXCHANGE  02365O      x
 36 HOUSTON SHIP CH INDEX SWAP - NEW YORK MERCANTILE EXCHANGE  023A10      x
 37 CBT ETHANOL - CHICAGO BOARD OF TRADE  025601     x
 38 CHICAGO ETHANOL SWAP - NEW YORK MERCANTILE EXCHANGE  025651     x
 39 SOYBEAN MEAL - CHICAGO BOARD OF TRADE  026603 ZM   x
 40 JAPAN C&F NAPTHA SWAP - NEW YORK MERCANTILE EXCHANGE  03265C      x
 41 COTTON NO. 2 - ICE FUTURES U.S.  033661 CT x x
 42 HENRY HUB BASIS SWAP - NEW YORK MERCANTILE EXCHANGE  035652     x
 43 HOUSTON SHIP CH BASIS SWAP - NEW YORK MERCANTILE EXCHANGE  035653     x
 44 NW PIPE ROCKIES BASIS SWAP - NEW YORK MERCANTILE EXCHANGE  035654     x
 45 PANHANDLE BASIS SWAP - NEW YORK MERCANTILE EXCHANGE  035655     x
 46 HENRY HUB SWAP - NEW YORK MERCANTILE EXCHANGE  03565B       
 47 HENRY HUB PENULTIMATE GAS SWAP - NEW YORK MERCANTILE EXCHANGE  03565C      x
 48 ROUGH RICE - CHICAGO BOARD OF TRADE  039601 ZR   x
 49 FRZN CONCENTRATED ORANGE JUICE - ICE FUTURES U.S.  040701 JO   x
 50 2-YEAR U.S. TREASURY NOTES - CHICAGO BOARD OF TRADE  042601      
 51 10-YEAR U.S. TREASURY NOTES - CHICAGO BOARD OF TRADE  043602 ZN    
 52 5-YEAR U.S. TREASURY NOTES - CHICAGO BOARD OF TRADE  044601      
 53 30-DAY FEDERAL FUNDS - CHICAGO BOARD OF TRADE  045601 ZQ    
 54 MILK Class III - CHICAGO MERCANTILE EXCHANGE  052641     x
 55 LEAN HOGS - CHICAGO MERCANTILE EXCHANGE  054642 HE x x
 56 LIVE CATTLE - CHICAGO MERCANTILE EXCHANGE  057642 LC x x
 57 RANDOM LENGTH LUMBER - CHICAGO MERCANTILE EXCHANGE  058643 LB   x
 58 FEEDER CATTLE - CHICAGO MERCANTILE EXCHANGE  061641 FC x x
 59 PJM ELECTRICITY MONTHLY - NEW YORK MERCANTILE EXCHANGE  064657     x
 60 ISO NEW ENGLAND LMP SWAP - NEW YORK MERCANTILE EXCHANGE  06465H      x
 61 PJM CAL MONTH OFF PK LMP SWAP - NEW YORK MERCANTILE EXCHANGE  06465M      x
 62 ISO NEW ENG OFF PK LMP SWAP - NEW YORK MERCANTILE EXCHANGE  06465S      x
 63 CINERGY CAL MONTH LMP SWAP - NEW YORK MERCANTILE EXCHANGE  064A01      x
 64 CINERGY OFF PEAK LMP SWAP - NEW YORK MERCANTILE EXCHANGE  064A02       
 65 PJM N ILL PEAK DAY AHEAD - NEW YORK MERCANTILE EXCHANGE  064A34      x
 66 PJM JCPL PEAK DAY AHEAD - NEW YORK MERCANTILE EXCHANGE  064A48      x
 67 PJM PEPCO PEAK DAY AHEAD - NEW YORK MERCANTILE EXCHANGE  064A50      x
 68 PJM PSEG PEAK DAY AHEAD - NEW YORK MERCANTILE EXCHANGE  064A54      x
 69 PJM WESTERN PEAK DAY AHEAD - NEW YORK MERCANTILE EXCHANGE  064A56       
 70 PJM WESTERN PEAK REAL TIME - NEW YORK MERCANTILE EXCHANGE  064A58      x
 71 PJM WESTERN OFF PEAK REAL TIME - NEW YORK MERCANTILE EXCHANGE  064A59      x
 72 ISO NEW ENG INT HUB PEAK SWAP - NEW YORK MERCANTILE EXCHANGE  064A60      x
 73 MW IND TRANS PEAK SWAP - NEW YORK MERCANTILE EXCHANGE  064A62      x
 74 NYISO ZONE 5 MW PEAK SWAP - NEW YORK MERCANTILE EXCHANGE  064A66       
 75 ISO NEW ENG HUB OFF PEAK SWAP - NEW YORK MERCANTILE EXCHANGE  064A78       
 76 MT BELVIEU PROPANE 5 DEC SWAP - NEW YORK MERCANTILE EXCHANGE  06665O       
 77 MT BELVIEU ETHANE 5 DEC SWAP - NEW YORK MERCANTILE EXCHANGE  06665P      x
 78 MT BELV NORM BUTANE 5 DEC SWAP - NEW YORK MERCANTILE EXCHANGE  06665Q      x
 79 MT BELV NAT GASOLINE 5 DEC SWP - NEW YORK MERCANTILE EXCHANGE  06665R      x
 80 CRUDE OIL LIGHT SWEET - ICE FUTURES EUROPE   LIGHT SWEET - ICE FUTURES EUROPE  067411     x
 81 CRUDE OIL, LIGHT SWEET - NEW YORK MERCANTILE EXCHANGE 067651 QM   x
 82 WTI CRUDE OIL CALENDAR SWAP - NEW YORK MERCANTILE EXCHANGE  06765A      x
 83 DUBAI CRUDE OIL CALENDAR SWAP - NEW YORK MERCANTILE EXCHANGE  06765G      x
 84 WTI CRUDE OIL FINANCIAL - NEW YORK MERCANTILE EXCHANGE  06765I      x
 85 BRENT FINANCIAL - NEW YORK MERCANTILE EXCHANGE  06765J      x
 86 BRENT (ICE) CALENDAR SWAP - NEW YORK MERCANTILE EXCHANGE  06765N      x
 87 BRENT-DUBAI SWAP - NEW YORK MERCANTILE EXCHANGE  06765O      x
 88 COCOA - ICE FUTURES U.S.  073732 CC x x
 89 PALLADIUM - NEW YORK MERCANTILE EXCHANGE  075651 PA   x
 90 PLATINUM - NEW YORK MERCANTILE EXCHANGE  076651 PL   x
 91 SUGAR NO. 11 - ICE FUTURES U.S.  080732 SB x x
 92 COFFEE C - ICE FUTURES U.S.  083731 KC x x
 93 SILVER - COMMODITY EXCHANGE INC.  084691 SI,XAGUSD,ZI   x
 94 COPPER-GRADE #1 - COMMODITY EXCHANGE INC.  085692 HG   x
 95 GOLD - COMMODITY EXCHANGE INC.  088691 GC,GOLD,XAUUSD   x
 96 RUSSIAN RUBLE - CHICAGO MERCANTILE EXCHANGE  089741 USDRUB,USDRUR    
 97 CANADIAN DOLLAR - CHICAGO MERCANTILE EXCHANGE  090741 6C,USDCAD    
 98 SWISS FRANC - CHICAGO MERCANTILE EXCHANGE  092741 6S,USDCHF    
 99 MEXICAN PESO - CHICAGO MERCANTILE EXCHANGE  095741      
 100 BRITISH POUND STERLING - CHICAGO MERCANTILE EXCHANGE  096742 6B,GBPUSD    
 101 JAPANESE YEN - CHICAGO MERCANTILE EXCHANGE  097741 6J,USDJPY    
 102 U.S. DOLLAR INDEX - ICE FUTURES U.S.  098662 DX    
 103 EURO FX - CHICAGO MERCANTILE EXCHANGE 099741 6E,EURUSD    
 104 GASOLINE BLENDSTOCK (RBOB) - NEW YORK MERCANTILE EXCHANGE  111659 XRB   x
 105 RBOB CALENDAR SWAP - NEW YORK MERCANTILE EXCHANGE  11165K      x
 106 NEW ZEALAND DOLLAR - CHICAGO MERCANTILE EXCHANGE  112741 6N,NZDUSD    
 107 VIX FUTURES - CBOE FUTURES EXCHANGE  011700      
 108 DOW JONES INDUSTRIAL AVERAGE - CHICAGO BOARD OF TRADE  124601      
 109 3-MONTH EURODOLLARS - CHICAGO MERCANTILE EXCHANGE  132741      
 110 S&P 500 STOCK INDEX - CHICAGO MERCANTILE EXCHANGE  138741      
 111 E-MINI S&P 500 STOCK INDEX - CHICAGO MERCANTILE EXCHANGE  13874A  ES,SPX    
 112 NASDAQ-100 STOCK INDEX - CHICAGO MERCANTILE EXCHANGE  209741 NQ    
 113 NASDAQ-100 STOCK INDEX (MINI) - CHICAGO MERCANTILE EXCHANGE  209742      
 114 DOW JONES UBS EXCESS RETURN - CHICAGO BOARD OF TRADE  221602      
 115 AUSTRALIAN DOLLAR - CHICAGO MERCANTILE EXCHANGE  232741 6A,AUDUSD    
 116 RUSSELL 2000 MINI INDEX FUTURE - ICE FUTURES U.S.  23977A       
 117 NIKKEI STOCK AVERAGE - CHICAGO MERCANTILE EXCHANGE  240741      
 118 NIKKEI STOCK AVERAGE YEN DENOM - CHICAGO MERCANTILE EXCHANGE  240743      
 119 E-MINI MSCI EAFE - CHICAGO MERCANTILE EXCHANGE  244741      
 120 E-MINI MSCI EMERGING MARKETS - CHICAGO MERCANTILE EXCHANGE  244742      
 121 INTEREST RATE SWAPS 10YR - CHICAGO BOARD OF TRADE  246602      
 122 INTEREST RATE SWAPS 5YR - CHICAGO BOARD OF TRADE  247602      
 123 S&P GSCI COMMODITY INDEX - CHICAGO MERCANTILE EXCHANGE  256741      
 124 SING JET KERO SWAP - NEW YORK MERCANTILE EXCHANGE  26265D       
 125 E-MINI S&P 400 STOCK INDEX - CHICAGO MERCANTILE EXCHANGE  33874A       
 126 GULF JET NY HEAT OIL SPR SWAP - NEW YORK MERCANTILE EXCHANGE  86465A      x
 127 SING JET KERO GASOIL SPR SWAP - NEW YORK MERCANTILE EXCHANGE  86465C      x
 128 JET CIF NWE/GASOIL FUT - NEW YORK MERCANTILE EXCHANGE  86465D      x
 129 GULF # 6 FUEL OIL CRACK SWAP - NEW YORK MERCANTILE EXCHANGE  86565A      x
 130 3.5% FUEL OIL RDAM CRACK SPR - NEW YORK MERCANTILE EXCHANGE  86565C      x
 131 NAPTHA CRACK SPR SWAP - NEW YORK MERCANTILE EXCHANGE  86665A      x
 132 GASOIL CRACK SPR SWAP - NEW YORK MERCANTILE EXCHANGE  86765C      x


Таблица 3. Список инструментов, по которым представляются отчеты COT