Как рисовать экспертом ZigZag - страница 2

 
Natalya Dzerzhinskaya:


Возможно они. Я их сделаю доступными для вызова. А как в советнике с ними поступить чтобы рисовали?

Допустим:

double Ha=iCustom(Symbol(),0,"::Indicators\\ZigZag.ex4",ZZperiod,5,3, 1,1);
double La=iCustom(Symbol(),0,"::Indicators\\ZigZag.ex4",ZZperiod,5,3, 2,1);



Не, не так. В цикле надо перебирать, как вам выше писали, оба буфера и значение смещения=инкремент цикла. В ЗЗ не на каждом баре значение рабочее, чаще 0.0 будет.
 
Vitalie Postolache:

Не, не так. В цикле надо перебирать, как вам выше писали, оба буфера и значение смещения=инкремент цикла. В ЗЗ не на каждом баре значение рабочее, чаще 0.0 будет.


Ага, с этим понятно.
Надеюсь разберусь.
Спасибо))

 

Обычный зигзаг рисуется по нулевому буферу.
Перебираем его, если содержимое ячейки больше нуля, значит это перелом зигзага. Это и есть бар и цена точки.
Нулевое значение ячейки пропускаем - нет точки зигзага.

...и так весь буфер

...последние две точки могут перерисовываться

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

 
Taras Slobodyanik:


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


Ничего особо не надо определять, в один буфер всегда пишутся вершины, а в другой, соответственно - всегда впадины. Достаточно их в нужном порядке чередовать.
 
Vitalie Postolache:
Ничего особо не надо определять, в один буфер всегда пишутся вершины, а в другой, соответственно - всегда впадины.

Буфер типа DRAW_SECTION рисует ZZ одним буфером - проводит линии между ненулевыми точками. Это и есть самый обычный из всех обычных


Natalya Dzerzhinskaya:

Там же надо знать время 1 цена 1 и время 2 цена 2

Перебираете (вызываете индикатор) в цикле на глубину в сколько вам надо баров, если значение ненулевое и не EMPTY_VALUE - это экстремум. Само значение - цена, Time[номер бара] - время. В скрипте на 1й странице есть всё что вам нужно. Нашли 3 точки экстремумов - можете нарисовать 2 трендовые линии

Но вообше-то стоит заиметь функцию для расчёта ZZ и вставлять её в советники - это чтобы не вызывать внешний индикатор хрен знает сколько раз

 
Vitalie Postolache:

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

если определять ничего не нужно, расскажите, что делать когда на одном баре два перелома?
как рисовать линию, сверху-вниз или снизу вверх? ;)
 
Vitalie Postolache:


Прежде всего, где вы видели ЗЗ с одним буфером? Классический - с тремя, многие другие - минимум тоже с тремя. 

В классическом, из поставки терминала - вершина в 2-м буфере, впадина в 3-м.


Ни дня без бреда, да?

Где угодно и сколько угодно зигзагов с одним буфером. Для рисования зигзага достаточно одного буфера.

 
Vitalie Postolache:

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

А вы  вообще зигзаг видели?
 

Зигзаг стандартный смотрим нулевой буфер. На барах, где перелом отсутствует, его значение = 0. Перебираем бары и находим отличное от нуля значение. Это цена вершины. Время определяем по номеру бара. Проводим из прошлой вершины в эту ТрендЛинию. Вот мой скрипт, выводящий зигзаг в файл. Где-то скачал и чуть подправил. А зачем рисовать советником, если можно индикатор бросить на график!

//+------------------------------------------------------------------+
//| Запись в файл значений индикатора ZigZag      ZigZag_to_File.mq4 |
//+------------------------------------------------------------------+
#property show_inputs
#property strict

enum Локаль   // Десятичный разделитель для отображения в Excel
{  Точка, Запятая };

enum Значения // Количество значений, выводимых в файл 
{  Последнее, Все };

// Параметры индикатора
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern Значения Все = Все;     // Все значения или лишь последнее
extern Локаль   RUS = Запятая; // Для русской локализации запятую

void OnStart()
{
   string ИмяФайла=Symbol()+".txt";                 // Имя файла на диске
   int    Файл = FileOpen(ИмяФайла, FILE_CSV | FILE_WRITE, " ");   // Указатель на файл
   double ZZ;      // Значение индикатора ЗигЗаг или 0 при его отсутствии

   if(Файл == -1)
   {
      Alert("Ошибка при открытии файла ", ИмяФайла);
      return;
   }

   FileWrite(Файл, "           Время    Open    High     Low   Close  ZigZag");
   for(int shift = 0; shift <= Bars-1; shift++)
   {
      ZZ = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift);
      if(!ZZ)continue;
      FileWrite(Файл,
               TimeToStr(Time[shift]),
               dstr(Open[shift]),
               dstr(High[shift]),
               dstr(Low[shift]),
               dstr(Close[shift]),
               dstr(ZZ)    );
         if(!Все)break;
   }
   FileClose(Файл);
}

// Преобразование числа double в строку с запятой или точкой в соответствии с локализацией
string dstr(double Цена)
{
  if(!RUS) return DoubleToStr(Цена, Digits);
  return StringSetChar(DoubleToStr(Цена, Digits), StringFind(DoubleToStr(Цена, Digits), "."), ',');
}
 
STARIJ:

А зачем рисовать советником, если можно индикатор бросить на график!


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


Трендовые линии прорисовываются советником.
Причина обращения: