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

 

Всем доброго времени суток! Вопрос по mql4. В Справочнике сказано  ArrayBsearch  Возвращает индекс первого найденного элемента. Вот мой код

int K5,S;   
double K6;
#include <UN.mqh>
void OnTick()///**/ 
{
if (Bid==1.61360&&S==0)
{
S=1;
K5=ArrayBsearch(UN,Bid,WHOLE_ARRAY,0,MODE_ASCEND);
K6=UN[ArrayBsearch(UN,Bid,WHOLE_ARRAY,0,MODE_ASCEND)][0];
Print("-------------K5-----",K5,"   K6 ",K6); 
}
}

Код обращается к двухмерному массиву UN в первом измерении которого хранятся   6700  строк со значениями цены , которые повторяются. Массив отсортирован по возрастанию.

Вот фрагмент этого массива

1.6121  ,       1335379587      ,
1.6121  ,       1347570374      ,
1.6121  ,       1357847772      ,
1.6121  ,       1358137564      ,
1.6121  ,       1379547068      ,
1.6121  ,       1382028979      ,
1.6121  ,       1384946430      ,
1.6121  ,       1410191668      ,
1.6121  ,       1410270362      ,
1.6121  ,       1412804368      ,
1.6136  ,       1263228748      ,
1.6136  ,       1263303074      ,
1.6136  ,       1264413990      ,
1.6136  ,       1264756287      ,
1.6136  ,       1289306656      ,
1.6136  ,       1289444716      ,
1.6136  ,       1289576618      ,
1.6136  ,       1297067549      ,
1.6136  ,       1297958087      ,
1.6136  ,       1301901208      ,
1.6136  ,       1301927162      ,
1.6136  ,       1301999284      ,
1.6136  ,       1308270212      ,
1.6136  ,       1308571818      ,
1.6136  ,       1310605156      ,
1.6136  ,       1310697508      ,
1.6136  ,       1311097717      ,
1.6136  ,       1313038096      ,
1.6136  ,       1335389058      ,
1.6136  ,       1347571839      ,
1.6136  ,       1349111008      ,
1.6136  ,       1355341840      ,
1.6136  ,       1355512503      ,
1.6136  ,       1357918408      ,
1.6136  ,       1380508587      ,
1.6136  ,       1382545538      ,
1.6136  ,       1385061697      ,
1.6136  ,       1414506914      ,
1.6151  ,       1263314859      ,
1.6151  ,       1263359820      ,
1.6151  ,       1264081299      ,
1.6151  ,       1264096188      ,
1.6151  ,       1288862988      ,
1.6151  ,       1289310689      ,
1.6151  ,       1289584047      ,
1.6151  ,       1296637766      ,
1.6151  ,       1297071100      ,

ВОПРОС Почему  ArrayBsearch возвращает индекс не первого найденного элемента(желтый) как написано в Справочнике, а возвращает индекс последнего элемента (зеленый).

И какие исправления нужно внести в код что бы  ArrayBsearch возвращал индекс  первого найденного элемента(желтого)

Всем спасибо за помощь.

 
ANDREY #:

Всем доброго времени суток! Вопрос по mql4. В Справочнике сказано  ArrayBsearch  Возвращает индекс первого найденного элемента. Вот мой код

Код обращается к двухмерному массиву UN в первом измерении которого хранятся   6700  строк со значениями цены , которые повторяются. Массив отсортирован по возрастанию.

Вот фрагмент этого массива

ВОПРОС Почему  ArrayBsearch возвращает индекс не первого найденного элемента(желтый) как написано в Справочнике, а возвращает индекс последнего элемента (зеленый).

И какие исправления нужно внести в код что бы  ArrayBsearch возвращал индекс  первого найденного элемента(желтого)

Всем спасибо за помощь.

ArrayBsearch

Ищет указанное значение в отсортированном по возрастанию многомерном числовом массиве. Поиск производится в первом измерении с учетом флага AS_SERIES.

Дело может быть в этом. Попробуйте изменить флаг AS_SERIES перед вызовом ArrayBsearch()

P.S. Когда меня в очереди спрашивают "кто крайний?", я уточняю, с какой стороны :)

 
Vladislav Boyko #:

Дело может быть в этом. Попробуйте изменить флаг AS_SERIES перед вызовом ArrayBsearch()

P.S. Когда меня в очереди спрашивают "кто крайний?", я уточняю, с какой стороны :)

Спасибо большое за ценную информацию. Читал про этот флаг. Но никогда  не вдумывался в него, поскольку написано что ArraySetAsSeries

устанавливает флаг AS_SERIES указанному объекту динамического массива, индексация элементов массива будет производиться как в таймсериях.

А у меня массив статический

Спасибо.

Объект динамического массива - Типы данных - Основы языка - Справочник MQL4
Объект динамического массива - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Объект динамического массива - Типы данных - Основы языка - Справочник MQL4
 

Заполняю массив разницей Хай[0] и клоз[1]. Одни положительные числа (логично). После цикла заполнения, принтую циклом все эти значения - половина отрицательных значений. Что это? Откуда они? Почему изменились?


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

      { mass[i]=iHigh(_Symbol, PERIOD_H1, i)-iClose(_Symbol, PERIOD_H1, i+1);

Print( mass[i]; }

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

      { if (mass[i]<0) Print( mass[i], "   ", i);

}


 
Valeriy Yastremskiy #:

{ mass[i]=iHigh(_Symbol, PERIOD_H1, i)-iClose(_Symbol, PERIOD_H1, i+1);

Два раза прибавляется 1. Прибавление в теле цикла где разница лишнее.

Обычно i принтую, так понятней что происходит.  Print("i ",i,"  ", mass[i]; }

А это я просто для проверки. Сейчас тот же код после перезагрузки терминала заработал нормально. То есть, принтует повторно те же значения. Видимо, косяк терминала, если перезагрузка спасает. 

 
Ivan Butko #:

А это я просто для проверки. Сейчас тот же код после перезагрузки терминала заработал нормально. То есть, принтует повторно те же значения. Видимо, косяк терминала, если перезагрузка спасает. 

Зы, ошибся, код верный.)

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

Вообще для чистоты эксперимента в таких случаях принтую в теле цикла все значения, и клоз и хай и разницу и номер массивов))) Так наглядней.
 
Ivan Butko #:

Заполняю массив разницей Хай[0] и клоз[1]. Одни положительные числа (логично). После цикла заполнения, принтую циклом все эти значения - половина отрицательных значений. Что это? Откуда они? Почему изменились?


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

      { mass[i]=iHigh(_Symbol, PERIOD_H1, i)-iClose(_Symbol, PERIOD_H1, i+1);

Print( mass[i]; }

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

      { if (mass[i]<0) Print( mass[i], "   ", i);

}



А почему хай свечи не может быть ниже клоуза соседней?

 
PapaYozh #:


А почему хай свечи не может быть ниже клоуза соседней?

Конечно, может. Только не половина. 1% от какого-то количества. 

 

Всем привет

Кто подскажет, как работает функция print

Хочу глазами проверить, что сделки открываются корректно. В момент открытия позиции вывожу 7 значений типа double:

printf("Parametrs",a,b,c,d,f,g,h);

Итог, в журнал записывается только слово: " Parametrs


Что не так?

 
Михаил Соколов #:

Всем привет

Кто подскажет, как работает функция print

Хочу глазами проверить, что сделки открываются корректно. В момент открытия позиции вывожу 7 значений типа double:

printf("Parametrs",a,b,c,d,f,g,h);

Итог, в журнал записывается только слово: " Parametrs


Что не так?

Здравствуйте, Михаил! Попробуйте применить функцию Print() вместо printf():

Print("Parametrs: ",a,b,c,d,f,g,h);

С уважением, Владимир.

Причина обращения: