Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1338

Artyom Trishkin #:

Индексация массивов - просто жуть какая-то... Копирование одних и тех же данных в цикле... Создание новых хэндлов в цикле - слов нет...

Остальное даже глядеть расхотелось, извините

Про индексацию массивов не понял, в каких массивах вам не понравилась индексация?   Данные в строчке 43 функцией CopyBuffer копируются  хендлы на разных таймфреймах, с 1мин. по 4Н.  Всего копируется 5 цен индикатора МА, по первым 5 барам, причём на каждой итерации как хендл, так и массив с 5 барами, обнуляется 

ArrayFree(bufer_MA);


и хендл удаляется 

 IndicatorRelease(MA200); //Удаление хендла

.   Если вы можете предложить алгоритм обработатки 274 инструментов и каждый из них на 6 таймфреймах как то иначе, буду рад   Просто ветка вроде как называется -- Вопросы от начинающих.  Будь я профи, наверное и вопросов у меня не возникало бы.

создание хендлов при различных ситуациях вроде не затратная, это просто указатель без предзагрузок? основная работа идет с CopyBuffer

нет необходимости удалять хендл в цикле, проверять может и нужно, у меня лично только при создании первого постоянно проблема, решается она Sleep(), чтобы подгрузился график или функцией предварительной подгрузки котировок

разработчикам стоило бы самим это решить, в OnInit не важна скорость, речь про первый индикатор с перебором 7 символов, ошибка всегда на разных итерациях выскакивает

----------

как работает создание хендла, в специально сработанном цикле необходима проверка наличия или просто очередное создание достаточно(т.е. перезапись)?

Fast235 #:

создание хендлов при различных ситуациях вроде не затратная, это просто указатель без предзагрузок? основная работа идет с CopyBuffer

нет необходимости удалять хендл в цикле, проверять может и нужно, у меня лично только при создании первого постоянно проблема, решается она Sleep(), чтобы подгрузился график или функцией предварительной подгрузки котировок

разработчикам стоило бы самим это решить, в OnInit не важна скорость, речь про первый индикатор с перебором 7 символов, ошибка всегда на разных итерациях выскакивает

----------

как работает создание хендла, в специально сработанном цикле необходима проверка наличия или просто очередное создание достаточно(т.е. перезапись)?

Это вы мне?  Или это ваш вопрос к знатакам здешним?)))

Kira27 #:

Это вы мне?  Или это ваш вопрос к знатакам здешним?)))

про создание и удаление хендлов,

это работает, интересует как будет правильней, надеюсь разработчики скажут

Итак, оказалось что скрипт
void OnStart()
  {
   int Target=6;       //Количество тайм-фреймов
   int Counter_UP=0;   //Счетчик нахождения цены над МА
   int Counter_DOWN=0;
   int MA = 200;       //Период МА
   double bufer_MA[];  //Буфер для хендла
   ENUM_TIMEFRAMES frame1[10];  //Битная маска тайм-фреймов
//___________________int битная маска ENUM  Массив таймфреймов__________________________________________
   frame1[1]=1;
   frame1[2]=5;
   frame1[3]=15;
   frame1[4]=30;
   frame1[5]=16385;
   frame1[6]=16388;
   frame1[7]=16408;
   frame1[8]=32769;
   frame1[9]=49153;
//____________________________________________________________________________________________________________

   int KollSymbols = SymbolsTotal(true);  //Колл. символов в маркет вотч
   Alert("Колл.Инстр = ",KollSymbols);
//---
   int MA200;  //Переменная для хендла
   for(int i=0; i<KollSymbols; i++) //Перебераем все символы из маркет вотч
     {
      string symbol = SymbolName(i,true);  //Выбираем имя символа из маркет вотч
     // Alert("symbol = ",symbol,"i= ",i);
      for(int I=1; I<=Target; I++)  //Перебераем таймфреймы
        {
         MA200 = iMA(symbol,frame1[I],MA,0,MODE_EMA,PRICE_MEDIAN);  //хендл на выбранном тайме
         CopyBuffer(MA200,0,TimeCurrent(),5,bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма

         ArraySetAsSeries(bufer_MA,true);  //Разворачиваем массив как в тайм-серии

         //Alert("Символ - ",symbol,"i= ",i);
         // Alert("Simbol = ",symbol," bufer_MA[1] = ",bufer_MA[1]);
         if(iClose(symbol,frame1[I],1) > bufer_MA[1])  //Если цена 1 баре, на выбранном символе и тайме, БОЛЬШЕ цены скользяхи на 1 баре
           {
            //Alert("iClose= ",iClose(symbol,frame1[I],1), " bufer_MA[1]= ",bufer_MA[1]);
            Counter_UP++;
            if(Counter_UP==Target)
               Alert("Инструмент для наблюдения в покупки - ",symbol);

            ArrayFree(bufer_MA);      //Очистка буфера индикатора
         
           }
         else
           {
            ArrayFree(bufer_MA);      //Очистка буфера индикатора
           }
         IndicatorRelease(MA200); //Удаление хендла
        }
      Counter_UP=0;
      Counter_DOWN=0;
     }
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

работает норм.   И список из 22 инстр.   обрабатывает достаточно долго мин 5.  Хотя это странно.   Основное время он тратит на запись хендла в массив.  Итог профилирования  


Вопрос.  Почему так затратно по времени копирование 5 значений из хендла в массив, хотя копирование происходит 132 раза для 22инструментов из списка.  То-есть для 273 инструментов понадобится копировать 1632 раза, причём с подгрузкой истории по всем инструментам на хард компа. 

Fast235 #:

про создание и удаление хендлов,

это работает, интересует как будет правильней, надеюсь разработчики скажут

Вот я как раз этим занимаюсь, в коде выше посмотрите, тоже есть вопросы))

Kira27 #:
Итак, оказалось что скрипт

работает норм.   И список из 22 инстр.   обрабатывает достаточно долго мин 5.  Хотя это странно.   Основное время он тратит на запись хендла в массив.  Итог профилирования  


Вопрос.  Почему так затратно по времени копирование 5 значений из хендла в массив, хотя копирование происходит 132 раза для 22инструментов из списка.  То-есть для 273 инструментов понадобится копировать 1632 раза, причём с подгрузкой истории по всем инструментам на хард компа. 

Если ничего не напутал.

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

//+------------------------------------------------------------------+
void OnStart()
  {
   int Target = 6;     //Количество тайм-фреймов
   int Counter_UP = 0; //Счетчик нахождения цены над МА
   int Counter_DOWN = 0;
   int MA = 200;       //Период МА
   double bufer_MA[];  //Буфер для хендла
   int MA200[][9];  //Переменная для хендла
   string symbol[];

   ENUM_TIMEFRAMES frame1[9];  //Битная маска тайм-фреймов
//___________________int битная маска ENUM  Массив таймфреймов__________________________________________
   frame1[0] = 1;
   frame1[1] = 5;
   frame1[2] = 15;
   frame1[3] = 30;
   frame1[4] = 16385;
   frame1[5] = 16388;
   frame1[6] = 16408;
   frame1[7] = 32769;
   frame1[8] = 49153;
//____________________________________________________________________________________________________________

   int KollSymbols = SymbolsTotal(true);  //Колл. символов в маркет вотч
   Print("Колл.Инстр = ", KollSymbols);
   int res = 0;
   for(int i = 0; i < KollSymbols; i++)
     {
      for(int I = 0; I < 9; I++) //Перебераем таймфреймы
        {
         ArrayResize(MA200, i + 1);
         ArrayResize(symbol, i + 1);
         symbol[i] = SymbolName(i, true); //Выбираем имя символа из маркет вотч
         MA200[i][I] = iMA(symbol[i], frame1[I], MA, 0, MODE_EMA, PRICE_MEDIAN); //хендл на выбранном тайме
         if(MA200[i][I] == INVALID_HANDLE)
            PrintFormat("Инвалид хэндл, символ %s, тайм %d", symbol[i], frame1[I]);
         res++;
        }
     }
   Print("Создано хэндлов = " + (string)res);

//---
   for(int i = 0; i < KollSymbols; i++)
     {
      for(int I = 0; I < 9; I++) //Перебераем таймфреймы
        {
         int size = CopyBuffer(MA200[i][I], 0, 1, 1, bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма
         PrintFormat("Скопировано %d, символ %s, тайм %d", size, symbol[i], frame1[I]);
         if(size > 0)
            if(iClose(symbol[i], frame1[I], 1) > bufer_MA[0]) //Если цена 1 баре, на выбранном символе и тайме, БОЛЬШЕ цены скользяхи на 1 баре
              {
               Counter_UP++;
              }
        }
     }
   Print("Counter_UP = " + (string)Counter_UP);
  }
//+------------------------------------------------------------------+
[Удален]
Kira27 #:

Смысл скрипта, перебрать каждый инструмент из маркет вотч на таймфреймах с 1мин до 4Н

Если бы я делал такое, то создал бы массив и хранил в нём прошлые данные, обновляя текущие. Это позволит избежать тяжёлые циклы и CopyBuffer. Всё будет летать.

Aleksandr Slavskii #:

Если ничего не напутал.

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

Спасибо за отклик, и ваш вариант исполнения, поэксперементирую с ним)!  Не понял только почему перед завершением программы не удаляете хендлы?  Или они при завершении проги сами автоматом удаляются.  Хотя оператива не освобождается судя по диспетчеру задач.

Aleksei Stepanenko #:

Если бы я делал такое, то создал бы массив и хранил в нём прошлые данные, обновляя текущие. Это позволит избежать тяжёлые циклы и CopyBuffer. Всё будет летать.

Спасибо!  Подумаю и в этом направлении)