Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 252

 
ALXIMIKS:
посмотрите эту статью, все не на столько просто как кажется, и в общем весьма полезно.

посмотрел. на ее детально изучение у меня уйдет неделя. но хуже того, что я не нашел там мест которые бы были связаны с моей задачей. я не раскрашиваю индикаторы, и вообще никак их не модифицирую. я лишь хочу найти максимумы и минимумы на n-последних барах. есть там намек на сходство в RSI_Extremums_Sample.mq4 но мне этот код не осилить. там много лишнего, там индикатор РИСУЕТСЯ.... а мне это не нужно...
 
lottamer:

посмотрел. на ее детально изучение у меня уйдет неделя. но хуже того, что я не нашел там мест которые бы были связаны с моей задачей. я не раскрашиваю индикаторы, и вообще никак их не модифицирую. я лишь хочу найти максимумы и минимумы на n-последних барах. есть там намек на сходство в RSI_Extremums_Sample.mq4 но мне этот код не осилить. там много лишнего, там индикатор РИСУЕТСЯ.... а мне это не нужно...


3173
artmedia70 27.10.2013 15:42 #
Forexman77:

Возможно ли с помощью функции " ArrayMaximum", расчитать ближайший максимум пользовательского индикатора?

Или для этого нужны иные функции?

Попробовал сделать так:

И ничего не выходит. Гуру, подскажите, как сделать?

   for (i=2; i<nBars; i++) {                    
      double a=iCustom(NULL, 0, "EMAF",0,0,i+1);
      double b=iCustom(NULL, 0, "EMAF",0,0,i);
      double c=iCustom(NULL, 0, "EMAF",0,0,i-1);
      if ((a-b)*(b-c)<0) {
         if (b<c) {                                
            // Нашли донышко
            }
         if (b>c) {                           
            // Нашли пичок
            }
         }
      }   
Для поиска в советнике. НЕ в индикаторе.

 
lottamer:

из учебника взял этот код. все в принципе понятно. не понятно только как вместо расчета экстремумов цены за n периодов, рассчитать экстремумы MACD-индикатора, например ?

в ключевом блоке видимо нужно поменять HIGH и LOW на MACD... но я не понимаю как...все попытки танцев с бубном заканчиваются обнулением.

понимаю что нужно создать массив MACD...

double MACDBuffer[];

так же видел в других советниках такую строку

но тупо замерить одно на другое не получается...

подскажите как это сделать?


Cтатья .
 

нашел у Кима что-то похожее

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 17.05.2008                                                     |
//|  Описание : Возвращает значение максимального элемента массива.            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//+----------------------------------------------------------------------------+
double ArrayMax(double& x[]) {
  if (ArraySize(x)>0) return(x[ArrayMaximum(x)]);
  else {
    Print("ArrayMax(): Массив пуст!");
    return(0);
  }
}

вопрос: как создать массив значений индикатора?

 
lottamer:

нашел у Кима что-то похожее

вопрос: как создать массив значений индикатора?

перечитал что спрашивали, не так понял сперва(

чтобы получить буфер с данными индюка можно:

1) прогнать цикл с сбором в буфер значений iMACD

2) взять исходный код с MACD, там есть буфер

int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd counted in the 1-st buffer
   for(int 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);
//---- signal line counted in the 2-nd buffer
   for(i=0; i<limit; i++)
      SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i);
//---- done
   return(0);
  }
 
ALXIMIKS:

перечитал что спрашивали, не так понял сперва(

чтобы получить буфер с данными индюка можно:

1) прогнать цикл с сбором в буфер значений iMACD

2) взять исходный код с MACD, там есть буфер


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

Print(MACDBuffer[1]); ?? принтует ноль...почему? по идее там должно быть значение 1-го бара....

и еще... зачем рассчитывать MACD через МА, когда есть прямая функция iMACD ???

 
lottamer:


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

Print(MACDBuffer[1]); ?? принтует ноль...почему? по идее там должно быть значение 1-го бара....

и еще... зачем рассчитывать MACD через МА, когда есть прямая функция iMACD ???


Скажите, пожалуйста, что Вам надо,

но по понятнее, чтобы и тупой понял.

 
ALXIMIKS:


Скажите, пожалуйста, что Вам надо,

но по понятнее, чтобы и тупой понял.

мне нужно определить минимальное (как на картинке) и максимальное значение индикатора MACD на заданном количестве баров. (в данном случае 20).

я нашел код который делает это для цены, и тупо пытался заменить HIGH LOW на MACD. но ничего не получилось....



 
artmedia70:
Давать качественную историю - работа как раз ДЦ. Им лень, и они всегда на МК пеняют.


Спасибо!
 
lottamer:

мне нужно определить минимальное (как на картинке) и максимальное значение индикатора MACD на заданном количестве баров. (в данном случае 20).

я нашел код который делает это для цены, и тупо пытался заменить HIGH LOW на MACD. но ничего не получилось....

В конец пользовательского макдака вставьте.
   int max,min,maxlast,minlast;
   max = ArrayMaximum(MacdBuffer,20,1);
   min = ArrayMinimum(MacdBuffer,20,1);
   if (max!=maxlast){
      ObjectDelete  ("highline");   
      ObjectCreate  ("highline",1,WindowOnDropped( ) ,0,MacdBuffer[max],0,0);
   }
   if (min!=minlast){
      ObjectDelete  ("lowline");   
      ObjectCreate  ("lowline",1,WindowOnDropped( ) ,0,MacdBuffer[min],0,0);
   }

П.С. хотя так правильнее и лучше:

   int max,min;
   static double maxlast,minlast;
   max = ArrayMaximum(MacdBuffer,20,1);
   min = ArrayMinimum(MacdBuffer,20,1);
   if (MacdBuffer[max]!=maxlast){
      maxlast=MacdBuffer[max];
      ObjectDelete  ("highline");   
      ObjectCreate ("highline",1,WindowOnDropped( ) ,0,MacdBuffer[max],0,0);
   }
   if (MacdBuffer[min]!=minlast){
      minlast=MacdBuffer[min];
      ObjectDelete  ("lowline");   
      ObjectCreate ("lowline",1,WindowOnDropped( ) ,0,MacdBuffer[min],0,0);
   }
Причина обращения: