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

 
Kira27 #:
Привет!!!  Подскажите где я ошибся, чет сам не догоняю)  

Из 275 инструментов обрабатывает штук 27 и залипает, занимает память, и при принудительном завершении скрипта выдает строку с ошибкой. 

Если этот массив

   double bufer_MA[];  //Буфер для хендла

то его использовать в

         CopyBuffer(MA200,0,TimeCurrent(),5,bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма

совсем не правильно.

Или я что-то не так понял?

 
Alexey Viktorov #:

Если этот массив

то его использовать в

совсем не правильно.

Или я что-то не так понял?

Там вообще много чего не так

 
Alexey Viktorov #:

Если этот массив

то его использовать в



Пример:



//+------------------------------------------------------------------+ 
//|                                              TestCopyBuffer3.mq5 | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00"
 
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_plots   1 
//---- plot MA 
#property indicator_label1  "MA" 
#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrRed 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
//--- input parameters 
input bool               AsSeries=true; 
input int                period=15; 
input ENUM_MA_METHOD     smootMode=MODE_EMA; 
input ENUM_APPLIED_PRICE price=PRICE_CLOSE; 
input int                shift=0; 
//--- indicator buffers 
double                   MABuffer[]; 
int                      ma_handle; 
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- indicator buffers mapping 
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA); 
   Print("Параметр AsSeries = ",AsSeries); 
   Print("Индикаторный буфер после SetIndexBuffer() является таймсерией = ", 
         ArrayGetAsSeries(MABuffer)); 
//--- set short indicator name 
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries); 
//--- set AsSeries (depends on input parameter) 
   ArraySetAsSeries(MABuffer,AsSeries); 
   Print("Индикаторный буфер после ArraySetAsSeries(MABuffer,true); является таймсерией = ", 
         ArrayGetAsSeries(MABuffer)); 
//--- 
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price); 
   return(INIT_SUCCEEDED); 
  } 
//+------------------------------------------------------------------+ 
//| Custom indicator iteration function                              | 
//+------------------------------------------------------------------+ 
int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const datetime &time[], 
                const double &open[], 
                const double &high[], 
                const double &low[], 
                const double &close[], 
                const long &tick_volume[], 
                const long &volume[], 
                const int &spread[]) 
  { 
//--- check if all data calculated 
   if(BarsCalculated(ma_handle)<rates_total) return(0); 
//--- we can copy not all data 
   int to_copy; 
   if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total; 
   else 
     { 
      to_copy=rates_total-prev_calculated; 
      //--- last value is always copied 
      to_copy++; 
     } 
//--- try to copy 
   if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0); 
//--- return value of prev_calculated for next call 
   return(rates_total); 
  } 
//+------------------------------------------------------------------+
 

совсем не правильно.

Или я что-то не так понял?

Почему не правильно?  Ведь в примере к функции 


CopyBuffer

так и используют  

 

Alexey Viktorov #:


Или я что-то не так понял?

Смысл скрипта, перебрать каждый инструмент из маркет вотч на таймфреймах с 1мин до 4Н для определения цены над МА200 и если этот факт обнаружится, выдать алерт с именем символа на котором цена выше МА на всех 6 таймфреймах.

 
Artyom Trishkin #:

Там вообще много чего не так

А по конкретнее, если вас не затруднит)

 
Kira27 #:

А по конкретнее, если вас не затруднит)

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

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

 
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 #:

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

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

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

Причина обращения: