[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 525

 
hoz:
 Вот страница учебника https://docs.mql4.com/ru/array/ArrayCopy
 Там сказано, что:
 С чего бы это вдруг array2 содержит 10 последних баров?
 Ведь Bars*6 - 60 не будет возвращать значение 10. Логики я вообще не замечаю.
 Например, в истории 1000 баров. Тогда Bars*6 - 60 = 1000*6 - 60 = 6000 - 60 = 5940. И где тут 10 последних баров?
5940 --Начальный индекс  исходного массива для копирования 10 последних баров (бар - 6 индексов).
 

Roll: 
5940 --Начальный индекс  исходного массива для копирования 10 последних баров (бар - 6 индексов).

Уважаемые эксперты, а нет  ли ошибки в учебнике?   

Вот мои рассуждения:

В начале кода  вызывается   ф-я  int ArrayCopyRates, которая  копирует в двухмерный массив, вида RateInfo[][6], данные баров текущего графика и возвращает количество скопированных баров, либо -1 в случае неудачи, согласно примера этой ф-ии:

double array1[][6];
ArrayCopyRates(array1,"EURUSD", PERIOD_H1);
Print("Текущий бар ",TimeToStr(array1[0][0]),"цена открытия ", array1[0][1]);

текущим баром является бар с индексом  0-0, таким образом ,  возвращаясь к первоначальному  коду,  мы  копируем элемент с индексом 0-0 (текущий бар) массива array1 , в  массив  array2 с начальным индексом  0-0,  мы получаем 10 последних баров ( где последний бар - это текущий бар, бар с индексом [0]), что противоречит написанному в учебнике… и соответственно , копируя элемент с индексом    Bars*6-60,60 массива array1 в массив  array2 с начальным индексом элемента 0 мы получаем информациию о барах из истории.

 

Здравствуйте.

Есть пользовательский индикатор.

Пишу советника..и встал вопрос...как обратиться к моему индикатору? А именно взять данные из указанного бара(в моем случае необходимо взять 2-ого бара). Есть windowsPriceMax, но насколько я понял, выводит только последнее значение графика подокна и то не понятно, если к примеру у меня 3 линии на индикаторе, что он выведет?

 
Tragedy:

Здравствуйте.

Есть пользовательский индикатор.

Пишу советника..и встал вопрос...как обратиться к моему индикатору? А именно взять данные из указанного бара(в моем случае необходимо взять 2-ого бара). Есть windowsPriceMax, но насколько я понял, выводит только последнее значение графика подокна и то не понятно, если к примеру у меня 3 линии на индикаторе, что он выведет?



double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

Расчет указанного пользовательского индикатора. Пользовательский индикатор должен быть скомпилирован (файл с расширением EX4) и находиться в директории каталог_терминала\experts\indicators.
Параметры:

symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
name - Имя пользовательского индикатора.
... - Список параметров (при необходимости). Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора.
mode - Индекс линии индикатора. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

 

Спасибо. Помогли. Думал, что так вызываются лишь iMac*** iStoch*** индикаторы, которые шли предустановленные.

 
Lisi4ka330:

Уважаемые эксперты, а нет  ли ошибки в учебнике?   

Вот мои рассуждения:

В начале кода  вызывается   ф-я  int ArrayCopyRates, которая  копирует в двухмерный массив, вида RateInfo[][6], данные баров текущего графика и возвращает количество скопированных баров, либо -1 в случае неудачи, согласно примера этой ф-ии:

текущим баром является бар с индексом  0-0, таким образом ,  возвращаясь к первоначальному  коду,  мы  копируем элемент с индексом 0-0 (текущий бар) массива array1 , в  массив  array2 с начальным индексом  0-0,  мы получаем 10 последних баров ( где последний бар - это текущий бар, бар с индексом [0]), что противоречит написанному в учебнике… и соответственно , копируя элемент с индексом    Bars*6-60,60 массива array1 в массив  array2 с начальным индексом элемента 0 мы получаем информациию о барах из истории.


Не делая громких заявлений, проверяем на практике:

//+------------------------------------------------------------------+
//|                                                       массив.mq4 |
//|                                                  Copyright 2012, |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012,"
#property link      "https://forum.mql4.com/ru/46980/page525"
#property show_inputs
extern string s=" -----номер бара--------";
extern int a=9;//номер 10 последних баров 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{if(a<10)
{double array1[][6];double array2[10][6];
  ArrayCopyRates(array1);
  ArrayCopy(array2,array1,0,Bars*6-60,60);
// теперь array2 содержит 10 последних баров из истории(имеется в виду,что последний бар-это текущий бар,бар с индексом [0])
Alert("Контрольный бар - ",a," время - ",TimeToStr(array2[a][0]),"  цена открытия - ",array2[a][1]);}return(0);}
 
Roll:


Не делая громких заявлений, проверяем на практике:

 

Да, на практике  действительно получается, что элемент с индексом Bars*6-60,60 - текущий бар... тогда как объяснить, что  в примере :

double array1[][6];
ArrayCopyRates(array1,"EURUSD", PERIOD_H1);
Print("Текущий бар ",TimeToStr(array1[0][0]),"цена открытия ", array1[0][1]);
текущий бар -  array1[0][0], а после копирования массива  он становится  array1[Bars*6-60,60][0]... получается что где-то происходит перенумерация...  конечно результат понятен после использования функции на практике... но логика  напутана,  на мой взгляд))) 
 
Lisi4ka330:

Да, на практике  действительно получается, что элемент с индексом Bars*6-60,60 - текущий бар...


Это Ваш вывод.
 
Roll:


Не делая громких заявлений, проверяем на практике:

 

#property show_inputs
extern string s=" -----номер бара--------";
extern int a=9;//номер 10 последних баров 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{if(a<10)
{double array1[][6];double array2[10][6];
  ArrayCopyRates(array1);
  ArrayCopy(array2,array1,0,Bars*6-60,60);
// теперь array2 содержит 10 последних баров из истории(имеется в виду,что последний бар-это текущий бар,бар с индексом [0])
Alert("Контрольный бар - ",a," время - ",TimeToStr(array2[a][0]),"  цена открытия - ",array2[a][1]);}return(0);}

 

 Ну так тут распринтован канкретный элемент массива TimeToStr(array2[a][0]

 То что вывело верно, я согласен. Но причём тут  Bars*6-60 ... Вместо Bar подставляется при расчёте значение чего? Если баров, то как выходит, что последние 10 баров?

 Можно заметить, на форуме не только я этого не понял, а многие. 

 

 Получается что количество всех баров умножить на 6 и минус 60. Откуда мы взяли 6 ? Да и вообще бессмыслица какая-то. 

 
hoz:

 

 Ну так тут распринтован канкретный элемент массива TimeToStr(array2[a][0]

 То что вывело верно, я согласен. Но причём тут  Bars*6-60 ... Вместо Bar подставляется при расчёте значение чего? Если баров, то как выходит, что последние 10 баров?

 Можно заметить, на форуме не только я этого не понял, а многие. 



int Bars -- Количество баров на текущем графике.