Нужна спец помощь по АО!

 
Нужна помощь вот в таком деле... Нужно чтобы определялась по АО вот такая вот вещь:




И в какой-нибудь переменной было зафиксировано это - "два"...
Нужен кусок кода в эксперт, не в индикатор....
Заранее всем благодарен!

 
И по каким принципам определяются эти вершины?
Потому что между ними есть еще несколько.
Чем одни отличаются от других?
 
Oasis

Смотри, я отметил места, смены цвета, одного столба на другой, тоесть, вот этот переход (идем справа на лево, это важно!) зеленый, зелёный, зелёный.. -> красный - это раз ну и тд. Самое главное чтобы было не меньше 3-х столбов одного цвета справа и не менее 3-х столбов переходного цвета слева... иначе это ложный раз.. И так просматриваем до тех пор пока, как показано в это примере (SELL) не произойдет смена отрицательного числа на положительное (я отметил этот переход) -> это стоп!
Надеюсь, понятно изъяснился...

 
Посмотрите как сделано в поставляемом с МТ4 эксперте "MACD Sample", там в качестве индикатора используется MACD (немного похоже на вашу задачу).
Или выложите код индикатора, что-бы можно было "ткнуть пальцем" откуда брать значения. :-)
 
В том то и смысл, что мне нужен не индикатор, а кусок кода в эксперт, который бы и решал вот эту задачу. А значения надо брать с АО индикатора iAO(NULL, 0, 0) и тд.., в заглавии темы я это написал...
 
// Глобал.пер
datetime TimeOpen;
bool OnePeak, TwoPeak;
double OnePeakVal, TwoPeakVal;
 
// Инициализатор выполнения на цене открытия
bool StartProgram()
   {
   if(TimeOpen != Time[0])
      {
      TimeOpen = Time[0];
      return(true);
      }else
      return(false);
   }
   
 
 
 void start()
  {
 if(StartProgram())
   {
   if(AOmodel())
      Print("Такая вот модель ;-) ", TimeToStr(Time[1], TIME_DATE|TIME_MINUTES));
   }
  }
  
// --- --- --- Функции
 
bool AOmodel()
   {
   if(AO(1) > AO(2) && AO(2) > AO(3) && AO(3) > AO(4) &&
      AO(4) < AO(5) && AO(5) < AO(6) && AO(6) < AO(7) &&
      AO(7) < 0 && AO(1) < 0)
      {
      if(OnePeak)
         { 
         TwoPeak = true;
         TwoPeakVal = AO(4); 
         }else{
         OnePeak = true;
         OnePeakVal = AO(4);
         }
      }
   if(AO(1) >= 0)
      {
      OnePeak = false;
      TwoPeak = false;
      }
   if(OnePeak && TwoPeak && TwoPeakVal > OnePeakVal)
      {
      OnePeak = false;
      TwoPeak = false;
      return(true);
      }else{
      return(false);
      }       
   }
 
// Значение индикатора AO!
   
double AO(int Shift) 
   {
   return(NormalizeDouble(iAO(NULL, 0, Shift), Digits + 1));
   }

Ну, вот что то вроде - это для низов так сказать :-)
 

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

Первичную проверку нужно организовать в функции init(), сделать в цикле для последних 50 баров

 

Я вот всё таки думаю, что тут нужен цикл. Смотри, это в данном примере мы видим две пики, но их может быть сколько угодно….! Наша задача сделать так что бы скрипт просматривал, эти бары, по АО начиная с настоящего и идя назад один за одним смотрел за их значениями… Там где идет перелом в значениях это и есть пик, сохранить это как «раз» или «1» если быть более точным, и идти дальше назад, еще перелом это второй пик или «два» тоесть «2» и это сохранить в переменной (я так думаю, массив нужен), ну и так дальше до тех пор пока не встретим значение с другим знаком (в зависимости от BUY или SELL) – вот тогда стоп! И всё это в цикле, причем без прерывания, тоесть без break; в цикле. ., так чтобы цикл постоянно смотрел за значениями АО и выдавал нам количество вершин на данный момент от настоящего момента до смены знака в значениях…

Фууу…….

 

to Inter

Ну Вы сами достаточно точно не определили стоящую перед Вами задачу, в начале

Судя по иллюстрации - это двойная дивергенция на АО, при определении вершин как 3 красных 3 зеленых…

Сноски на то что вершин больше двух нигде и не было… Причем до сих пор не ясно как они между собой соотносятся…образуют ли они двойную/тройную/четверную и т.д дивергенцию, или что-то еще – это вопрос )))))))

Надо быть точнее в постановке задачи в начале)

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

 
Oasis Всё правильно, по иллюстрации - это двойная дивергенция на АО… Но как ты сам понимаешь таких вершин может быть и три и четыре. Я просто кусок вот такой вырезал, для наглядности. В моей задаче простой смысл, надо знать количество ПИК на данный момент, всё! А без цикла тут не обойтись…

Нужна Помощь! ХЕЛП!

 
>> В моей задаче простой смысл, надо знать количество ПИК на данный момент, всё!

Вот код который определяет кол-во пиков и заносит зничение на них в мас.
datetime TimeOpen;
int a;
double PeakValue[10];
 
bool StartProgram()
   {
   if(TimeOpen != Time[0])
      {
      TimeOpen = Time[0];
      return(true);
      }else
      return(false);
   }
 void start()
  {
 if(StartProgram())
   {
   AOmodel();
   Print("Количество пиков на данный момент: ", DoubleToStr(a, 0));
   }
  }
void AOmodel()
   {
   if(AO(1) > AO(2) && AO(2) > AO(3) && AO(3) > AO(4) &&
      AO(4) < AO(5) && AO(5) < AO(6) && AO(6) < AO(7) &&
      AO(7) < 0 && AO(1) < 0) {a++; PeakValue[a] = AO(4);} 
   if(AO(1) >= 0) a = 0;       
   }   
double AO(int Shift) 
   {return(NormalizeDouble(iAO(NULL, 0, Shift), Digits + 1));}
Причина обращения: