Вопросы от "чайника" - страница 38

 

 Итак. Свершилось! Не прошло и года. Я таки решился! Всерьёз заглянул в документацию по MQL5. Начал с малого: минимизировал кое-какой код кое-какого индикатора в попытках упростить и разобраться в его структуре и работе. И оцепенел...

 Сперва расковырял Fractals - он оказался неожиданно маленьким и довльно-таки простым. Затем рассуждал логически: тащить этот код из программы в программу неразумно, следует применить всего-лишь вызов этого индикатора, скопировать и использовать готовые расчётные значения буферов. Если я не ошибся направлением, меня понесло в околостоящую степь и принесло к примеру с iFractals ("Я всё правильно сделал?" (c)). Максимально сократил код, вычистив всё лишнее и условно ненужное, оставив только самую суть. И что же я обнаружил? По объёму и читабельности код вызова данного индикатора оказался ничуть не компактнее изначального кода самого индикатора.

 Вопросы.

 1. Какой смысл в iFractals?

 2. Что со мной не так?

 Спасибо!

 P.S.: Или это лишь частный случай, когда не наблюдается выгоды в объёме второго кода? 

 
x100intraday:

2. Что со мной не так?

это форум не психиатров, а программистов по MQL. Ковырятся в чужих тараканах обычно нехочется.

Будьте более конкретны в ваших вопросах.
 

Вопрос вопрос

жизни и смерти...

каким не криминальным способом можно получить значение open [15625] бара H1 таймфрейма

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

 
BaTTLeBLooM:

Вопрос вопрос

жизни и смерти...

каким не криминальным способом можно получить значение open [15625] бара H1 таймфрейма

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


Приведите свой код, пожалуйста.

 
Renat:

Приведите свой код, пожалуйста.

привожу   

double MTime ( int mode )
   {     

      double iOpen_min [], iOpen_hour [], iOpen_4hour [];

      ArraySetAsSeries ( iOpen_min, true );
      ArraySetAsSeries ( iOpen_hour, true );
      ArraySetAsSeries ( iOpen_4hour, true );     
      int rates_open_min, rates_open_hour, rates_open_4hour;
      int err = 0;
      do
         {    
            rates_open_min = CopyOpen ( NULL, PERIOD_M1, 0, 7501, iOpen_min );
            rates_open_hour = CopyOpen ( NULL, PERIOD_H1, 0, 20000, iOpen_hour );
            rates_open_4hour = CopyOpen ( NULL, PERIOD_H4, 0, 10000, iOpen_4hour );           
            err ++;
         }
      while ( ( rates_open_min <= 0 || rates_open_hour <= 0 || rates_open_4hour <= 0) && err < 10 );   

      double Minute2 = iOpen_min [ 0 ] - iOpen_min [ 2 ];
      double Minute12 = iOpen_min [ 0 ] - iOpen_min [ 12 ];
      double Hour = iOpen_min [ 0 ] - iOpen_min [ 60 ];   // Час
      double Hour5 = iOpen_min [ 0 ] - iOpen_min [ 300 ];     // 5 Часов
      double Day = iOpen_min [ 0 ] - iOpen_min [ 1500 ];   // День
      double Week = iOpen_min [ 0 ] - iOpen_min [ 7500 ];  // Неделя
      double Month = iOpen_hour [ 0 ] - iOpen_hour [ 625 ];   // Месяц
      double Month5 = iOpen_hour [ 0 ] - iOpen_hour [ 3125 ];  // Полугодие

      double Month25 = iOpen_hour [ 0 ] - iOpen_hour [ 15625 ];  // 3 года

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

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
BaTTLeBLooM:

критическая ошибка - выход за пределы массива.

как-то так можно попробовать:

      do
         {    
            //if(err>0) Sleep(10);//желательно с паузой
            rates_open_min = CopyOpen ( NULL, PERIOD_M1, 0, 7501, iOpen_min );
            rates_open_hour = CopyOpen ( NULL, PERIOD_H1, 0, 20000, iOpen_hour );
            rates_open_4hour = CopyOpen ( NULL, PERIOD_H4, 0, 10000, iOpen_4hour );           
            err ++;
         }
      while ( ( rates_open_min < 7501 || rates_open_hour < 20000 || rates_open_4hour < 10000) && err < 10 );   

   if(rates_open_min<7501 || rates_open_hour<20000 || rates_open_4hour<10000) return(-1);//Данные не скопированы
   else
      {
      double Minute2 = iOpen_min [ 0 ] - iOpen_min [ 2 ];
      double Minute12 = iOpen_min [ 0 ] - iOpen_min [ 12 ];
      double Hour = iOpen_min [ 0 ] - iOpen_min [ 60 ];   // Час
      double Hour5 = iOpen_min [ 0 ] - iOpen_min [ 300 ];     // 5 Часов
      double Day = iOpen_min [ 0 ] - iOpen_min [ 1500 ];   // День
      double Week = iOpen_min [ 0 ] - iOpen_min [ 7500 ];  // Неделя
      double Month = iOpen_hour [ 0 ] - iOpen_hour [ 625 ];   // Месяц
      double Month5 = iOpen_hour [ 0 ] - iOpen_hour [ 3125 ];  // Полугодие
      double Month25 = iOpen_hour [ 0 ] - iOpen_hour [ 15625 ];  // 3 года
      }
 
Swan:

критическая ошибка - выход за пределы массива.

как-то так можно попробовать:

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

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

 
Renat:

Приведите свой код, пожалуйста.

ну раз ответа нет, тогда буду вручную вводить )))) благо всего одно значение
 
BaTTLeBLooM:
ну раз ответа нет, тогда буду вручную вводить )))) благо всего одно значение

у вас в коде нет проверок. Чтож вы тогда хотите?

 
BaTTLeBLooM:

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

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

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

while( ... rates_open_hour <= 0 //копировалось только доступное на данный момент времени количество данных и соответственно массив мог быть меньше 15625.


А ситуация возникает из-за недостаточного курения мануалов :)

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5