Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1494

 

Meta Editor выдает ошибку 'ArrayMinimum' - constant cannot be modified и 'ArrayMaximum' - constant cannot be modified, а также '=' - illegal operation use по присвоению переменной PrevClose в следующем коде:

ulong copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1); 
ArrayResize(ticks, copied, 100000);
double PrevClose = ticks[copied-1]; // Получаем последний элемент массива как значение PrevClose
double highestHigh = ArrayMaximum(ticks, 0, copied - 1); // Находим максимальное значение в массиве ticks
double lowestLow = ArrayMinimum(ticks, 0, copied - 1); // Находим минимальное значение в массиве ticks
 
maxvoronin74 #:

Meta Editor выдает ошибку 'ArrayMinimum' - constant cannot be modified и 'ArrayMaximum' - constant cannot be modified, а также '=' - illegal operation use по присвоению переменной PrevClose в следующем коде:

"Находим максимальное значение в массиве ticks"- максимальное значение чего мы находим?

ticks[copied-1].bid или ticks[copied-1].flags   

Шутка)))


Скорее всего вы перепутали CopyTicks  с CopyRates, хотя там тоже массив структур и указывать, какой элемент структуры вам нужен.

double PrevClose = rates[copied-1].close;

У вас в коде лишняя строка.

ArrayResize(ticks, copied, 100000);
 Не нужна она так как  CopyTicks и CopyRates , сама при копировании, распределяет размер массива.
 
Aleksandr Slavskii #:

"Находим максимальное значение в массиве ticks"- максимальное значение чего мы находим?

ticks[copied-1].bid или ticks[copied-1].flags   

Шутка)))


Скорее всего вы перепутали CopyTicks  с CopyRates, хотя там тоже массив структур и указывать, какой элемент структуры вам нужен.

double PrevClose = rates[copied-1].close;

У вас в коде лишняя строка.

 Не нужна она так как  CopyTicks и CopyRates , сама при копировании, распределяет размер массива.

Благодарю за подсказку. Я не знал. На всякий случай вставляю эту строку.

Верно ли я понимаю вашу шутку, что в rates все цены усредненные и учитывают бар, а в ticks - нет? Я потому и взял tick, чтобы использовать произвольный интервал времени, а не цены баров. CopyRates у меня в аналогичной формуле заполнял за отрезок час переменную copied на максимальное значение типа ulong. Эту проблему я тоже не мог решить.

 
maxvoronin74 #:

Благодарю за подсказку. Я не знал. На всякий случай вставляю эту строку.

Верно ли я понимаю вашу шутку, что в rates все цены усредненные и учитывают бар, а в ticks - нет? Я потому и взял tick, чтобы использовать произвольный интервал времени, а не цены баров. CopyRates у меня в аналогичной формуле заполнял за отрезок час переменную copied на максимальное значение типа ulong. Эту проблему я тоже не мог решить.

Всё не верно. 

MqlRates-это структура, а вы обращаетесь с ней как с переменной. 

MqlTick- тоже структура.

Вы пытаетесь соединить тёплое с мягким, поэтому компилятор вас не понимает.

Так же как и я)))

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

 
Aleksandr Slavskii #:

Всё не верно. 

MqlRates-это структура, а вы обращаетесь с ней как с переменной. 

MqlTick- тоже структура.

Вы пытаетесь соединить тёплое с мягким, поэтому компилятор вас не понимает.

Так же как и я)))

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

Задача стоит модифицировать WPR (Williams Percent Range) так, чтобы получать разницу значений WPR за произвольный отрезок времени, независимо от баров.
 
maxvoronin74 #:
Задача стоит модифицировать WPR (Williams Percent Range) так, чтобы получать разницу значений WPR за произвольный отрезок времени, независимо от баров.

Возможно (но это не точно) вы это хотели получить.

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double bid[];
   for(int i = 0; i < copied; i++)
      bid[i] = ticks[i].bid;
   double PrevClose = bid[copied - 1]; // Получаем последний элемент массива как значение PrevClose
   double highestHigh = ArrayMaximum(bid, 0, copied); // Находим максимальное значение в массиве ticks
   double lowestLow = ArrayMinimum(bid, 0, copied); // Находим минимальное значение в массиве ticks
 
Aleksandr Slavskii #:
double lowestLow = ArrayMinimum(bid, 0, copied);

Благодарю. Вот, что вышло, если я правильно уловил урок:

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
double ask_arr[];
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
double highestBid = ArrayMaximum(bid_arr, 0, copied-1);
double lowestBid = ArrayMinimum(bid_arr, 0, copied-1);
double highestAsk = ArrayMaximum(ask_arr, 0, copied-1);
double lowestAsk = ArrayMinimum(ask_arr, 0, copied-1);
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR
Но, к сожалению по строке bid_arr[i] = ticks[i].bid; слетел Эксперт с графика по причине array out of range in 'имямоегоэксперта.mq5' (204,12).
 
maxvoronin74 #:

Благодарю. Вот, что вышло, если я правильно уловил урок:

Раз уж мы всё равно крутим цикл по всем тикам, можно в этом цикле не копировать, а сразу искать те максимумы-минимумы.

Кстати, если копировать, неплохо бы сначала задать размеры массивов, куда копируем, цикл за нас это делать не будет, вылетим из массива на первой же итерации. Это только CopyTicksRange сама целевой массив отресайзит.

 
JRandomTrader #:

Раз уж мы всё равно крутим цикл по всем тикам, можно в этом цикле не копировать, а сразу искать те максимумы-минимумы.

Кстати, если копировать, неплохо бы сначала задать размеры массивов, куда копируем, цикл за нас это делать не будет, вылетим из массива на первой же итерации. Это только CopyTicksRange сама целевой массив отресайзит.

Я перфекционист, сортировать отдельные элементы массива структур, это как пенопластом по стеклу.
Насчёт не распределенного массива, у меня есть уважительная причина. Время час ночи и жена над ухом со словами "спать пора, спать пора".   )))
 
Aleksandr Slavskii #:
Я перфекционист, сортировать отдельные элементы массива структур, это как пенопластом по стеклу.
Насчёт не распределенного массива, у меня есть уважительная причина. Время час ночи и жена над ухом со словами "спать пора, спать пора".   )))
Что, ночь, что утро один фиг)
Да, вы правы насчёт искать максимум сразу. Так намного удобнее будет .Я чёт с утра тупанул.