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

 
Alexey Viktorov #:

Обратите внимание на другие методы

Да, про них я знаю конечно, но мне для другого надо... Короче, суть такая. Недавно на бинансе начал торговать и хотел потестировать. Также есть кухонный брокер с большим количеством криптовалют, но спред мешает. А так котировки довольно неплохо совпадают с котировками бинанса, особенно если рассматривать цену (бид+аск)/2.

Вот хотел добиться максимального соответствия, хотя конечно можно будет и пренебречь этими расхождениями

 
deerhunter22 #:

Да, про них я знаю конечно, но мне для другого надо... Короче, суть такая. Недавно на бинансе начал торговать и хотел потестировать. Также есть кухонный брокер с большим количеством криптовалют, но спред мешает. А так котировки довольно неплохо совпадают с котировками бинанса, особенно если рассматривать цену (бид+аск)/2.

Вот хотел добиться максимального соответствия, хотя конечно можно будет и пренебречь этими расхождениями

Наверное можно поглядеть в сторону создания собственного графика. MQL5 позволяет.

 

Доброе время суток. При написании советника на Mql5 столкнулся с проблемой. Есть массив со значениями открытия свечей за год. На каждой свече этого массива нужно создать массив из n-свечей, скажем 30, чтобы проверять максимумы и минимумы. Что-то типа индикатора Zigzag.

Написал такой код, который выдаёт ошибку: "array out of range" или значения максимум и минимум во всём массиве opens, а не в требуемом 30-свечном периоде.

for(int i=0; i<ArraySize(opens); i++)
  {
    if(i+30<=ArraySize(opens))
      {
       double maximum=0;
       double minimum=9;
       for(int j=0; j<30; j++)
        {
         maximum = ArrayMaximum(opens, i, i+j);
         minimum = ArrayMaximum(opens, i, i+j);
        }
     }
  }

Возможно, нужно создавать ещё один массив, который проверять в функциях ArrayMaximum() и ArrayMinimum(), но я запутался с вложенными циклами и размерностью массивов.

Подскажите, плиз.

 
Dmitry Ivanushko #:
if(i+30<=ArraySize(opens))
if(i+30<ArraySize(opens))

Здесь выход за пределы массива

 
if(i+30<ArraySize(opens))

Эта ошибка из-за невнимательности. Её исправление не решает проблемы.

Вот как бы создать массив из 30-ти цен открытия свечей, чтобы уже в нём искать максимумы и минимумы?

 
Dmitry Ivanushko #:
ArrayMaximum
ArrayMaximum

Возвращает индекс максимального  значения, а не цену.

//+------------------------------------------------------------------+
int indexMax[];
int indexMin[];
int sizeArray = ArraySize(opens);
int size = 0;
int n = 30;

for(int i = n; i < sizeArray; i + n)
  {
   ArrayResize(indexMax, size + 1);
   indexMax[size] = ArrayMaximum(opens, i - n, i);
   indexMin[size] = ArrayMinimum(opens, i - n, i);
   size++;
  }
//+------------------------------------------------------------------+

Не проверял, но вроде так вы получите индексы минимумов и максимумов открытий (opens) свечей.

Хотя можно получить и сразу цену, а не индексы.

double PriseMin = opens[ArrayMinimum(opens, i - n, i)];
 
for(int i = n; i < sizeArray; i + n)

Нигде не нашёл примера цикла на mql с шагом. Это упрощает всё дело.

Только ChatGPT посоветовал мне такое написание: 

for(int i = n; i < sizeArray; i += n)

Буду дальше экспериментировать. Код работает. Спасибо.

А ошибка "array out of range" возникает, если не делать ArrayResize.

 
Dmitry Ivanushko #:

Эта ошибка из-за невнимательности. Её исправление не решает проблемы.

Вот как бы создать массив из 30-ти цен открытия свечей, чтобы уже в нём искать максимумы и минимумы?

А в чём проблема? Объявите массив temp[] и в него копируйте по 30 элементов и в нём ищите индекс минимального\максимального значения. А если в конце будет меньше 30ти, то скопируется сколько осталось. И в этом случае, я лучше-бы использовал цикл while()

 
Alexey Viktorov #:
А в чём проблема? Объявите массив temp[] и в него копируйте по 30 элементов и в нём ищите индекс минимального\максимального значения. А если в конце будет меньше 30ти, то скопируется сколько осталось. И в этом случае, я лучше-бы использовал цикл while()

Да, можно и так. Плохо соображаю, поэтому спрашиваю совета. 

 
Dmitry Ivanushko #:

Да, можно и так. Плохо соображаю, поэтому спрашиваю совета. 

В статическом массиве задается размер константный, его не изменить, в динамическом его можно менять, но размер массива задается! т.е. размер массива известен и индексы элементов от 0 до конца. <=  выход за пределы как раз потому что индексы элементов с нуля, и индекс последнего элемента меньше на единицу размера массива.

Все в Ваших руках))))