Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 929

 
Здравствуйте. Пытаюсь освоить виртуальный хостинг все по инструкции, не открывается советник.Подскажите, плз.
 

Подскажите пожалуйста, кто из столпов Классического ТА является автором этой картинки?

Эта картинка есть у Элдера в "Основах биржевой торговли". Меня, собственно говоря, интересует такая же картинка, но с КОНВЕРГЕНЦИЯМИ, если такая вообще существует в природе.


 

Помогите, пожалуйста. Простейший скрипт, а не работает. Не могу понять почему.

int awd1[];
void OnStart()
  {
   for(int i=0;i<=5;i++)
   {
   awd1[i]=i+10;
   }
   Alert("первый=");
  }

Цикл должен прокрутиться 6 раз. При каждой итерации должно присваиваться значение в массив awd1. После завершения работы цикла должно выскочить окошко с записью "первый=". Но оно не выскакивает. Что не так?

 
silachara:

Помогите, пожалуйста. Простейший скрипт, а не работает. Не могу понять почему.

int awd1[];
void OnStart()
  {
   for(int i=0;i<=5;i++)
   {
   awd1[i]=i+10;
   }
   Alert("первый=");
  }

Цикл должен прокрутиться 6 раз. При каждой итерации должно присваиваться значение в массив awd1. После завершения работы цикла должно выскочить окошко с записью "первый=". Но оно не выскакивает. Что не так?

Это поможет избавиться и от сообщений в терминале: array out of range in ...:

#property strict
#define ARRAY_SIZE  6
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
 int j=0, awd1[];
   ArrayResize(awd1,ARRAY_SIZE,ARRAY_SIZE+1);
//---
   for(int i=0;i<ARRAY_SIZE;i++)
     {
      j=i+10;
      //j=j+10;//или, к примеру, такой вариант вместо строки выше, чтобы вы посмотрели, что присваиваться будет
      awd1[i]=j;
     }
   Alert("первый = ");
  }
//+------------------------------------------------------------------+


P./S.: Вот вариант с проверкой:

#property strict
#define ARRAY_SIZE  6
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
 int j=0, count=0, awd1[];
   ArrayResize(awd1,ARRAY_SIZE,ARRAY_SIZE+1);
//---
   for(int i=0;i<ARRAY_SIZE;i++)
     {
      j=i+10;
      //j=j+10;//или, к примеру, такой вариант вместо строки выше, чтобы вы посмотрели, что присваиваться будет
      awd1[i]=j;
      count++;
      Print("count = ",count,", awd1[",i,"] = ",awd1[i],", j = ",j);
     }
   Alert("первый = ");
  }
//+------------------------------------------------------------------+
 
silachara:
Чуть поправила коды выше, чтобы одно и то же значение awd1[i] не выходило.
 
DiPach:
Чуть поправила коды выше, чтобы одно и то же значение awd1[i] не выходило.

Спасибо!

Т.е. массив надо было объявить указав количество ячеек в нем? Это требование появилось после перехода МТ4 на 600-й билд? Или и раньше так было?

И еще одна проблема: не могу найти файл, куда записывается информация из Print(). Подскажите, плиз, путь. Все директории МТ4 перерыл, но не нашел.

 
silachara:

Спасибо!

Т.е. массив надо было объявить указав количество ячеек в нем? Это требование появилось после перехода МТ4 на 600-й билд? Или и раньше так было?

Функция для установки размера динамического массива ArrayResize была и до 600-го билда.

А так..., при обновлённом языке MQL4 компилятор стал строже. Посмотреть интересующую инфу "из первых уст", а не по пересказу с возможным не намеренным искажением, в т.ч., за счёт неполноты изложения,  можно, при необходимости, и здесь. В том числе, в "Таблице отличий между компиляторами" прежнего и обновлённого языков MQL4 (эта таблица на первой странице этой темы, в конце первого сообщения), или по поиску. Как помню, материалов было много при переходе на обновлённый язык MQL4.

 

silachara:

И еще одна проблема: не могу найти файл, куда записывается информация из Print(). Подскажите, плиз, путь. Все директории МТ4 перерыл, но не нашел.

Быстрый способ: Перейдите на вкладку терминала "Эксперты" -> кликните правой кнопой мыши в поле этой вкладки -> в открывшемся меню нажмите на строку "Открыть".

После этого откроется папка с лог-файлами с записями из этой вкладки, в т.ч., о выводимых через Print(). Ниже картинка (вспомнила, что у меня эта инфа есть в виде визуализации):


P./S.: Этим же способом можно быстро открыть папку на компе с лог-файлами записей из вкладки терминала "Журнал" (они в другой папке находятся).

 

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

void OnStart()
  {
int awd1[];
ArrayResize(awd1,6,7);
   for(int i=0;i<=5;i++)
   {
   awd1[i]=i+10;
   Print("awd1[", i, "]=", awd1[i]);
   }
   Alert("awd1[0]=", awd1[0], ", awd1[1]=", awd1[1], ", awd1[2]=", awd1[2], 
   ", awd1[3]=", awd1[3], ", awd1[4]=", awd1[4], ", awd1[5]=", awd1[5]);
  }

Что было изменено:

1. Перенес строку с объявлением массива int awd1[]; внутрь функции OnStart()

2. Добавил функцию ArrayResize(awd1,6,7);

3. Скрипт заработал.

Попытаюсь сделать выводы. В скриптах массивы корректно объявлять внутри функции OnStart(). После объявления массива ему обязательно нужно определить размер функцией ArrayResize(), иначе компилятор будет ругаться. Мои выводы верны? Если нет, то подскажите, пожалуйста, правильную трактовку.

 
silachara:

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

Что было изменено:

1. Перенес строку с объявлением массива int awd1[]; внутрь функции OnStart()

2. Добавил функцию ArrayResize(awd1,6,7);

3. Скрипт заработал.

Попытаюсь сделать выводы. В скриптах массивы корректно объявлять внутри функции OnStart(). После объявления массива ему обязательно нужно определить размер функцией ArrayResize(), иначе компилятор будет ругаться. Мои выводы верны? Если нет, то подскажите, пожалуйста, правильную трактовку.

В общем-то, да. И ругаться будет хоть тихо, но конкретно. :)

Уточню лишь следующие моменты:

1. При объявлении обычных переменных и массивов, думаю, нужно исходить из того, что будет выполнять этот скрипт(или советник/индикатор) и для чего предназначены эти переменные/ массивы.

Вами прилагаемая схема работы скрипта вполне, полагаю, допускает объявление переменных не на глобальном уровне программы, а так локально. Т.е., объявление массива происходит разово. И не происходит не требуемых повторных(зацикленных) объявлений  в теле Start() в коде, о котором говорим, к примеру, на участке до начала цикла for(), и, например, при надобности объявления каких-то переменных далее, на участке после выхода из for() {}:


Соответственно, то, что массив разово объявляется не на уровне глобальных переменных программы, а в теле OnStart(), но до оператора цикла for() - это вполне приемлимо в такой схеме работы программы.

С моей точки зрения, если нет необходимости что-то объявлять на уровне глобальных переменных программы, то оптимальнее этой возможностью воспользоваться и объявлять, то что можно, локально.

2. По коду же уточню следующее:

void OnStart()
  {
   int awd1[];
   ArrayResize(awd1,6,7);
   for(int i=0;i<6;i++)
     {
      awd1[i]=i+10;
      Print("awd1[",i,"]=",awd1[i]);
     }
   string text=StringConcatenate("awd1[0]=",awd1[0],", awd1[1]=",awd1[1],", awd1[2]=",awd1[2],
                                 ", awd1[3]=",awd1[3],", awd1[4]=",awd1[4],", awd1[5]=",awd1[5]);
   Alert(text);
  }

То бишь:

  • Не стоит применять знак <= (меньше равно) в for. Имею в виду, где было (i=0;i<=5;i++). Просто поставьте знак <(меньше), а вместо 5, цифру 6:
for(int i=0;i<6;i++)

Вот в таком варианте 5 будет подходить для for:

for(int i=5;i>=0;i--)
  • Помню раньше встречала инфу, что функция Stringconcatenate способствует более быстрой обработке длинного текста. Поэтому у себя обычно её применяю. Вот включила и тут, так, на всякий случай.


P./S.: Ещё одно уточнение, на всякий случай, применение ArrayResize() - для динамических массивов. В Документации к этой функции есть инфа, когда нельзя изменять размер для динамических массивов этой функцией.