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

 
mila.com:

советник сделала чтобы проверить саму возможность, открывает правильно, а в индикаторе вообще невидит значения ближних двух буферов индикатора "Arrow v.3"

Так у вас индикатор за пределы массива вылетает в цикле. Поглядите какой лимит, и какие значения il во вложенных циклах. Куда индекс il ссылается при limit == rates_total-2 ?

 
mila.com:

Как это увидеть?

Код свой посмотреть

 
Artyom Trishkin:

Поглядите какой лимит, и какие значения il во вложенных циклах.

печатает номер бара первой и второй стрелок , поочерёдно

  for(int i=limit; i>=0; i--) 
     {
     for(int il=i+1;il<=i+300;il++)
        {
         if(NormalizeDouble(iCustom(NULL,0,"Arrow v.3",0,il),Digits)!=EMPTY_VALUE
            )
           {
            num_buy=il;
            Print(il);
           // break;
           }
        }
//
      if(num_buy==60)
        {
         BufferUP[i+1]=low[i+1]-distance*MyPoint;
         
        }
    }
 

Третьи сутки на него гляжу, не понимаю что не так)

Подскажите
 
mila.com:

печатает номер бара первой и второй стрелок , поочерёдно

А что это вообще за странный цикл?

Зачем идёте от начала истории к её концу и постоянно возвращаетесь назад на триста баров во вложенном цикле на каждой итерации первого цикла?

Тут вас наверное спасает iCustom(), который не выдаёт значений за пределами исторических данных.

Ну вот сами поглядите. Допустим, у вас есть истории всего 1000 баров: rates_total в этом случае у вас равен 1000. Лимит, 1000-2=998. Ну самый первый бар истории вы получается исключаете из цикла. Бог с ним.

Вы ставите сначала индекс на бар с номером 998 (rates_total-2 = 1000-2 = 998),

а далее что делаете? Далее делаете вложенный цикл начиная от значения i, равном 998+1=999 - это самый первый бар истории - левее ничего нету - пусто. А вы делаете цикл от 999 до 999+300. Там данных нет - это выход за пределы массива.

То есть, лимит у вас в данной ситуации должен быть таким, чтобы вложенный цикл в самом начале дошёл до бара 999. Это rates_total-2-300. Тогда, раз вы вложенный цикл начинаете от i+1, вот тогда не будет выхода за пределы массива: i=1000-2-300 = 698. Во вложенном цикле li=i+1 = 698+1=699, и вплоть до li=i+300 = 698+300=998. Опять самый первый бар исключён из расчёта. Ну зато нет выхода за пределы массива.

По всей видимости, вы не совсем представляете себе что вы делаете.

Об этом говорит очень странный цикл вообще.

Там вам не нужны вложенные циклы. Если ищете определённое количество значений буфера пользовательского индикатора, то и делайте цикл от нуля до определённого значения. Но не более rates_total.

 
Artyom Trishkin:

А что это вообще за странный цикл?

Зачем идёте от начала истории к её концу и постоянно возвращаетесь назад на триста баров во вложенном цикле на каждой итерации первого цикла?

Тут вас наверное спасает iCustom(), который не выдаёт значений за пределами исторических данных.

Ну вот сами поглядите. Допустим, у вас есть истории всего 1000 баров: rates_total в этом случае у вас равен 1000. Лимит, 1000-2=998. Ну самый первый бар истории вы получается исключаете из цикла. Бог с ним.

Вы ставите сначала индекс на бар с номером 998 (rates_total-2 = 1000-2 = 998),

а далее что делаете? Далее делаете вложенный цикл начиная от значения i, равном 998+1=999 - это самый первый бар истории - левее ничего нету - пусто. А вы делаете цикл от 999 до 999+300. Там данных нет - это выход за пределы массива.

То есть, лимит у вас в данной ситуации должен быть таким, чтобы вложенный цикл в самом начале дошёл до бара 999. Это rates_total-2-300. Тогда, раз вы вложенный цикл начинаете от i+1, вот тогда не будет выхода за пределы массива: i=1000-2-300 = 698. Во вложенном цикле li=i+1 = 698+1=699, и вплоть до li=i+300 = 698+300=998. Опять самый первый бар исключён из расчёта. Ну зато нет выхода за пределы массива.

По всей видимости, вы не совсем представляете себе что вы делаете.

Об этом говорит очень странный цикл вообще.


Спасибо, доходчиво.

 
Artyom Trishkin:

Об этом говорит очень странный цикл вообще.

Там вам не нужны вложенные циклы. Если ищете определённое количество значений буфера пользовательского индикатора, то и делайте цикл от нуля до определённого значения. Но не более rates_total.

Почему от нуля?

мне нужно в поставит точку если на третьем или "N" баре есть стрелка вызываемого индикатора. На всей истории

какой правильный цикл?

 
mila.com:

Почему от нуля?

мне нужно в поставит точку если на третьем или "N" баре есть стрелка вызываемого индикатора. На всей истории

какой правильный цикл?

Где это нужно сделать? В индикаторе? В советнике?

 
Artyom Trishkin:

Где это нужно сделать? В индикаторе? В советнике?

В индикаторе

 
mila.com:

В индикаторе

Ну так и читайте iCustom() сразу по индексу первого цикла.

Другой вопрос - что вам нужны данные от текущего бара влево. Поэтому и говорю - читайте от нуля до найденного нужного, но не более, чем rates_total-1.

При этом читайте только при limit>1

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

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