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

 
lottamer:

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

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

Скопируйте в массив massMACD[20] необходимые вам данные МАКДака и найдите в этом массиве
минимальное ArrayMinimum(massMACD); и
максимальное ArrayMaximum(massMACD); значения.
 
ALXIMIKS:
В конец пользовательского макдака вставьте.

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


если так, то не работает....

double MACDBuffer[];
double SignalBuffer[];

 
 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,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,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,9,0,MODE_SMA,i);
        //t=MACDBuffer[0];
        //Print(t*10000);
//---- done
  
  
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);
      Print(min,max);
   }
    return(0);
  }
 
artmedia70:
Скопируйте в массив massMACD[20] необходимые вам данные МАКДака и найдите в этом массиве
минимальное ArrayMinimum(massMACD); и
максимальное ArrayMaximum(massMACD); значения.


отлично.

вопрос только КАК копируют данные в массив? так?

for(int i=1; i<20; i++)
      MACDBuffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);

или так?

   MACDLineBuffer[i] = iMACD(NULL, 0, 12,26,9,PRICE_CLOSE,MODE_MAIN,i);
 
lottamer:


если так, то не работает....

В конец пользовательского MACD:

Навигатор ==> Пользовательские Индикаторы ==> MACD ==> ПКМ (права клавиша мыши) ==> Изменить ==>

 
lottamer:


отлично.

вопрос только КАК копируют данные в массив? так?

или так?


блин, это одно и тоже, просто не факт что вызов iMACD затребует ресурсов столько же как и его исходный код.

iMACD и все iCostum возвращают значение члена массива, а по этому необходимо в цикле пройти и собрать их в буфер, для дальнейших опираций

  MACDLineBuffer[i] = iMACD(NULL, 0, 12,26,9,PRICE_CLOSE,MODE_MAIN,i);

не верно, так как вы получаете только одно значение, а вам надо 20 и по этому используйте цикл:

for(int i=1; i<20; i++)
      MACDLineBuffer[i] = iMACD(NULL, 0, 12,26,9,PRICE_CLOSE,MODE_MAIN,i);

 
ALXIMIKS:

В конец пользовательского MACD:

Навигатор ==> Пользовательские Индикаторы ==> MACD ==> ПКМ (права клавиша мыши) ==> Изменить ==>

работает :)

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

спасибо

 

давайте начнем сначала.

int start()
  {
  
    
for(int i=0; i<20; i++)
MACDBuffer[i] = iMACD(NULL, 0, 12,26,9,PRICE_CLOSE,MODE_MAIN,i);

этого достаточно чтобы скопировать в массив 20(19 неважно) значений индикатора?

 
lottamer:

давайте начнем сначала.

этого достаточно чтобы скопировать в массив 20(19 неважно) значений индикатора?

давайте уточним, если кому-то что-то надо и я хоть что-то знаю - то с радостью пытаюсь этому человеку помочь,

но подтирать за ним зад после каждого пука - увы не собираюсь.

Да, этого достаточно, если вы объявили статический массив double MACDBuffer[20] и не достаточно если объявлен динамический массив double MACDBuffer[].

вам это говорил artmedia70.

 
ALXIMIKS:

давайте уточним, если кому-то что-то надо и я хоть что-то знаю - то с радостью пытаюсь этому человеку помочь,

но подтирать за ним зад после каждого пука - увы не собираюсь.

Да, этого достаточно, если вы объявили статический массив double MACDBuffer[20] и не достаточно если объявлен динамический массив double MACDBuffer[].

вам это говорил artmedia70.


ладно, пусть будет статический.

double MACDBuffer[20];

double min,max;
 
  
 int start()
  {
 
   for(int i=0; i<20; i++)
      MACDBuffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);

   min=ArrayMinimum(MACDBuffer);
   max=ArrayMaximum(MACDBuffer);
  
  Print(min,"____",max);

почему принтует 19__0 ???

 
lottamer:


ладно, пусть будет статический.

почему принтует 19__0 ???


по тому что верно работает. Еще что-то?