
MQL5: Анализ и обработка отчетов Commodity Futures Trading Commission (CFTC) в MetaTrader 5
Введение
Торговый терминал 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 |
Ссылка на скачивание последнего файла данных | |||
Группы трейдеров, представленных в отчете (англоязычное наименование) | Спекулянты (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 buffersInput переменные, глобальные переменные, подключение библиотеки классов:
#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 передаются параметры, необходимы для инициализации нужного нам отчета:
- NULL – текущий символ в терминале
- 0 – текущий таймфрейм
- "cot" – имя файла пользовательского индикатора
- td – commercial, группа трейдеров
- type_data – вид индикатора, задается во входных параметрах
- tr = COT – вид отчета
На выходе имеем хэндл, который в дальнейшем используется для получения данных.
В функции 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. Самое простое – сделать оценку вероятности правильного определения цвета недельной свечи. Проверим следующие гипотезы:
- Знак чистых лонгов спекулянтов совпадает с цветом свечи: если он положителен, то недельный тренд бычий, если отрицателен, то медвежий;
- Если чистые лонги спекулянтов увеличиваются, то свеча белая, если уменьшаются – то черная;
- Если индикатор, построенный на чистых длинных позициях спекулянтов Вильямса, находится в зоне перекупленности (более 75%), то свеча будет черная, в зоне перепроданности (менее 25%) – белая.
Данные будем брать из отчета 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.54 – знак спекулянтов;
- 0.50 – изменение чистых лонгов спекулянтов;
- 0.48 – индекс Вильямса.
Таким образом, лучший прогноз среди полученных сигналов дает знак чистых лонгов спекулянтов. Наихудший – индекс Вильямса, 0.48 означает, что с вероятностью 0.52 свечи будут белыми, даже если индекс находится в зоне перекупленности, и черными - в зоне перепроданности. Таким образом, его использование в том виде, который предлагает Вильямс, нерационально. Возможно, лучших результатов можно достигнуть, если использовать его в большей временной перспективе: месяц, может быть, более. Список инструментов, для которых выполнен анализ – весь, по которым есть данные в отчетах СОТ и списке доступных символов демосерверов.
Заключение
MQL5 является инструментом, который позволяет запрограммировать весь цикл работ, которые выполняет трейдер при разработке торговых систем:
- Построение индикаторов, реализующих сложные алгоритмы доступа к внешним источникам данных;
- Повторное их использование в других индикаторах, скриптах и советниках;
- Реализация собственных алгоритмов статистического и количественного анализа.
Преимущества:
- Применение объектно-ориентированного программирования резко сокращает затраты времени по отладке разрабатываемого программного обеспечения.
- Наличие отладчика.
- Переход с предыдущей версии языка MQL4 не вызывает особых затруднений.
- Реализация объектно-ориентированной модели удачна, легко осваивается.
- Документация хорошо организована и достаточна.
- Интеграция с Windows API расширяет функционал платформы и позволяет, к примеру, организовать работу со страницами интернет.
Недостатки:
Основной сложностью для меня оказалась организация доступа к исторически данным:
- Отсутствуют необходимые примитивные функции доступа к таймсериям (аналоги Time[], Open[], Close[] и др. в MQL4);
- При обращении к данным необходимо выполнять многочисленные проверки их доступности, необходимо вникать в тонкости из организации.
Отладчик присутствует, но функционала мало: нет отладки индикаторов, возможности просмотра сложных объектов (массивов и экземпляров классов) отсутствуют.
Перечисленные преимущества и недостатки не являются полным перечнем: я коснулся тех, с которыми пришлось столкнуться при работе с материалами статьи.
Приложение 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





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Да, вроде исправили, после обновления скомпилировал без ошибки. Спасибо. Правда обновления не произошло, попробую еще раз во вторник, посмотрим.
У Вас в логе есть строка: "Загрузка выполнена", это означает, что были найдены более свежие данные, они были загружены. Дело в том, что в индикаторе не предусмотрена проверка на их обновление, поэтому чтобы он их подхватил, нужно проинициализировать его заново. Например, переключить таймфрейм с w1 на d1 и обратно.
Во вторник искать обновления нет смысла. Следующие файлы появятся только в субботу утром.
не работает....
на Евро-Долларе работает.... а как заставить на дргуих торговых инструментах работать ?