Работа с массивами-подскажите, как правильно. - страница 2

 
ask >>:
Простите, что надоедаю, но еще один вопрос: почему нельзя строить iMAOnArray(value1........k), если значения value1 принимают то положительное, то отрицательное значение, допустим такие: 1, 3, 4, -5, -1, 2 или если можно, то можно спросить как ?

А почему вы, собственно, считаете, что так делать нельзя? Чем докажете? :-)

Попробуйте код:

Все работает и выдает что-то достаточно интересное :-)

#property indicator_buffers 1
#property indicator_color1 Lime
#property indicator_width1 1
#property indicator_separate_window
double   Buffer[];
int init()
  {
     SetIndexBuffer(0, Buffer);
      SetIndexStyle(0, DRAW_LINE);
      return(0);
  }
int deinit()
  {
  }
extern int MA_Period = 10;
int start()
  {  
   double value1[1000];
   ArraySetAsSeries(value1,true);
   for (int k=0; k<1000;k++)
      {
      if(k%2 == 0)
        value1[k]=Close [k]; // если счетчик четный то кладем значение положительное
      else
        value1[k]=-Close [k]; // если нет- то кладем отрицательное
      }
   for (k=0; k<1000;k++)
      {
      Buffer[k]= iMAOnArray(value1,0,MA_Period,0,MODE_SMA,k);   
      }
   return(0);
  }       
 
jartmailru >>:

А почему вы, собственно, считаете, что так делать нельзя? Чем докажете? :-)

Попробуйте код:

Все работает и выдает что-то достаточно интересное :-)


МЕГАЖЕСТЬ!!!!!!!!

А я всю жизнь, точнее уже как начал писать, думал что такое нельзя делать О_о Ого-го, оказывается можно О_о

СПАСИБО ОГРОМНОЕ!!! А ТО МНЕ ПРИШЛОСЬ ПИСАТЬ ТАКУЮ ВОТ ШТУКУ, чтобы заменить imaonarray

for (int i=Bars; i>=0;i--) // стартуем цикл ПРОБЕГА для расчета средней
   {  
   double price=0; // обнуляем переменную в которой будет происходить накопление
   
    for (int k=i; k<i+PeriodMA; k++) //стартуем цикл для расчета средней
     { 
       // тут будем получать значения
     double x=.... 
         massive1[k]=....;
         
         // теперь суммируем значения массива
          price+=massive1[k];
                  } //завершаем цикл для расчета средней
                  
           Buffer[i]=  price/PeriodMA; // выводим ее значения
                   }// закрываем цикл ПРОБЕГА для расчета средней

Оказывается все много-много проще блин. Век живи-век учись, ешкин кот!

Еще раз спасибо-вы упростили мне жисть!



 

А еще есть какие-то гаджеты (навороты) в

массивах? Может еще какие там фишки есть, которые никто не знает, точнее знают, но профессионалы ?

Я просто все всегда через циклы :( Просто оказывается массивы много-много удобнее.

 
ask >>:

Я просто все всегда через циклы :( Просто оказывается массивы много-много удобнее.

Знаете, уважаемый... и я ведь тоже через циклы - зачем по-другому?

А если бы и использовал iMAOnArray, то как-нибудь так:

double МоёiMAOnArray(...) {

рез = iMAOnArray(...);

if(паранойя)

{

 double рез2 = ПосчитайЦиклом(...);

 if(рез != рез2) { Alert("Приплыли"); return (-1); }
}

return (рез);

}

Ха. что-то не так с вставлялкой кода :-)..
.

Потому что бывают интересные ошибки,
которые возникают из-за того, что мы не проверяем
и не визуализируем данные. А раз уж iMAOnArray имеет специфику
(нужен вызов ArraySetAsSeries), которая может привести к ошибке,
то эта ошибка должна возникнуть.

И на отладку у вас уйдет больше времени,

чем на написание специфической функции МоёiMAOnArray.
.
А в циклах начал ставить смешные проверки типа
if(текущаяПеременная == oldValue) { Alert("Зациклилось в СделайРаз()."); return; }
потому что когда виснет MT, убивать его, вытирать индикатор и запускать заново-
намного дольше.
.
Единственное что- пишите структурный код.
Как говорил великий Фаулер в книге "Рефакторинг",
если вы хотите сделать комментарий

for (int k=i; k<i+PeriodMA; k++) //стартуем цикл для расчета средней
то это означает, что вам нужно объявить функцию

double ЦиклДляРасчетаСредней(...)

Не будьте профессионалом- делайте ошибки, планируйте, что вы их сделаете :-).

.

Что любопытно, у Автокада (инженерные чертежи, проекты и тп) есть режим проверки CRC.

Т.е. все сохраняемые файлы- возможно, и внутри автокада что-то фиксируется на уровне- 

сохраняются с контрольными кодами, которые потом пересчитываются и проверяются :-).

 
double МоёiMAOnArray(...) {

рез = iMAOnArray(...);

if(паранойя)

{

 double рез2 = ПосчитайЦиклом(...);

 if(рез != рез2) { Alert("Приплыли"); return (-1); }
}

return (рез);

}
 :))) рассмешили, особенно алертом :)


jartmailru >>:

Знаете, уважаемый... и я ведь тоже через циклы - зачем по-другому?


Не будьте профессионалом- делайте ошибки, планируйте, что вы их сделаете :-).

Просто господин Rosh писал где-то на форуме альпари в уроках ( всегда читаю, что он там пишет), что цикл-кушает ресурсы компьютера, поэтому подумал, что так наверное будет проще и полезнее, оказалось совсем даже и нет :(


Потому что бывают интересные ошибки,
которые возникают из-за того, что мы не проверяем
и не визуализируем данные. А раз уж iMAOnArray имеет специфику
(нужен вызов ArraySetAsSeries), которая может привести к ошибке,
то эта ошибка должна возникнуть.
чем на написание специфической функции МоёiMAOnArray.

Да, полностью с вами соглашусь. Просто, циклы понять легко, а вот понять все эти амаонарай, сетарай для человека с гуманитарным образованием, да и еще слабым логическим мышлением-крайне сложно :(

то это означает, что вам нужно объявить функцию

Бааалин, и правда так было бы много-много правильнее и проще! Спасибо за подсказку, просто чет я не подумал о таком (хотя знаком с функциями, но как-то даж и вылетило из головы, что так можно сделать :(, балин ). Еще раз спасибо за такое большое количество таких нужных подсказок. Теперь я их запомню и мне потом будет много проще, что радует и вселяет удовлетворение.
 
ask >>:

Просто господин Rosh писал где-то на форуме альпари в уроках ( всегда читаю, что он там пишет), что цикл-кушает ресурсы компьютера

Дык... используйте функцию как я привел- хотите- она работает быстро и оптимально.

Хотите- включаете режим "паранойя" ("дебаг") и получаете резервирование обсчетов в два раза.

Если "пилотирование" на "паранойя" прошло, то потом режим можно отключить.

 
ask >>:

А еще есть какие-то гаджеты (навороты) в

массивах? Может еще какие там фишки есть, которые никто не знает, точнее знают, но профессионалы ?

Я просто все всегда через циклы :( Просто оказывается массивы много-много удобнее.

Кто-то, где-то, когда-то :) на этом форуме написал, как заменить многомерный массив одномерным.

может когда-нить пригодится.

В mql4 максимум четырехмерный массив, можно изменить только первое измерение и, вроде, одномерный быстрее.


массив однозначно удобнее, еси он буферный :)

но 8 штук не всегда хватает, приходицо извращаться

 
Swan >>:

массив однозначно удобнее, еси он буферный :)

но 8 штук не всегда хватает, приходицо извращаться

N.B.: Визуализацию можно сделать объектами: линиями и стрелками :-).

Работает вполне себе ничего.

 

Swan >>:


массив однозначно удобнее, еси он буферный :)


Спасибо, это тоже очень важно. Кстати, я почти интуитивно именно так и стал писать все нужные мне массивы-через буфер, даж шаблончик сделал-заготовку заранее :)

jartmailru >>:

Дык... используйте функцию как я привел- хотите- она работает быстро и оптимально.

Хотите- включаете режим "паранойя" ("дебаг") и получаете резервирование обсчетов в два раза.

Если "пилотирование" на "паранойя" прошло, то потом режим можно отключить.



Угу, теперь тока функцией и буду считать имаонарай, тем более мне там все ясно, все понятно :)

Спасибо всем за подсказики, разобрался во всем лучше некуда и теперь мне радастно :) Сокрушу рынок, порву Бафета, найму Потанина газоны постригать, когда куплю себе Италию :)

 

Только учтите, что МА на массиве - штука тормозная. Если вам нужно простое арифметическое - Simple MA, то лучше посчитать его в теле своей программы (сумма элементов массива отнесенная на его длину). Можете даже почувствовать вкус к "семантическому сахару" типа x+=y в цикле.

Экспоненциальную МА вообще нет смысла считать через обращение к этой функции. Там вообще нужно знать только два значения (а не гонять целый массив!!!): текущее значение MA и предыдущее: ema=k*ARRAY[i]+(1-k)*emaPrevios, где k - коэффициен, вычисляемый из периода по форумуле k=2/(Период+1); emaPrevios - предыдущее значение ema - если загонять в массив, то, соответственно, ema[i] и ema[i+1] для серийных массивов.

Могу привести фрагменты кода для внедрения.

Да и другие типы не особо сложнее...

Причина обращения: