Вопросы от "чайника" - страница 86

 

 Renat, вопрос был скорее теоретический, нежели практический.

 Дабы в тумане не блуждать, сошлюсь на пример из справки по iFractals. Правда, там индикатор, но упростим задачу до однократного просчёта графической разметки скриптом.

 Положим, я вознамерился узнать время всех верхних фрактальных баров на всей истории (или на её значительной части на каком-нибудь среднем таймфрейме, где фракталов будет предостаточно). Правильно ли я понял, что лучше многократно побеспокоить CopyTime в цикле при FrUpBuffer[shift]!=EMPTY_VALUE на глубину 1 элемент:

handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for(int shift=0; shift<BarsCalculated(handle); shift++)
{
   if(FrUpBuffer[shift]!=EMPTY_VALUE)
   {
     CopyTime(_Symbol,PERIOD_H4, shift, 1, Arr);
     Print(Arr[0]);
   }
}

bool FillArraysFromBuffers(double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);

   return(true);
  }

 и получить более быстрый результат, нежели одним махом съедать историю CopyTime'ом на глубину FrUpBuffer:

handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for(int shift=0; shift<BarsCalculated(handle); shift++)
{
   if(FrUpBuffer[shift]!=EMPTY_VALUE)
     Print(TimeUpBuffer[shift]);
}

bool FillArraysFromBuffers(double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);
   else CopyTime(_Symbol,PERIOD_H4,0,amount,TimeUpBuffer);

   return(true);
  }
а уж затем в том же цикле при том же if'е просто вывести Print'ом значения времени фрактальных баров?

 И там, и там задачи идентичные, просто реализации чуть разные. 

 Интуитивно понимаю, что копировать в массив подряд огормную цепочку значений времени баров (как фрактальных, так и пустых) - это дольше и дороже; с другой стороны, дёргать многократно CopyTime на глубину в 1 элемент - удовольствие сомнительное.

 Если первый вариант быстрее, то это абсолютный выигрыш или всё зависит от общего количества попавшихся фракталов (например, на мелких ТФ их значительно больше)? 

 

 Здесь https://www.mql5.com/ru/forum/3775/page59#comment_94865 я задавал вопрос о помещении в цикл объявления, связывания, инициализации и прочих действий над множеством однотипных буферов с целью сокращения кода, улучшения читабельности и управляемости. Ответ с наглядным примером получен (класс, структура), с этим разобрался.

 Теперь по тому же принипу попытался утрамбовать множественное назначение #property типа:

#property indicator_label1  "FractalUp1"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrGreen

#property indicator_label2  "FractalDown1"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrGreen
// ---
#property indicator_label3  "FractalUp2"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrBlue

#property indicator_label4  "FractalDown2"
#property indicator_type4   DRAW_ARROW
#property indicator_color4  clrBlue
[...]

и возымел по меньшей мере две проблемы:

1. for на глобальном уровне запрещён, то есть самое раннее использование - не ранее как в OnInit(), но #property, как известно, объявляются на глобальном уровне до всех прочих функций;

2. при попытке назначить свойства индикаторам в цикле в OnInit():

// понимаю, что сочинил бред
for (int i=0; i<NUMBER; i++)
{
  #property Property_Array[i].indicator_label (string)("Fractal"+i)
  #property Property_Array[i].indicator_type  DRAW_ARROW
  #property Property_Array[i].indicator_color clrArr[i]
}
компилятор ругается на '#' (как и ожидалось): '#property' - unexpected token.
 Подкажите, осуществима ли затея в принципе и если да, то как?
 

Подскажите, можно ли как-то объявить двухмерный массив массивов?

Что-то типа этого:

double Buffers[6][3]={ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] };
 
tol64:

Подскажите, можно ли как-то объявить двухмерный массив массивов?

массив структур у которых поля будут массивами можно объявить, компилятор даже пропускает динамические массивы в структуре:

struct arr{double arr_str[];};
arr buffers[6][3];
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
tol64:

Подскажите, можно ли как-то объявить двухмерный массив массивов?

Что-то типа этого:

#define DIM1_NUMBER 6
#define DIM2_NUMBER 3

struct TBuffer
{
  string Buffer[3]; // для нагляднсти поменяем double на string
};

TBuffer Buffer_Array[DIM1_NUMBER];

string prefixArr[6]={"a","b","c","d","e","f"};

int OnInit()
  {
   for (int j=0; j<DIM1_NUMBER; j++)
   {
      for (int i=0; i<DIM2_NUMBER; i++)
      {
        string t;
   
        StringConcatenate(t,prefixArr[j],i);
        Buffer_Array[j].Buffer[i]=t;
      }
   }

   Print(Buffer_Array[0].Buffer[0],", ",
         Buffer_Array[0].Buffer[1],", ",
         Buffer_Array[0].Buffer[2],"; ",

         Buffer_Array[1].Buffer[0],", ",
         Buffer_Array[1].Buffer[1],", ",
         Buffer_Array[1].Buffer[2],"; ",

         Buffer_Array[2].Buffer[0],", ",
         Buffer_Array[2].Buffer[1],", ",
         Buffer_Array[2].Buffer[2],"; ",

         Buffer_Array[3].Buffer[0],", ",
         Buffer_Array[3].Buffer[1],", ",
         Buffer_Array[3].Buffer[2],"; ",

         Buffer_Array[4].Buffer[0],", ",
         Buffer_Array[4].Buffer[1],", ",
         Buffer_Array[4].Buffer[2],"; ",

         Buffer_Array[5].Buffer[0],", ",
         Buffer_Array[5].Buffer[1],", ",
         Buffer_Array[5].Buffer[2]
   );

   return(0);
  }
 [Исправлено.]
 

IgorM,  x100intraday

 Спасибо за варианты. Думаю это должно подойти, буду пробовать. 

 
tol64:

IgorM,  x100intraday

 Спасибо за варианты. Думаю это должно подойти, буду пробовать. 

Кстати имя "Buffer" можно поменять на "_" или ещё какую нибудь загагулину тогда вообще будет полная наглядность вызова:

Buffer_Array[0]._[0]

Buffer_Array[0].¦[0]

 
Urain:

Кстати имя "Buffer" можно поменять на "_" или ещё какую нибудь загагулину тогда вообще будет полная наглядность вызова:

Спасибо Urain. Тоже интересное дополнение. Так привычнее.))
 

 А вот как всё это с #property провернуть? - интересно...

 Неужто никаких идей? 

 
x100intraday:

 А вот как всё это с #property провернуть? - интересно...

 Неужто никаких идей? 

расшифруй
Причина обращения: