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

 
Aleksei Stepanenko:

или сделать отдельную функцию печати массива:

И вызывайте её из любого места

Алексей, я долго молчал, но никак не могу спокойно видеть такое… Зачем использовать функцию IntegerToString() если явное приведение типа в этом случае гораздо проще и менее затратно…

eStr+=(string)i+": "+DoubleToString(eArray[i],4)+", ";
 

хз, привычка :)

 
Aleksei Stepanenko:

или сделать отдельную функцию печати массива:

И вызывайте её из любого места

Большое спасибо за понимание и разъяснение. Беру паузу на изучение и понимание новой для меня информации.

 
Alexey Viktorov:

Алексей, я долго молчал, но никак не могу спокойно видеть такое… Зачем использовать функцию IntegerToString() если явное приведение типа в этом случае гораздо проще и менее затратно…

И Вам спасибо за ценные дополнения.

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

на форуме и в публикациях про С#, Delphi и всё прочее...

tcl.Eval("toplevel .myWin ; wm title .myWin {Окношко}" ); // простите, не удержался
 
Aleksei Stepanenko:

или сделать отдельную функцию печати массива:

И вызывайте её из любого места

Я решил сделать отдельную пользовательскую функцию печати массива. А точнее, не сделать , воспользоваться той ( PrintArray() ) ,которую уже сделали Вы.

Что я сделал?

1. Обращение к пользовательской функции PrintArray() я разместил внутри функции OnTick()... как написано в учебнике Ковалева.

2.Тело  функции PrintArray()  я разместил за пределами  функции OnTick()... как написано в учебнике Ковалева.

Все новые переменные из тела этой функции - локальные. Они объявлены и инициализированы внутри этой функции.

int P1=0;
double LoY[31];
void OnTick()
{
if (P1==0)
{
for(int r=0; r<31;r++)
{
LoY[r]=1.6104+(r*2)*0.0001;
P1=1;
}
}
//*************************************************************  Б Л О К    N 2
for(int x=0; x<31;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
}
}
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
PrintArray(LoY);
}
//****************************

void PrintArray(double &eArray)
   {
   string eStr="";
   int eSize=ArraySize(eArray);
   for(int i=0; i<eSize; i++)
      {
      eStr+=IntegerToString(i)+": "+DoubleToString(eArray[i],4)+", ";
      }
   Print(str);
   }

Я ни каких изменений в Вашу функцию не вносил. Но компилятор почему то выдает 6 ошибок. И все они относятся к пользовательской функции.

Буду Вам очень признателен, если скажете мне, что я сделал не правильно.
Спасибо.

 
ANDREY:

Я решил сделать отдельную пользовательскую функцию печати массива. А точнее, не сделать , воспользоваться той ( PrintArray() ) ,которую уже сделали Вы.

Что я сделал?

1. Обращение к пользовательской функции PrintArray() я разместил внутри функции OnTick()... как написано в учебнике Ковалева.

2.Тело  функции PrintArray()  я разместил за пределами  функции OnTick()... как написано в учебнике Ковалева.

Все новые переменные из тела этой функции - локальные. Они объявлены и инициализированы внутри этой функции.

Я ни каких изменений в Вашу функцию не вносил. Но компилятор почему то выдает 6 ошибок. И все они относятся к пользовательской функции.

Буду Вам очень признателен, если скажете мне, что я сделал не правильно.
Спасибо.

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

void PrintArray(double &eArray[])
 

Aleksei Stepanenko:

string str="";

for(int r=0; r<31;r++)
   {
   LoY[r]=1.6104+r*0.0001;
   str+="--LoY["+IntegerToString(r)+"]--, "+DoubleToString(LoY[r],4)+", ";
   }
Print(str);


Как мне кажется, до меня наконец то дошло ( я слегка тугодум)......

На первой итерации  строковая переменная  str пустая. Символы  =+ предписывают   str  присвоить себе саму себя пустую(без значений) и к  самой себе пустой прибавить строку со значениями, а именно  "--LoY["+IntegerToString(r)+"]--, "+DoubleToString(LoY[r],4)+", ";. Значением этой строки будет "  --LoY[0]--, --1.6104-- ". После этих операций  str на первой итерации получает значение   --LoY[0]--, --1.6104-- ". Как я понял в Вашей терминологии это называется первый элемент.

На второй итерации   str уже имеет первый элемент со значением  "  --LoY[0]--, --1.6104-- "   Символы  =+ предписывают   str  присвоить себе саму себя со значением первого элемента  и к  самой себе со значением первого элемента прибавить строку с другими  значениями, а именно  "--LoY["+IntegerToString(r)+"]--, "+DoubleToString(LoY[r],4)+", ";. Значением этой строки уже  будет "  --LoY[1]--, --1.6105-- ". После этих операций  str на второй  итерации получает значение   --LoY[0]-- --1.6104--  --LoY[1]-- --1.6105-- ". То есть в  str появился(приплюсовался) второй элемент.  И на тридцатой итерации в   str будет 30 элементов с разными значениями элементов массива.

А после окончания цикла, за его пределами будет один раз напечатана строковая переменная  str с 30 элементами.
Я долго не мог понять этот алгоритм, потому что когда Вы говорили о сложении я обращал внимание исключительно на красные плюсы.  "--LoY["+IntegerToString(r)+"]--, "+DoubleToString(LoY[r],4)+", а  не на str+=

И поэтому для меня до сих пор остается загадкой какую же роль в этом алгоритме играют эти красные плюсы    "--LoY["+IntegerToString(r)+"]--, "+DoubleToString(LoY[r],4)+"

Спасибо за помощь.

 
Alexey Viktorov:

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

Добавил квадратные скобки  void PrintArray(double &eArray[]) Компилятор ни показал ни одной ошибки и ни одного предупреждения.
НО..... функция   Print() почему то не напечаталась ни одного раза.

Вашу лень понимаю, потому что сам такой. Если лень пройдет и на ее место придет энтузиазм , буду Вам признателен , если подскажете что еще не правильно в пользовательской функции.

Спасибо за помощь и извините за беспокойство.

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