Эконометрика: прогноз EURUSD на один шаг вперед

Автор: lexy Пятница, Сентябрь 5th, 2014 Нет комментариев

Рубрика: Разное

В статье рассматривается прогноз пары EURUSD на один шаг вперед с помощью пакета EViews с последующей оценкой результатов прогнозирования с помощью программы наEViews и советника на MQL4. Данная статья является продолжением статьи «Анализ статистических характеристик индикаторов», положения которой будут использоваться без дополнительных разъяснений.

1. Построение модели

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

EURUSD = C(1)*EURUSD_HP(1) + C(2)*D(EURUSD_HP(1)) + C(3)*D(EURUSD_HP(2))

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

Начнем построение модели для символа EURUSD часового таймфрейма на барах за одну неделю: с 12.09.2011 по 17.09.2011.

 

1.1. Анализ исходной котировки EURUSD

С самого начала проанализируем исходный ряд EURUSD с целью составления плана на следующий шаг.

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

Текст индикатора приведен ниже и, по-моему мнению, в комментариях не нуждается.

//+------------------------------------------------------------------+
//|                                                   Kotir_Out.mq4  |
//|   Индикатор вывода котировок для EViews                          |
//|   Версия от 29.08.2011                                           |
//+------------------------------------------------------------------+
//--- индикатор в основном окне
#property indicator_chart_window
//--- кол-во видимых буферов индикатора
#property indicator_buffers            1
//--- установка цвета индикатора
#property indicator_color1             Red      // Прогноз      
//--- установка ширины линии
#property indicator_width1             2
//--- внешние параметры
extern   int      Number_Bars=100;     // Кол-во баров
extern   string   DateTime_begin    =  "2011.01.01 00:00";
extern   string   DateTime_end      =  "2011.01.01 00:00";
//--- глобальные переменные
//--- декларирование буферов
double   Quotes[];         // Котировки - не видимы
int      Quotes_handle;    // Указатель на файл Quotes
int      i;                // Счетчик в цикле
//--- имена файлов для обмена с EViews
string   fileQuotes;       // Имя файла для котировок
//+------------------------------------------------------------------+
//|Indicator initialization function                                 |
//+------------------------------------------------------------------+
int init()
  {
//--- кол-во буферов индикатора
   IndicatorBuffers(1);
//--- установка параметров рисования
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,0);
   SetIndexDrawBegin(0,Number_Bars);

//--- привязка номера индикатора к имени
   SetIndexBuffer(0,Quotes);  // Расчетный буфер

//--- начальные значения буферов
   SetIndexEmptyValue(0,0.0);
//--- имя индикатора
   IndicatorShortName("Forecast");
//--- сформируем имена файлов для обмена с EViews
   fileQuotes="kotir.txt";   // Имя файла для котировки
   int       N_bars_begin   =  0;
   int       N_bars_end     =  0;

   datetime  var_DT_begin   =  0;
   datetime  var_DT_end     =  0;
   bool      exact          =  false;
//---
//--- создадим файл котировок для работы EViews
   Quotes_handle=FileOpen(fileQuotes,FILE_CSV|FILE_WRITE,',');
//--- аварийный выход
   if(Quotes_handle<1)
     {
      Print("Не удалось создать файл ",fileQuotes," Ошибка #",GetLastError());
      return(0);
     }
   FileWrite(Quotes_handle,"DATE","kotir");  // Заголовок
//---    
//--- вычислим количество баров для экспорта
   var_DT_begin =  StrToTime(DateTime_begin);
   var_DT_end   =  StrToTime(DateTime_end);

   if(var_DT_begin!=var_DT_end)
     {
      N_bars_begin=iBarShift(NULL,Period(),var_DT_begin,exact);
      N_bars_end=iBarShift(NULL,Period(),var_DT_end,exact);
      Number_Bars=N_bars_begin-N_bars_end;

      Print("Number_Bars = ",Number_Bars,
            ", N_bars_end = ",N_bars_end,
            ", N_bars_begin = ",N_bars_begin);

      for(i=N_bars_begin; i>=N_bars_end; i--)
        {
         FileWrite(Quotes_handle,
                   TimeToStr(iTime(Symbol(),Period(),i)),
                   iOpen(Symbol(),Period(),i));
        }
     }
   else
     {
      for(i=Number_Bars-1; i>=0; i--)
        {
         FileWrite(Quotes_handle,
                   TimeToStr(iTime(Symbol(),Period(),i)),
                   iOpen(Symbol(),Period(),i));
        }
     }
// --- запишем котировки
   FileWrite(Quotes_handle, "Прогноз ", 0);   // Место для прогноза
   FileClose(Quotes_handle);                  // Закрыть файл с котировками
   Comment("Создан файл котировок c количеством баров =",Number_Bars+1);
//--- конец секции Init()
   return(0);
  }
//+------------------------------------------------------------------+
//| Indicator start function                                         |
//+------------------------------------------------------------------+
int start()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//--- убрать сообщение с монитора
   Comment("                                                     ");
//----
   return(0);
  }
//+------------------------------------------------------------------+

 

Задав указанные выше даты, я получил файл котировок, состоящий из 119 строк, последняя из которой имеет вид «Прогноз,0″ – это место для будущего прогноза. Замечу, что работаю я с ценами Open. Также обращаю внимание, что порядок котировок в файле противоположный тому, который принят в MQL4, т.е. как в языках программирования.

Индикатор, естественно, формирует файл kotir.txt в папке терминала \expert\files\. Рассмотренный ниже советник в режиме DEMO или REAL торгов будет брать файл котировок из этой папки, но в режиме тестера этот файл необходим в папке \tester\files\, поэтому я вручную перемещаю файл kotir.txt в папку \tester\files\ терминала.

Представляю график:

 

Рис. 1. График котировок EURUSD, таймфрейм Н1

Визуально наблюдаем то ли один, то ли много трендов, но наша цель состоит в прогнозе будущей стабильности торговой системы. Поэтому проведем анализ на стационарность исходных котировок EURUSD_H1.

Вычислим описательные статистики:

