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

 
x100intraday:
  Таки примерчик бы...

Примерно так (не структура, а класс, конечно):

class TBuffer
{
public:
  double  MABuffer[ ];
};

//---------------------------------------------------------------------
TBuffer*  Buffer_Array[ ];
//---------------------------------------------------------------------

//---------------------------------------------------------------------
  ArrayResize( Buffer_Array, NUMBER );
  for( int i = 0; i < NUMBER; i++ )
  {
    Buffer_Array[ i ] = new TBuffer;
    SetIndexBuffer( i, Buffer_Array[ i ].MABuffer, INDICATOR_DATA );
  }

Что куда вставлять, думаю, понятно.

В конце не забыть:

  for( int i = 0; i < NUMBER; i++ )
  {
    delete( Buffer_Array[ i ] );
  }
 
Yedelkin:

Переформулирую. Вас интересует, возможно ли при определении функции

указывать в качестве её формального параметра только переменную типа структуры, игнорируя указания имени самой структуры? Т.е. указывать, например, не void funcName(MqlTradeRequest & req), а просто void funcName(& req)?

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

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

struct Data1
  {
   double param[1000000];
  };
struct Data2
  {
   int    temp;
   double k;
  };
struct Data3
  {
   int    temp;
   double k;
  };

 Но чтобы передавать любую из этих структур в функцию с одним именем, приходится пользоваться перегрузкой.

void funWrite(Data1 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }
void funWrite(Data2 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }
void funWrite(Data3 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }

 Тут возникают сложности.

1. кол.во структур ограничено, т.к. перегрузка при большем кол-ве элементов пудет замедлять работу.

2. Я сам могу при копировании перегрузочных функций совершить ошибку.

 

PS// Функция  funWrite()  совершает определенные расчеты и совершает выполнение FileWriteArray()  с определенной последовательностью и вычисляемыми параметрами (с какого индекс начать запись, сколько прочитать).

 
rlx:

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

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

 Но чтобы передавать любую из этих структур в функцию с одним именем, приходится пользоваться перегрузкой.

Понятно. Как-то ранее я задавал аналогичный вопрос относительно того, можно ли не указывать тип массивов при определении функции. Чуть ниже там Рош посоветовал перегрузку.

Поэтому я пришёл к выводу, что "встроенные" функции типа FileWriteArray(), у которых некоторые параметры указаны с типом void, сами являются перегруженными функциями. Просто мы не видим их реализацию.

 
Yedelkin:

Понятно. Как-то ранее я задавал аналогичный вопрос относительно того, можно ли не указывать тип массивов при определении функции. Чуть ниже там Рош посоветовал перегрузку.

Поэтому я пришёл к выводу, что "встроенные" функции типа FileWriteArray(), у которых некоторые параметры указаны с типом void, сами являются перегруженными функциями. Просто мы не видим их реализацию.

Встроенные функции написаны на полноценном языке программирования.

В C например можно передать переменные любого количества, а уже в функции получать список переданных параметров, и рассматривать их. 

void fun(...)
  {
}

 

В MQL5 такой возможности нет. В частности отсутствуют ссылки и указатели на простые типы данных и структуры...

 

Наверно это как  то повязано на безопасности. Доступ к данным. Выход за пределы песочницы

Но все же хочется чтобы данные возможности были реализованы в MQL5 

 
rlx:

Наверно это как  то повязано на безопасности. Доступ к данным. Выход за пределы песочницы

Но все же хочется чтобы данные возможности были реализованы в MQL5 

Лучше написать пожелание в Сервисдеск. А то на форуме оно быстро затеряется.
 
Dima_S:

Примерно так (не структура, а класс, конечно):

Что куда вставлять, думаю, понятно.

В конце не забыть:

 Вот это я понимаю помощь: реальная и вполне конкретная. Благодарю. Где тут плюсовалка?

 Кстати... я тут прикинул - этого варианта мне вполне достаточно. Но не хотелось бы оставаться формалистом... поэтому из любознательности решил, что всё же не помешало бы попытаться организовать двумерный массив. MQL чем-то напоминает C/C++, который я благополучно подзабыл за последний десяток годков. Сейчас попытался сделать так (здесь без цикла - специально упростил):

class TBuffer
{
public:
  double MABuffer[][1];
};

//---------------------------------------------------------------------
TBuffer* Buffer_Array[][1];
//---------------------------------------------------------------------
int OnInit()
  {
   ArrayResize(Buffer_Array,1);
   Buffer_Array[0][0] = new TBuffer;
   SetIndexBuffer(0,Buffer_Array[0][0].MABuffer,INDICATOR_DATA);
// --- [...]
   delete(Buffer_Array[0][0]);
   return(0);
  }

 Компилятор выдаёт ошибку: "'MABuffer' - parameter conversion is not allowed".

 Интересно, что делаю не так? Если не ошибаюсь, при объявлении класса с многомерным массивом необходимо задать численно одно из измерений, придав ему таким образом статичность? ArrayResize тем временем задаёт новый размер для первого измерения.

 

x100intraday:

Интересно, что делаю не так? 

1) SetIndexBuffer работает с массивом double одной размерности.

2) Не понятно, зачем вы используете TBuffer*, т.е. используете динамику там, где она не нужна?

3) (СОВЕТ) В примере вполне можно было обойтись структурой, а не классом, для небольшой экономии памяти и пары сотен тактов.

 

mql5:

3) (СОВЕТ) В примере вполне можно было обойтись структурой, а не классом, для небольшой экономии памяти и пары сотен тактов.

Это проверено??
 

В советнике используется обращение к индикатору на другом таймфрейме. На тестах в советнике появляются неверные данные от индикатора.

Сам советник работает на M5, а индикатор на H4. Индикаторы, которые вызываются на том же таймфрейме (M5), возвращают правильные значения.

Возвращаемые значения похожи на значения индикатора, но отличаются от реальных, которые видны при наложении индикатора в окне ценового графика.

В чем проблема? 

Примерный код вызова индикатора:

 

int W_handle;
int OnInit()
  {
   W_handle=iCustom(NULL, PERIOD_H4, "WW");
  }

void OnNewBar() // моя функция
{
 double wave[10];
 ArraySetAsSeries(wave, true);

 CopyBuffer(W_handle,0,0,2,wave);
 if (wave[1] > 0) Buy(); 
// по замыслу в wave[1] должно лежать значение индикатора на предыдущем баре H4
// но так получается только на нескольких первых обращениях, потом результат начинает расходиться с реальностью
}
Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.