Что-то не так с циклом?

 

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

Пытаюсь адаптировать данную статью https://www.mql5.com/ru/articles/1503  под mql5.

Сейчас на этапе "рисования квадратиков". Квадратики рисует, все замечательно, только вот рисует как-то неправильно. Хотелось бы услышать Ваши комментарии относительно того, почему так получилось

int OnInit()
{
  for(int x=0;x<9;x++)
  {
      for(int y=0;y<3;y++)
      {
         ObjectCreate(0, "signal"+IntegerToString(x+y),OBJ_LABEL,0,0,0,0,0);
         // создаем очередную метку. Обратите внимание, что название метки
         // создается "на лету" и зависит от счетчиков "x" и "y"
         ObjectSetString (0, "signal"+IntegerToString(x+y), OBJPROP_FONT, "Wingdings");
         // меняем шрифт на Wingdingsб чтобы получить доступ к символам
         ObjectSetInteger (0,"signal"+IntegerToString(x+y), OBJPROP_COLOR, Blue);
         // меняем цвет на синий
         ObjectSetString(0, "signal"+IntegerToString(x+y), OBJPROP_TEXT, CharToString(110));
         //делаем квадратики
         ObjectSetInteger(0, "signal"+IntegerToString(x+y),OBJPROP_XDISTANCE,x*20);
         // изменяем координату Х.
         // x*20 - каждая метка создается с интервалом в 20 пикселей по
         // горизонтали и напрямую зависит от счетчика "x"
         ObjectSetInteger(0, "signal"+IntegerToString(x+y),OBJPROP_YDISTANCE,y*20);
         // изменяем координату Y.
         // y*20 - каждая метка создается с интервалом в 20 пикселей по
         // вертикали и напрямую зависит от счетчика "y"
      }
      }
   return(INIT_SUCCEEDED);

Рисует этот индикатор не три ряда (как отражено в условии цикла), а только первый ряд и последние два квадрата с двух других рядов

Помогите, пожалуйста, разобраться, где ошибка 

Язык MQL4 для "чайников". Пользовательские индикаторы (часть 2)
Язык MQL4 для "чайников". Пользовательские индикаторы (часть 2)
  • 2007.12.26
  • Antoniuk Oleg
  • www.mql5.com
Это пятая статья из цикла "Язык MQL4 для 'чайников'". Сегодня мы научимся использовать графические объекты - очень мощное средство разработки, которое позволяет существенно расширить возможности индикаторов. Кроме того, вы можете использовать их также в скриптах и советниках. Мы узнаем как создавать объекты, изменять их параметры, проверять ошибки. Конечно, мне не удастся описать полностью все объекты, их слишком много. Но вы получите все необходимые знания, чтобы разобраться в этом самостоятельно. Также в этой статье содержится пошаговое руководство-пример по созданию сложного сигнального индикатора. При этом, многие параметры будут доступны пользователю для настройки, что позволит гибко изменять внешний вид.
 

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

В Вашем коде, думаю, нужно обратить внимание на имена объектов. Если у Вас в одном из проходов: x = 1; y = 1, а в другом проходе будет y = 1; x = 1. Какие имена будут у меток?

 
Vasiliy Pushkaryov:

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

В Вашем коде, думаю, нужно обратить внимание на имена объектов. Если у Вас в одном из проходов: x = 1; y = 1, а в другом проходе будет y = 1; x = 1. Какие имена будут у меток?

Не думаю, просто механически посмотрим давайте:

00 10 20 30 40 50 60 70 80

01 11 21 31 41 51 61 71 81

02 12 22 32 42 52 62 72 82 

 
Эдуард Климуш:

Не думаю, просто механически посмотрим давайте:

00 10 20 30 40 50 60 70 80

01 11 21 31 41 51 61 71 81

02 12 22 32 42 52 62 72 82 

А куда же вы сложение дели?
 
Эдуард Климуш:

Не думаю, просто механически посмотрим давайте:

00 10 20 30 40 50 60 70 80

01 11 21 31 41 51 61 71 81

02 12 22 32 42 52 62 72 82 

у вас идет сложение чисел x+y, потом перевод в тип стринг, поэтому результат будет? вот и считайте

0+0=0, 0+1=1, 0+2=2

1+0=1, 1+1=2, 1+2=3

вот и думайте что у вас получается с именами 

 
Sergey Gritsay:

у вас идет сложение чисел x+y, потом перевод в тип стринг, поэтому результат будет? вот и считайте

0+0=0, 0+1=1, 0+2=2

1+0=1, 1+1=2, 1+2=3

вот и думайте что у вас получается с именами 

Ох, действительно, сейчас пересмотрю, спасибо большое
 
Sergey Gritsay:

у вас идет сложение чисел x+y, потом перевод в тип стринг, поэтому результат будет? вот и считайте

0+0=0, 0+1=1, 0+2=2

1+0=1, 1+1=2, 1+2=3

вот и думайте что у вас получается с именами 

Все, спасибо большое, действительно, сделал вот так - IntegerToString(x)+IntegerToString(y) - и все заработало
 
Эдуард Климуш:

Не думаю, просто механически посмотрим давайте:

00 10 20 30 40 50 60 70 80

01 11 21 31 41 51 61 71 81

02 12 22 32 42 52 62 72 82 

Ну да, это я прогнал с единицами. Надо было так написать: x = 1; y = 2, а в другом проходе будет y = 2; x = 1.

Хотя Ilyas уже ответил.

 
Эдуард Климуш:
Все, спасибо большое, действительно, сделал вот так - IntegerToString(x)+IntegerToString(y) - и все заработало

Тоже не лучший вариант, надо еще какой-то знак между х и у:

IntegerToString(x)+"_"+IntegerToString(y)

Это если количество больше 10.

1 и 11, это не 11 и 1.

 
Vasiliy Pushkaryov:

Ну да, это я прогнал с единицами. Надо было так написать: x = 1; y = 2, а в другом проходе будет y = 2; x = 1.

Хотя Ilyas уже ответил.

А вы не могли бы подсказать, каким образом можно записать следующее условие на iRSI:

По текущему бару мы не смотрим, смотрим по последнему закрытому (чтобы сигнал был четким, не прыгал туда сюда)

Если RSI на баре, который шел перед последним закрытым (как я понимаю, его порядковый номер будет 2), меньше 20, а RSI на баре, который закрылся (как я понимаю, его порядковый номер будет 1), больше 20 (выход из зоны перепроданности), то квадратик окрашивается зеленым

if ((iRSI(Symbol(),period[x],14,PRICE_CLOSE)для бара с номером [2] < 20) && ((iRSI(Symbol(),period[x],14,PRICE_CLOSE)для бара с номером [2] > 20))
{
 //меняем цвет
}
 
Dmitry Fedoseev:

Тоже не лучший вариант, надо еще какой-то знак между х и у:

IntegerToString(x)+"_"+IntegerToString(y)

Это если количество больше 10.

1 и 11, это не 11 и 1.

Добавил разделитель "signal"+IntegerToString(x)+ "." + IntegerToString(y)
Причина обращения: