Подскажите, как вытягивать значения из индикатора зиг-заг? Как вообще это реализуется? Т.е. если я хочу подхватить определённый экстремум, а не только последний.
Вот, например, я щяс это зиг-заг хочу прикрутить к своему эксперту:
То что нужно воспользоваться функцией iCustom как это обычно и делается для обращения к пользовательскому индюку я понимаю, но как цеплять вершины это вопрос...
В буфере ищется НЕПУСТОЕ (EMPTY_VALUE) значение по принципу:
//+-------------------------------------------------------------------------------------+//| Поиск последнего элемента ZZBuf с непустым значением |//+-------------------------------------------------------------------------------------+int GetLastIndexNoEmptyValue(int index)
{
while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
index++; // Пока не будет найден экстремум или// ..пока не достигнем конца историиreturn(index); // Индекс бара с непустым значением..// ..зиг-зага
}
В буфере ищется НЕПУСТОЕ (EMPTY_VALUE) значение по принципу:
//+-------------------------------------------------------------------------------------+//| Поиск последнего элемента ZZBuf с непустым значением |//+-------------------------------------------------------------------------------------+int GetLastIndexNoEmptyValue(int index)
{
while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
index++; // Пока не будет найден экстремум или// ..пока не достигнем конца историиreturn(index); // Индекс бара с непустым значением..// ..зиг-зага
}
а доступ к буферу индикатора через iCustom().
Логично. Но таким образом будет поиск до тех пор, пока не наткнёмся на непустое значение. А если, мне, например, да и, на самом деле, нужен не последее непустое значение т.е. не последний экстремум, а другой.. Например, вот на скрине:
Логично. Но таким образом будет поиск до тех пор, пока не наткнёмся на непустое значение. А если, мне, например, да и, на самом деле, нужен не последее непустое значение т.е. не последний экстремум, а другой.. Например, вот на скрине:
В цикл ввести счётчик экстремумов и по номеру экстремума (непустого значения подряд) разрывать цикл.
вот так. функции отдаешь n (номер пика) она тебе вернет его значение. если тебе нужен номер бара пика то поменять тип функции на int и вместо return(ind); напиши return(i);
Также учти что если ты в коде своем используешь i особенно в переборах (как в учебнике) то в этой функции поменяй i на любую другую переменную например k.
и обязательно настрой iCustom внутри функции под свой индикатор.
вот так. функции отдаешь n (номер пика) она тебе вернет его значение. если тебе нужен номер бара пика то поменять тип функции на int и вместо return(ind); напиши return(i);
Также учти что если ты в коде своем используешь i особенно в переборах (как в учебнике) то в этой функции поменяй i на любую другую переменную например k.
и обязательно настрой iCustom внутри функции под свой индикатор.
Николай, интересно, конечно, у вас написано условие. Смотрю, и думаю...
if(ind!=0) n--;
elseif(ind!=0) return(ind);
Получается если буфер пользовательского индикатора вернул значение нуль, то n--, а если если буфер пользовательского индикатора вернул значение нуль, то ... возврашаем значение буфера индикатора.
Но условия же одинаковы. И там и так если не нуль..
Николай, интересно, конечно, у вас написано условие. Смотрю, и думаю...
Получается если буфер пользовательского индикатора вернул значение нуль, то n--, а если если буфер пользовательского индикатора вернул значение нуль, то ... возврашаем значение буфера индикатора.
Но условия же одинаковы. И там и так если не нуль..
скобки фигурные куда то выпали пока пытался суда нормально код вставить:
или вот так, что лаконичней. Помешан я на быстродействии и красоте кода, не обращайте внимания )
В общем то, и так и так прекрасно всё. Просто я привык код писать немного иначе, мне так читается проще, а у вас по другому. У вас скобка первая каждая не переносится. Я у себя разложил в Эдиторе и всё стало на свои места в таком виде:
В общем то, и так и так прекрасно всё. Просто я привык код писать немного иначе, мне так читается проще, а у вас по другому. У вас скобка первая каждая не переносится. Я у себя разложил в Эдиторе и всё стало на свои места в таком виде:
когда код перешагивает за over 1000 строк, начинаешь писать компактно )
также в MT4 страдает быстродействие, особенно когда проводишь тесты. Лаконичный вариант исполняется быстрее.
Подскажите, как вытягивать значения из индикатора зиг-заг? Как вообще это реализуется? Т.е. если я хочу подхватить определённый экстремум, а не только последний.
Вот, например, я щяс это зиг-заг хочу прикрутить к своему эксперту:
То что нужно воспользоваться функцией iCustom как это обычно и делается для обращения к пользовательскому индюку я понимаю, но как цеплять вершины это вопрос...
В буфере ищется НЕПУСТОЕ (EMPTY_VALUE) значение по принципу:
а доступ к буферу индикатора через iCustom().В буфере ищется НЕПУСТОЕ (EMPTY_VALUE) значение по принципу:
а доступ к буферу индикатора через iCustom().
Логично. Но таким образом будет поиск до тех пор, пока не наткнёмся на непустое значение. А если, мне, например, да и, на самом деле, нужен не последее непустое значение т.е. не последний экстремум, а другой.. Например, вот на скрине:
Логично. Но таким образом будет поиск до тех пор, пока не наткнёмся на непустое значение. А если, мне, например, да и, на самом деле, нужен не последее непустое значение т.е. не последний экстремум, а другой.. Например, вот на скрине:
В цикл ввести счётчик экстремумов и по номеру экстремума (непустого значения подряд) разрывать цикл.
Понял. Благодарю. Тут нужно теперь на практике это всё применять. Суть понял, но в уме стока фильтров что мозг закипает...
Понял. Благодарю. Тут нужно теперь на практике это всё применять. Суть понял, но в уме стока фильтров что мозг закипает...
double get_extrem(int n) {
for(int i=1;;i++) {
double ind=iCustom(Symbol(),0,"indicator_name",0,i);
if(n>1)
if(ind!=0) n--;
else
if(ind!=0) return(ind);
}
}
вот так. функции отдаешь n (номер пика) она тебе вернет его значение. если тебе нужен номер бара пика то поменять тип функции на int и вместо return(ind); напиши return(i);
Также учти что если ты в коде своем используешь i особенно в переборах (как в учебнике) то в этой функции поменяй i на любую другую переменную например k.
и обязательно настрой iCustom внутри функции под свой индикатор.
double get_extrem(int n) {
for(int i=1;;i++) {
double ind=iCustom(Symbol(),0,"indicator_name",0,i);
if(n>1)
if(ind!=0) n--;
else
if(ind!=0) return(ind);
}
}
вот так. функции отдаешь n (номер пика) она тебе вернет его значение. если тебе нужен номер бара пика то поменять тип функции на int и вместо return(ind); напиши return(i);
Также учти что если ты в коде своем используешь i особенно в переборах (как в учебнике) то в этой функции поменяй i на любую другую переменную например k.
и обязательно настрой iCustom внутри функции под свой индикатор.
Николай, интересно, конечно, у вас написано условие. Смотрю, и думаю...
Получается если буфер пользовательского индикатора вернул значение нуль, то n--, а если если буфер пользовательского индикатора вернул значение нуль, то ... возврашаем значение буфера индикатора.
Но условия же одинаковы. И там и так если не нуль..
Николай, интересно, конечно, у вас написано условие. Смотрю, и думаю...
Получается если буфер пользовательского индикатора вернул значение нуль, то n--, а если если буфер пользовательского индикатора вернул значение нуль, то ... возврашаем значение буфера индикатора.
Но условия же одинаковы. И там и так если не нуль..
скобки фигурные куда то выпали пока пытался суда нормально код вставить:
double get_extrem(int n) {
for(int i=1;;i++) {
double ind=iCustom(Symbol(),0,"indicator_name",0,i);
if(n>1) {
if(ind!=0) n--;
}else{
if(ind!=0) return(ind);
}
}
}
Если n>1 {
если буфер не пустой то от n отнимем 1
}наоборот{
если буфер не пустой - вернем его значение
}
double get_extrem(int n) {
for(int i=1;;i++) {
double ind=iCustom(Symbol(),0,"indicator_name",0,i);
if(ind!=0) {
if(n>1) n--; else return(ind);
}
}
}
double get_extrem(int n) {
for(int i=1;;i++) {
double ind=iCustom(Symbol(),0,"indicator_name",0,i);
if(ind!=0) {
if(n>1) n--; else return(ind);
}
}
}
В общем то, и так и так прекрасно всё. Просто я привык код писать немного иначе, мне так читается проще, а у вас по другому. У вас скобка первая каждая не переносится. Я у себя разложил в Эдиторе и всё стало на свои места в таком виде:
В общем то, и так и так прекрасно всё. Просто я привык код писать немного иначе, мне так читается проще, а у вас по другому. У вас скобка первая каждая не переносится. Я у себя разложил в Эдиторе и всё стало на свои места в таком виде:
когда код перешагивает за over 1000 строк, начинаешь писать компактно )
также в MT4 страдает быстродействие, особенно когда проводишь тесты. Лаконичный вариант исполняется быстрее.