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

 
Сергей Таболин:

Первая путя помогла )))) Спасибо.

Ещё вопрос: Отрываю в индикаторе 3 экземпляра индикатора для получения данных с разных ТФ. Но при прикреплении оного к графику получаю такую распринтовку:

Что бы это значило?

Не могу сказать наверняка , но возможно 2-й буффер был проинициализирован поздно.

Что бы выяснить точнее в чём же причина надо скорректировать следующе строки приблизительно так

if(CopyBuffer(handle_MA,0,0,ma_values_to_copy,buffer_MA) < 0 ) // копируем данные из индикаторного массива в массив buffer_MA
   {                                                                                // если не скопировалось
      Print("Не удалось скопировать данные из индикаторного буфера в buffer_MA, код ошибки "+ IntegerToString(GetLastError()));   // то выводим сообщение об ошибке
      return(0);                                                                    // и выходим из функции
   }

После чего можно будет более уверенно сказать в чём дело

 
Oleg Peiko:

Не могу сказать наверняка , но возможно 2-й буффер был проинициализирован поздно.

Что бы выяснить точнее в чём же причина надо скорректировать следующе строки приблизительно так

После чего можно будет более уверенно сказать в чём дело

2019.03.23 22:58:11.410 my_HMA5_123 (GBPUSD,M30)        Скопирован индикаторный буфер в buffer_MA
2019.03.23 22:58:11.410 my_HMA5_123 (GBPUSD,M30)        Не удалось скопировать данные из индикаторного буфера в buffer_MA2
2019.03.23 22:58:11.410 my_HMA5_123 (GBPUSD,M30)        4806
2019.03.23 22:58:11.637 my_HMA5_123.ex5::my_HMA5 (GBPUSD,M15)   BarsCalculated() вернул -1, код ошибки 4806
2019.03.23 22:58:11.648 my_HMA5_123 (GBPUSD,M30)        Скопирован индикаторный буфер в buffer_MA
2019.03.23 22:58:11.648 my_HMA5_123 (GBPUSD,M30)        Скопирован индикаторный буфер в buffer_MA2
2019.03.23 22:58:11.648 my_HMA5_123 (GBPUSD,M30)        Скопирован индикаторный буфер в buffer_MA3
ERR_INDICATOR_DATA_NOT_FOUND    4806    Запрошенные данные не найдены

С этим можно что-то сделать?

Кстати, этот экземпляр открывается на М15.

Впрочем и на других ТФ то же самое...

 
Сергей Таболин:

С этим можно что-то сделать?

Кстати, этот экземпляр открывается на М15.

Впрочем и на других ТФ то же самое...

В таймере один раз в две минуты запрашивайте любые данные по требуемому таймфрейму. Таким образом вы всегда будете иметь актуальные данные по тф.

К тому же: в OnCalculate() в самом его начале запрашиваете, например:

   if(iTime(NULL,PERIOD_M15,1)==0)
      return 0;

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

   datetime array[];
   if(CopyTime(NULL,PERIOD_M15,0,number_of_datas,array)!=number_of_datas)
      return 0;

В этом случае, пока не будет доступно требуемое в number_of_datas количество данных, индикатор будет ожидать следующий тик.

Если вы решите использовать для получения нужного количества данных по пятнадцатиминутному таймфрейму функцию

Bars(NULL,PERIOD_M15);

.., то следует учитывать, что для расчёта нужно брать количество данных не более, чем rates_total, иначе будет выход за пределы массива. Иными словами, если на текущем тф баров меньше, чем на М15, то нужно брать количество баров, равное их количеству на текущем тф = rates_total

 
Artyom Trishkin:

В таймере один раз в две минуты запрашивайте любые данные по требуемому таймфрейму. Таким образом вы всегда будете иметь актуальные данные по тф.

К тому же: в OnCalculate() в самом его начале запрашиваете, например:

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

В этом случае, пока не будет доступно требуемое в number_of_datas количество данных, индикатор будет ожидать следующий тик.

Если вы решите использовать для получения нужного количества данных по пятнадцатиминутному таймфрейму функцию

.., то следует учитывать, что для расчёта нужно брать количество данных не более, чем rates_total, иначе будет выход за пределы массива. Иными словами, если на текущем тф баров меньше, чем на М15, то нужно брать количество баров, равное их количеству на текущем тф = rates_total

Спасибо.

Сделал так:

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[])
  {
   
   if(iTime(NULL,PERIOD_CURRENT,1)==0)  return(0); 
   if(iTime(NULL,periodTF1,1)==0)       return(0); 
   if(iTime(NULL,periodTF2,1)==0)       return(0); 
   
   int ma_values_to_copy; 
   int ma_calculated = 0;
   if(PeriodSeconds(PERIOD_CURRENT) < PeriodSeconds(periodTF1) && PeriodSeconds(PERIOD_CURRENT) < PeriodSeconds(periodTF2))   ma_calculated = BarsCalculated(handle_MA);
   else
   if(PeriodSeconds(periodTF1) < PeriodSeconds(PERIOD_CURRENT) && PeriodSeconds(periodTF1) < PeriodSeconds(periodTF2))        ma_calculated = BarsCalculated(handle_MA2);
   else
   if(PeriodSeconds(periodTF2) < PeriodSeconds(PERIOD_CURRENT) && PeriodSeconds(periodTF2) < PeriodSeconds(periodTF1))        ma_calculated = BarsCalculated(handle_MA3);
   
   if(ma_calculated <= 0){ 
      PrintFormat("BarsCalculated() вернул %d, код ошибки %d",ma_calculated,GetLastError()); 
      return(0); 
     }  
   if(prev_calculated == 0 || ma_calculated != ma_bars_calculated || rates_total > prev_calculated + 1){ 
      if(ma_calculated > rates_total) ma_values_to_copy = rates_total; 
      else ma_values_to_copy = ma_calculated; 
     } else { 
      ma_values_to_copy = (rates_total - prev_calculated) + 1; 
     } 

результат:

2019.03.24 00:56:38.056 my_HMA5_125 (GBPUSD,M30)        BarsCalculated() вернул -1, код ошибки 4806
2019.03.24 00:56:38.226 my_HMA5_125 (GBPUSD,M30)        Скопирован индикаторный буфер в buffer_MA
2019.03.24 00:56:38.226 my_HMA5_125 (GBPUSD,M30)        Скопирован индикаторный буфер в buffer_MA_c
2019.03.24 00:56:38.226 my_HMA5_125 (GBPUSD,M30)        Скопирован индикаторный буфер в buffer_MA2
2019.03.24 00:56:38.226 my_HMA5_125 (GBPUSD,M30)        Скопирован индикаторный буфер в buffer_MA_c2
2019.03.24 00:56:38.226 my_HMA5_125 (GBPUSD,M30)        Скопирован индикаторный буфер в buffer_MA3
2019.03.24 00:56:38.226 my_HMA5_125 (GBPUSD,M30)        Скопирован индикаторный буфер в buffer_MA_c3

тяжеловато даются мне индикаторы )))

 

Всем привет!
Подскажите плиз по функции CopyHigh.
Прочитал в определении к функции "Получает в массив исторические данные по максимальной цене баров по соответствующим символу и периоду".

А речь идет о массиве цен Bid или Ask ? Или как-то задавать можно тип цены необходимой?

 
renatmt5:

Всем привет!
Подскажите плиз по функции CopyHigh.
Прочитал в определении к функции "Получает в массив исторические данные по максимальной цене баров по соответствующим символу и периоду".

А речь идет о массиве цен Bid или Ask ? Или как-то задавать можно тип цены необходимой?

СправкаОсобенности построения графиков

Особенности построения графиков

Исторические данные, на основе которых строятся графики, хранятся на жестком диске. При открытии графика данные загружаются с диска и производится докачка последних недостающих данных с торгового сервера. Если исторические данные по финансовому инструменту отсутствуют на жестком диске, происходит загрузка последних 512 баров истории.

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

  • В настройках платформы задается параметр "Макс. баров на графике". Этот параметр позволяет контролировать количество отображаемых исторических данных на графике.
  • Графики строятся по ценам Bid. Если по символу доступен стакан цен, то графики строятся по ценам Last (цена последней совершенной сделки).
Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
  • www.metatrader5.com
Графики в торговой платформе отображают изменение котировок финансовых инструментов во времени. Они необходимы для проведения технического анализа и работы советников. Они позволяют трейдерам наглядно следить за котировками валют и акций в режиме реального времени и моментально реагировать на любое изменение ситуации на финансовых рынках...
 
Vladimir Karputov:

СправкаОсобенности построения графиков

Особенности построения графиков

Исторические данные, на основе которых строятся графики, хранятся на жестком диске. При открытии графика данные загружаются с диска и производится докачка последних недостающих данных с торгового сервера. Если исторические данные по финансовому инструменту отсутствуют на жестком диске, происходит загрузка последних 512 баров истории.

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

  • В настройках платформы задается параметр "Макс. баров на графике". Этот параметр позволяет контролировать количество отображаемых исторических данных на графике.
  • Графики строятся по ценам Bid. Если по символу доступен стакан цен, то графики строятся по ценам Last (цена последней совершенной сделки).

Владимир, добрый день! Как всегда, выручаете :) Спасибо!

 
Доброго всем времени суток. Подскажите плиз как рассчитать правильно объем позиции исходя из средств выделенных на сделку.   
 

Как в mql5 найти самую маленькую свечу из N?

В mql4 

   min=99999;
   N=5;
   for(int i=1;i<=N;i++)
     {
      if(High[i]-Low[i]<min) min=High[i]-Low[i];
     }
 
yiduwi:

Как в mql5 найти минимальную свечу из N?

В mql4 

В советнике или в индикаторе? Для текущего таймрфейма или для чужого?