Рис. 2. Описательные статистики

Из описательной статистики следует, что:

  • Имеется скос вправо (должен быть ноль, а имеем 0.244950);
  • Вероятность нормального распределения нашей исходной котировки 9.64%.

Конечно, визуально гистограмма не имеет никакого отношения к нормальному распределению, но вероятность в 9.64% порождает определенные иллюзии.

Давайте наглядно сравним с теорией:

Рис. 3. Сравнение гистограммы EURUSD с теоретической кривой нормального распределения

 

 

Визуально мы находим подтверждение, что котировка EURUSD_Н1 крайне далека о нормального распределения.

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

Вычислим автокорреляцию котировок.

Она имеет следующий вид:

Рис. 4. Автокорреляционная функция котировок EURUSD_H1

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

Какими статистическими характеристиками будет обладать этот остаток, если из исходной котировки вычесть детерминированную составляющую?

Для это проведем тест на единичный корень, который должен показать нам, будет ли более перспективной работа с первой разностью (остатком) исходной котировки.

Таблица 1. Тест на единичный корень

 

Проведенный тест показывает, что:

  • Вероятность, что исходная котировка имеет единичный корень (первая разность имеет нормальное распределение), равна 41%;
  • Статистика DW (Durbin-Watson) чуть больше 2.2, что также говорит о нормальном распределении первой разности.
Вывод: имеет смысл проводить детрендирование ценового ряда и в дальнейшем анализировать остаток от детрендирования.

 

1.2. Сглаживание

По аналогии с предыдущей статьей для выделения детерминированной составляющей котировки EURUSD будем использовать сглаживание Ходрика-Прескотта (Hodrick-Prescott filter).

Цифра «10″ в именах рядов означает параметр «лямбда» в сглаживании Ходрика-Прескотта. Из теории этого сглаживания известно, что величина лямбды имеет большое значение для результата, который имеет следующий вид:

 

Рис. 5. Результат сглаживания ряда фильтром Ходрика-Прескотта

 

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

kotir = C(1) * HP(-1) + C(2) * D(HP(-1)) + C(3)*D(HP(-2))

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

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

 

Таблица 2. Оценка уравнения регрессии

 

Конечно, крайне неприятным является вероятность в 39% того, что коэффициент при НР1_D(-1) равен нулю. Оставляем все как есть, так как строим демонстрационный пример.

Получив оценку уравнения регрессии (оценку коэффициентов уравнения) можно сделать прогноз на один шаг вперед.

Результат выглядит следующим образом:

 

Рис. 6. Прогноз EURUSD на один шаг вперед (на 0 часов понедельника)

 

1.3. Оценка остатков от уравнения регрессии

Проведем ограниченный анализ остатка от уравнения регрессии. Этот остаток получен путем вычитания из исходных котировок EURUSD значений, вычисленных по уравнению регрессии.

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

Первый тестом будет тест на анализ зависимостей между лагами в остатке:

 

Рис. 7. Автокорреляционная функция остатка

 

К сожалению, зависимости между лагами остались, а наличие зависимостей ставит под сомнение статистический анализ.

Следующий тест, который проведем — это тест на нормальность распределения остатка.

Результат имеет следующий вид:

 

Рис. 8. Гистограмма остатка от уравнения регрессии

Вероятность того, что остаток распределен по нормальному закону, равна 25.57%, это достаточно большая величина.

Проведем тесты на наличие гетероскедастичности в остатке.

Получаем следующие результаты:

 

  • Вероятность отсутствия гетероскедастичности типа GARCH = 16.08%
  • Вероятность отсутствия общей гетероскедастичности типа White = 0.0066%
Выводы: после дифференцирования с вероятностью 25% был получен остаток с нормальным распределением, но с близкой к нулю вероятностью отсутствия зависимостей и мы можем строго отклонить гипотезу об отсутствии гетероскедастичности общего вида по White. Из этого следует, что наша модель является довольно сырой, в ней необходимо устранить зависимости между лагами, а после этого еще раз проверить на гетероскедастичность и при ее наличии смоделировать эту гетероскедастичность.

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

 

2. Оценка результатов прогнозирования

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

 

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

Отношение прибыли к убытку обозначено как профит-фактор. Подсчитывается отношение прибыльных и убыточных приращений (отношение прибыльных и убыточных сделок). Также подсчитываем количество подряд убыточных сделок и отношение убытка в подряд убыточных сделках к прибыли (фактор восстановления).

Программа на языке EViews для оценки результатов моделирования в терминах торговой системы состоит из основной программы и двух подпрограмм.

Основная программа (головная) имеет следующий вид:

'
' Программа прогнозирования на один шаг вперед
' Версия от 26.09.2011
'-----------------------------------------------
 include    sub_profit_factor
 include    sub_model_2
'
' 1. Создадим рабочий файл EViews с именем МТ4
'
 %path   = "C:\Program Files\BCS Trade Station\tester\files"
 cd      %path

 if @fileexist("work.wf1") = 0  then
  wfcreate(wf  = work)  u 510
 else
  wfopen   work
 endif
'
' Читает котировки из файлов
 read(  t  = txt)   kotir.txt date $   kotir
'
'  Число наблюдений в ряде без NA
 !number   = @obs(kotir)
 smpl     1  !number  - 1

 genr  trend    = NA        ' Тренд = kotir_f(i) - kotir(i-1)
 genr  kotir_d  = d(kotir)  ' Прирост движения цены на один шаг  - d(kotir)
'

' Вычислим модель
 call  sub_model_2
'
' Вычислим таблицу профита
 call sub_profit_factor

' Создаем файл для результата
 genr result   = 0
'
' Заполняем результат
 result(1)  = kotir_f(!number)    ' Прогноз на один шаг вперед
 result(2)  = kotir_f_se(!number) ' Ошибка прогноза на один шаг вперед
 result(3)  = trend(!number - 1)  ' Направление прогноза
'-----------------------------------------------
' Вернем результат в МТ4
'
 smpl      1  10
 write(t=txt,na=0,d=c,dates)  EViewsForecast.txt   result

