Что возвращают функции Lowest и Highest - страница 2

 
nen
Не мог ответить (меня не было). Выложите код, который нужно разобрать, чтобы говорить об одном.
ЗЫ В том зигзаге была не ошибка , а опечатка (по сравнению с кодом в МТ3), я нашел только эту опечатку и больше ничего не правил.
 
Vladislav, почему-то Ваш код у меня не на всех таймфреймах работает. На каких-то выводится, на других нет. Странно. работает.
 
Rosh, вот код с сайта codebase.mql4.com. У меня такой же. Если получится его одолеть всем миром, буду очень признателен. И не я один. Заранее спасибо за помощь.

У меня сейчас накопилось большое количество с теми или иными правками. Работают неплохо. Но на первом луче - от нулевого бара начинающемся или от какого либо из первых баров - ошибки в работе функций поиска экстремумов дают сбои. И индикатор работает неустойчиво.

//+------------------------------------------------------------------+
//| Custom Moving Average.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net/

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2);
//---- drawing settings
SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(0,0.0);
//---- indicator short name
IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int shift, back,lasthighpos,lastlowpos;
double val,res;
double curlow,curhigh,lasthigh,lastlow;

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
if(val==lastlow) val=0.0;
else
{
lastlow=val;
if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer[shift+back];
if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0;
}
}
}
ExtMapBuffer[shift]=val;
//--- high
val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
if(val==lasthigh) val=0.0;
else
{
lasthigh=val;
if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer2[shift+back];
if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0;
}
}
}
ExtMapBuffer2[shift]=val;
}

// final cutting
lasthigh=-1; lasthighpos=-1;
lastlow=-1; lastlowpos=-1;

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
curlow=ExtMapBuffer[shift];
curhigh=ExtMapBuffer2[shift];
if((curlow==0)&&(curhigh==0)) continue;
//---
if(curhigh!=0)
{
if(lasthigh>0)
{
if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
else ExtMapBuffer2[shift]=0;
}
//---
if(lasthigh<curhigh || lasthigh<0)
{
lasthigh=curhigh;
lasthighpos=shift;
}
lastlow=-1;
}
//----
if(curlow!=0)
{
if(lastlow>0)
{
if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
else ExtMapBuffer[shift]=0;
}
//---
if((curlow<lastlow)||(lastlow<0))
{
lastlow=curlow;
lastlowpos=shift;
}
lasthigh=-1;
}
}

for(shift=Bars-1; shift>=0; shift--)
{
if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
else
{
res=ExtMapBuffer2[shift];
if(res!=0.0) ExtMapBuffer[shift]=res;
}
}
}
 
Vladislav, почему-то Ваш код у меня не на всех таймфреймах работает. На каких-то выводится, на других нет. Странно. работает.


А на каких не выводится ? У меня вроде все показывает. Да и не мой это код - из стандартной поставки вроде. Во всяком случае у меня во всех версиях МТ.
 
Vladislav, то, что это не Ваш код, понятно. У меня в поставке тот код, что я привел.
На каких таймфреймах не выводится. ДЦ- Брезан.
GBP-CHF
Не выводится - m1, m15. На остальных выводится.
EUR-USD
Не выводится - m1, m5
AUD-USD - на всех выводится.
Не понятно, почему так.

Возможно, у Вас тот код, который летом, кажется, Слава переделал. Но его переделка мне не понравилась. Там не были решены некоторые проблему.
================
Неплохо переделал GODZILLA (Николай). Но у него решены только две проблемы.
1) Пересчет на каждом тике. Он его радикально сократил
2) Добавил алгоритм удаления горбов. Горбы в основном возникают от того, что на одном баре находится и минимум и максимум. А алгоритм зигзага такой, что он оставляет только максимумы. От этого часто и возникали несколько максимумов подряд.

У меня есть варианты доработки индикатора, поправленного GODZILL-ой. Убраны перегибы, висящие в воздухе. Но некорректная, как я предполагаю, работа функций поиска экстремумов все равно себя проявляет на первых двух лучах. И из-за этой проблемы я и поднял эту тему здесь.

Впрочем, возможно функция поиска и корректно работает, но нет четкого описания на эту функцию. Из-за этого и некорректное использование ее происходит.
 
У меня выводится на всех т\ф по указанным парам. Этот код не помню откуда - думал, что в поставке билда 197 - он у меня по какой-то причине во всех МТ :). Завтра проверю.
 
Стыдно сказать, никогда раньше всерьёз не интересовался зигзагом :). Код в посте nen 18.10.06 17:46
пока понять не получается. Мне кажется должно бы быть что-то вроде
...
//    val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
    highpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift);
    val=High[highpos];
    if(MathAbs(val-lastlow) < Point) val=0.0;
//    if(val==lasthigh) val=0.0;
    else {
      lasthigh=val;
      if(highpos!=shift) val=0.0;
//      if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
      else {
...


Здесь "лишний" старый код закомментирован. Хотя возможно я пока не понимю до конца идею зигзага. Во всяком случае висячих экстремумов такой код не даёт. Если этот вариант кода подходит, но его придумал не я :), приношу извинения за отсутствие ссылки.

 
Candid, спасибо. Посмотрю, как это работает. Но вопрос в названии ветки не снимается. Как раз зигзаг выявил проблему "непонятной" работы функций поиска экстремумов. Строчка highpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift); помогает найти экстремум. Но индекс highpos, возвращаемый функцмей Highest при прогоне в коде зигзага, часто получается случайный. Происходит отклонение от истинного положения бара. То есть highpos будеи, например, 15. А на самом деле бар имеет другой индекс: 13 или 16 или еще какой-то. Разброс получается. Из-за этого зигзаг с маленькими значениями параметров и на "маленьких" таймфреймах (минутки, пятиминутки ...) начинает работать неустойчиво.

Ну ладно. Бог с ним, с зигзагом. Вопрос не в зигзаге. А в том, что функции языка MQ4 должны работать устойчиво и предсказуемо.

И вот это и ЯВЛЯЕТСЯ ОСНОВНОЙ ПРОБЛЕМОЙ. Функции поиска применяются не только в зигзаге. Но и во многих других индикаторах.

Зигзаг - это частный случай. Но и он помогает высветить проблему. Много индикаторов построены на основе зигзагов. Зигзаг работает неустойчиво. Это ни для кого не секрет. Многие вынуждены тратить свое время на программирование каких-то своих зтгзагов для своих потребностей. Сколько тратится времени. Впустую. Из-за непонимания первоосновы проблемы.
 
Candid, твои слова: Стыдно сказать, ..... Код в посте nen 18.10.06 17:46 пока понять не получается.

Это золотые слова. Не ты первый, кто это говорит. Но тем не менее, идеи, заложенные в зигзаг и частично реализованные в этом коде очень хорошие. Эти идеи довести бы до кондиции.
 
2 nen:
Когда мы в процессе расчёта индикатора двигаем окно (shift,shift+ExtDepth), появление нового экстремума может быть связано как с новой ценой, так и с тем, что из окна ушёл старый экстремум. Этот момент нужно обрабатывать. Для этого в моей вставке введена строка if(highpos!=shift) val=0.0; . Как это делается в стандартном коде, я не понял. Судя по тому, что висячие экстремумы в моём варианте пропали, это делается либо неправильно, либо совсем не делается.
А в чём именно состоит неустойчивость работы зигзага?