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

 
Taras Slobodyanik:

формат комментария может различаться у разных брокеров.

Не встречал отсутствия "To" и "From"
 
Artyom Trishkin:
Не встречал отсутствия "To" и "From"
Артем, посмотри по моему вопросу выше....
 

Всем дорого времени суток!

Подскажите пожалуйста в MQL4(или в  MQL5, но работающая на  MQL4) есть функция которая преобразует  массив LoY[2][7] в массив  LoY[7][2]  и наоборот. Что то типа транспонирования. Внизу образец нужного мне преобразования. Хотелось бы поиметь именно функцию. Как преобразовать массив  в цикле я уже знаю.

Спасибо за помощь.

 
ANDREY:

Всем дорого времени суток!

Подскажите пожалуйста в MQL4(или в  MQL5, но работающая на  MQL4) есть функция которая преобразует  массив LoY[2][7] в массив  LoY[7][2]  и наоборот. Что то типа транспонирования. Внизу образец нужного мне преобразования.

Спасибо за помощь.

просто для справки : в классике алгоритмов (вообще ИТ) такая операция называется zip,

такой функции в библиотеке объяснимо нет. Она жутко прожорлива и неэффективна. Проще и быстрее менять индексы в алгоритме/программе или использовать косвенные обращения, чем переставлять ВСЕ данные в массивах.

 
Maxim Kuznetsov:

 Проще и быстрее менять индексы в алгоритме/программе или использовать косвенные обращения, чем переставлять ВСЕ данные в массивах.

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

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

 
ANDREY:

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

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

void Convert_7x2_2x7 (const double &src[7][2],double &dst[2][7]) {

   for(int i=0;i<7;i++)

   for(int j=0;j<2;j++) {

dst[j][i]=src[i][j];

   }

}

коротко, но это худшее что можно сделать :-) два вложенных цикла и поэлементное копирование массивов.

когда вы внутри своего алгоритма можете просто переименовать индексы. Просто поменять в коде i на j и наоборот..

 
Maxim Kuznetsov:

void Convert_7x2_2x7 (const double &src[7][2],double &dst[2][7]) {

   for(int i=0;i<7;i++)

   for(int j=0;j<2;j++) {

dst[j][i]=src[i][j];

   }

}

коротко, но это худшее что можно сделать :-)

Спасибо большое. А пример лучшего??? :-).... что бы у меня было полное понимание.

Поэлементное копирования - это долго и энергозатратно...особенно для больших массивов......если я не ошибаюсь. 

 
Андрей, зачем Вам это? Если данные уже собраны в массиве, можно найти способ просто их использовать как есть, ничего не двигая. Или заранее собирать в массив в нужном порядке. Что Вы хотите получить?
 
Aleksei Stepanenko:
Андрей, зачем Вам это? Если данные уже собраны в массиве, можно найти способ просто их использовать как есть, ничего не двигая. Или заранее собирать в массив в нужном порядке. Что Вы хотите получить?

Вот мой простой код для иллюстрации того что мне нужно.

double LoY[2][31],LoU,LoU1;
int S,S1,S2;

void OnTick()
{
//*************************************************** БЛОК 1
if (Minute()==20&&Minute()!=S1)
{
ArrayFill(LoY,0,10,0.5555);

S1=Minute();
}
//*************************************************** БЛОК 2
if (Minute()!=S)
{
LoY[0][S2]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("----LoY[0][1]-- Г ---  [0]  ",  LoY[0][0],"  [1] ",   LoY[0][1],"  [2] ",   LoY[0][2],"  [3] ",   LoY[0][3],"  [4] ",   LoY[0][4],"  [26] ",   LoY[0][26],"  [27] ",   LoY[0][27],"  [28] ",   LoY[0][28],"  [30] ",   LoY[0][30],"  [60] ",   LoY[0][60]);
Print("----LoY[1][0]-- В ---  [0]  ",  LoY[0][0],"  [1] ",   LoY[1][0],"  [2] ",   LoY[2][0],"  [3] ",   LoY[3][0],"  [4] ",   LoY[4][0],"  [26] ",   LoY[26][0],"  [27] ",   LoY[27][0],"  [28] ",   LoY[28][0],"  [30] ",   LoY[30][0],"  [60] ",   LoY[60][0]);
S2++;
if (S2==62)
{
S2=0;
}
S=Minute();
}
}

В блоке 1 выполняется ArrayFill(LoY,0,10,0.5555) и присваивает первым 10 элементам массива значение 0.5555. После этого мне нужно отсортировать всю  нулевую строку от столбца 0 до столбца 31.

Отсортировать я хочу в блоке 2 при помощи ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); Но не могу отсортировать, потому что эта функция сортирует двумерный массив по первому измерению, то есть по строкам. А у меня строка которую нужно сортировать только 1.  ArraySort() по второму измерению, то есть по столбцам не сортирует двумерные массивы(только одномерные).

Вот я и подумал о том что может быть стоит преобразовать LoY[2][31] после исполнения первого блока в  LoY[31][2] что бы в блоке 2  ArraySort() могла отсортировать нужные мне значения. А мне нужно отсортировать все значения из нулевой строки после того как  ArrayFil() изменила первые 10 из них.

Может быть сортировать  двумерные массивы по второму измерению , то есть по столбцам,  можно  при помощи какой то другой функции , или как то еще?
Извините... не знаю как удалить код. Поэтому просто скажу что в нем ошибка в строке 180   вместо LoY[S2][0]=Bid; нужно LoY[0][52]=Bid;

Спасибо за помощь

 
Вы хотите отсортировывать значения в обеих строках или только в первой?