'-----------------Конец программы --------------
 smpl      1  !number
 save       work
 close      @all
 exit
'
'-----------------------------------------------

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

С изменением модели в основной программе надо менять две строчки, связанные с изменением имени подпрограммы для модели.

Подпрограмма, в которую вынесена модель (уравнение регрессии):

subroutine  sub_model_2

  cd
  wfselect             work
  smpl          1    !number    -  1
' Сглаживание 1-го уровня фильтром НР котировку с первой лямбдой
' и получает два файла:  
'      hp1     -  сглаженный файл
'      p1_d    -   файл остатка
  hpf(lambda    =  10)   kotir hp1   @hp1_d
'
'  4. Оценивается регрессия eq02, которая использует ряды:
'        hp1  
'        hp1_d
  equation eq1.ls   kotir   hp1(-1)   hp1_d(-1) hp1_d(-2)

'  
'  Расширяется выборка для включения места для прогноза
  smpl              1 !number
'
'  Делается прогноз на один шаг вперед и формируются выходные ряды:
'    kotir_f     -  прогноз
'    kotir_f_se  -  ошибка прогноза
  fit(p)            kotir_f   kotir_f_se

  save              work

endsub

Этих подпрограмм должно быть равно количеству моделей.

Для другой модели следует изменить имя подпрограммы и, соответственно, имена в основной программе.

Подпрограмма, которая вычисляет показатели прибыли/убытка по модели:

' Подпрограмма оценивает результаты прогноза
' Версия от 27.09.2011
' ----------------------------------------------------------------------------
' Cравнивая приращение прогноза с приращением уровня котировки
' программа вычисляет:
'  профит фактор по приращениям;
'  прибыльность уравнения в количестве наблюдений
'  фактор восстановления как отношение дохода в пипсах к наибольшей просадке
' ----------------------------------------------------------------------------
subroutine sub_profit_factor

' Локальные перменные
   !profit = 0          ' Накопление профита
   !lost = 0            ' Накопление убытка
   !profit_factor = 0   ' Профит фактор
   !i = 1               ' Раб. индекс
   !n_profit = 0        ' Кол-во прибыльны сдлок
   !n_lost = 0          ' Кол-во убыточных сделок
   !n_p_l = 0           '
   !pr = 0              '  Отсутствие серии убытков
   !prosadka = 0        ' Просадка - накопление серии убытков
   !tek_prosadka = 0    ' Текущая просадка
   !tek_pr = 0          '  Текущее кол-во убыточных сделок

 cd
 wfselect       work
 smpl        1   !number

' Вычислим тренд на каждом баре
 for  !i  =  1  to  !number - 1
  trend(!i) = kotir_f(!i + 1) - kotir(!i)
 next

'  Подсчитаем прибыль при достижении прогноза
 for  !i      =  1   to  !number - 1
  if  trend(!i) * kotir_d(!i) > 0   then    ' Совпаает тренд с приростом? - Да
   !profit   = !profit + @abs(kotir_d(!i))  ' Накопление профита
   !n_profit = !n_profit +1                 ' Накопление кол-ва профитных сделок
   !tek_pr   = 0                            ' Обнуление текущей серии убытков
   !tek_prosadka  =   0                     ' Обнуление текущей просадки
  endif
  if  trend(!i) * kotir_d(!i) <  0   then   ' Совпаает тренд с приростом? - Нет
   !lost   = !lost + @abs(kotir_d(!i))      ' Наколение убытка
   !n_lost = !n_lost + 1                    ' Накопление кол-ва убыточных сделок

   !tek_pr = !tek_pr + 1                              ' Увеличим кол-во текущих убыточных сделок
   !tek_prosadka = !tek_prosadka + @abs(kotir_d(!i))  ' Увеличим текущую просадку
  endif

  '  Выбираем максимум кол-ва убыточных сделок
  if  !tek_pr > !pr then
   !pr  = !tek_pr
  endif

  ' Выбираем максимум просадки
  if  !tek_prosadka  > !prosadka  then
   !prosadka  = !tek_prosadka
  endif
 next

'   Блокирование деления на ноль
 if !lost = 0 then                 ' Нет убыточных сделок
  !profit_factor = 1000
 else
  !profit_factor = !profit / !lost ' Профит-фактор
 endif 

 if !n_lost = 0  then
  !n_p_l = !number      '  если убыточных сделок ноль,
                        '  то профитных равно числу наблюдений
 else
  !n_p_l =  !n_profit / !n_lost
 endif

 if !prosadka = 0  then
  !factor_reset = 1000
 else
  !factor_reset = !profit / !prosadka
 endif

'  Создадим таблицу результатов если она не существует
 if @isobject("tab_profit") = 0    then
  table(3,12)    tab_profit
  tab_profit.title  Прогноз один шаг после конца выборки с прибыльностью за выборку

' Оформить заголовок таблицы
  tab_profit.setfillcolor(1) yellow
  tab_profit.setfillcolor(2) yellow

' Установить характеристики колонок
' 1- колонка
  setcolwidth(tab_profit,1,15)
  tab_profit(1,1)   = "Начало"
  tab_profit(2,1)   = "выборки"

' 2-я колонка
  setcolwidth(tab_profit,2,15)
  tab_profit(1,2)   = "Конец"
  tab_profit(2,2)   = "выборки"

' 3-я колонка
  setcolwidth(tab_profit,3,7)
   tab_profit(1,3)   = "Факт на"
  tab_profit(2,3)   = "конец "

' 4- колонка
  setcolwidth(tab_profit,4,7)
  tab_profit(1,4)   = "Прогноз"
  tab_profit(2,4)   = "на 1 шаг"

' 5- колонка
  setcolwidth(tab_profit,5,10)
  tab_profit(1,5)   = "Ошибка"
  tab_profit(2,5)   = "прогноза"

' 6- колонка
  setcolwidth(tab_profit,6,8)
  tab_profit(1,6)    =  "Прибыль"
  tab_profit(2,6)    =  "выборки"

' 7- колонка
  setcolwidth(tab_profit,7,8)
  tab_profit(1,7)    =  "Убыток"
  tab_profit(2,7)    =  "выборки"

' 8- колонка
  setcolwidth(tab_profit,8,10)
  tab_profit(1,8)   = "Maксимум"
  tab_profit(2,8)   = "просадки"

' 9- колонка
  setcolwidth(tab_profit,9,8)
  tab_profit(1,9)   = "Кол-во"
  tab_profit(2,9)    =  "убытков"

' 10- колонка
  setcolwidth(tab_profit,10,7)
  tab_profit(1,10)    =  "P / F в"
  tab_profit(2,10)    =  "пипсах"

' 11- колонка
  setcolwidth(tab_profit,11,8)
  tab_profit(1,11)    =  "P / F в"
  tab_profit(2,11)    =  "наблюд"

' 12- колонка
  setcolwidth(tab_profit,12,8)
  tab_profit(1,12)   = "Фактор"
  tab_profit(2,12)   = "восстан"
  tab_profit.setlines(R1C1:R2C12) +o +v
 endif

 tab_profit.insertrow(3) 1
 tab_profit.setlines(R3C1:R3C12) +a +v +i

' Установить формат выдачи табл
 tab_profit.setformat(R3C1:R3C1)   c.16
 tab_profit.setformat(R3C2:R3C2)   c.16
 tab_profit.setformat(R3C3:R3C3)   f.4
 tab_profit.setformat(R3C4:R3C4)   f.4
 tab_profit.setformat(R3C5:R3C5)   f.4
 tab_profit.setformat(R3C6:R3C6)   f.4
 tab_profit.setformat(R3C7:R3C7)   f.4
 tab_profit.setformat(R3C8:R3C8)   f.4
 tab_profit.setformat(R3C9:R3C9)   f.0
 tab_profit.setformat(R3C10:R3C10) f.2
 tab_profit.setformat(R3C11:R3C11)  f.2
 tab_profit.setformat(R3C12:R3C12) f.2

' Заполнить таблицу результатами
 tab_profit(3 ,1) = date(1)
 tab_profit(3 ,2) = date(!number - 1)
 tab_profit(3 ,3) = kotir(!number - 1)
 tab_profit(3 ,4) = kotir_f(!number - 1)
 tab_profit(3 ,5) = kotir_f_se(!number - 1) 

 tab_profit(3 ,6) =  !profit
 tab_profit(3 ,7) =  !lost
 tab_profit(3 ,8) = !prosadka
 tab_profit(3 ,9) = !pr
 tab_profit(3,10) =  !profit_factor
 tab_profit(3,11) = !n_p_l
 tab_profit(3,12) = !factor_reset

' Запонить таблицу в рабочем файле
 save        work
 show        tab_profit

endsub

 

Результат приведенных выше простых программ на EViews для нашего уравнения следующий:

 

Таблица 3. Результат оценки прибыльности в EViews

 

Результат печален: прибыль в три раза меньше убытка. И это несмотря на радужную величину ошибки прогноза в 19 пипсов. Модель надо дорабатывать, но в статье я этого делать не буду, а сделаю на форуме совместно со всеми желающими поучаствовать в разработке прибыльной модели.

До сих пор в статье котировки EURUSD_H1 анализировались средствами программы EViews.

Однако очень заманчивым является использование результатов прогноза в советнике терминала МetaТrader 4 для торговли.

Далее рассмотрим обмен данными между программами EViews и МetaТrader 4, а затем с помощью советника в МetaТrader 4 еще раз проанализируем результаты.

 

3. Обмен данными между EViews и МetaТrader 4

 

В данной статье используется обмен данными между EViews и МetaТrader 4 при помощи файлов типа .txt.

Алгоритм обмена выглядит следующим образом:

  1. Советник в МetaТrader 4:
    • Формирует файл котировок;
    • Запускает EViews.
  2. EViews:
    • Запускается по команде из советника;
    • Выполняет программу вычисления прогноза для полученной из советника котировки kotir.txt ;
    • Записывает в файл EViewsForecast.txt результаты прогноза.
  3. Советник в МetaТrader 4:
    • Дождавшись окончания формирования результатов в EViews, читает файл с прогнозом;
    • Принимает решение о входе в позицию или выходе из позиции.

Несколько слов по поводу размещения файлов.

Файлы терминала МetaТrader 4 размещаются в своих обычных каталогах: советник в папке \expert, а индикатор (который не нужен для тестирования) в папке \expert\indicators. Все это находится в папке терминала. Советник устанавливается вместе с другими советниками.

Файлы, которыми обменивается советник с EViews, при работе советника находятся в \expert\files, при тестировании советника — в папке \tester\files.

Файл, который советник отправляется для EViews, имеет имя kotir.txt, которое не зависит от выбранного символа и таймфрейма. Поэтому советник можно прикреплять к любому символу, а размер шага прогноза указывается в параметрах советника при его запуске.

EViews возвращает файл с именем EVIEWSFORECAST.txt. В каталог терминала помещается рабочий файл EViews под именем worf.wf1.

В программах EViews, которые прилагаются к статье, указаны каталоги, которые скорее всего не будут совпадать с каталогами, установленными на вашем компьютере. У меня эти программы установлены в корневую папку диска. В EViews придется разобраться с каталогом по умолчанию или указать ваши каталоги (каталоги по умолчанию, которые использует сам EViews, я не использовал).

 

 

4. Советник на MQL4

