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

 

Почему у меня некорректно скопированы цены закрытия от указанного времени с указанным количеством. MQL5

copied = CopyClose(_Symbol,PERIOD_H4,Time[59],5,MPI); Alert(copied);
  for(int i = 0; i < 100; i++)
    {
     Alert(MPI[i]);
    };
 
Alexandr Sokolov:

Почему у меня некорректно скопированы цены закрытия от указанного времени с указанным количеством. MQL5

А где в mql5 вы нашли Time[] или это пользовательский массив?

 
Alexey Viktorov:

А где в mql5 вы нашли Time[] или это пользовательский массив?

Да это пользовательский массив, в который я скопировал время открытия баров того таймфрейма, в окне которого находится индикатор. Или как иначе указывать дату (особенно с учётом того что в будущем она должна будет комбинироваться несколькими вариантами)?

 
Alexandr Sokolov:

Да это пользовательский массив, в который я скопировал время открытия баров того таймфрейма, в окне которого находится индикатор. Или как иначе указывать дату (особенно с учётом того что в будущем она должна будет комбинироваться несколькими вариантами)?

Да, что-то не так с копированием "чужого" тф. Я начал один индикатор по нескольким тф, и заметил что не сразу происходит копирование CopyRates(). Видимо из-за неподготовленных данных по периоду. Просто повторное компилирование исправляет ситуёвину. Получается, что надо сначала "дёрнуть" период, а потом копировать. Но до этого руки не дошли. Завтра буду проверять. Но надеюсь, что я прав.

И вопрос на засыпку: зачем копировать время открытия баров того таймфрейма, в окне которого находится индикатор если вместо этого можно использовать time[]. И не следует забывать о направлении индексирования.

 
Alexey Viktorov:

И вопрос на засыпку: зачем копировать время открытия баров того таймфрейма, в окне которого находится индикатор если вместо этого можно использовать time[]. И не следует забывать о направлении индексирования.

Time используется за рамками OnCalculate. Направление индексации ArraySetAsSeries(...,true) во всех буферах


Зачем это? - я сделал индикатор тренда (выложил в CodeBase), он "шумный". Я сделал замедление - недостаточно. Теперь хочу сделать так чтобы значения на каждой свече младшего таймфрейма вычислялись от баров старшего таймфрейма

Что ты имел ввиду под словом "дёрнуть"?

 
Alexandr Sokolov:

Time используется за рамками OnCalculate. Направление индексации ArraySetAsSeries(...,true) во всех буферах


Зачем это? - я сделал индикатор тренда (выложил в CodeBase), он "шумный". Я сделал замедление - недостаточно. Теперь хочу сделать так чтобы значения на каждой свече младшего таймфрейма вычислялись от баров старшего таймфрейма

Что ты имел ввиду под словом "дёрнуть"?

"Дёрнуть" это не моё выражение. Так я читал на этом форуме периодическое обращение к данным нужного периода.

Помню, даже я в гневе от того, что не получается, выражался "дёргал период как кота за причинное место", но не помогает. После многих обсуждений проблемы завернул копирование в цикл do while. Если скопировалось с первой попытки, ну и слава Богу. Если-же нет, то даём N попыток через пустой цикл for на 200-500 итераций, кажется этого достаточно. Можно увеличить...

А тот индикатор, о котором я сказал чуть раньше, ещё в стадии самого начала. Потому и не сделано как надо. Просто проверял сколько баров старшего тф нужно на доступные бары текущего периода. У меня получилось, что на 5000 баров М5 приходится 17 дневных. А если это не учитывать, то копируются 5000 текущего М5 периода, 5000 4х часов и 5000 дневных. Слишком много лишних...

Ещё немаловажное замечание: Некоторое время назад можно было один раз перевернуть индексацию массива, а теперь приходится на каждом чихе перенаправлять. Где-то я об этом уже писал. По этому я предпочитаю работать в умолчательном варианте. Привыкнуть не сложно.

 

GlobalVariable по умолчанию может быть только double

double close = GlobalVariableGet("close");


Если значение close мне необходимо без дробной части, будет ли правильно писать так:

int close = GlobalVariableGet("close");
 
Alexey Viktorov:

"Дёрнуть" это не моё выражение. Так я читал на этом форуме периодическое обращение к данным нужного периода.

Помню, даже я в гневе от того, что не получается, выражался "дёргал период как кота за причинное место", но не помогает. После многих обсуждений проблемы завернул копирование в цикл do while. Если скопировалось с первой попытки, ну и слава Богу. Если-же нет, то даём N попыток через пустой цикл for на 200-500 итераций, кажется этого достаточно. Можно увеличить...

А тот индикатор, о котором я сказал чуть раньше, ещё в стадии самого начала. Потому и не сделано как надо. Просто проверял сколько баров старшего тф нужно на доступные бары текущего периода. У меня получилось, что на 5000 баров М5 приходится 17 дневных. А если это не учитывать, то копируются 5000 текущего М5 периода, 5000 4х часов и 5000 дневных. Слишком много лишних...

Ещё немаловажное замечание: Некоторое время назад можно было один раз перевернуть индексацию массива, а теперь приходится на каждом чихе перенаправлять. Где-то я об этом уже писал. По этому я предпочитаю работать в умолчательном варианте. Привыкнуть не сложно.

Подожди, мы что-то пропустили или неправильно друг друга поняли, ведь

Alert(copied);

... возвращает у меня 5, что правильно, а вот значения в буфере у меня все одинаковые

 
Alexandr Sokolov:

Подожди, мы что-то пропустили или неправильно друг друга поняли, ведь

... возвращает у меня 5, что правильно, а вот значения в буфере у меня все одинаковые

Тогда надо разобраться с размерностью массива MPI и его направлением индексации, если копируешь 5 элементов, то почему цикл до 100?

Я в таких случаях предпочитаю пользоваться отладчиком. Получил массив и проверяй без перезапуска все поля массива до одури...

 
Alexey Viktorov:

Тогда надо разобраться с размерностью массива MPI и его направлением индексации, если копируешь 5 элементов, то почему цикл до 100?

Я в таких случаях предпочитаю пользоваться отладчиком. Получил массив и проверяй без перезапуска все поля массива до одури...

100-ку я поставил потому-что думал что то что мне нужно с 59 начнётся, но при 6-ке то-же самое

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