1. Достаточно одного буфера
2. Если даете одним буферам сериес, то и основному тоже надо true
3. Функции поиска экстремумов возвращают ИНДЕКСЫ, а не сами значения
4. Про остальное не спрашивайте :)
#property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 #property indicator_type1 DRAW_ARROW #property indicator_color1 DodgerBlue input int HLPeriod=3; input double K=0.5; input int MinStep=10; double PlotBuffer[]; //------------------------------------------------------------------ void OnInit() { SetIndexBuffer(0,PlotBuffer); PlotIndexSetInteger(0,PLOT_ARROW,159); } //------------------------------------------------------------------ int OnCalculate(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[]) { ArraySetAsSeries(high, true); ArraySetAsSeries(low, true); ArraySetAsSeries(PlotBuffer, true); int limit; if(prev_calculated>1) limit=prev_calculated-1; else limit=0; for(int i=rates_total-1-HLPeriod; i>=limit; i--) { PlotBuffer[i]=PlotBuffer[i+1]; double h=high[ArrayMaximum(high, i, HLPeriod)]; double l=low[ArrayMinimum(low, i, HLPeriod)]; double av=0; for (int j=i;j<i+HLPeriod;j++) av+=(high[j]-low[j]); av/=HLPeriod; if(av>=(h-l)*K) if(MathAbs((h+l)/2-PlotBuffer[i])>=Point()*MinStep) PlotBuffer[i]=(h+l)/2; } return(rates_total); }
1. Достаточно одного буфера
2. Если даете одним буферам сериес, то и основному тоже надо true
3. Функции поиска экстремумов возвращают ИНДЕКСЫ, а не сами значения
4. Про остальное не спрашивайте :)
огромное спс, еще уточните про п.2
- без ArraySetAsSeries() можно код писать или обязательно так?
- почему мой первый вариант не переделался как в статье?
ЗЫ:в принципе все это я знал, но чет когда обнаружил отсутствие МТ4-шных iHighest и iLowest начались скачки по справке и форуму, и совершенно потерял нить рассуждений
огромное спс, еще уточните про п.2
- без ArraySetAsSeries() можно код писать или обязательно так?
1. Можно скорей всего. Только информация отображаемая или анализируемая индикатором (в зависимости от характера информации в массивах) может отображаться при этом не совсем так как это задумано.
Если в двух словах то так - Текущие бары (расположенные в правой части графика) будут в разных условиях считаться первыми или последними. Также информация которую отображает индюк может оказаться условно "перевернутой" по оси времени.
Также в этом сулучае следует подумать о циклах, какие они должны быть: нарастающие или убывающие (от 0 до n / от n до 0).
PS
Хотел как проще, получилось как всегда... :)
2. iHighest и iLowest вроде были представлены в статье про миграцию. Насколько они работоспособные правда не скажу (у меня своя библиотека для этих целей)...
спс за участие, но, увы - Ваш ответ информации не нес, единственное, соглашусь, что циклы нужно перепроверить
Можно мозги в узел завязать.
Как только узнал что в mql5 можно нормально работать с массивами в прямом порядке, сразу все индикаторы и эксперты пишу с нормальным обращением к элементам массива.
Прошлое -> будущее
0 -> 100
А если сомневаетесь в правильности, используйте отладку, поймете что и куда. :)
Ну не знаю, я вот недолюбливаю когда массив, как серия.
Можно мозги в узел завязать.
Как только узнал что в mql5 можно нормально работать с массивами в прямом порядке, сразу все индикаторы и эксперты пишу с нормальным обращением к элементам массива.
Прошлое -> будущее
0 -> 100
А если сомневаетесь в правильности, используйте отладку, поймете что и куда. :)
При совместном использовании МТ4 и MT5 (бывает и такое)... :) придется использовать серийность в любом случае.
Да и в получении данных от индюка или с графика удобней это, на мой взгляд - указал последний бар как 0 и не мучайся...
Ну не знаю, я вот недолюбливаю когда массив, как серия.
Можно мозги в узел завязать.
Как только узнал что в mql5 можно нормально работать с массивами в прямом порядке, сразу все индикаторы и эксперты пишу с нормальным обращением к элементам массива.
Прошлое -> будущее
0 -> 100
А если сомневаетесь в правильности, используйте отладку, поймете что и куда. :)
угу, тяжело с МТ4 на МТ5 переходить, привычки портят логику написания программ,
спс, значит ArraySetAsSeries() можно и убрать если не требуется для специфических задач
Помогите найти ошибку, пол дня ищу, не могу найти,
вот эта прграмма в виде скрипта работает правильно:
static datetime S_F[]={0,0}; void OnStart() { MqlDateTime tms; string st, fi; bool session=false; datetime start1=0, finish1=0, start=0, finish=0; ENUM_DAY_OF_WEEK days[]={SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY}; for(int i=0;i<7;i++) { session=SymbolInfoSessionQuote(_Symbol,days[i],0,start1,finish1); if(session) { st=TimeToString(TimeCurrent(),TIME_DATE)+" "+TimeToString(start1,TIME_SECONDS); fi=TimeToString(TimeCurrent(),TIME_DATE)+" "+TimeToString(finish1-1,TIME_SECONDS); start1=StringToTime(st); finish1=StringToTime(fi); TimeToStruct(start1,tms); for(int m=0; m<7; m++) { if(days[tms.day_of_week]==days[m]) { int k=(m-i)*86400; start1=start1-k; finish1=finish1-k+1; break; } } if(start==0) start=start1; if(finish==0) finish=finish1; if(finish==start1) finish=finish1; } } if(S_F[0]!=start) {S_F[0]=start; S_F[1]=finish;} Print("Начало сессии оп ",_Symbol,": ",TimeToString(S_F[0],TIME_DATE|TIME_SECONDS)," конец сессии: ",TimeToString(S_F[1],TIME_DATE|TIME_SECONDS)); return; }
при запуске на тестере в виде эксперта работает неправильно:
static datetime S_F[]={0,0}; int OnInit() { EventSetTimer(86000); return(0); } void OnDeinit(const int reason) { EventKillTimer(); } void OnTimer() { MqlDateTime tms; string st, fi; bool session=false; datetime start1=0, finish1=0, start=0, finish=0; ENUM_DAY_OF_WEEK days[]={SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY}; for(int i=0;i<7;i++) { session=SymbolInfoSessionQuote(_Symbol,days[i],0,start1,finish1); if(session) { st=TimeToString(TimeCurrent(),TIME_DATE)+" "+TimeToString(start1,TIME_SECONDS); fi=TimeToString(TimeCurrent(),TIME_DATE)+" "+TimeToString(finish1-1,TIME_SECONDS); start1=StringToTime(st); finish1=StringToTime(fi); TimeToStruct(start1,tms); for(int m=0; m<7; m++) { if(days[tms.day_of_week]==days[m]) { int k=(m-i)*86400; start1=start1-k; finish1=finish1-k+1; break; } } if(start==0) start=start1; if(finish==0) finish=finish1; if(finish==start1) finish=finish1; } } if(S_F[0]!=start) {S_F[0]=start; S_F[1]=finish;} Print("Начало сессии оп ",_Symbol,": ",TimeToString(S_F[0],TIME_DATE|TIME_SECONDS)," конец сессии: ",TimeToString(S_F[1],TIME_DATE|TIME_SECONDS)); return; }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
собственно сабж, буду рад, если кто растолкует в чем принципиальная разница между МТ4 и МТ5 при написании индикаторов
хочу переделать индикатор: KvantLevel.mq4
1-й вариант по статье https://www.mql5.com/ru/articles/81
2-й вариант пытаюсь заменить ф-ции МТ4 iHighest и iLowest на ArrayMaximum() и ArrayMinimum()
но , увы два часа пробую переделать простой индикатор и все никак :)
заранее спс