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

 
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 #:
Я перфекционист, сортировать отдельные элементы массива структур, это как пенопластом по стеклу.
Насчёт не распределенного массива, у меня есть уважительная причина. Время час ночи и жена над ухом со словами "спать пора, спать пора".   )))
Что, ночь, что утро один фиг)
Да, вы правы насчёт искать максимум сразу. Так намного удобнее будет .Я чёт с утра тупанул.
 
JRandomTrader #:

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

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

Извините. Невнимательность. Поправил. Спасибо. И что значение ArrayMaximum - индекс, а не цена, тоже забыл. Но уже все исправил.

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
ArrayResize(bid_arr,copied,100000);
double ask_arr[];
ArrayResize(ask_arr,copied,100000);
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
int IndMaxBid = ArrayMaximum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с максимальной ценой
double highestBid = bid_arr[IndMaxBid]; // Самая высокая цена bid за период
int IndMinBid = ArrayMinimum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с минимальной ценой
double lowestBid = bid_arr[IndMinBid]; // Самая низкая цена bid за период
int IndMaxAsk = ArrayMaximum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с максимальной ценой
double highestAsk = ask_arr[IndMaxAsk]; // Самая высокая цена ask за период
int IndMinAsk = ArrayMinimum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с минимальной ценой
double lowestAsk = ask_arr[IndMinAsk]; // Самая низкая цена ask за период
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

Поскольку ArrayMaximum не работал с массивом ticks, я пробовал альтернативные расчеты, с if в цикле. Почему это лучше?

 
maxvoronin74 #:

Почему это лучше?

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double highestHigh = 0, lowestLow = DBL_MAX;
   for(int i = 0; i < copied; i++)
     {
      if(highestHigh < ticks[i].ask) // Находим максимальное значение в массиве ticks
         highestHigh = ticks[i].ask;
      if(lowestLow > ticks[i].bid) // Находим минимальное значение в массиве ticks
         lowestLow = ticks[i].bid;
     }
 
Aleksandr Slavskii #:
Благодарю.
 
Интересно, можно ли графический текстовый объект расположить, например, на боковой шкале подокна с графиком WPR?
Причина обращения: