Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Не мог ответить (меня не было). Выложите код, который нужно разобрать, чтобы говорить об одном.
ЗЫ В том зигзаге была не ошибка , а опечатка (по сравнению с кодом в МТ3), я нашел только эту опечатку и больше ничего не правил.
У меня сейчас накопилось большое количество с теми или иными правками. Работают неплохо. Но на первом луче - от нулевого бара начинающемся или от какого либо из первых баров - ошибки в работе функций поиска экстремумов дают сбои. И индикатор работает неустойчиво.
//+------------------------------------------------------------------+
//| 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;
}
}
}
А на каких не выводится ? У меня вроде все показывает. Да и не мой это код - из стандартной поставки вроде. Во всяком случае у меня во всех версиях МТ.
На каких таймфреймах не выводится. ДЦ- Брезан.
GBP-CHF
Не выводится - m1, m15. На остальных выводится.
EUR-USD
Не выводится - m1, m5
AUD-USD - на всех выводится.
Не понятно, почему так.
Возможно, у Вас тот код, который летом, кажется, Слава переделал. Но его переделка мне не понравилась. Там не были решены некоторые проблему.
================
Неплохо переделал GODZILLA (Николай). Но у него решены только две проблемы.
1) Пересчет на каждом тике. Он его радикально сократил
2) Добавил алгоритм удаления горбов. Горбы в основном возникают от того, что на одном баре находится и минимум и максимум. А алгоритм зигзага такой, что он оставляет только максимумы. От этого часто и возникали несколько максимумов подряд.
У меня есть варианты доработки индикатора, поправленного GODZILL-ой. Убраны перегибы, висящие в воздухе. Но некорректная, как я предполагаю, работа функций поиска экстремумов все равно себя проявляет на первых двух лучах. И из-за этой проблемы я и поднял эту тему здесь.
Впрочем, возможно функция поиска и корректно работает, но нет четкого описания на эту функцию. Из-за этого и некорректное использование ее происходит.
пока понять не получается. Мне кажется должно бы быть что-то вроде
Здесь "лишний" старый код закомментирован. Хотя возможно я пока не понимю до конца идею зигзага. Во всяком случае висячих экстремумов такой код не даёт. Если этот вариант кода подходит, но его придумал не я :), приношу извинения за отсутствие ссылки.
Ну ладно. Бог с ним, с зигзагом. Вопрос не в зигзаге. А в том, что функции языка MQ4 должны работать устойчиво и предсказуемо.
И вот это и ЯВЛЯЕТСЯ ОСНОВНОЙ ПРОБЛЕМОЙ. Функции поиска применяются не только в зигзаге. Но и во многих других индикаторах.
Зигзаг - это частный случай. Но и он помогает высветить проблему. Много индикаторов построены на основе зигзагов. Зигзаг работает неустойчиво. Это ни для кого не секрет. Многие вынуждены тратить свое время на программирование каких-то своих зтгзагов для своих потребностей. Сколько тратится времени. Впустую. Из-за непонимания первоосновы проблемы.
Это золотые слова. Не ты первый, кто это говорит. Но тем не менее, идеи, заложенные в зигзаг и частично реализованные в этом коде очень хорошие. Эти идеи довести бы до кондиции.
Когда мы в процессе расчёта индикатора двигаем окно (shift,shift+ExtDepth), появление нового экстремума может быть связано как с новой ценой, так и с тем, что из окна ушёл старый экстремум. Этот момент нужно обрабатывать. Для этого в моей вставке введена строка if(highpos!=shift) val=0.0; . Как это делается в стандартном коде, я не понял. Судя по тому, что висячие экстремумы в моём варианте пропали, это делается либо неправильно, либо совсем не делается.
А в чём именно состоит неустойчивость работы зигзага?