Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2523
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
У меня нет конкретного числа баров. Оно может быть в приделах от единицы до восьми
Суть такова: если более 8 баров - не рисуем
Так как мне узнать date1,date2,date3?
Есть появления сигнала А, далее сигнал В, но т.к и там и там используется high and low только текущего бара, то и значения time одинаковые. Как исправить одинаковые time, зная что между сигналами А и В не может быть меньше одного бара и больше восьми баров?
Так как мне узнать date1,date2,date3?
Есть появления сигнала А, далее сигнал В, но т.к и там и там используется high and low только текущего бара, то и значения time одинаковые. Как исправить одинаковые time, зная что между сигналами А и В не может быть меньше одного бара и больше восьми баров?
Спасибо!
//+------------------------------------------------------------------+ //| ZigZag calculation One | //+------------------------------------------------------------------+ int OnCalculateOne(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &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; //--- initializing if(prev_calculated==0) { ArrayInitialize(ZigZagBuffer,0.0); ArrayInitialize(HighMapBuffer,0.0); ArrayInitialize(LowMapBuffer,0.0); start=InpDepth; } //--- ZigZag was already calculated before if(prev_calculated>0) { i=rates_total-1; //--- searching for the third extremum from the last uncompleted bar while(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 for if(LowMapBuffer[i]!=0.0) { curlow=LowMapBuffer[i]; extreme_search=Peak; } else { curhigh=HighMapBuffer[i]; extreme_search=Bottom; } //--- clear indicator values for(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 extremes for(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 values if(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 ZigZag for(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 call return(rates_total); }
Вы так и не поняли, нельзя использовать два "int OnCalculatе" в одном индикаторе.
Вам предложили два варианта решения вопроса, но Вы либо не понимаете принципа работы предложенных вариантов, либо не хотите понимать.
Повторюсь еще раз и надеюсь Вы поймете.
В "int OnCalculatе"добавляете обращение к двум функциям(выделил желтым) - это именно обращение(вызов функции), больше сюда ничего добавлять не надо!
Далее Вам надо прописать эти функции которые вызываются из "int OnCalculatе" и первую функцию я Вам расписал
Вам осталось сделать аналогичную функцию для второго зиг-зага, т.е. просто скопировать ее еще раз переименовать в "OnCalculateTwo" и естественно использовать имена буферов для второго зиг-зага.
Все остальные функции "int Highest", "int Lowest" оставить без изменений
Да я вас прекрасно понял с первого раза. Спасибо Вам за данный мне совет. Всё сделал как Вы сказали. Однако, ещё раз повторяю, компилятор ругается на конструкцию: extreme_search=Extremum;
ругается на конструкцию: extreme_search=Extremum;
Пользуйтесь переводчиком!
'Extremum' - undeclared identifier (не объявленный идентификатор)Вы вначале кода эту переменную удалили или изменили.
Пользуйтесь переводчиком!
'Extremum' - undeclared identifier (не объявленный идентификатор)Вы вначале кода эту переменную удалили или изменили.
Я эту переменную совсем не трогал
Я сравнил с обычным зигзагом, там стоит конструкция: exTreme_search=0, а у нас конструкция: extreme_search=Extremum;
Я так понял, что ошибка связана с целыми числами.Я эту переменную совсем не трогал
Я сравнил с обычным зигзагом, там стоит конструкция: exTreme_search=0, а у нас конструкция: extreme_search=Extremum;
Я так понял, что ошибка связана с целыми числами.Я сравнил с обычным зигзагом
Скорее всего мы использовали разные зиг-заги.
Я использовал стандартный из папки "Examples"
Ростислав, а как в таком случае учесть число баров между событиями А и В?
Если между ними более 8 баров, то тогда линии не создаются, я попробовал сделать вот так, но у меня вышло не очень: