Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Khizantsyan Arsentiy
73
Khizantsyan Arsentiy  

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

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

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

Роман
7939
Роман  
Doctor.Tiy:

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

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

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


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

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

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


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

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

Artyom Trishkin
Модератор
78949
Artyom Trishkin  
evillive:

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

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


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

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

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

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


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

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

Vitalie Postolache
12317
Vitalie Postolache  

Попытался индикатор переделать чтобы в будущее не смотрел, заодно для новых билдов ошибку "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);
}
//+------------------------------------------------------------------+
Vitalie Postolache
12317
Vitalie Postolache  

Уважаемые гуру оптимизации кода, в чём всё же причина таких тормозов данного кода и как исправить? Не ради этого индикатора, науки ради, вторые сутки мозги ломаю, этож надо же уметь сделать так, 5000 баров больше секунды обсчитывает )))

Мысля есть у меня что слишком дофига много раз вызывается индикатор МА, пробовал в два приёма считать - в первом цикле заполнять массив буфера, а во втором - искать "типа фракталы на MACD", по задумке автора, так стрелок не рисует.

Victor Nikolaev
Модератор
14810
Victor Nikolaev  
evillive:

Уважаемые гуру оптимизации кода, в чём всё же причина таких тормозов данного кода и как исправить? Не ради этого индикатора, науки ради, вторые сутки мозги ломаю, этож надо же уметь сделать так, 5000 баров больше секунды обсчитывает )))

Мысля есть у меня что слишком дофига много раз вызывается индикатор МА, пробовал в два приёма считать - в первом цикле заполнять массив буфера, а во втором - искать "типа фракталы на MACD", по задумке автора, так стрелок не рисует.


Второй цикл зачем сделали? (я про выложенный код)
Vitalie Postolache
12317
Vitalie Postolache  

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

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


//+------------------------------------------------------------------+
//|                                                  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);
}
//+------------------------------------------------------------------+
Victor Nikolaev
Модератор
14810
Victor Nikolaev  
evillive:

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

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



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