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

 
Alexey Viktorov:
Какая размерность массива NewsArr во втором измерении?

К сожалению, не понял. Что такое второе измерение?

А, наверное понял: NewsArr принимает значения 0,1,2 и 3. Это?

Наверное это: string NewsArr[4][1000];

 
novichok2018:

К сожалению, не понял. Что такое второе измерение?

А, наверное понял: NewsArr принимает значения 0,1,2 и 3. Это?

Наверное это: string NewsArr[4][1000];

Первое измерение и второе измерение.

Но наверное что-то не то ответили.
 
Alexey Viktorov:

Первое измерение и второе измерение.

Но наверное что-то не то ответили.

А где искать размерность второго измерения?

Или размерность первого измерения 4, а второго 1000?
 
novichok2018:

А где искать размерность второго измерения?

Или размерность первого измерения 4, а второго 1000?

Да. Но что-то напутано в этом сообщении

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

novichok2018, 2019.01.16 15:52

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

Платформа выдает сообщение: array out of range (284,17). 

строка 284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh); позиция 17 открывает квадр.скобку с NomNews, кот. глобально инициирована 0. 

Менял 0 на 1, безрезультатно.
Менял в строке if(NomNews==300)break; 300 на 360000, безрезультатно.    

Скомпилирую - несколько минут работает нормально. И что делать?

При количестве значений во втором измерении 1000 и

if(NomNews==300)break;
Выход за пределы массива во втором измерении быть не может.


 
psyman:

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


И еще есть вопрос - если в качестве текста метки выводится Bid, то в какой функции это делать более оптимально OnChartEvent или OnCalculate?

У OBJ_LABEL точка привязки есть даже если ты ее не задавал, по-умолчаню это левый верхний угол. Bid меняется в OnCalculate, в нём и делай изменение текста в метке.

 
Alexey Viktorov:

Да. Но что-то напутано в этом сообщении

При количестве значений во втором измерении 1000 и

Выход за пределы массива во втором измерении быть не может.


Да нет, ничего вроде не напутал. Вот скопированное сообщение: 2019.01.16 20:14:11.110 OnNews_M5_EURUSD EURUSD,M5: array out of range in 'OnNews_M5_EURUSD.mq4' (284,17).

Ну а строку 284 я показал выше.
 
novichok2018:

Да нет, ничего вроде не напутал. Вот скопированное сообщение: 2019.01.16 20:14:11.110 OnNews_M5_EURUSD EURUSD,M5: array out of range in 'OnNews_M5_EURUSD.mq4' (284,17).

Ну а строку 284 я показал выше.

позиция 17 открывает квадр.скобку с NomNews, кот. глобально инициирована 0.

Ну так у вас размер ячейки массива во втором измерении нулевой получается...

 
Artyom Trishkin:

Ну так у вас размер ячейки массива во втором измерении нулевой получается...

Вот где находится NomNews:

datetime TimeNewsFunck(int nomf)

  {

   string s=NewsArr[0][nomf];

   string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4));

   return((datetime)(StringToTime(time) + GMTplus*3600));

  }

//345678901234567890////////////////////////////////////////////////////////////////////////////////

void UpdateNews()

  {

   string TEXT=ReadCBOE();

   int sh = StringFind(TEXT,"pageStartAt>")+12;

   int sh2= StringFind(TEXT,"</tbody>");

   TEXT=StringSubstr(TEXT,sh,sh2-sh);


   sh=0;

   while(!IsStopped())

     {

      sh = StringFind(TEXT,"event_timestamp",sh)+17;

      sh2= StringFind(TEXT,"onclick",sh)-2;

      if(sh<17 || sh2<0)break;

      NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh);


      sh = StringFind(TEXT,"flagCur",sh)+10;

      sh2= sh+3;

      if(sh<10 || sh2<3)break;

      NewsArr[1][NomNews]=StringSubstr(TEXT,sh,sh2-sh);

      if(OnlySymbolNews && StringFind(ValStr,NewsArr[1][NomNews])<0)continue;


      sh = StringFind(TEXT,"title",sh)+7;

      sh2= StringFind(TEXT,"Volatility",sh)-1;

      if(sh<7 || sh2<0)break;

      NewsArr[2][NomNews]=StringSubstr(TEXT,sh,sh2-sh);

      if(StringFind(NewsArr[2][NomNews],"High")>=0 && !HighNews)continue;

      if(StringFind(NewsArr[2][NomNews],"Moderate")>=0 && !MidleNews)continue;

      if(StringFind(NewsArr[2][NomNews],"Low")>=0 && !LowNews)continue;


      sh=StringFind(TEXT,"left event",sh)+12;

      int sh1=StringFind(TEXT,"Speaks",sh);

      sh2=StringFind(TEXT,"<",sh);

      if(sh<12 || sh2<0)break;

      if(sh1<0 || sh1>sh2)NewsArr[3][NomNews]=StringSubstr(TEXT,sh,sh2-sh);

      else NewsArr[3][NomNews]=StringSubstr(TEXT,sh,sh1-sh);


      NomNews++;

      if(NomNews==300)break;

     }

  }

Значения от 0 до 300. Задать глобально 4?

 
novichok2018:


Значения от 0 до 300. Задать глобально 4?

Всё равно на 12 минуте работы выдает сообщение.

 
novichok2018:

Всё равно на 12 минуте работы выдает сообщение.

из всего могу сказать, что NomNews попадает в цикл While уже в состоянии больше, чем 999. И тогда нужно искать из-за чего так выходит и где-то ставить сброс этой переменной.

Что бы это проверить впишите в самом начале цикла:

if(NomNews > 999)
{
   Print(NomNews);
   break;
}
Причина обращения: