Уважаемые программисты помогите перенести алгоритм индикатора на алгоритм советника!!!

 

Задача состоит в том чтобы перенести алгоритм индикатора на алгоритм советника а точнее условия по которому работает индикатор на условия по которому работает советник...

А то запутался... Подробности по ходу...

С уважением Тий.

Файлы:
 
Doctor.Tiy:

Задача состоит в том чтобы перенести алгоритм индикатора на алгоритм советника а точнее условия по которому работает индикатор на условия по которому работает советник...

А то запутался... Подробности по ходу...

С уважением Тий.


Уважаемый доктор, создание ников с "точкой" внутри запрещено правилами форума.
 
Roman.:

Уважаемый доктор, создание ников с "точкой" внутри запрещено правилами форума.

Нету такого, не надо выдумывать. Запрещены адреса веб-сайтов.


Что до вопроса, немного непонятно, то ли "как перенести алгоритм индикатора в советника", то ли "как правильно вызывать индикатор из советника"? В советнике-то вызывается МА, а индикатор - модифицированный МАСД, принцип торговли которым - непонятен.

Автор, сделайте скриншот стандартного MACD и нарисуйте на нём что должно получиться, а то этот ваш индикатор не очень понятен. Ну и принцип торговли в советнике данныи индикатором само собой.

 
evillive:

Нету такого, не надо выдумывать. Запрещены адреса веб-сайтов.

Дело не в том что разрешено или запрещено. Попробуйте зайти к нему в профиль.
 
artmedia70:
Дело не в том что разрешено или запрещено. Попробуйте зайти к нему в профиль.


А, понял. Ну тогда добавить бы правило надо )))
 
Doctor.Tiy:

Задача состоит в том чтобы перенести алгоритм индикатора на алгоритм советника а точнее условия по которому работает индикатор на условия по которому работает советник...

А то запутался... Подробности по ходу...

С уважением Тий.


Зачем переносить код индикатора, заглядывающего в будущее в советник.

Такие индикаторы только на графике хороши

 

Попытался индикатор переделать чтобы в будущее не смотрел, заодно для новых билдов ошибку "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", по задумке автора, так стрелок не рисует.

 
evillive:

Уважаемые гуру оптимизации кода, в чём всё же причина таких тормозов данного кода и как исправить? Не ради этого индикатора, науки ради, вторые сутки мозги ломаю, этож надо же уметь сделать так, 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);
}
//+------------------------------------------------------------------+
 
evillive:

Сам не знаю, показалось что так надо, с массивами не очень дружу если это не ценовой массив

Вроде исправил, лучше не смог, циклов всё равно получилось больше одного, никак не считало как надо в одном. Индикатор в будущее не заглядывает, тормозить перестал и за пределы массива больше не вылезает:



Если limit меньше двух то последний цикл работать не будет, точнее будет работать только на истории. У Вас limit равен 1 или 2. Все время пересчитываете один бар
Причина обращения: