Вопрос разработчикам

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

1. В коде пишу
Print(GetLastError());


В терминале, в логах (вкладка "Эксперты") результат Print всегда дублируется. Почему?

2. Функция

ArrayResize()

- как и где ей пользоваться? Я имею ввиду в момент формировния массива (в цикле) или же она прменяется к уже сформированному массиву (за циклом)???

3. Просьба: сделайте, пожалуйста, возможность ПОЛНОГО выбора масштаба графика пользователем (на сколько нужно пользователю, на столько он и увеличивает/уменьшает).

 
1. вкладка "Эксперты" как раз для того, чтобы собирать вывод из экспертов.
2. int ArrayResize( object& array[], int new_size)
все совершенно прозрачно - изменение размера массива.
Sets new size to the first dimension. If success returns count of all elements contained in the array after resizing, otherwise, returns zero and array is not resized.

Parameters

array[] - Array to resize.
new_size - New size for the first dimension.

Sample

double array1[][4];
int element_count=ArrayResize(array, 20);
// element count is 80 elements

3. А чем не устраивают текущие варианты масштаба?
 
Renat

Вам не стоило приводить пример из словаря. Я в нем это давно прочел. Просто несколько раз когда я писал сюда о тех или иных ошибках, одним из самых первых ответов, который вы мне давали - "где ArrayResize???".
Размер массива менять функцией ArrayResize надо на лету при формировании массива (в цикле) или же после того, как мкассив сформирован?

1. вкладка "Эксперты" как раз для того, чтобы собирать вывод из экспертов.

Я догадался. Но но на мой вопрос вы так и не ответили: почему сразу как изменяю код, компилирую, перехожу в терминал - в логах уже 2 копии результата команды Print?

3. А чем не устраивают текущие варианты масштаба?

Тем, что при резком скачке рынка, низ/верх подробно, хорошо увеличенными не рассмотришь, так чарт сразу сжимается при большом скачке. Нужно большее увеличение. Почему бы не сделать как в Investor's Dream, например, - сколько надо столько и увеличиваешь/уменьшаешь.
 
Размер массива менять функцией ArrayResize надо на лету при формировании массива (в цикле) или же после того, как мкассив сформирован?

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

Тем, что при резком скачке рынка, низ/верх подробно, хорошо увеличенными не рассмотришь

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


Да, я думал так же, но видимо что НЕ ТАК!.
Привожу вам 2 кода. В первом ArrayResize делается во время формирования цикла, во втором - после.
Попробуйте оба. Второй, тот что должен по логике работать - не работает!

//+------------------------------------------------------------------+
//|                                                        Super.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MetaQuotes Software Corp."
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Green
#property  indicator_color2  Red

//---- indicator buffers
double     plus[];
double     minus[];
double     indima[];
double     ind[];

extern     int fast=3;
extern     int slow=17;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 1 additional buffer used for counting.
   IndicatorBuffers(3);
   //---- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,3);
   SetIndexBuffer(0,plus);
   SetIndexBuffer(1,minus);
   SetIndexDrawBegin(0,20);
   SetIndexDrawBegin(1,20);
   SetIndexArrow(0,241);
   SetIndexArrow(1,242);

   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("Test");
   SetIndexLabel(0,"Test");
   SetIndexLabel(1,"Test");

//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
   int    limit;
   int    counted_bars=IndicatorCounted();
   double current,prev;
//---- check for possible errors
   if(counted_bars<0) return(-1);
   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   
   for(int i=0; i<limit-17; i++)
      {
         if (Open[i] <  Close[i])    ind[i] = Close[i]-Open[i];
         if (Open[i] >  Close[i])    ind[i] = Open[i]-Close[i];
         if (Open[i] == Close[i])    ind[i] = 0.0;
         ArrayResize(ind,8000); 
      }
      
     
      for(i=0; i<limit-17; i++)
         {
           indima[i] = iMAOnArray(ind,0,fast,0,MODE_SMA,i)-iMAOnArray(ind,0,slow,0,MODE_SMA,i); 
           ArrayResize(indima,8000); 
         }
         
         
         
      for(i=0; i<limit-17; i++)
         {
           current = indima[i];
           prev = indima[i+1];
           
           if (current > prev) 
                     {
                           plus[i] = current;
                           minus[i] = 0.0;
                     }
           if (prev > current) 
                     {
                           minus[i] = current;
                           plus[i] = 0.0;
                     }
           if (prev == current && Close[i]<Open[i]) 
                     {
                           minus[i] = current;
                           plus[i] = 0.0;
                     }
           if (prev == current && Close[i]>Open[i]) 
                     {
                           plus[i] = current;
                           minus[i] = 0.0;
                     }
           if (prev == current && Close[i]==Open[i]) 
                     {
                           plus[i] = current;
                           minus[i] = 0.0;
                     }
         }

//---- done
   return(0);
  }



А вот и второй - ресайз делается после того, как цикл сформирован, - непосредственно перед употреблением!:

//+------------------------------------------------------------------+
//|                                                        Super.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MetaQuotes Software Corp."
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Green
#property  indicator_color2  Red

//---- indicator buffers
double     plus[];
double     minus[];
double     indima[];
double     ind[];

extern     int fast=3;
extern     int slow=17;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 1 additional buffer used for counting.
   IndicatorBuffers(3);
   //---- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,3);
   SetIndexBuffer(0,plus);
   SetIndexBuffer(1,minus);
   SetIndexDrawBegin(0,20);
   SetIndexDrawBegin(1,20);
   SetIndexArrow(0,241);
   SetIndexArrow(1,242);

   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("Test");
   SetIndexLabel(0,"Test");
   SetIndexLabel(1,"Test");

//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
   int    limit;
   int    counted_bars=IndicatorCounted();
   double current,prev;
//---- check for possible errors
   if(counted_bars<0) return(-1);
   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   
   for(int i=0; i<limit-17; i++)
      {
         if (Open[i] <  Close[i])    ind[i] = Close[i]-Open[i];
         if (Open[i] >  Close[i])    ind[i] = Open[i]-Close[i];
         if (Open[i] == Close[i])    ind[i] = 0.0;
         
      }
      ArrayResize(ind,8000); 
     
      for(i=0; i<limit-17; i++)
         {
           indima[i] = iMAOnArray(ind,0,fast,0,MODE_SMA,i)-iMAOnArray(ind,0,slow,0,MODE_SMA,i); 
           
         }
      ArrayResize(indima,8000);   
         
         
      for(i=0; i<limit-17; i++)
         {
           current = indima[i];
           prev = indima[i+1];
           
           if (current > prev) 
                     {
                           plus[i] = current;
                           minus[i] = 0.0;
                     }
           if (prev > current) 
                     {
                           minus[i] = current;
                           plus[i] = 0.0;
                     }
           if (prev == current && Close[i]<Open[i]) 
                     {
                           minus[i] = current;
                           plus[i] = 0.0;
                     }
           if (prev == current && Close[i]>Open[i]) 
                     {
                           plus[i] = current;
                           minus[i] = 0.0;
                     }
           if (prev == current && Close[i]==Open[i]) 
                     {
                           plus[i] = current;
                           minus[i] = 0.0;
                     }
         }

//---- done
   return(0);
  }



Что скажете?

 
Виталий, в обоих случаях неверное использование ArrayResize.
Да и к тому же - откуда взялся фиксированный размер в 8000?

"До" - означает, что подготовить(заресайзить) размер буфера индикатора надо до момента любого обращения к нему. Похоже, что Вам необходимо некоторое время потратить на изучение основ програмирования.
 
Виталий, все неверные варианты вы уже попробовали.
Осталось еще перед циклом ArrayResize поставить :)).
Функция ArrayResize устанавливает размер массива, поэтому ее нужно вызвать ДО использования самого массива.

Кстати, Ренат,
если вызвать ArrayResize для уже существующего и заполненного массива, что будет?
1. Данные в нем сохранятся?
2. При уменьшении размера отбросятся с меньшими или большими индексами для обычных и тех что типа Close массивов?
3. При увеличении массива заполнятся нулями?
4. В начала или конце для обычных и тех что типа Close массивов?
5. ArrayResize работает только для динамических массивов?
(т.е. описанных как int a[])
6. Что будет если в ArrayResize подставить статический массив?

Понимаю что можно и самому проверить с помощью Print,
но представте сколько на это времени уйдет ...
 
если вызвать ArrayResize для уже существующего и заполненного массива, что будет?

Если новый размер больше старого, то все старые данные сохранятся(скопируются из старого буфера), а новое место заполнится нулями. Если новый размер меньше существующего, то массив урежется, но данные сохранятся.
Изменение размера для серийных(Open, High, Low, Close, Volume) и индикаторных массивов не работает.
Статический массив вроде можно менять.
 
Renat
Большое вам спасибо! Ошибку понял и исправил.

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

Я программировал на Perl. Там ресайз делать до первичного обращения к массиву делать было не нужно.
Perl вообще один из самых простых и интуитивно понятных языков.

Mak
Ну кто через это не проходил??? :)
Большое вам спасибо! Теперь я на один вопрос умнее ! :))
 
Perl вообще один из самых простых и интуитивно понятных языков.

Да уж .... :))
Одни регэкспы и умолчания чего стоят :)

Уж если вы с Перлом освоились,
MQL вам совсем элементарным покажется.
Только немного руку набить ...
 
Mak

Не кто и не говорил что MQL сложный. Просто инфы по языку пока не много. Так вроде в общем сейчас все ок, но вот появляются моменты типа этого.