Глюк в iMA ???

 
//+------------------------------------------------------------------+
//| Copyright © 2004, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net/
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
//---- indicator buffers
double itelo[];
double ishag[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- 1 additional buffer used for counting.
IndicatorBuffers(3);
//---- drawing settings
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
SetIndexDrawBegin(0,0);
SetIndexDrawBegin(1,0);
//SetIndexDrawBegin(2,3);
//---- 3 indicator buffers mapping
SetIndexBuffer(0,itelo);
SetIndexBuffer(1,ishag);
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("iТело-iШаг");
SetIndexLabel(0,"iТело");
SetIndexLabel(1,"iШаг");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Test |
//+------------------------------------------------------------------+
int start()
{
int limit;
int counted_bars=IndicatorCounted();
double telo[],shag[];
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- macd counted in the 1-st additional buffer
for(int i=0; i<limit-3; i++)
{
telo[i] = 0.0;
if (Open[i]>Close[i]) telo[i] = Open[i]-Close[i];
if (Open[i]<Close[i]) telo[i] = Close[i]-Open[i];
shag[i] = High[i] - Low[i];

}
for(i=0; i<limit-3; i++)
{
ishag[i] = iMAOnArray(shag,0,3,0,MODE_LWMA,0);
itelo[i] = iMAOnArray(telo,0,3,0,MODE_LWMA,0);

}
//---- done
return(0);
}

Если запускать как вышенаписано - не работает. В логах ничего нет.
Если без сглаживания средними, то все ОК.
Почему?
 
пожалуйста, оформляйте исходные тексты с использованием тега pre в квадратнвх скобках.
 
Извиняюсь, вот форматированный код:

//+------------------------------------------------------------------+
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MetaQuotes Software Corp."
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Green
#property  indicator_color2  Red
//---- indicator buffers
double     itelo[];
double     ishag[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 1 additional buffer used for counting.
   IndicatorBuffers(3);
   //---- drawing settings
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3);
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   SetIndexDrawBegin(0,0);
   SetIndexDrawBegin(1,0);
   //SetIndexDrawBegin(2,3);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,itelo);
   SetIndexBuffer(1,ishag);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("iТело-iШаг");
   SetIndexLabel(0,"iТело");
   SetIndexLabel(1,"iШаг");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Test                                                             |
//+------------------------------------------------------------------+
int start()
  {
   int    limit;
   int    counted_bars=IndicatorCounted();
   double telo[],shag[];
//---- check for possible errors
   if(counted_bars<0) return(-1);
   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd counted in the 1-st additional buffer
   for(int i=0; i<limit-3; i++)
   {
      telo[i] = 0.0;
      if (Open[i]>Close[i]) telo[i] = Open[i]-Close[i];
      if (Open[i]<Close[i]) telo[i] = Close[i]-Open[i];
      shag[i] =  High[i] - Low[i];

   }
   for(i=0; i<limit-3; i++)
   {
      ishag[i] = iMAOnArray(shag,0,3,0,MODE_LWMA,0);
      itelo[i] = iMAOnArray(telo,0,3,0,MODE_LWMA,0); 
      
   }
//---- done
   return(0);
  }
 
Slawa

Так что, это глюк? Почему не работает?
 
2Виталий

Так что, это глюк? Почему не работает?

В твоем индикаторе всем значениям буферов ishag[i] и itelo[i] будет присвоено одно и то же значение взятое из одного и того же места (последний параметр) iMAOnArray(shag,0,3,0,MODE_LWMA,0). Рекомендую пошагово выводить результаты в лог (или файл) и отследить на каком этапе выводимые результаты не совпадают с ожидаемыми (локализовать ошибку) и затем ее исправлять.
Также твой код:
      telo[i] = 0.0;
      if (Open[i]>Close[i]) telo[i] = Open[i]-Close[i];
      if (Open[i]<Close[i]) telo[i] = Close[i]-Open[i];


Можно заменить следующим:

      telo[i] = MathAbs(Open[i]-Close[i]);


В приведенном примере (словарь) обнаруживают "пересечение вверх", если на предыдущем интервале (индекс 1 - последний параметр) значение медленной средней больше, а на текущем (индекс 0) меньше или равно быстрой то выдать сигнал "пересечение вверх".

 
Profi_R
Пробовал выводить результат в лог пошагово. Не получается:
Пока есть второй цикл:

for(i=0; i<limit-3; i++)
   {
      ishag[i] = iMAOnArray(shag,0,3,0,MODE_LWMA,0);
      itelo[i] = iMAOnArray(telo,0,3,0,MODE_LWMA,0); 
      
   }



Значения всех элементов массивов telo и shag равны 0.
Вот поэтому я и застопорился- не могу понять в чем ошибка, а ребята из Metaquotes игнорируют мою просьбу о помощи, к сожалению.

 
Пока есть второй цикл:

for(i=0; i<limit-3; i++)
   {
      ishag[i] = iMAOnArray(shag,0,3,0,MODE_LWMA,0);
      itelo[i] = iMAOnArray(telo,0,3,0,MODE_LWMA,0); 
   }


Значения всех элементов массивов telo и shag равны 0.


ты не обратил внимание на мое первое замечание, значения твоего индикатора на всем промежутке будет равно одному и тому же числу (последний параметр я его жирным выделил в предыдущем посте) скорее всего он должен быть у тебя i или что-то в этом роде(подтверждение тому твой лог, т.е. везде 0), и еще нужно разобраться с остальными параметрами (0,3,0) что они означают? Когда сможешь понять их назначение тогда и разберешься со своим индюком. :)

 
  double telo[],shag[];


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

 
Slawa

А при чем тут ArrayResize???
Мне не нужно изменять размер массива.

Profi_R
Поменял, но видимо дело не только в этом - не помогло :(
 
А при чем тут ArrayResize???
Мне не нужно изменять размер массива.

как это не нужно?
Вы работаете с массивом нулевой длины. какие данные Вы хотите получить из массива нулевой длины? Вы даже GetLastError() после обращения к массиву не анализируете - а там у Вас "out of range"
 
Slawa
А при чем тут ArrayResize???
Мне не нужно изменять размер массива.


Не жди готовых ответов старайся ответить на них, во-первых поймешь почему, во-вторых отложится в уме, и затем не будешь допускать подобных ошибок. На форуме тебе будут стараться помочь, но большую часть усилий придется приложить самому. Насчет ArrayResize, вот что написано в описании "Sets new size to the first dimension. If success returns count of all elements contained in the array after resizing, otherwise, returns zero and array is not resized", что означает (если я правильно понял) что данная функция изменяет размер массива (при успешном изменении размерности возвращает новое количество элементов, иначе 0). Наверняка нужно после создания массива его инициализировать, затем менять его размерность, попробуй узнай размерность своего массива в ходе выполнения кода - функция ArraySize( object array[]), если размер не верен, то точно проблема связана с изменением размерности массива. Со временем появятся и уроки и описание может быть на русском (я не владею английским и тоже изучаю методом научного тыка и интуиции) и станет полегче.

Profi_R
Поменял, но видимо дело не только в этом - не помогло :(


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

2Форумяне

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

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