Здравствуйте. Вроде сделал как надо. "Вылезло" куча ошибок. Вы извините, я mql5 только начинаю программировать. Файл с индюком я прикрепил ниже. Спасибо Вам, за помощь.
В логе написаны ошибки, почитайте их и примите решение.
Vitaly Muzichenko, здравствуйте. Дело в том, что у меня была проблема, как совместить две функции int OnCalculate в одном индикаторе. Зачем это мне надо. Я хочу совместить два зигзага в одном индюке с разными параметрами, к примеру: 12, 5,3 и 52, 26, 9. Я данный индюк составил, однако у меня получилось две конструкции OnCalculatе, вместе они не работают. При этом, если я одну из двух функций кидаю в коменты, у меня всё работает. Теперь, я обратился в чат с проблемой совместимости зарезервированных слов. Мне, один, из представителей mql сообщества предложил вариант и за это ему большое спасибо. Данный вариант, исключает оператор "limit", вместо этого он предложил конструкцию extreme_search=Extremum. Я её не знаю, мне бы стандартный алгоритм изучить). Код в логе в первую очередь ругается на extreme_search=Extremum. При этом, мне написали "Именно в таком виде как я показал, ничего более." Я не говорю, что всё понимаю, мне до этого как Вам ползком до Китая. Если Вы знаете ответ, на мой вопрос, как объединить две функции OnCalculatе в одну, подскажите. Готовый файл mql прекреплён на странице 2521. С большим к Вам уважением, буду ждать ответа.
Vitaly Muzichenko, здравствуйте. Дело в том, что у меня была проблема, как совместить две функции int OnCalculate в одном индикаторе.
Вы так и не поняли, нельзя использовать два "int OnCalculatе" в одном индикаторе.
Вам предложили два варианта решения вопроса, но Вы либо не понимаете принципа работы предложенных вариантов, либо не хотите понимать.
Повторюсь еще раз и надеюсь Вы поймете.
В "int OnCalculatе"добавляете обращение к двум функциям(выделил желтым) - это именно обращение(вызов функции), больше сюда ничего добавлять не надо!
//+------------------------------------------------------------------+//| ZigZag calculation |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
OnCalculateOne(rates_total,prev_calculated,time,open,high,low,close,tick_volume,volume,spread);
OnCalculateTwo(rates_total,prev_calculated,time,open,high,low,close,tick_volume,volume,spread);//--- return value of prev_calculated for next callreturn(rates_total);
}
Далее Вам надо прописать эти функции которые вызываются из "int OnCalculatе" и первую функцию я Вам расписал
//+------------------------------------------------------------------+//| ZigZag calculation One |//+------------------------------------------------------------------+int OnCalculateOne(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---int i=0;
int start=0,extreme_counter=0,extreme_search=Extremum;
int shift=0,back=0,last_high_pos=0,last_low_pos=0;
double val=0,res=0;
double curlow=0,curhigh=0,last_high=0,last_low=0;
//--- initializingif(prev_calculated==0)
{
ArrayInitialize(ZigZagBuffer,0.0);
ArrayInitialize(HighMapBuffer,0.0);
ArrayInitialize(LowMapBuffer,0.0);
start=InpDepth;
}
//--- ZigZag was already calculated beforeif(prev_calculated>0)
{
i=rates_total-1;
//--- searching for the third extremum from the last uncompleted barwhile(extreme_counter<ExtRecalc && i>rates_total-100)
{
res=ZigZagBuffer[i];
if(res!=0.0)
extreme_counter++;
i--;
}
i++;
start=i;
//--- what type of exremum we search forif(LowMapBuffer[i]!=0.0)
{
curlow=LowMapBuffer[i];
extreme_search=Peak;
}
else
{
curhigh=HighMapBuffer[i];
extreme_search=Bottom;
}
//--- clear indicator valuesfor(i=start+1; i<rates_total && !IsStopped(); i++)
{
ZigZagBuffer[i] =0.0;
LowMapBuffer[i] =0.0;
HighMapBuffer[i]=0.0;
}
}
//--- searching for high and low extremesfor(shift=start; shift<rates_total && !IsStopped(); shift++)
{
//--- low
val=low[Lowest(low,InpDepth,shift)];
if(val==last_low)
val=0.0;
else
{
last_low=val;
if((low[shift]-val)>InpDeviation*_Point)
val=0.0;
else
{
for(back=1; back<=InpBackstep; back++)
{
res=LowMapBuffer[shift-back];
if((res!=0) && (res>val))
LowMapBuffer[shift-back]=0.0;
}
}
}
if(low[shift]==val)
LowMapBuffer[shift]=val;
else
LowMapBuffer[shift]=0.0;
//--- high
val=high[Highest(high,InpDepth,shift)];
if(val==last_high)
val=0.0;
else
{
last_high=val;
if((val-high[shift])>InpDeviation*_Point)
val=0.0;
else
{
for(back=1; back<=InpBackstep; back++)
{
res=HighMapBuffer[shift-back];
if((res!=0) && (res<val))
HighMapBuffer[shift-back]=0.0;
}
}
}
if(high[shift]==val)
HighMapBuffer[shift]=val;
else
HighMapBuffer[shift]=0.0;
}
//--- set last valuesif(extreme_search==0) // undefined values
{
last_low=0.0;
last_high=0.0;
}
else
{
last_low=curlow;
last_high=curhigh;
}
//--- final selection of extreme points for ZigZagfor(shift=start; shift<rates_total && !IsStopped(); shift++)
{
res=0.0;
switch(extreme_search)
{
case Extremum:
if(last_low==0.0 && last_high==0.0)
{
if(HighMapBuffer[shift]!=0)
{
last_high=high[shift];
last_high_pos=shift;
extreme_search=Bottom;
ZigZagBuffer[shift]=last_high;
res=1;
}
if(LowMapBuffer[shift]!=0.0)
{
last_low=low[shift];
last_low_pos=shift;
extreme_search=Peak;
ZigZagBuffer[shift]=last_low;
res=1;
}
}
break;
case Peak:
if(LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<last_low && HighMapBuffer[shift]==0.0)
{
ZigZagBuffer[last_low_pos]=0.0;
last_low_pos=shift;
last_low=LowMapBuffer[shift];
ZigZagBuffer[shift]=last_low;
res=1;
}
if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0)
{
last_high=HighMapBuffer[shift];
last_high_pos=shift;
ZigZagBuffer[shift]=last_high;
extreme_search=Bottom;
res=1;
}
break;
case Bottom:
if(HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>last_high && LowMapBuffer[shift]==0.0)
{
ZigZagBuffer[last_high_pos]=0.0;
last_high_pos=shift;
last_high=HighMapBuffer[shift];
ZigZagBuffer[shift]=last_high;
}
if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0)
{
last_low=LowMapBuffer[shift];
last_low_pos=shift;
ZigZagBuffer[shift]=last_low;
extreme_search=Peak;
}
break;
default:
return(rates_total);
}
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
Вам осталось сделать аналогичную функцию для второго зиг-зага, т.е. просто скопировать ее еще раз переименовать в "OnCalculateTwo" и естественно использовать имена буферов для второго зиг-зага.
Все остальные функции "int Highest", "int Lowest" оставить без изменений
Здравствуйте! Подскажите, как можно узнать временные рамки между двух условий для появления сигнала? Ну т.е событие А = 16:00 Событие В = 19:00 и далее построить линию. Я сделал это следующим образом:
Ну или проще: Как узнать сколько баров между двух событий? Это нужно, чтобы изменить количество баров для рассчета в событие А. Т.е сигнал А может быть в приделах от предыдущего бара, до 8 бара ранее
Sergei Gurov #: Здравствуйте! Подскажите, как можно узнать временные рамки между двух условий для появления сигнала? Ну т.е событие А = 16:00 Событие В = 19:00 и далее построить линию. Я сделал это следующим образом: Ну или проще: Как узнать сколько баров между двух событий? Это нужно, чтобы изменить количество баров для рассчета в событие А. Т.е сигнал А может быть в приделах от предыдущего бара, до 8 бара ранее
Возможно невнятно сформулировал... Ну то есть: Произошло событие "А", затем событие В. И до тех пор, пока между событиями А и В не появится больше 8 баров, рисуется линия. Но т.к я и там и там использую текущие значения high и low, то и time получается одинаковым. Как исправить одинаковые значения Time?
Возможно невнятно сформулировал... Ну то есть: Произошло событие "А", затем событие В. И до тех пор, пока между событиями А и В не появится больше 8 баров, рисуется линия. Но т.к я и там и там использую текущие значения high и low, то и time получается одинаковым. Как исправить одинаковые значения Time?
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Здравствуйте. Вроде сделал как надо. "Вылезло" куча ошибок. Вы извините, я mql5 только начинаю программировать. Файл с индюком я прикрепил ниже. Спасибо Вам, за помощь.
В OnCalculate - только вызов функций.
Именно в таком виде как я показал, ничего более.
Аналогично для второго зиг-зага со своими буферами
Именно в таком виде как я показал, ничего более.
Аналогично для второго зиг-зага со своими буферами
Всё скопировал в таком виде как Вы показали, ничего более.
матерится так:
Всё скопировал в таком виде как Вы показали, ничего более.
матерится так:
Нужно не копировать, а понимать что делаете.
В логе написаны ошибки, почитайте их и примите решение.
Всё скопировал в таком виде как Вы показали, ничего более.
матерится так:
Аналогично для второго зиг-зага со своими буферами
Нужно не копировать, а понимать что делаете.
В логе написаны ошибки, почитайте их и примите решение.
Vitaly Muzichenko, здравствуйте. Дело в том, что у меня была проблема, как совместить две функции int OnCalculate в одном индикаторе. Зачем это мне надо. Я хочу совместить два зигзага в одном индюке с разными параметрами, к примеру: 12, 5,3 и 52, 26, 9. Я данный индюк составил, однако у меня получилось две конструкции OnCalculatе, вместе они не работают. При этом, если я одну из двух функций кидаю в коменты, у меня всё работает. Теперь, я обратился в чат с проблемой совместимости зарезервированных слов. Мне, один, из представителей mql сообщества предложил вариант и за это ему большое спасибо. Данный вариант, исключает оператор "limit", вместо этого он предложил конструкцию extreme_search=Extremum. Я её не знаю, мне бы стандартный алгоритм изучить). Код в логе в первую очередь ругается на extreme_search=Extremum. При этом, мне написали "Именно в таком виде как я показал, ничего более." Я не говорю, что всё понимаю, мне до этого как Вам ползком до Китая. Если Вы знаете ответ, на мой вопрос, как объединить две функции OnCalculatе в одну, подскажите. Готовый файл mql прекреплён на странице 2521. С большим к Вам уважением, буду ждать ответа.
Vitaly Muzichenko, здравствуйте. Дело в том, что у меня была проблема, как совместить две функции int OnCalculate в одном индикаторе.
Вы так и не поняли, нельзя использовать два "int OnCalculatе" в одном индикаторе.
Вам предложили два варианта решения вопроса, но Вы либо не понимаете принципа работы предложенных вариантов, либо не хотите понимать.
Повторюсь еще раз и надеюсь Вы поймете.
В "int OnCalculatе"добавляете обращение к двум функциям(выделил желтым) - это именно обращение(вызов функции), больше сюда ничего добавлять не надо!
Далее Вам надо прописать эти функции которые вызываются из "int OnCalculatе" и первую функцию я Вам расписал
Вам осталось сделать аналогичную функцию для второго зиг-зага, т.е. просто скопировать ее еще раз переименовать в "OnCalculateTwo" и естественно использовать имена буферов для второго зиг-зага.
Все остальные функции "int Highest", "int Lowest" оставить без изменений
Я сделал это следующим образом:
Ну или проще: Как узнать сколько баров между двух событий?
Это нужно, чтобы изменить количество баров для рассчета в событие А. Т.е сигнал А может быть в приделах от предыдущего бара, до 8 бара ранее
Здравствуйте! Подскажите, как можно узнать временные рамки между двух условий для появления сигнала? Ну т.е событие А = 16:00 Событие В = 19:00 и далее построить линию.
Я сделал это следующим образом:
Ну или проще: Как узнать сколько баров между двух событий?
Это нужно, чтобы изменить количество баров для рассчета в событие А. Т.е сигнал А может быть в приделах от предыдущего бара, до 8 бара ранее
Возможно невнятно сформулировал... Ну то есть:
Произошло событие "А", затем событие В. И до тех пор, пока между событиями А и В не появится больше 8 баров, рисуется линия. Но т.к я и там и там использую текущие значения high и low, то и time получается одинаковым. Как исправить одинаковые значения Time?
Возможно невнятно сформулировал... Ну то есть:
Произошло событие "А", затем событие В. И до тех пор, пока между событиями А и В не появится больше 8 баров, рисуется линия. Но т.к я и там и там использую текущие значения high и low, то и time получается одинаковым. Как исправить одинаковые значения Time?
У меня нет конкретного числа баров. Оно может быть в приделах от единицы до восьми