Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Используй MQL5 Cloud Network. Тестируй роботов с гиперскоростью!
hoz
1936
hoz 2013.02.12 18:54 

 Пришлось мне всё-таки столкнуться с использованием массивов в своих экспертах. Вопрос собственно, вот в чём. Для меня затруднительно понять как осуществлять отладку кода, в котором присуствуют массивы.

 Возьмём простой пример. Есть 2 типа сигнала по соответственно 2 различным условиям.

Я так понимаю, логично завести массив в функции start(), у меня так:

int start()
{
// Отслеживание открытия нового бара
   if (lastBarTime == iTime(NULL, 0, 0))         // На текущем баре все необходимые действия..
       return (0);                               // ..уже были выполнены
// Рассчёт сигнала   
   static int signal[2];                         // Массив на 2 элемента
   GetSignal(signal);                            // Получаем сигнал в функции GetSignal() и возвращаем его в массив signal[2]
// Проведение торговых операций
   if (!Trade(signal))                           // торгуем по полученному выше сигналу
       return (0);
// дальше код...

 Верно ли я это сделал? Недавно про static шёл разговор, что мол он не работает, так вот.. думаю. Или может её глобальной сделать? я про массив signal[2]  имею ввиду..  Ведь важно чтоб сигнал сохранялся, до тех пор пока он не изменится.

 Вот функция, которая получает сигнал и возвращает его в массив signal[2]:

//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
void GetSignal(int& signal[])
{
   for (int i=0; i<2; i++)
   {
      Если условие совпало, то.. 
      {
         if ( ND(MathAbs(MA(g_maPeriod[i]) - Ask)) <= i_thresholdFromMa * pt) 
         {
            signal[i] = SIGNAL_BUY;             
         }
      }
   
      Если условие совпало, то..
      {
          if ( (MathAbs(MA(g_maPeriod[i]) - Bid)) <= i_thresholdFromMa * pt )  
          {
             signal[i] = SIGNAL_SELL;
          }
      }
   }
}
Как можно распринтовать данный момент? Согласно документации можно принтанут массив поэлементно. У нас функция GetSignal() передаёт значение сигнала на соответствующем индексе i. Как понять какой сигнал пошёл в массив signal[2] в start()?
Алексей Тарабанов
7220
Алексей Тарабанов 2013.02.12 19:29  

1) Вы можете использовать static в том и только том случае, если при работе эксперта никогда не будет:

1. Изменяться параметры эксперта.

2. Меняться ТФ, валютная пара, номер счета.

3. Возникать ошибки позднего присоединения. 

Иначе говоря - если функция init() никогда не будет выполняться повторно.

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

2) iTime(NULL,0,0) тождественно Time[0], второе работает быстрее :) 

Только заметил: Вы объявили массив статичным. В MQL4 все массивы всегда статичны, правда, пользовать эту "особенность" никогда не пробовал,- не люблю пользовать баги, как фичи,- баг могут исправить, а вместе с ним умрет и фича :)

hoz
1936
hoz 2013.02.12 20:44  
tara:

1) Вы можете использовать static в том и только том случае, если при работе эксперта никогда не будет:

1. Изменяться параметры эксперта.

 Ну так параметры эксперта(внешние) и так не будут изменяться при работе эксперта... К чему первый пункт?

tara:

3. Возникать ошибки позднего присоединения. 

Иначе говоря - если функция init() никогда не будет выполняться повторно.

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

 Ну так если будет реконнект вслучае проблемы связи, то это произойдёт. А значит уже не приемлимо? От этого то никто не застрахован.

tara:

 Только заметил: Вы объявили массив статичным. В MQL4 все массивы всегда статичны, правда, пользовать эту "особенность" никогда не пробовал,- не люблю пользовать баги, как фичи,- баг могут исправить, а вместе с ним умрет и фича :) 

 Вы уверены в этом? Я по поводу статичности массивов.
Алексей Тарабанов
7220
Алексей Тарабанов 2013.02.12 20:52  
Уверен в статичности массивов и не уверен в том, что Вам не захочется изменить параметры эксперта :)
Алексей Тарабанов
7220
Алексей Тарабанов 2013.02.12 20:55  
А вообще, по моим скромным наблюдениям, лучше других в работе с памятью ориентируется Рустам. Существенно лучше.
hoz
1936
hoz 2013.02.12 21:37  
tara:
Уверен в статичности массивов и не уверен в том, что Вам не захочется изменить параметры эксперта :)


Так Вы имеет в виду в течении запуска терминала.. :) Вы правы!

tara:
А вообще, по моим скромным наблюдениям, лучше других в работе с памятью ориентируется Рустам. Существенно лучше.

Я не совсем понимаю о ком речь.
Алексей Тарабанов
7220
Алексей Тарабанов 2013.02.12 21:41  
hoz:


Так Вы имеет в виду в течении запуска терминала.. :) Вы правы!


Я не совсем понимаю о ком речь.
Если у Вас будет сложный вопрос, то его ответ будет наилучшим :)
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий