Помогите с массивом!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Maksim Neimerik
31701
Maksim Neimerik  
Привет! Нужно найти 3-й екстремум зигзага. Написал вот такое (только не смейтесь)):
int Zig()
{
   double Candle=0;
   for(int i=0;i<=Bars-1;i++)
   {
      if(ZZ_Orlova[i]!=0)
      {
      Candle=i;
      break;
      }
   }
   return(Candle);
}
//+------------------------------------------------------------------+
int Zag()
{
   double Candle=0;
   for(int i=Zig()+1;i<=Bars-1;i++)
   {
      if(ZZ_Orlova[i]!=0)
      {
      Candle=i;
      break;
      }
   }
   return(Candle);
}
//+------------------------------------------------------------------+
double ZigZag()
{
   double Prise=0;
   for(int i=Zag()+1;i<=Bars-1;i++)
   {
      if(ZZ_Orlova[i]!=0)
      {
      Prise=ZZ_Orlova[i];
      break;
      }
   }
   return(Prise);
}
но это конечно же не практично и не красиво с точки зрения программирования. Вот я и хочу спросить: можно ли инициализировать 3-х значный массив и в цикле (for) записать в него 3 первых екстремума зигзага? Если можно то с чего начать, как это сделать. Будьте добры подскажите!!!
Vitaly Muzichenko
14102
Vitaly Muzichenko  
Maksim Neimerik:
Привет! Нужно найти 3-й екстремум зигзага. Написал вот такое (только не смейтесь)):но это конечно же не практично и не красиво с точки зрения программирования. Вот я и хочу спросить: можно ли инициализировать 3-х значный массив и в цикле (for) записать в него 3 первых екстремума зигзага? Если можно то с чего начать, как это сделать. Будьте добры подскажите!!!
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает номер бара экстремума ЗигЗага по его номеру.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
int GetExtremumZZBar(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bc=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=0; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bc, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(i);
    }
  }
  Print("GetExtremumZZBar(): Экстремум ЗигЗага номер ",ne," не найден");
  return(-1);
}
Maksim Neimerik
31701
Maksim Neimerik  
Большое спасибо!!!
Taras Slobodyanik
38275
Taras Slobodyanik  

перебирать пачку баров на каждом тике — будет медленно работать...

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

Vitaly Muzichenko
14102
Vitaly Muzichenko  
Taras Slobodyanik:

перебирать пачку баров на каждом тике — будет медленно работать...

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

А зачем вершины и прочие индикаторы проверять на каждом тике?

Такие вещи проверяются один раз на "новом баре"

Taras Slobodyanik
38275
Taras Slobodyanik  
Vitaly Muzichenko:

А зачем вершины и прочие индикаторы проверять на каждом тике?

Такие вещи проверяются один раз на "новом баре"


зависит от стратегии - зигзаг может перерисовывать последние две вершины, и делает это в любой момент, а не только в начале нового бара.

Maksim Neimerik
31701
Maksim Neimerik  
Насчет нового бара я согласен потому что зигзаг перерисовывает только две последние вершины а мне нужна 3-я. Но я бы хотел узнать именно про запись в массив последних 3-х екстремумов... Это возможно или нет? Если да то как это сделать? У меня что-то туго с массивами...
Alexey Viktorov
27863
Alexey Viktorov  
Maksim Neimerik:
Насчет нового бара я согласен потому что зигзаг перерисовывает только две последние вершины а мне нужна 3-я. Но я бы хотел узнать именно про запись в массив последних 3-х екстремумов... Это возможно или нет? Если да то как это сделать? У меня что-то туго с массивами...

А с не массивами не туго?

Какая разница записать в массив mass[3] или в 3 разные переменные mass0, mass1, mass2???

"А ответ ужасно прост и ответ единственный" В. С. Высоцкий.

mass[0] равнозначно mass0

mass[1] равнозначно mass1

mass[2] равнозначно mass2

Это все премудрости массивов. Просто в цикле перебирай значения индикатора, если не пустое значение и\или не 0 (зависит от написания ZZ), проверяй на соответствие цене high или low и при необходимости записывай в массив с очередным индексом.

Konstantin Erin
2161
Konstantin Erin  
Maksim NeimerikНужно 3-й екстремум зигзага. 3-х значный массив и в цикле (for) записать в него 3 первых екстремума зигзага?

Попробуйте так. Заодно посмотрите какая разница

// С массивом
double Цены[3];   // 3-х элементный массив результаты
int Счетчик = 0;   // Найдено вершин

for(int i=0;i<Bars;i++)
{
  if(ZZ_Orlova[i]!=0)
  {
      Цены[Счетчик]=ZZ_Orlova[i];
      Счетчик++;
      if(Счетчик==3)break;
  }
}
Alert(Цены[2]);
-------------------------------------------------------------------------------------------------
// Без массива с запоминанием лишь третьей вершины зигзага
double Цена;
int Счетчик = 0;   // Найдено вершин
for(int i=0;i<Bars;i++)
{
  if(ZZ_Orlova[i]!=0)
  {
      Цена=ZZ_Orlova[i];
      Счетчик++;
      if(Счетчик==3)break;
  }
}
Alert(Цена);

------------------------------------------------------------------------------------------------------ // Без массива запоминаем все три вершины double Цена1,Цена2,Цена3; int Счетчик = 0; // Найдено вершин for(int i=0;i<Bars;i++) { if(ZZ_Orlova[i]!=0) { Счетчик++; if(Счетчик==1) Цена1=ZZ_Orlova[i]; if(Счетчик==2) Цена2=ZZ_Orlova[i]; if(Счетчик==3) if(Счетчик==3) Цена3=ZZ_Orlova[i]; // лишний раз проверяется 3 можно так { Цена3=ZZ_Orlova[i]; break; } if(Счетчик==3)break; } } Alert(Цена3);

Maksim Neimerik
31701
Maksim Neimerik  
STARIJ:

Попробуйте так. Заодно посмотрите какая разница

Большое спасибо, первый вариант это как раз то что я и хотел узнать.

Maksim Neimerik
31701
Maksim Neimerik  
Alexey Viktorov:

А с не массивами не туго?

Какая разница записать в массив mass[3] или в 3 разные переменные mass0, mass1, mass2???

"А ответ ужасно прост и ответ единственный" В. С. Высоцкий.

mass[0] равнозначно mass0

mass[1] равнозначно mass1

mass[2] равнозначно mass2

Это все премудрости массивов. Просто в цикле перебирай значения индикатора, если не пустое значение и\или не 0 (зависит от написания ZZ), проверяй на соответствие цене high или low и при необходимости записывай в массив с очередным индексом.

Нет, не туго. Неумесное замечание с Вашей стороны, и совсем не дружественное...
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий