Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2056

 
Valeriy Yastremskiy #:

Матрица - размерность массива 2, вектор - одномерный массив. Ничего сложного. НО кто придумал назвать вектором одномерный массив (вернее кто придумал понятно), вот его логику понять видимо не смогу никогда))))

В Учебнике по МТ4 так хорошо всё объяснялось. На пальцах иногда разжёвывали. А тут... порог вхождения слишком велик. Даже просто перечитывая справочник, что такое вектор, что такое матрица, я не понимаю, как их использовать. 

В том же примере

//--- генерируем обучающую выборку
   if(!CreateData(m_datam_targettrain))  
      return;

...

...


bool CreateData(matrix &datamatrix &targetconst int count)
  {
//--- инициализируем матрицы исходных данных и результатов
   if(!data.Init(count3) || !target.Init(count1))
      return false;
//--- заполняем матрицу исходных данных случайными значениями
   data.Random(-1010
);                     
//--- рассчитываем целевые значения для обучающей выборки
   vector X1 = MathPow(data.Col(0) + data.Col(1) + data.Col(1), 2);
   vector X2 = MathPow(data.Col(0), 2) + MathPow(data.Col(1), 2) + MathPow(data.Col(2), 2);

   if(!target.Col(X1 / X20))
      return false;
//--- возвращаем результат
   return true;
  }

Как это? Куда здесь сувать показания индикатора исторические и фактические, как создать наборы сетов и к ним фактических данных... Какая-то форма записи необычная. 

Через цикл в обычный массив загоняешь разницу цен или показания индикаторов: первые 10 значений истории загнял, а последнее - фактическое значение, то есть то, что должно получится. И нейросеть проверяет это. В примерах из здешних статей так и делается, но вот этот шаблон из справочника, он кажется каким-то... более умным, чтоли. Если все пытаются подогнать веса в тестере стратегий, то тут обратное распространение ошибки, круто же. 

Но, блин, перепрофилировать данный шаблон под практикум форекса прямо засада
 
Ivan Butko #:

В Учебнике по МТ4 так хорошо всё объяснялось. На пальцах иногда разжёвывали. А тут... порог вхождения слишком велик. Даже просто перечитывая справочник, что такое вектор, что такое матрица, я не понимаю, как их использовать. 

В том же примере

//--- генерируем обучающую выборку
   if(!CreateData(m_datam_targettrain))  
      return;

...

...


bool CreateData(matrix &datamatrix &targetconst int count)
  {
//--- инициализируем матрицы исходных данных и результатов
   if(!data.Init(count3) || !target.Init(count1))
      return false;
//--- заполняем матрицу исходных данных случайными значениями
   data.Random(-1010
);                     
//--- рассчитываем целевые значения для обучающей выборки
   vector X1 = MathPow(data.Col(0) + data.Col(1) + data.Col(1), 2);
   vector X2 = MathPow(data.Col(0), 2) + MathPow(data.Col(1), 2) + MathPow(data.Col(2), 2);

   if(!target.Col(X1 / X20))
      return false;
//--- возвращаем результат
   return true;
  }

Как это? Куда здесь сувать показания индикатора исторические и фактические, как создать наборы сетов и к ним фактических данных... Какая-то форма записи необычная. 

Через цикл в обычный массив загоняешь разницу цен или показания индикаторов: первые 10 значений истории загнял, а последнее - фактическое значение, то есть то, что должно получится. И нейросеть проверяет это. В примерах из здешних статей так и делается, но вот этот шаблон из справочника, он кажется каким-то... более умным, чтоли. Если все пытаются подогнать веса в тестере стратегий, то тут обратное распространение ошибки, круто же. 

Но, блин, перепрофилировать данный шаблон под практикум форекса прямо засада

А где Вы вообще взяли этот код? Смотрю в хелпе ME, там как бы и нет таких методов ( .Random) - очень странно, а в коде всплывает.

Вообще там похоже ещё хелп не поспевает за вводимыми функциями, к примеру в хелпе

void matrix.FromBuffer(const int rows, const int cols, const scalar array[], const int count=-1, const int offset=0)

frombuffer

Создает матрицу из одномерного массива

но по факту получаю ошибку

'FromBuffer' is not a member of 'matrix' type   Test_Matrix.mq5 53      9

А так функцию можно было бы поменять на нечто такое

//+------------------------------------------------------------------+
//| Метод генерации выборки                                          |
//+------------------------------------------------------------------+
bool CreateData(matrix &data, matrix &target, const int count)
  {
//--- инициализируем матрицы исходных данных и результатов
   if(!data.Init(count, 3) || !target.Init(count, 1))
      return false;
//--- заполняем матрицу исходных данных случайными значениями
   //data.Random(-10, 10);
   //Имеем матрицу 1000 строк и 3 столбца
   float arr_Mass[];
   ArrayResize(arr_Mass,count*3);//Создали массив для записи данных
   for(int i=0;i<count;i++)
   {
   arr_Mass[i+0]=1;//Заполнили первый столбец предикторами
   arr_Mass[i+1]=2;//Заполнили второй столбец предикторами
   arr_Mass[i+2]=3;//Заполнили третий столбец предикторами
   }
   data.FromBuffer(count,3,arr_Mass,-1,0);
//--- рассчитываем целевые значения для обучающей выборки
   vector X1 = MathPow(data.Col(0) + data.Col(1) + data.Col(1), 2);
   vector X2 = MathPow(data.Col(0), 2) + MathPow(data.Col(1), 2) + MathPow(data.Col(2), 2);
   if(!target.Col(X1 / X2, 0))
      return false;
//--- возвращаем результат
   return true;
  }
 

В общем как то так запустилось - заполняйте массив своими данными, как угодно. Целевую так же надо переделать, что б заполнялась.

//+------------------------------------------------------------------+
//| Метод генерации выборки                                          |
//+------------------------------------------------------------------+
bool CreateData(matrix &data, matrix &target, const int count)
  {
//--- инициализируем матрицы исходных данных и результатов
   if(!data.Init(count, 3) || !target.Init(count, 1))
      return false;
//--- заполняем матрицу исходных данных случайными значениями
   //data.Random(-10, 10);
   //Имеем матрицу 1000 строк и 3 столбца
   double arr_Mass[][3];
   //ArrayResize(arr_Mass,count*3);//Создали массив для записи данных
   ArrayResize(arr_Mass,count);//Создали массив для записи данных
   for(int i=0;i<count;i++)
   {
   arr_Mass[i][0]=1;//Заполнили первый столбец предикторами
   arr_Mass[i][1]=2;//Заполнили второй столбец предикторами
   arr_Mass[i][2]=3;//Заполнили третий столбец предикторами
   }
   //data.FromBuffer(count,3,arr_Mass,-1,0);
   data.Assign(arr_Mass);
   Print("double_matrix after Assign(arr_Mass) \n", data); 
//--- рассчитываем целевые значения для обучающей выборки
   vector X1 = MathPow(data.Col(0) + data.Col(1) + data.Col(1), 2);
   vector X2 = MathPow(data.Col(0), 2) + MathPow(data.Col(1), 2) + MathPow(data.Col(2), 2);
   if(!target.Col(X1 / X2, 0))
      return false;
//--- возвращаем результат
   return true;
  }
 
Aleksey Vyazmikin #:

В общем как то так запустилось - заполняйте массив своими данными, как угодно. Целевую так же надо переделать, что б заполнялась.

Спасибо большое, что разобрались! Попробую

 
Aleksey Vyazmikin #:

В общем как то так запустилось - заполняйте массив своими данными, как угодно. Целевую так же надо переделать, что б заполнялась.

Алексей, подскажите, пожалуйста, ещё, как работать с векторами? 

Не нахожу примеры на сайте... 

В шаблоне какая-то математическая функция, да и векторов почему то два

 
Ivan Butko #:
Алексей, подскажите, пожалуйста, ещё, как работать с векторами? 

Не нахожу примеры на сайте... 

В шаблоне какая-то математическая функция, да и векторов почему то два

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

Работа с матрицами и векторами в MQL5
Работа с матрицами и векторами в MQL5
  • www.mql5.com
Для решения математических задач в MQL5 были добавлены матрицы и векторы. Новые типы имеют встроенные методы для написания краткого и понятного кода, который близок к математической записи. Массивы — это хорошо, но матрицы во многих случаях лучше.
 
Aleksey Vyazmikin #:

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

Хорошо! Гляну,спасибо
 
Ivan Butko #:

В Учебнике по МТ4 так хорошо всё объяснялось. На пальцах иногда разжёвывали. А тут... порог вхождения слишком велик. Даже просто перечитывая справочник, что такое вектор, что такое матрица, я не понимаю, как их использовать. 

В том же примере

//--- генерируем обучающую выборку
   if(!CreateData(m_datam_targettrain))  
      return;

...

...


bool CreateData(matrix &datamatrix &targetconst int count)
  {
//--- инициализируем матрицы исходных данных и результатов
   if(!data.Init(count3) || !target.Init(count1))
      return false;
//--- заполняем матрицу исходных данных случайными значениями
   data.Random(-1010
);                     
//--- рассчитываем целевые значения для обучающей выборки
   vector X1 = MathPow(data.Col(0) + data.Col(1) + data.Col(1), 2);
   vector X2 = MathPow(data.Col(0), 2) + MathPow(data.Col(1), 2) + MathPow(data.Col(2), 2);

   if(!target.Col(X1 / X20))
      return false;
//--- возвращаем результат
   return true;
  }

Как это? Куда здесь сувать показания индикатора исторические и фактические, как создать наборы сетов и к ним фактических данных... Какая-то форма записи необычная. 

Через цикл в обычный массив загоняешь разницу цен или показания индикаторов: первые 10 значений истории загнял, а последнее - фактическое значение, то есть то, что должно получится. И нейросеть проверяет это. В примерах из здешних статей так и делается, но вот этот шаблон из справочника, он кажется каким-то... более умным, чтоли. Если все пытаются подогнать веса в тестере стратегий, то тут обратное распространение ошибки, круто же. 

Но, блин, перепрофилировать данный шаблон под практикум форекса прямо засада

Синтаксиса не знаю. В Дата вместо рандом суете клоз, видимо как то Дата.Массив клоз., А вот с целевыми надо думать, возможно найти на участке массива клоз экстремумы, или через зигзаг пропустить и отобрать, или тупо по три максимальных максимума и минимума с раздвижкой 5-10 баров отобрать. 

 
Ivan Butko #:
Хорошо! Гляну,спасибо

Пожалуйста.

Если не получилось, вот пример доковырял...

//+------------------------------------------------------------------+
//| Метод генерации выборки                                          |
//+------------------------------------------------------------------+
bool CreateData(matrix &data, matrix &target, const int count)
  {
//--- инициализируем матрицы исходных данных и результатов
   if(!data.Init(count, 3) || !target.Init(count, 1))
      return false;
//--- заполняем матрицу исходных данных случайными значениями
//data.Random(-10, 10);
//Имеем матрицу 1000 строк и 3 столбца
   double arr_Mass[][3];
//ArrayResize(arr_Mass,count*3);//Создали массив для записи данных
   ArrayResize(arr_Mass,count);//Создали массив для записи данных
   for(int i=0; i<count; i++)
     {
      arr_Mass[i][0]=1;//Заполнили первый столбец предикторами
      arr_Mass[i][1]=2;//Заполнили второй столбец предикторами
      arr_Mass[i][2]=3;//Заполнили третий столбец предикторами
     }
//data.FromBuffer(count,3,arr_Mass,-1,0);
   data.Assign(arr_Mass);
   Print("data after Assign(arr_Mass) \n", data);
//--- рассчитываем целевые значения для обучающей выборки
//vector X1 = MathPow(data.Col(0) + data.Col(1) + data.Col(1), 2);
//vector X2 = MathPow(data.Col(0), 2) + MathPow(data.Col(1), 2) + MathPow(data.Col(2), 2);
//if(!target.Col(X1 / X2, 0))
//   return false;
   vector V_Target;//Вектор для получения массива с целевыми и передачи в матрицу
   int arr_Target[];//Массив для целевой
   ArrayResize(arr_Target,count);//Изменяем массив на заданное число строк в выборке
   int T_Rand=0;//Будем писать рандом
   for(int i=0; i<count; i++)
     {
      T_Rand=rand();//Получаем случайное число от 0 до 32767
      if(T_Rand>32767/2)arr_Target[i]=1;//Если число меньше половины от максимального случайного, то целевая 1
      else arr_Target[i]=0;             //иначе целевая "0"
     }
   V_Target.Assign(arr_Target);//Копируме массив в вектор
   if(!target.Col(V_Target,0))//Копируем вектор в матрицу, если ошибка то вернём false функции
      return false;
   Print("data after Col(V_Target)", target);
//--- возвращаем результат
   return true;
  }
 
Aleksey Vyazmikin #:

Если не получилось

Ууу, видать это надолго...


Aleksey Vyazmikin #:

Пожалуйста.

Если не получилось, вот пример доковырял...

Благодарю Вас! Сейчас попробую

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