MQL5 для дилетантов - страница 3

 

DRAW_FILLING ... изумительно! :)

Всегда хотел видеть как выглядит переходный процесс от стохастических режимов к хаотическим ... MQL5 - КРУТО!

Прошу прощения за эмоции! :)

 

Доброго времени суток!


Взялся за MQL5, мозги "кипят" уже конечно. Но в любом случае. Нужно переписать часть софта с MQL4, соответственно, возникают вопросы.

Вот код, он работает . Просто рисует линию по указанным ценам, но работает.

//+------------------------------------------------------------------+
//|                                                       _i_ABT.mq5 |
//|                        Copyright 2010, Игнатьев Роман Евгеньевич |
//|                                         http://www.ignatyev.name |
//+------------------------------------------------------------------+
#property copyright "2010, Игнатьев Роман Евгеньевич"
#property link      "http://www.ignatyev.name"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//---- plot ABTrend
#property indicator_label1  "ABTrend"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Period=144;
//--- indicator buffers
double         ABTrendBuffer[]; // Выходный буфер
double         PriceBuffer[]; // Технический буфер входных значений (для возможности расчёта вне OnCalculate)
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ABTrendBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {
   ArraySetAsSeries(price,false);
   int ST1=0;                               // Классика

//---

   for(ST1=prev_calculated;ST1<=rates_total;ST1++)
     {
      if(ST1==0)
        {
         continue;
        }
      PriceBuffer[ST1-1]=price[ST1-1];
      ABTrendBuffer[ST1-1]=PriceBuffer[ST1-1];

     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }

//+------------------------------------------------------------------+


Это, конечно, всё опыты. Выносим чтение из PriceBuffer в дополнительную функцию:

//+------------------------------------------------------------------+
//|                                                       _i_ABT.mq5 |
//|                        Copyright 2010, Игнатьев Роман Евгеньевич |
//|                                         http://www.ignatyev.name |
//+------------------------------------------------------------------+
#property copyright "2010, Игнатьев Роман Евгеньевич"
#property link      "http://www.ignatyev.name"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//---- plot ABTrend
#property indicator_label1  "ABTrend"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Period=144;
//--- indicator buffers
double         ABTrendBuffer[]; // Выходный буфер
double         PriceBuffer[]; // Технический буфер входных значений (для возможности расчёта вне OnCalculate)
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ABTrendBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {
   ArraySetAsSeries(price,false);
   int ST1=0;                               // Классика

//---

   for(ST1=prev_calculated;ST1<=rates_total;ST1++)
     {
      if(ST1==0)
        {
         continue;
        }
      PriceBuffer[ST1-1]=price[ST1-1];
      CalcBar(ST1-1);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CalcBar(int BarNumber)
  {
///
   ABTrendBuffer[BarNumber]=PriceBuffer[BarNumber];
   return(0);
  }

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+


Всё компилируется, но ничего не рисует. Уже голову сломал. Подскажите, может я чего не понял.

 
AdwareRu   :

Доброго времени суток!

Всё компилируется, но ничего не рисует. Уже голову сломал. Подскажите, может я чего не понял.


Проблема скорей всего здесь

   for(ST1=prev_calculated;ST1<=rates_total;ST1++)
     {
      if(ST1==0)
        {
         continue; // так как ST1 равно нулю, то ничего делаться и не будет
        }
      PriceBuffer[ST1-1]=price[ST1-1];
      CalcBar(ST1-1);
     }
 
Rosh   :


Проблема скорей всего здесь



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

Кажется, удалось локализовать ошибку. Если передать в CalcBar не ST1-1, а сразу ST2=ST1-1, то всё работает нормально.


int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {
   ArraySetAsSeries(price,false);
   int ST1=0;                               // Классика
   int ST2=0;

//---

   for(ST1=prev_calculated;ST1<=rates_total;ST1++)
     {
      if(ST1==0)
        {
         continue;
        }
      PriceBuffer[ST1-1]=price[ST1-1];
      ST2=ST1-1;
      CalcBar(ST2);

     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
Похоже, компилятор неверно понимает строку CalcBar(ST1-1), и верно CalcBar(ST2). Хм...
 
AdwareRu   :

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


Спасибо, ошибка оптимизатора (инлайниг функций) исправлена.

Ждите обновлений.

 
mql5   :


Спасибо, ошибка оптимизатора (инлайниг функций) исправлена.

Ждите обновлений.


Спасибо.
 

Привет!

Разработчикам:

1. Не знаю, критично или нет:

При возникновении ошибки Array out of range in ИНДИКАТОР, после компиляции ...

Индикатор выбрасывает с графика (в Indicator List имени индикатора нет).

2. В процессе работы индикатора используется DRAW_FILLING и DRAW_ARROW

Экономный режим расчета индикатора не реализуется.

В режиме off-line:

Код индикатора отрабатывается нормально (объекты аналогичны с мт4) при установке на график и при переходе с одного периода на другой.

В режиме on-line (поступают котировки) ...

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

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

Билд 236,вероятно, сегодня терминал обновился - билд 237.

Если необходим код - опубликую.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
SHerh   :

Привет!

Разработчикам:

1. Не знаю, критично или нет:

При возникновении ошибки Array out of range in ИНДИКАТОР, после компиляции ...

Индикатор выбрасывает с графика (в Indicator List имени индикатора нет).

Смотрите раздел Ошибки выполнения:

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

деление на ноль;
выход за пределы массива;
использование некорректного указателя на объект;
 
SHerh   :


2. В процессе работы индикатора используется DRAW_FILLING и DRAW_ARROW

Экономный режим расчета индикатора не реализуется.

В режиме off-line:

Код индикатора отрабатывается нормально (объекты аналогичны с мт4) при установке на график и при переходе с одного периода на другой.

В режиме on-line (поступают котировки) ...

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

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

Билд 236,вероятно, сегодня терминал обновился - билд 237.

Если необходим код - опубликую.

У Вас алгоритмическая ошибка в коде.