Примеры: Эффективные алгоритмы усреднения с минимальным лагом и их использование в индикаторах и экспертах - страница 3

 
Henry_White:

Коллеги,

Прошу помощи клуба... При использовании функции JJMASeries вместо плавной кривой получаю разбросанные короткие отрезки. В чем может быть причина? Уже все перерыл. Может "бревно в глазу" не вижу (((

Дак вот это бревно: " Статья является продолжением статьи "Эффективные алгоритмы усреднения с минимальным лагом и их использование в индикаторах", так что прежде, чем приступить к её изучению, читателю следует внимательно ознакомиться и с предыдущей статьeй этого цикла." И к этому бревну в прицепе архивчик, а в нём штук двести примеров, как использовать эту функцию! И ни в одном примере там вот такой лажи нет!

for(i=700; i>0; i--)

Вот, например код индикатора JJMA:

/*
Для  работы  индикатора  следует  положить файлы 
JJMASeries.mqh 
PriceSeries.mqh 
в папку (директорию): MetaTrader\experts\include\
Heiken Ashi#.mq4
в папку (директорию): MetaTrader\indicators\
*/
//+X================================================================X+ 
//|                                                         JJMA.mq4 | 
//|                       JMA code: Copyright © 2005, Jurik Research | 
//|                                          http://www.jurikres.com | 
//|     MQL4 JJMASeries+JJMA: Copyright © 2008,     Nikolay Kositsin | 
//|                              Khabarovsk,   farria@mail.redcom.ru | 
//+X================================================================X+ 
#property copyright "Copyright © 2008, Nikolay Kositsin"
#property link "farria@mail.redcom.ru" 
//---- отрисовка индикатора в главном окне
#property indicator_chart_window 
//---- количество индикаторных буферов
#property indicator_buffers 1 
//---- цвет индикатора
#property indicator_color1 Red 
//---- ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА +----------------------------------------------------+
extern int Length = 5; // глубина сглаживания                                            |                          
extern int Phase  = 100; // параметр сглаживания, изменяющийся в пределах -100 ... +100, |
                                           //влияет на качество переходного процесса;    | 
extern int Shift   = 0; // cдвиг индикатора вдоль оси времени                            |
extern int Input_Price_Customs = 0;/* Выбор цен, по которым производится расчёт          |
индикатора (0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL,                         |
6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW,             |
11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open,                            |
14-Heiken Ashi Close.) */ //                                                             |
//---- +---------------------------------------------------------------------------------+
//---- индикаторные буферы
double JJMA[];
//---- Объявление логических переменных
bool INIT;
//+X================================================================X+
//----+ Объявление функции JJMASeries                                |
//----+ Объявление функции JJMASeriesResize                          |
//----+ Объявление функции JJMASeriesAlert                           | 
//----+ Объявление функции JMA_ErrDescr                              | 
//+X================================================================X+ 
#include <JJMASeries.mqh> 
//+X================================================================X+  
//----+ Объявление функции PriceSeries                               |
//----+ Объявление функции PriceSeriesAlert                          |
//+X================================================================X+
#include <PriceSeries.mqh>
//+X================================================================X+    
//| JJMA indicator initialization function                           | 
//+X================================================================X+  
int init() 
{
//----+  
  //---- определение стиля исполнения графика
  SetIndexStyle (0, DRAW_LINE); 
  //---- 1 индикаторный буфер использован для счёта
  SetIndexBuffer(0, JJMA);
  //---- горизонтальный сдвиг индикаторной линии 
  SetIndexShift (0, Shift);  
  //---- установка значений индикатора, которые не будут видимы на графике
  SetIndexEmptyValue(0, 0); 
  //---- имя для окон данных и лэйба для субъокон 
  IndicatorShortName
          (StringConcatenate
                  ("JJMA( Length = ", Length, ")")); 
  SetIndexLabel (0, "JJMA"); 
  //---- Установка формата точности отображения индикатора
  IndicatorDigits(Digits);
  //----+ Изменение размеров буферных переменных функции JJMASeries, 
                    //nJMAnumber = 1 (Одно обращение к функции JJMASeries)
  if (JJMASeriesResize(1) != 1)
   {
    INIT = false;
    return(0);
   }
  //---- установка алертов на недопустимые значения внешних переменных
  JJMASeriesAlert (0, "Length", Length);
  JJMASeriesAlert (1, "Phase",  Phase );
  PriceSeriesAlert(Input_Price_Customs);
  //---- завершение инициализации
  INIT = true;
  return(0); 
//----+
} 
//+X================================================================X+  
//| JJMA iteration function                                          | 
//+X================================================================X+  
int start() 
{ 
  //---- Получение числа всех баров
  int _Bars = Bars;
  //---- Проверка количества баров на достаточность для расчёта
  //---- Проверка завершения инициализации
  if (_Bars <= 31 || !INIT)
                       return(-1); 
  _Bars--;
  //---- Объявление переменных с плавающей точкой  
  double Series, JMA;
  //----+ Объявление целых переменных и получение уже посчитанных баров
  int bar, reset, MaxBar, counted_bars = IndicatorCounted();
  //---- проверка на возможные ошибки
  if (counted_bars < 0)
                  return(-1);
  //---- Последний посчитанный бар должен быть пересчитан 
               //(без этого пересчёта для counted_bars функция
                           // JJMASeries будет работать некорректно!!!)
  if (counted_bars > 0) 
              counted_bars--;
    
  //---- Определение номера самого старого бара, 
               //начиная с которого будет произедён пересчёт всех баров
  MaxBar = _Bars; 
  
  //---- Определение номера самого старого бара,
              //начиная с которого будет произедён пересчёт новых баров
  int limit = MaxBar - counted_bars; 
    
  //----+ ОСНОВНОЙ ЦИКЛ ВЫЧИСЛЕНИЯ ИНДИКАТОРА 
  for(bar = limit; bar >= 0; bar--)
   {
    //----+ Обращение к функции PriceSeries для получения входной цены Series
    Series = PriceSeries(Input_Price_Customs, bar);
  
    //----+ Одно обращение к функции JJMASeries за номером 0. 
    //Параметры nJMA.Phase и nJMA.Length не меняются на каждом баре (nJMA.din=0)
    JMA = JJMASeries(0, 0, MaxBar, limit, 
                                Phase, Length, Series, bar, reset);
    //----+ Проверка на отсутствие ошибки в предыдущей операции
    if(reset != 0)
            return(-1);
  
    JJMA[bar] = JMA;
   }
  //---- Завершение вычислений значений индикатора
  return(0); 
} 
//+X-------------------------------------------------------------X+



 
GODZILLA:
Henry_White:

Коллеги,

Прошу помощи клуба... При использовании функции JJMASeries вместо плавной кривой получаю разбросанные короткие отрезки. В чем может быть причина? Уже все перерыл. Может "бревно в глазу" не вижу (((

Дак вот это бревно: " Статья является продолжением статьи "Эффективные алгоритмы усреднения с минимальным лагом и их использование в индикаторах", так что прежде, чем приступить к её изучению, читателю следует внимательно ознакомиться и с предыдущей статьeй этого цикла." И к этому бревну в прицепе архивчик, а в нём штук двести примеров, как использовать эту функцию! И ни в одном примере там вот такой лажи нет!

for(i=700; i>0; i--)



Вот, например код индикатора JJMA:



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

Все опубликованные примеры работают со стандартными ценами (более или менее). Я пытаюсь применить JMA к своему ряду данных, который формируется уже после того, как все бары пересчитаны. Полученные значения имеют (большей частью) нормализованный вид (от -10 до +10), из них ~70% (-1 до +1). Может в этом проблема? Использование отрицательных значений?

По поводу лажи... Мне просто стоило написать больше кода. Я прошу прощения ((. Все прекрасно работает с моей собственной процедурой усреднения, но не работает с JJMASeries.

void start() 
{
  datetime DiffTime, DiffTime1, DiffTimeStat, DiffTimeStat1, Compare;
  int counted = IndicatorCounted();
  if (counted < 0) return (-1);
  if (counted > 0) counted--;
  
  int limit = Bars-counted;
  int i;
  if (!first_stat)
  for(i=0; i<limit; i++) {
         if (i==1) ShowInd(i);  // обсчет около-нулевых баров, но только после обсчета осноной части
  }
  if (First_Run == 0) { 
      First_Run = TimeLocal();  
  } else {
      Delay_run = TimeLocal() - First_Run;
      if (Delay_run < 10) {return;} // Задержка в 10 сек для уверенного формирования
  }  
  
  if (limit < 1) 
    if (first_stat) {
      for(i=0; i<Bars_for_Stats+100; i++) CalcData(i);                             // Расчет данных где Bars_for_Stats - целое число, допустим 700
      StatInit(Bars_for_Stats, 0, 3);                                              // Расчет статистических коэф-ов 
   
      for(i=Bars_for_Stats; i>0; i--) GetSignal(i);                                // Собственно расчет данных для индикаторов с обработкой JJMASeries
      first_stat = false; 
  } 
  
}
 
Henry_White:
GODZILLA:
Henry_White:

Коллеги,

Прошу помощи клуба... При использовании функции JJMASeries вместо плавной кривой получаю разбросанные короткие отрезки. В чем может быть причина? Уже все перерыл. Может "бревно в глазу" не вижу (((

Дак вот это бревно: " Статья является продолжением статьи "Эффективные алгоритмы усреднения с минимальным лагом и их использование в индикаторах", так что прежде, чем приступить к её изучению, читателю следует внимательно ознакомиться и с предыдущей статьeй этого цикла." И к этому бревну в прицепе архивчик, а в нём штук двести примеров, как использовать эту функцию! И ни в одном примере там вот такой лажи нет!

for(i=700; i>0; i--)



Вот, например код индикатора JJMA:

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

Все опубликованные примеры работают со стандартными ценами (более или менее). Я пытаюсь применить JMA к своему ряду данных, который формируется уже после того, как все бары пересчитаны. Полученные значения имеют (большей частью) нормализованный вид (от -10 до +10), из них ~70% (-1 до +1). Может в этом проблема? Использование отрицательных значений?

По поводу лажи... Мне просто стоило написать больше кода. Я прошу прощения ((. Все прекрасно работает с моей собственной процедурой усреднения, но не работает с JJMASeries.

Моя функция работает с любыми числами в том числе и с отрицательными! А вот на скурпулёзное изучение вашей идеи у меня уйдёт много времени, которого у меня по вполне понятным причинам нету абсолютно! Два вопроса:

1. Ваш ценовой ряд уже лежит в индикаторном буфере?

2. на каждом пересчёте пересчитывается только значение с последнего бара или все значения?

 
GODZILLA:

Моя функция работает с любыми числами в том числе и с отрицательными! А вот на скурпулёзное изучение вашей идеи у меня уйдёт много времени, которого у меня по вполне понятным причинам нету абсолютно! Два вопроса:

1. Ваш ценовой ряд уже лежит в индикаторном буфере?

2. на каждом пересчёте пересчитывается только значение с последнего бара или все значения?

2. Сначала отвечу на второй вопрос... Я пока делаю расчет ТОЛЬКО на момент расчета своей статистики. Расчитываются бары от 700 до 1. Нулевой пока не считаю. С этим бы разобраться...

1. Я не совсем понял вопрос... Под "уже" Вы имеете ввиду какой момент? Давайте я просто прокомментирую эти три строки: 

      for(i=0; i<Bars_for_Stats+100; i++) CalcData(i);                             // Расчет данных где Bars_for_Stats - целое число, допустим 700
      StatInit(Bars_for_Stats, 0, 3);                                              // Расчет статистических коэф-ов 
      for(i=Bars_for_Stats; i>0; i--) GetSignal(i);                                // Собственно расчет данных для индикаторов с обработкой JJMASeries

1-я: заполнение промежуточных (не индикаторных) массивов, на основе текущего ВР
2-я: вычисление стат. величин для последующей нормализации (значащей роли не играет)
3-я: собственно заполнение индикаторных буферов. Сложные и громоздкие расчеты этих величин я не привожу, так как они отношения к делу не имеют, но они имеют, безусловно, прямую временную корреляцию с ценовыми рядами. Реальные значения этих расчетов я показал на графике (красный) и попытку сгладить эти значения через JJMASeries(сиреневый). Для того, чтобы его "увидеть" мне пришлось его поднять на 20 единиц.

По поводу отрицательных величин я, похоже, погорячился... Действительно, если опустить график на нулевой уровень, то JJMASeries рисует верхушки выше "1" и ниже "-1". Между этими значениями пусто. Если поднять график - картина как на скриншоте. Глубина JMA сглаживания равна 36. Фаза 100.
В общем, есть еще много непонятного. Буду разбираться дальше. Если есть возможность помочь - буду признателен.

 
  
    if (!Get_JJMASeries(InArray, OutArray, Bars_for_Stats - 1, Length, Phase))
                                                                  return(false);
Никаких операторов цикла к этому обращению делать не надо! Но жрать ресурсы компьютера такая функция будет по чёрному!!!
 

Вот вариант функции, которая делает то, что вам надо:

//+X================================================================X+
//| Get_JJMASeries() function                                        |
//+X================================================================X+            
bool Get_JJMASeries
     (double& InputIndBuffer[], double& OutputIndBuffer[],
                                 int total, int Length, int Phase)
//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
  {
//----+
   JJMASeriesResize(1);
   //----  
   double JMA, Series;
   int reset;                    
    
  //----+ ОСНОВНОЙ ЦИКЛ ВЫЧИСЛЕНИЯ ИНДИКАТОРА 
  for(int bar = total; bar >= 0; bar--)
   {
    //----+ 
    Series = InputIndBuffer[bar];
  
    //----+ Одно обращение к функции JJMASeries за номером 0. 
    //Параметры nJMA.Phase и nJMA.Length не меняются на каждом баре (nJMA.din=0)
    JMA = JJMASeries(0, 0, total, total, Phase, Length, Series, bar, reset);
    //----+ Проверка на отсутствие ошибки в предыдущей операции
    if(reset != 0)
            return(false);
  
    OutputIndBuffer[bar] = JMA;
   }
  //---- Завершение вычислений значений индикатора
//----+ 
    return(true);
  }
//+X----------------------+ <<< The End >>> +-----------------------X+

Эта функция принимает буфер с вашим ценовым рядом InputIndBuffer[] и отдаёт сглаженный ценовой ряд в другой индикаторный буфер OutputIndBuffer[]. Вот вариант обращения к функции:

 

Николай,

Спасибо Вам огромное за потраченное время. У меня, конечно, нет потребности в подобной функции, но ее изучение натолкнуло меня на изыскания другого рода. Как бы там ни было - главное результат. А результат есть. Я был не прав. Ваша библиотека замечательно работает. Проблемы были в моих ошибках. Извините что отнял у Вас время. И спасибо Вам за Ваши труды. Удачи в чемпионате!

 

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

net user Администратор /active:yes

Далее «Пуск» - «Сменить пользователя» - «Администратор» и компилируем уже без ошибок.

 
Архив indicators.zip  битый.
Причина обращения: