Задача состоит в том чтобы перенести алгоритм индикатора на алгоритм советника а точнее условия по которому работает индикатор на условия по которому работает советник...
А то запутался... Подробности по ходу...
С уважением Тий.
Уважаемый доктор, создание ников с "точкой" внутри запрещено правилами форума.
Уважаемый доктор, создание ников с "точкой" внутри запрещено правилами форума.
Нету такого, не надо выдумывать. Запрещены адреса веб-сайтов.
Что до вопроса, немного непонятно, то ли "как перенести алгоритм индикатора в советника", то ли "как правильно вызывать индикатор из советника"? В советнике-то вызывается МА, а индикатор - модифицированный МАСД, принцип торговли которым - непонятен.
Автор, сделайте скриншот стандартного MACD и нарисуйте на нём что должно получиться, а то этот ваш индикатор не очень понятен. Ну и принцип торговли в советнике данныи индикатором само собой.
Нету такого, не надо выдумывать. Запрещены адреса веб-сайтов.
Дело не в том что разрешено или запрещено. Попробуйте зайти к нему в профиль.
А, понял. Ну тогда добавить бы правило надо )))
Задача состоит в том чтобы перенести алгоритм индикатора на алгоритм советника а точнее условия по которому работает индикатор на условия по которому работает советник...
А то запутался... Подробности по ходу...
С уважением Тий.
Зачем переносить код индикатора, заглядывающего в будущее в советник.
Такие индикаторы только на графике хороши
Попытался индикатор переделать чтобы в будущее не смотрел, заодно для новых билдов ошибку "Array out of range" устранил.
Но теперь другая бяка - индикатор стрелки рисует только после изменения параметров или ручного обновления окна, а также полностью игнорируется значение переменной 'delta' (хотя может не игнорирует а просто не перерасчитывает без ручного обновления окна).
А также он стал ужасно тормозить, пришлось ввести ограничение на отрисовку в 1000 баров, так как не нашёл отчего именно тормоза...
//+------------------------------------------------------------------+ //| Custom MACD.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Doctor.Tiy & Anya.Bu.." //---- indicator settings #property indicator_separate_window #property indicator_buffers 6 #property indicator_color1 Yellow #property indicator_color2 Red #property indicator_color3 Blue #property indicator_color4 Green #property indicator_color5 Gray #property indicator_color6 Gray #property indicator_width1 1 #property indicator_width2 2 #property indicator_width3 2 //---- indicator parameters extern int drawbars=1000; extern int FastEMA=12; extern int SlowEMA=26; //---- indicator buffers double MacdBuffer[]; double F_upper[]; double F_lower[]; double L_Close0[]; double L_Close1[]; double L_CloseDelta[]; extern double delta =0.0001; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexStyle(1,DRAW_ARROW); SetIndexStyle(2,DRAW_ARROW); SetIndexStyle(3,DRAW_LINE); //---- indicator buffers mapping SetIndexBuffer(0,MacdBuffer); SetIndexBuffer(1,F_upper); SetIndexBuffer(2,F_lower); SetIndexBuffer(3,L_CloseDelta); return(0); } //+------------------------------------------------------------------+ //| Moving Averages Convergence/Divergence | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int n=drawbars; int limit=Bars-counted_bars, i=0; //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; if(drawbars>limit) n=limit; for(i=0; i<limit; i++) { MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i); for(int k=i+2;k<n-2;k++) { L_CloseDelta[k]=Close[k]-Close[k+1]; if (MacdBuffer[k]>delta && MacdBuffer[k]>MacdBuffer[k-2] && MacdBuffer[k]>MacdBuffer[k-1] && MacdBuffer[k]>MacdBuffer[k+1] && MacdBuffer[k]>MacdBuffer[k+2]) {F_upper[k]=MacdBuffer[k]; F_lower[k]=EMPTY_VALUE;} if (MacdBuffer[k]<-delta && MacdBuffer[k]<MacdBuffer[k-2] && MacdBuffer[k]<MacdBuffer[k-1] && MacdBuffer[k]<MacdBuffer[k+1] && MacdBuffer[k]<MacdBuffer[k+2]) {F_lower[k]=MacdBuffer[k]; F_upper[k]=EMPTY_VALUE;} } } return(0); } //+------------------------------------------------------------------+
Уважаемые гуру оптимизации кода, в чём всё же причина таких тормозов данного кода и как исправить? Не ради этого индикатора, науки ради, вторые сутки мозги ломаю, этож надо же уметь сделать так, 5000 баров больше секунды обсчитывает )))
Мысля есть у меня что слишком дофига много раз вызывается индикатор МА, пробовал в два приёма считать - в первом цикле заполнять массив буфера, а во втором - искать "типа фракталы на MACD", по задумке автора, так стрелок не рисует.
Уважаемые гуру оптимизации кода, в чём всё же причина таких тормозов данного кода и как исправить? Не ради этого индикатора, науки ради, вторые сутки мозги ломаю, этож надо же уметь сделать так, 5000 баров больше секунды обсчитывает )))
Мысля есть у меня что слишком дофига много раз вызывается индикатор МА, пробовал в два приёма считать - в первом цикле заполнять массив буфера, а во втором - искать "типа фракталы на MACD", по задумке автора, так стрелок не рисует.
Второй цикл зачем сделали? (я про выложенный код)
Сам не знаю, показалось что так надо, с массивами не очень дружу если это не ценовой массив
Вроде исправил, лучше не смог, циклов всё равно получилось больше одного, никак не считало как надо в одном. Индикатор в будущее не заглядывает, тормозить перестал и за пределы массива больше не вылезает:
//+------------------------------------------------------------------+ //| MACD_TIY.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //|v1.03 | //+------------------------------------------------------------------+ #property copyright "Doctor.Tiy & Anya.Bu.." //---- indicator settings #property indicator_separate_window #property indicator_buffers 5 #property indicator_color1 Magenta #property indicator_color2 Teal #property indicator_color3 Olive #property indicator_color4 Red #property indicator_color5 DimGray #property indicator_width1 2 #property indicator_width2 2 #property indicator_width3 2 #property indicator_width3 1 //---- indicator parameters extern int FastEMA=12; extern int SlowEMA=26; extern int SignalSMA=9; extern int price=0; extern double delta =0.0001; //---- indicator buffers double MacdBuffer[]; double F_upper[]; double F_lower[]; double signal[]; double L_CloseDelta[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicator buffers mapping SetIndexBuffer(0,F_upper); SetIndexBuffer(1,F_lower); SetIndexBuffer(2,MacdBuffer); SetIndexBuffer(3,signal); SetIndexBuffer(4,L_CloseDelta); //---- drawing settings SetIndexStyle(0,DRAW_ARROW,EMPTY,2); SetIndexArrow(0,217); SetIndexStyle(1,DRAW_ARROW,EMPTY,2); SetIndexArrow(1,218); SetIndexStyle(2,DRAW_HISTOGRAM,EMPTY,2); SetIndexStyle(3,DRAW_LINE); SetIndexStyle(4,DRAW_LINE); SetIndexLabel(0,"Fr_Up"); SetIndexLabel(1,"Fr_Dn"); SetIndexLabel(2,"MACD"); SetIndexLabel(3,"Signal"); SetIndexLabel(4,"Delta"); SetLevelValue(0,0); SetLevelStyle(2,0,Gray); IndicatorShortName("MACD_TIY: ("+IntegerToString(FastEMA)+","+IntegerToString(SlowEMA)+","+IntegerToString(SignalSMA)+")"); return(0); } //+------------------------------------------------------------------+ //| Moving Averages Convergence/Divergence | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int limit=0, i=0, m=0; //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; for(i=0; i<limit; i++) MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,price,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,price,i); for(i=0; i<limit; i++) signal[i]=iMAOnArray(MacdBuffer,0,SignalSMA,0,MODE_SMA,i); for(int k=2;k<=limit-2;k++) { L_CloseDelta[k]=Close[k]-Close[m]; if (MacdBuffer[k]>delta){ if ( MacdBuffer[k]>MacdBuffer[k-2]){ if ( MacdBuffer[k]>MacdBuffer[k-1]){ if ( MacdBuffer[k]>MacdBuffer[k+1]){ if ( MacdBuffer[k]>MacdBuffer[k+2]) {F_upper[k]=MacdBuffer[k]*2; F_lower[k]=EMPTY_VALUE; m=k;} }}}} if (MacdBuffer[k]<-delta){ if ( MacdBuffer[k]<MacdBuffer[k-2]){ if ( MacdBuffer[k]<MacdBuffer[k-1]){ if ( MacdBuffer[k]<MacdBuffer[k+1]){ if ( MacdBuffer[k]<MacdBuffer[k+2]) {F_lower[k]=MacdBuffer[k]*2; F_upper[k]=EMPTY_VALUE; m=k;} }}}} } return(0); } //+------------------------------------------------------------------+
Сам не знаю, показалось что так надо, с массивами не очень дружу если это не ценовой массив
Вроде исправил, лучше не смог, циклов всё равно получилось больше одного, никак не считало как надо в одном. Индикатор в будущее не заглядывает, тормозить перестал и за пределы массива больше не вылезает:
Если limit меньше двух то последний цикл работать не будет, точнее будет работать только на истории. У Вас limit равен 1 или 2. Все время пересчитываете один бар
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Задача состоит в том чтобы перенести алгоритм индикатора на алгоритм советника а точнее условия по которому работает индикатор на условия по которому работает советник...
А то запутался... Подробности по ходу...
С уважением Тий.