Алгоритм работы советника упрощен по максимуму:

  • Советник прикрепляется к таймфрейму М1 любого символа;
  • Шаг прогноза указывается в минутах в параметрах советника. По умолчанию – шаг прогноза 60 минут (Н1). Прикрепление советника к М1 дает наглядность при рассмотрении результатов тестирования, так как можно сжать график тестирования, переходя к любому старшему таймфрейму;
  • Для прогнозирования в EViews советник формирует файл kotir.txt с количеством баров (наблюдений), указанных в параметрах советника;
  • Если прогноз больше текущей цены, то открывается long;
  • Если прогноз меньше текущей цены, то открывается short;
  • Советник открывает не более одной позиции (работает без долива позиции);
  • Вне зависимости от прогноза предыдущая позиция закрывается, а новая открывается. Этот алгоритм открытия позиций совпадает с алгоритмом подсчета прибыльности/убыточности в программе на EViews;
  • Объем открываемой позиции равен 0.1 лота;
  • Стоп лоссы и тэйк профиты не используются (указаны равными в 100 пипсов, хотя в советнике имеется код для установки стопов на расстоянии ошибки прогноза);
  • Рисуется график с указанием величины прогноза и двух линий на расстоянии одной стандартной ошибки прогноза. При просмотре графика из тестера на более мелких таймфреймах, чем тот на котором был прикреплен советник, следует иметь ввиду, что линия прогноза смещена назад, т.е. рисуется прогноз, к которому текущая цена должна прийти в конце периода.

Советник прикрепляем к таймфрейму М1, график из тестера удобнее просматривать на таймфрейме М5.

Исходный код советника на MQL4 для торговли по паре EURUSD в статье не привожу из-за его объемности (около 600 строк). Текст можно посмотреть в файле EvewsMT4.mq4 в архиве EViews_MetaTrader_4.zip, прикрепленном к статье.

 

 

5. Результаты тестирования советника

Запустим советник в тестере на таймфрейме М1.

Входные параметры показаны ниже.

 

Рис. 9. Входные параметры советника

 

Фрагмент графика тестирования приведен ниже:

 

Рис. 10. Тестирование советника в режиме визуализации

Результаты тестирования советника, который использует прогнозы на один час (шаг) вперед, показаны ниже.

 

Strategy Tester Report

EvewsMT4

Real (Build 406)

Символ EURUSD (Euro vs US Dollar)
Период 1 Минута (M1) 2011.09.12 00:00 — 2011.09.16 21:59 (2011.09.12 — 2011.09.17)
Модель Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов)
Параметры StepForecast=60; NumberBars=101; MultSE=2;
Баров в истории

7948

Смоделировано тиков

79777

Качество моделирования

25.00%

Ошибки рассогласования графиков

0

Начальный депозит

10000.00

Чистая прибыль

-202.10

Общая прибыль

940.72

Общий убыток

-1142.82

Прибыльность

0.82

Матожидание выигрыша

-1.73

Абсолютная просадка

326.15

Максимальная просадка

456.15 (4.50%)

Относительная просадка

4.50% (456.15)

Всего сделок

117

Короткие позиции (% выигравших)

58 (51.72%)

Длинные позиции (% выигравших)

59 (45.76%)

Прибыльные сделки (% от всех)

57 (48.72%)

Убыточные сделки (% от всех)

60 (51.28%)

Самая большая

прибыльная сделка

100.00

убыточная сделка

-79.00

Средняя

прибыльная сделка

16.50

убыточная сделка

-19.05

Максимальное количество

непрерывных выигрышей (прибыль)

6 (105.00)

непрерывных проигрышей (убыток)

8 (-162.00)

Максимальная

непрерывная прибыль (число выигрышей)

166.00 (5)

непрерывный убыток (число проигрышей)

-162.00 (8)

Средний

непрерывный выигрыш

2

непрерывный проигрыш

2

Время

Тип

Ордер

Объём

Цена

S / L

T / P

Прибыль

Баланс

1

2011.09.12 01:00

sell

1

0.10

1.3609

1.3711

1.3509

2

2011.09.12 02:00

close

1

0.10

1.3584

1.3711

1.3509

25.00

10025.00

Рис. 11. Результаты тестирования советника

 

Результаты лучше, чем полученные в EViews.

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

Советник сдвигает окно в 118 баров и вычисляется прогноз на 119 бар, т.е. оценка уравнения регрессии всегда производится на 118 барах, поскольку EViews расширяет окно в пределах выборки, а советник двигает окно фиксированной ширины.

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

Таблица имеет следующий вид:

 

 

Начало
выборки
Конец
выборки
Факт на
конец
Прогноз
на 1 шаг
Ошибка
прогноза
Прибыль
выборки
Убыток
выборки
Maксимум
просадки
Кол-во
убытков
P/F в
пипсах
P/F в наблюд. Фактор восстан.
12.09.2011 0:00 16.09.2011 21:00 1,3791 1,3788 0,0019 0,0581 0,1531 0,0245 7 0,38 0,67 2,37
12.09.2011 0:00 16.09.2011 21:00 1,3791 1,3788 0,0019 0,0581 0,1531 0,0245 7 0,38 0,67 2,37
09.09.2011 21:00 16.09.2011 20:00 1,3784 1,3793 0,0019 0,0569 0,1619 0,0245 7 0,35 0,64 2,32
09.09.2011 20:00 16.09.2011 19:00 1,3794 1,3796 0,002 0,0596 0,1609 0,0245 7 0,37 0,67 2,43
09.09.2011 19:00 16.09.2011 18:00 1,3783 1,3782 0,0021 0,0642 0,1554 0,0245 7 0,41 0,69 2,62
09.09.2011 18:00 16.09.2011 17:00 1,3783 1,3806 0,002 0,0616 0,1606 0,0245 7 0,38 0,68 2,51
09.09.2011 17:00 16.09.2011 16:00 1,3829 1,3806 0,002 0,0642 0,1586 0,0245 7 0,4 0,71 2,62
09.09.2011 16:00 16.09.2011 15:00 1,3788 1,3793 0,002 0,0626 0,1565 0,0245 7 0,4 0,71 2,56
09.09.2011 15:00 16.09.2011 14:00 1,3798 1,38 0,0021 0,063 0,1633 0,0245 7 0,39 0,73 2,57
09.09.2011 14:00 16.09.2011 13:00 1,3808 1,381 0,0022 0,062 0,1656 0,0318 9 0,37 0,71 1,95
09.09.2011 13:00 16.09.2011 12:00 1,3809 1,3813 0,0021 0,0602 0,1679 0,0318 9 0,36 0,66 1,89
09.09.2011 12:00 16.09.2011 11:00 1,3792 1,3808 0,0021 0,0666 0,1613 0,0245 7 0,41 0,73 2,72
09.09.2011 11:00 16.09.2011 10:00 1,3795 1,3826 0,0021 0,0666 0,167 0,0245 7 0,4 0,73 2,72
09.09.2011 10:00 16.09.2011 9:00 1,3838 1,3847 0,0022 0,0652 0,1668 0,0318 9 0,39 0,71 2,05
09.09.2011 9:00 16.09.2011 8:00 1,3856 1,3854 0,0022 0,0675 0,165 0,0318 9 0,41 0,73 2,12
09.09.2011 8:00 16.09.2011 7:00 1,386 1,3856 0,0022 0,0671 0,1652 0,0318 9 0,41 0,71 2,11
09.09.2011 7:00 16.09.2011 6:00 1,3861 1,3857 0,0022 0,067 0,1663 0,0318 9 0,4 0,68 2,11
09.09.2011 6:00 16.09.2011 5:00 1,3852 1,3855 0,0022 0,0655 0,1681 0,0318 9 0,39 0,63 2,06
09.09.2011 5:00 16.09.2011 4:00 1,3844 1,3851 0,0022 0,0662 0,1674 0,0318 9 0,4 0,66 2,08
09.09.2011 4:00 16.09.2011 3:00 1,3848 1,3869 0,0022 0,0654 0,1683 0,0318 9 0,39 0,68 2,06
09.09.2011 3:00 16.09.2011 2:00 1,3879 1,3875 0,0022 0,0694 0,1624 0,0318 9 0,43 0,73 2,18
09.09.2011 2:00 16.09.2011 1:00 1,3865 1,3879 0,0022 0,0698 0,1634 0,0318 9 0,43 0,71 2,19
09.09.2011 1:00 16.09.2011 0:00 1,3881 1,3883 0,0022 0,0726 0,1604 0,0245 7 0,45 0,76 2,96
09.09.2011 0:00 15.09.2011 23:00 1,3876 1,3882 0,0022 0,0721 0,162 0,0245 7 0,45 0,73 2,94
08.09.2011 23:00 15.09.2011 22:00 1,3885 1,3884 0,0022 0,0718 0,1614 0,0245 7 0,44 0,72 2,93
08.09.2011 22:00 15.09.2011 21:00 1,3888 1,3883 0,0022 0,0737 0,1597 0,0245 7 0,46 0,77 3,01
08.09.2011 21:00 15.09.2011 20:00 1,3885 1,3874 0,0022 0,0729 0,1604 0,0318 9 0,45 0,74 2,29
08.09.2011 20:00 15.09.2011 19:00 1,3867 1,386 0,0022 0,0721 0,1604 0,0318 9 0,45 0,74 2,27
08.09.2011 19:00 15.09.2011 18:00 1,3856 1,3834 0,0022 0,0721 0,1628 0,0318 9 0,44 0,72 2,27
08.09.2011 18:00 15.09.2011 17:00 1,385 1,3861 0,0023 0,0702 0,1651 0,0318 9 0,43 0,72 2,21
08.09.2011 17:00 15.09.2011 16:00 1,3885 1,3824 0,0023 0,0739 0,1638 0,0245 7 0,45 0,72 3,02
08.09.2011 16:00 15.09.2011 15:00 1,3773 1,3784 0,0021 0,0719 0,1556 0,0318 9 0,46 0,72 2,26
08.09.2011 15:00 15.09.2011 14:00 1,3795 1,3794 0,0021 0,0726 0,1537 0,0318 9 0,47 0,72 2,28
08.09.2011 14:00 15.09.2011 13:00 1,3814 1,3792 0,0021 0,0736 0,1564 0,0318 9 0,47 0,74 2,31
08.09.2011 13:00 15.09.2011 12:00 1,3802 1,3764 0,0021 0,0712 0,159 0,0318 9 0,45 0,74 2,24
08.09.2011 12:00 15.09.2011 11:00 1,3769 1,3753 0,0021 0,0719 0,1568 0,0318 9 0,46 0,72 2,26
08.09.2011 11:00 15.09.2011 10:00 1,3765 1,3732 0,0021 0,0721 0,1564 0,0318 9 0,46 0,74 2,27
08.09.2011 10:00 15.09.2011 9:00 1,3722 1,3718 0,0021 0,0716 0,1538 0,0318 9 0,47 0,72 2,25
08.09.2011 8:00 15.09.2011 7:00 1,371 1,3716 0,0021 0,0729 0,1542 0,0318 9 0,47 0,74 2,29
08.09.2011 8:00 15.09.2011 7:00 1,371 1,3716 0,0021 0,0729 0,1542 0,0318 9 0,47 0,74 2,29
08.09.2011 7:00 15.09.2011 6:00 1,3723 1,3727 0,0021 0,0716 0,1547 0,0318 9 0,46 0,72 2,25
08.09.2011 6:00 15.09.2011 5:00 1,3726 1,3725 0,0021 0,0711 0,1564 0,0318 9 0,45 0,69 2,24
08.09.2011 5:00 15.09.2011 4:00 1,3719 1,3731 0,0021 0,0711 0,1563 0,0318 9 0,45 0,69 2,24
08.09.2011 4:00 15.09.2011 3:00 1,374 1,3744 0,0021 0,0713 0,1547 0,0318 9 0,46 0,69 2,24
08.09.2011 3:00 15.09.2011 2:00 1,3748 1,3747 0,0021 0,0705 0,1547 0,0318 9 0,46 0,68 2,22
08.09.2011 2:00 15.09.2011 1:00 1,3743 1,3742 0,0021 0,0715 0,1544 0,0318 9 0,46 0,7 2,25
08.09.2011 1:00 15.09.2011 0:00 1,3738 1,3743 0,0021 0,0714 0,1544 0,0318 9 0,46 0,7 2,25
08.09.2011 0:00 14.09.2011 23:00 1,375 1,3743 0,0021 0,0724 0,1532 0,0318 9 0,47 0,73 2,28
07.09.2011 23:00 14.09.2011 22:00 1,375 1,3736 0,0021 0,0727 0,1532 0,0318 9 0,47 0,74 2,29
07.09.2011 22:00 14.09.2011 21:00 1,3751 1,3735 0,0021 0,0734 0,1532 0,0318 9 0,48 0,74 2,31
07.09.2011 21:00 14.09.2011 20:00 1,3748 1,3716 0,0021 0,0722 0,1555 0,0318 9 0,46 0,72 2,27
07.09.2011 20:00 14.09.2011 19:00 1,3714 1,3712 0,0021 0,0812 0,145 0,0189 6 0,56 0,74 4,3
07.09.2011 19:00 14.09.2011 18:00 1,371 1,3697 0,0021 0,0692 0,1577 0,0318 9 0,44 0,69 2,18
07.09.2011 18:00 14.09.2011 17:00 1,3673 1,369 0,0021 0,0695 0,154 0,0318 9 0,45 0,72 2,19
07.09.2011 17:00 14.09.2011 16:00 1,3687 1,3693 0,0021 0,0695 0,1548 0,0318 9 0,45 0,72 2,19
07.09.2011 16:00 14.09.2011 15:00 1,3704 1,3704 0,0021 0,066 0,1591 0,0318 11 0,41 0,69 2,08
07.09.2011 15:00 14.09.2011 14:00 1,373 1,37 0,002 0,066 0,1577 0,0318 10 0,42 0,69 2,08
07.09.2011 14:00 14.09.2011 13:00 1,3712 1,3681 0,002 0,066 0,1562 0,0318 9 0,42 0,69 2,08
07.09.2011 13:00 14.09.2011 12:00 1,3685 1,3653 0,002 0,0665 0,1534 0,0318 9 0,43 0,74 2,09
07.09.2011 12:00 14.09.2011 11:00 1,3655 1,3646 0,002 0,0673 0,1504 0,0318 9 0,45 0,77 2,12
07.09.2011 11:00 14.09.2011 10:00 1,3656 1,3634 0,002 0,0709 0,15 0,0318 9 0,47 0,77 2,23
07.09.2011 10:00 14.09.2011 9:00 1,3625 1,3625 0,002 0,0725 0,1461 0,0318 9 0,5 0,83 2,28
07.09.2011 9:00 14.09.2011 8:00 1,3631 1,3638 0,002 0,0719 0,1465 0,0318 9 0,49 0,8 2,26
07.09.2011 8:00 14.09.2011 7:00 1,3641 1,3643 0,002 0,0707 0,1481 0,0318 9 0,48 0,77 2,22
07.09.2011 7:00 14.09.2011 6:00 1,3635 1,3648 0,002 0,0724 0,1481 0,0318 9 0,49 0,8 2,28
07.09.2011 6:00 14.09.2011 5:00 1,3647 1,3656 0,002 0,0724 0,1476 0,0318 9 0,49 0,8 2,28
07.09.2011 5:00 14.09.2011 4:00 1,3665 1,3676 0,002 0,0667 0,1536 0,0318 9 0,43 0,72 2,1
07.09.2011 4:00 14.09.2011 3:00 1,3694 1,3683 0,002 0,0675 0,1504 0,0318 9 0,45 0,74 2,12
07.09.2011 3:00 14.09.2011 2:00 1,3682 1,3682 0,002 0,0672 0,1498 0,0318 9 0,45 0,74 2,11
07.09.2011 2:00 14.09.2011 1:00 1,3684 1,3686 0,002 0,067 0,1512 0,0318 9 0,44 0,72 2,11
07.09.2011 1:00 14.09.2011 0:00 1,3679 1,3686 0,002 0,067 0,1514 0,0318 9 0,44 0,72 2,11
07.09.2011 0:00 13.09.2011 23:00 1,3678 1,3691 0,002 0,0679 0,1507 0,0318 9 0,45 0,74 2,14
06.09.2011 23:00 13.09.2011 22:00 1,3692 1,3698 0,002 0,066 0,1517 0,0318 9 0,44 0,69 2,08
06.09.2011 22:00 13.09.2011 21:00 1,3708 1,3705 0,002 0,0652 0,1512 0,0318 9 0,43 0,69 2,05
06.09.2011 21:00 13.09.2011 20:00 1,3719 1,3709 0,002 0,0652 0,1512 0,0318 9 0,43 0,69 2,05
06.09.2011 20:00 13.09.2011 19:00 1,371 1,3691 0,002 0,0652 0,1517 0,0318 9 0,43 0,69 2,05
06.09.2011 19:00 13.09.2011 18:00 1,3677 1,3669 0,002 0,0666 0,1485 0,0318 9 0,45 0,72 2,09
06.09.2011 18:00 13.09.2011 17:00 1,3678 1,3677 0,002 0,0666 0,149 0,0318 9 0,45 0,72 2,09
06.09.2011 17:00 13.09.2011 16:00 1,3698 1,3659 0,002 0,0625 0,1555 0,0318 9 0,4 0,64 1,97
06.09.2011 16:00 13.09.2011 15:00 1,3658 1,3643 0,002 0,065 0,1513 0,0318 9 0,43 0,72 2,04
06.09.2011 15:00 13.09.2011 14:00 1,3665 1,3636 0,002 0,0643 0,1527 0,0318 9 0,42 0,69 2,02
06.09.2011 14:00 13.09.2011 13:00 1,3639 1,3619 0,002 0,0659 0,1552 0,0318 9 0,42 0,74 2,07
06.09.2011 13:00 13.09.2011 12:00 1,3617 1,3628 0,0021 0,0824 0,1432 0,0189 6 0,58 0,8 4,36
06.09.2011 12:00 13.09.2011 11:00 1,3616 1,361 0,0021 0,0824 0,1435 0,0189 6 0,57 0,8 4,36
06.09.2011 11:00 13.09.2011 10:00 1,3582 1,3631 0,002 0,0795 0,1435 0,0189 6 0,55 0,8 4,21
06.09.2011 10:00 13.09.2011 9:00 1,3654 1,3656 0,002 0,077 0,146 0,0189 6 0,53 0,74 4,07
06.09.2011 9:00 13.09.2011 8:00 1,3655 1,3664 0,0021 0,0813 0,1442 0,0189 6 0,56 0,77 4,3
06.09.2011 8:00 13.09.2011 7:00 1,3679 1,3673 0,0022 0,0834 0,1435 0,0189 6 0,58 0,77 4,41
06.09.2011 7:00 13.09.2011 6:00 1,3685 1,3668 0,0022 0,0828 0,1448 0,0189 6 0,57 0,74 4,38
06.09.2011 6:00 13.09.2011 5:00 1,3676 1,3669 0,0022 0,0879 0,1406 0,0189 6 0,63 0,85 4,65
06.09.2011 5:00 13.09.2011 4:00 1,3669 1,3653 0,0022 0,0821 0,1458 0,0189 6 0,56 0,8 4,34
06.09.2011 4:00 13.09.2011 3:00 1,3635 1,3639 0,0022 0,0821 0,1428 0,0189 6 0,57 0,8 4,34
06.09.2011 3:00 13.09.2011 2:00 1,3637 1,3646 0,0022 0,0821 0,1428 0,0189 6 0,57 0,8 4,34
06.09.2011 2:00 13.09.2011 1:00 1,3657 1,364 0,0022 0,0825 0,1407 0,0189 6 0,59 0,8 4,37
06.09.2011 1:00 13.09.2011 0:00 1,366 1,3639 0,0022 0,085 0,1384 0,0141 6 0,61 0,83 6,03
06.09.2011 0:00 12.09.2011 23:00 1,3678 1,3655 0,0022 0,083 0,1416 0,0141 6 0,59 0,8 5,89
05.09.2011 23:00 12.09.2011 22:00 1,366 1,3613 0,0022 0,0806 0,1424 0,0123 6 0,57 0,8 6,55
05.09.2011 22:00 12.09.2011 21:00 1,3572 1,3585 0,002 0,0731 0,1414 0,0152 6 0,52 0,77 4,81
05.09.2011 21:00 12.09.2011 20:00 1,3576 1,3601 0,002 0,0714 0,1432 0,0152 6 0,5 0,74 4,7
05.09.2011 20:00 12.09.2011 19:00 1,3607 1,3637 0,0021 0,0712 0,1406 0,0129 6 0,51 0,74 5,52
05.09.2011 19:00 12.09.2011 18:00 1,3632 1,3619 0,0021 0,0712 0,1405 0,0129 6 0,51 0,74 5,52
05.09.2011 18:00 12.09.2011 17:00 1,3609 1,3641 0,0021 0,073 0,1378 0,0129 6 0,53 0,77 5,66
05.09.2011 17:00 12.09.2011 16:00 1,3684 1,3659 0,002 0,0713 0,1334 0,0083 6 0,53 0,74 8,59
05.09.2011 16:00 12.09.2011 15:00 1,3665 1,3636 0,002 0,0727 0,1343 0,0083 6 0,54 0,77 8,76
05.09.2011 15:00 12.09.2011 14:00 1,363 1,3601 0,002 0,072 0,1348 0,0083 6 0,53 0,77 8,67
05.09.2011 14:00 12.09.2011 13:00 1,3603 1,3594 0,002 0,0752 0,1304 0,0083 6 0,58 0,83 9,06
05.09.2011 13:00 12.09.2011 12:00 1,3623 1,3589 0,002 0,0742 0,1304 0,0083 6 0,57 0,83 8,94
05.09.2011 12:00 12.09.2011 11:00 1,3597 1,3561 0,0019 0,0737 0,1291 0,0083 6 0,57 0,8 8,88
05.09.2011 11:00 12.09.2011 10:00 1,3561 1,3551 0,0019 0,0729 0,1275 0,0083 6 0,57 0,8 8,78
05.09.2011 10:00 12.09.2011 9:00 1,3556 1,3552 0,002 0,072 0,1283 0,0083 6 0,56 0,77 8,67
05.09.2011 9:00 12.09.2011 8:00 1,3536 1,3532 0,002 0,072 0,1271 0,0083 6 0,57 0,77 8,67
05.09.2011 8:00 12.09.2011 7:00 1,3519 1,3554 0,0019 0,0703 0,1288 0,0083 6 0,55 0,74 8,47
05.09.2011 7:00 12.09.2011 6:00 1,3583 1,3579 0,0019 0,072 0,1224 0,0083 6 0,59 0,77 8,67
05.09.2011 6:00 12.09.2011 5:00 1,3591 1,3582 0,0019 0,0715 0,1224 0,0083 6 0,58 0,77 8,61
05.09.2011 5:00 12.09.2011 4:00 1,3593 1,3589 0,0019 0,0713 0,1224 0,0083 6 0,58 0,75 8,59
05.09.2011 3:00 12.09.2011 2:00 1,3583 1,361 0,0019 0,0746 0,1192 0,0083 6 0,63 0,78 8,99

 

Таблица 4. Результаты тестирования в EViews

 

Из таблицы видно, что наша модель (столь примитивная и недоделанная) практически безнадежна. Необходимо ее дорабатывать.

Построим график двух колонок: P/F в пипсах и P/F в наблюдениях.

Рис. 12. Графики прибыльности модели на выборке в 118 баров

 

 

Этот график представляет собой зависимость профит-факторов от количества баров в анализе. Очевиден растущий тренд.

Проверим на выборке в 238 баров. Получаем следующий график:

Рис. 13. Графики прибыльности модели на выборке в 236 баров

 

Из того факта, что графики прибыльности разные, следует вывод о нестабильности модели.

 

Заключение

В статье рассмотрено использование прогнозов на один шаг вперед из EViews для построения советника в МetaТrader 4.

Полученный отрицательный результат говорит о том, что построение модели в EViews является достаточно сложной задачей, но более перспективной, чем интуитивное построение советников.

 

Прикрепленные файлы:
 EViews_MetaTrader_4.zip (13.4 Kb)
Источник: mql4.com

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты