советник на базе ZigZaga

 
Возникла мыслишка автоматизировать торговлю по индикатору ZigZag(стандартный из МТ4).Идея простая и в ручную торгуется успешно.Как только линия индикатора прерывается и в течении нескольких баров отсутствует( 1-3 в зависимости от таймфрейма)позиция переворачивается на противоположную.Но как получить значение индикатора для советника или просто факт наличия или отсутсвия его линии на данном баре?Его линии - это не объекты,индикатор имеет 3 буфера,но значения их массивов,получаемые например с помощьф ф-ции iCustom(), вовсе не соответствуют наличию или отсутствию линии индикатора на данном баре.Подскажите пожалуйста.Не может быть чтобы эту информацию невозможно было выжать из индикатора.
 

==========

Пример моего давнего, первого советника по зиг-загу. Задавал эту часть кода вот так:

int start()
  {

//============ блок зигзага =======================
 double // экстремумы Зиг-Зага (ценовые  значения)
  y3=0, //предпоследнего экстремума
   y2=0,//значение последего экстремума
    y1=0,//тек. цена
     y0,//кончик посл. луча  
     zz;    //кончик 3-го экстр 
 int    x3, x2, x1, sh=ShiftBars;// номера баров с экстремумами 
 
    y0=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, 1);

//=============================================================================
  // Берём три экстремума Зиг-Зага
   while (y3==0) 
      {
      zz=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, sh);
      if (zz!=0 && zz!=EMPTY_VALUE) 
         {
         if      (y1==0) { x1=sh; y1=zz; }
         else if (y2==0) { x2=sh; y2=zz; }
         else if (y3==0) { x3=sh; y3=zz; }
         }
      sh++;
 
 //----- Вывод информации на экран -----------------------------------------------
string info="";
string on_off="---------------------------------------------------"+  "\r\n";
on_off=StringConcatenate (on_off,"Экстремум= ",y1," на ",x1," баре","\r\n");
on_off=StringConcatenate (on_off,"Экстремум= ",y2," на ",x2," баре","\r\n");
info=StringConcatenate(info,on_off,"\r\n");
info=StringConcatenate(info,"\r\n");
Comment(info);    
//-----------------------------------------------                
            
      } // while (y3==0)       
//=============== конец   блока зигзага =================================

Ну а далее просто, смотрите на комментарий в верхней левой части графика и задаете свой алгоритм входов.

if (y2<y1 && x2>x1) && ... //если последний экстремум - это максимум (или минимум)....

и т.д., и т.п.

 
leonid553:

==========

Пример моего давнего, первого советника по зиг-загу. Задавал эту часть кода вот так:

Ну а далее просто, смотрите на комментарий в верхней левой части графика и задаете свой алгоритм входов.

if (y2<y1 && x2>x1) && ... //если последний экстремум - это максимум (или минимум)....

и т.д., и т.п.


Спасибо,разобрался.В буферах оказывается номера баров экстремумов на которых оканчивается луч индикатора.Дальше, как говорится, дело техники.
 
Уважаемый leonid553,С Вашей помощью написал советник на основе ZigZaga и двух МАшек.Работает неплохо.но поздновато срабатывает после трендов высотой 80-100 пунктов.Из-за этого теряется приличная часть прибыли.Это слабая сторона всех советников на МАшках.Надо бы его дополнить критерием выхода RSI из зон перекупленности и перепроданности,но при высоте ветви ZigZaga не менее 80 пунктов.Измерить высоту ветви ZigZaga,по экстремумам,возникшим уже после включения советника нет проблем.С помщью ф-ции iCustom() получаем из буферов ZigZaga сведения о наличии на последнем баре минимума или максимума, отмеченных ZigZagом(кстати не совсем понятно почему в буферах ZigZaga для разных валютных пар экстремумы отмечаются : для EURUSD,GBPUSD значением 1,для EURJPY значением 102,дляGBPJPY значением 121.т.е. целой частью котировки), и определяем значения Low и High на этих барах. Однако для корректной работы необходимо,чтобы советник измерял и высоту последней ветви ZigZaga,возникшей перед включением советника.
Есть такая ф-ция ArrayBsearch(),возвращающая индекс первого найденного элемента в массиве,но непонятно как указать советнику массив какого индикатора мы имеем в виду.А если внести изменения в код индикатора и там определять индекс бара экстремума с помощью ф-ции ArrayBsearch(),то как потом получить этот индекс бара в советник?
Подскажите пожалуйста.
 

По поводу массива я сказать затрудняюсь. Я не проф. программист и знаком только с основами MQL/

Не совсем понято отображение экстремумов в целых цифрах от котировки. Я сейчас поставил отображение в советник - и в комменте все норм. отображается.

 

Я уже во всем рзобрался.Спасибо за помощь.Можно вообще удалить тему,господа модераторы.

Причина обращения: