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

 
Nikolay Ivanov #:

Ваш код распечатывает 0, а не -1..

Возможно -1 где то из другого места распечаталось, скорее всего весь код в принтах.. 

Да, Вы правы, каждый шаг запринтирован, чтобы видеть, в каком месте "затормозило". 

Пример привёл некорректный, прошу прощения, сам код большой. 

Но, решение Константина решило проблему! Действительно, поменял везде местами i-- и проверку на ноль, и теперь логика работает, как надо, вместо -1 выдает 0, либо 1. (раньше 0, либо -1, при последнем тут же ошибка). 

 
Nikolay Ivanov #:

Ваш код распечатывает 0, а не -1..

Возможно -1 где то из другого места распечаталось, скорее всего весь код в принтах.. 

Прежде чем пытаться решить проблему ее нужно определить.. Убедиться что она есть и локализовать ее место, а только потом решать..

Возьмите ручку и бумажку. И пропишите как считается цикл. В этом коде

void OnStart()
  {
int i=10;
for (i; i>0; i--)
{
i--;
if (i==0) break;
}

Print(i);
  }

проверка

if (i==0) break;

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

int i=11;

нечетное значение. Если четное, то при таком коде

int i=10;
for (i; i>0; i--)
{
i--;
if (i==0) break;
}

до

if (i==0) break;

будет приходить нечетное значение.

 
Nikolay Ivanov #:

Прежде чем пытаться решить проблему ее нужно определить.. Убедиться что она есть и локализовать ее место, а только потом решать..

Понял Вас, имею ввиду

 
Konstantin Nikitin #:

Возьмите ручку и бумажку. И пропишите как считается цикл. В этом коде

 Зачем мне брать ручку и бумашку, если в условии сказано что принт =-1, а по факту (я проверил) он принтуется как 0, то есть пример приведен некорректно. А на некорректный пример невозможно дать правильный ответ... 

 
Nikolay Ivanov #:

 Зачем мне брать ручку и бумашку, если в условии сказано что принт =-1, а по факту (я проверил) он принтуется как 0, то есть пример приведен некорректно. А на некорректный пример невозможно дать правильный ответ... 

Ноль принтуется из этой строки

for (i; i>0; i--)

а не из проверки и выходу по break.

Вообще для прохождения массива правильней писать

for (i; i>=0; i--)

т.к. массивы начинаются с нулевого индекса

 
Konstantin Nikitin #:

Ноль принтуется из этой строки

а не из проверки и выходу по break.

0 принтуется из этой строки, для того кода, который был приведен..

Print(i);

Вопрос не стоял почему не срабатывает break, вопрос стоял почему принт дал -1..  вот и все. и там не важно четное или нечетное i стартовое, никогда не принтуется -1... 

 
Подскажите, пожалуйста, как можно посчитать тики или свечи за большое время? (год, например). 

Пробую через Close[], но индекс больше 5000 не дает. 
 
Ivan Butko #:
Подскажите, пожалуйста, как можно посчитать тики или свечи за большое время? (год, например). 

Пробую через Close[], но индекс больше 5000 не дает. 

Тики или свечи такая большая разница, что и сказать страшно…

 
Alexey Viktorov #:

Тики или свечи такая большая разница, что и сказать страшно…

Вот, например, советник, ему какой угодно период укажи - он в тестере хоть по тикам, хоть по барам М1 пройдёт, каждый примет во внимание. 

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


UPD
Попробую через эту штуку, код в сети лежит

MqlRates rates[];

   int copied=CopyRates(NULL,0,0,100,rates);

   if(copied<=0)

      Print("Ошибка копирования ценовых данных ",GetLastError());

   else Print("Скопировано ",ArraySize(rates)," баров");


UPD
Странно. Ни с того ни с сего заработало. Даже миллионный бар проверяется. Ничего не делал, читал документацию, пил чай. Просто еще раз запустил и заработало. Весь день выдавало ошибку, хотя загрузил историю и настройки поменял еще вчера. 
То есть, и дополнительный код (выше) проверять не потребовалось. 
МТ4 - темпераментный какой-то. Или у ФорексЧифа такая особенность. Надо будет стандартный поставить, а не брокерский. 

 
Ivan Butko #:

Вот, например, советник, ему какой угодно период укажи - он в тестере хоть по тикам, хоть по барам М1 пройдёт, каждый примет во внимание. 

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


UPD
Попробую через эту штуку, код в сети лежит

MqlRates rates[];

   int copied=CopyRates(NULL,0,0,100,rates);

   if(copied<=0)

      Print("Ошибка копирования ценовых данных ",GetLastError());

   else Print("Скопировано ",ArraySize(rates)," баров");


UPD
Странно. Ни с того ни с сего заработало. Даже миллионный бар проверяется. Ничего не делал, читал документацию, пил чай. Просто еще раз запустил и заработало. Весь день выдавало ошибку, хотя загрузил историю и настройки поменял еще вчера. 
То есть, и дополнительный код (выше) проверять не потребовалось. 
МТ4 - темпераментный какой-то. Или у ФорексЧифа такая особенность. Надо будет стандартный поставить, а не брокерский. 

Первое обращение к CopyRates() инициировало подкачку исторических данных (не запускайте недельку, и опять получите то же самое, ну, может и не недельку, но какое-то время).
Просто нужно проверять сколько всего есть данных на сервере и сравнивать доступное количество советнику. Если меньше, чем требуется - выходить до следующего тика. На нём опять проверять. Если за какое-то количество попыток не получилось получить требуемую историю - тут уже обрабатывать сию ошибочку как требуется.

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